diff --git a/.travis.yml b/.travis.yml index 141d09c..4d1be7d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -24,3 +24,4 @@ script: notifications: email: false + diff --git a/README.md b/README.md index 718878e..d58545a 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,5 @@ -LimeReport v1.3.10 [![Build Status](https://travis-ci.org/newsages/LimeReport.svg?branch=master)](https://travis-ci.org/newsages/LimeReport) +LimeReport v1.3.10 [![Build Status](https://api.travis-ci.org/fralx/LimeReport.svg?branch=master)](https://travis-ci.org/fralx/LimeReport) ----------- ------------ - - ##Features * Multi-platform support diff --git a/demo_r1/demo_r1.pro b/demo_r1/demo_r1.pro index 5591daf..5b4ad00 100644 --- a/demo_r1/demo_r1.pro +++ b/demo_r1/demo_r1.pro @@ -1,15 +1,6 @@ include(../common.pri) QT += core gui -greaterThan(QT_MAJOR_VERSION, 4){ - QT += widgets printsupport - DEFINES += HAVE_QT5 -} - -macx{ - CONFIG += app_bundle -} - TARGET = LRDemo TEMPLATE = app @@ -27,8 +18,12 @@ RESOURCES += \ r1.qrc EXTRA_DIR += $$PWD/demo_reports -DEST_DIR = $${BUILD_DIR}/$${BUILD_TYPE}/demo -REPORTS_DIR = $${DEST_DIR}/demo_reports +DEST_DIR = $${BUILD_DIR}/$${BUILD_TYPE}/demo_r1 +REPORTS_DIR = $${DEST_DIR} + +macx{ + CONFIG += app_bundle +} unix:{ LIBS += -L$${BUILD_DIR}/$${BUILD_TYPE}/lib -llimereport @@ -36,7 +31,8 @@ unix:{ LIBS += -L$${BUILD_DIR}/$${BUILD_TYPE}/lib -lQtZint } DESTDIR = $$DEST_DIR - QMAKE_POST_LINK += mkdir -p $$quote($$REPORTS_DIR) | $$QMAKE_COPY $$quote($$EXTRA_DIR)/* $$quote($$REPORTS_DIR) $$escape_expand(\n\t) +# QMAKE_POST_LINK += mkdir -p $$quote($$REPORTS_DIR) | + QMAKE_POST_LINK += $$QMAKE_COPY_DIR $$quote($$EXTRA_DIR) $$quote($$REPORTS_DIR) $$escape_expand(\n\t) linux{ #Link share lib to ../lib rpath QMAKE_LFLAGS += -Wl,--rpath=\\\$\$ORIGIN @@ -56,6 +52,11 @@ win32 { DESTDIR = $$DEST_DIR RC_FILE += mainicon.rc - QMAKE_POST_LINK += $$QMAKE_COPY_DIR $$quote($$EXTRA_DIR) $$quote($$REPORTS_DIR) $$escape_expand(\\n\\t) + QMAKE_POST_LINK += $$QMAKE_COPY_DIR $$quote($$EXTRA_DIR\\*) $$quote($$REPORTS_DIR\\demo_reports) $$escape_expand(\\n\\t) + contains(CONFIG,zint){ + LIBS += -L$${BUILD_DIR}/$${BUILD_TYPE}/lib -lQtZint + } LIBS += -L$${BUILD_DIR}/$${BUILD_TYPE}/lib -llimereport } + + diff --git a/demo_r2/demo_r2.pro b/demo_r2/demo_r2.pro new file mode 100644 index 0000000..c184847 --- /dev/null +++ b/demo_r2/demo_r2.pro @@ -0,0 +1,62 @@ +include(../common.pri) +QT += core gui + +TARGET = LRDemo +TEMPLATE = app + +SOURCES += main.cpp\ + mainwindow.cpp + +HEADERS += mainwindow.h + +FORMS += mainwindow.ui + +INCLUDEPATH += $$PWD/../include +DEPENDPATH += $$PWD/../include + +RESOURCES += \ + demo_r2.qrc + +EXTRA_DIR += $$PWD/demo_reports +DEST_DIR = $${BUILD_DIR}/$${BUILD_TYPE}/demo_r2 +REPORTS_DIR = $${DEST_DIR} + +macx{ + CONFIG += app_bundle +} + +unix:{ + LIBS += -L$${BUILD_DIR}/$${BUILD_TYPE}/lib -llimereport + contains(CONFIG,zint){ + LIBS += -L$${BUILD_DIR}/$${BUILD_TYPE}/lib -lQtZint + } + DESTDIR = $$DEST_DIR +# QMAKE_POST_LINK += mkdir -p $$quote($$REPORTS_DIR) | + QMAKE_POST_LINK += $$QMAKE_COPY_DIR $$quote($$EXTRA_DIR) $$quote($$REPORTS_DIR) $$escape_expand(\n\t) +linux{ + #Link share lib to ../lib rpath + QMAKE_LFLAGS += -Wl,--rpath=\\\$\$ORIGIN + QMAKE_LFLAGS += -Wl,--rpath=\\\$\$ORIGIN/lib + QMAKE_LFLAGS += -Wl,--rpath=\\\$\$ORIGIN/../lib + QMAKE_LFLAGS_RPATH += #. .. ./libs +} + target.path = $${DEST_DIR} + INSTALLS = target +} + +win32 { + EXTRA_DIR ~= s,/,\\,g + DEST_DIR ~= s,/,\\,g + REPORTS_DIR ~= s,/,\\,g + + DESTDIR = $$DEST_DIR + RC_FILE += mainicon.rc + + QMAKE_POST_LINK += $$QMAKE_COPY_DIR $$quote($$EXTRA_DIR\\*) $$quote($$REPORTS_DIR\\demo_reports) $$escape_expand(\\n\\t) + contains(CONFIG,zint){ + LIBS += -L$${BUILD_DIR}/$${BUILD_TYPE}/lib -lQtZint + } + LIBS += -L$${BUILD_DIR}/$${BUILD_TYPE}/lib -llimereport +} + + diff --git a/demo_r2/demo_r2.qrc b/demo_r2/demo_r2.qrc new file mode 100644 index 0000000..efab479 --- /dev/null +++ b/demo_r2/demo_r2.qrc @@ -0,0 +1,21 @@ + + + images/lr.png + images/logo.png + images/folder3.png + images/new_leaf1.png + images/logo1.png + images/design.png + images/PDF.png + images/ZoomIn.png + images/ZoomOut.png + images/First.png + images/Last.png + images/Next.png + images/Prev.png + images/Print.png + images/FitWidth.png + images/FitPage.png + images/OneToOne.png + + diff --git a/demo_r2/demo_reports/categories.lrxml b/demo_r2/demo_reports/categories.lrxml new file mode 100644 index 0000000..e1c3fd4 --- /dev/null +++ b/demo_r2/demo_reports/categories.lrxml @@ -0,0 +1,227 @@ + + + + + + page1 + + + + + + + + ReportPage1 + + + + DataBand1 + + + + ImageItem1 + + + + + DataBand1 + + + + + + + + category + Picture + + + +
+ + + + + ReportPage1 + + + + + + + + + category + + + + + + + + + + SubDetailBand1 + + + + TextItem1 + + + + + SubDetailBand1 + + + + + + $D{products.ProductName} + + + + + + + + + + + + + + + + TextItem2 + + + + + SubDetailBand1 + + + + + + $D{products.UnitPrice} + + + + + + + + + + + + + + + + + + ReportPage1 + + + + + + DataBand1 + + + products + + + + + + TextItem3 + + + + + ReportPage1 + + + + + + Lime Report Demo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + datasources + + + + northwind + QSQLITE + ./demo_reports/northwind.db + + + + + + + + + + category + Select * from categories + northwind + + + + + + products + Select * from products where CategoryID = $D{category.CategoryID} + northwind + category + + + + + + + TestName + TestValue + + + + line_groupbandheader1 + + + + +
+
diff --git a/demo_r2/demo_reports/change_item_from_script.lrxml b/demo_r2/demo_reports/change_item_from_script.lrxml new file mode 100644 index 0000000..2e79dbc --- /dev/null +++ b/demo_r2/demo_reports/change_item_from_script.lrxml @@ -0,0 +1,211 @@ + + + + + + page1 + + + + + + + + ReportPage1 + + + + DataBand1 + + + + TextItem2 + + + + + DataBand1 + + + + + + $S{ + +var selectedItemBegin = '<span style="background:black; color:red; font-weight:bold ">'; +var selectedItemEnd = '</span>' + +var customer = ""; + +if ($D{customers.CustomerID}=="ANTON"){ + customer = selectedItemBegin+$D{customers.CustomerID}+selectedItemEnd; +} else { + customer = $D{customers.CustomerID}; +} +'<span>Customer: </span>'+customer; + +} + + + + + + + + + + + + + + + + + + ReportPage1 + + + + + + + + + customers + + + + + + + + + + ReportHeader1 + + + + TextItem1 + + + + + ReportHeader1 + + + + + + $S{ +var color = new QColor('#DEB887'); +var font = new QFont('Times New Roman',26,false,true); +THIS.backgroundColor = color; +THIS.fontColor = QColor('red'); +THIS.font = font; + +'Test'} + + + + + + + + + + + + + + + + TextItem3 + + + + + ReportHeader1 + + + + + + <p> <span>test1</span> <span style="background:red">test</span> </p> + + + + + + + + + + + + + + + + + + ReportPage1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + datasources + + + + test + QSQLITE + ./demo_reports/northwind.db + + + + + + + + + + customers + Select * from customers limit 5 + test + + + + + + + + TestName + TestValue + + + + + diff --git a/demo_r2/demo_reports/demoReport1_report_header_group_subdetail.lrxml b/demo_r2/demo_reports/demoReport1_report_header_group_subdetail.lrxml new file mode 100644 index 0000000..e036b0e --- /dev/null +++ b/demo_r2/demo_reports/demoReport1_report_header_group_subdetail.lrxml @@ -0,0 +1,632 @@ + + + + + + page1 + + + + + + + + ReportPage1 + + + + ReportHeader1 + + + + TextItem1 + + + + + ReportHeader1 + + + Lime +Report + + + + + + + + + + + + + + + ImageItem1 + + + + + ReportHeader1 + + + 89504e470d0a1a0a0000000d494844520000006400000071080600000023f9067c000000097048597300000dd700000dd70142289b780000119c49444154789ced9d79701cd59dc73feff55cba46b7c18eed8d84c1b6c02c4636b58ea928d8c609b0bb64c3429104ca5420b001c292cd3ae50d7120091bbb300e570a0c2609391c0889b99c1828b0036c42488c8d8d1cf9968c25d91aeb1849a3397afa78fb47cf48e383b2248f3c9a91be5553d3d3afbbe7757ffbbddfeffd8ef704a780dfef07104208745d17a73a7e1c83871002c330304d13c00638e503deb871a36bf1e2c5771886e1374d5328a546ba9e630642086f2010f8d3b469d35ec7e1c2729deaa44020e002beee72b9ced6340da5d4782b49135c2e577e28145a0b6c077a80e82909e9eaea12b66d8b6834aaaf5cb9f2059fcf67bb5c2e4388715e868b4824622e58b060e6a5975eba2810084c00a602fb180421a2b7b7570098a669ad58b1621b70180802d688d63ab711abadadfdbc94b2ce344d17e00524c0295b4812524a05f402078056c0601032681c274001d1d9b367cf9152da899e46e13c4b31684212308128104e6c8f6378b04b4b4b63272b182a2149a894cf38860129e5c9f79fe17a8ce31418276494619c905186e1ca9013a094e2b8b1c9b806360c199b36428410ac59b3068fc7a3b5b5b5b9bababa4428143a9ea49c47d23ed5d8d8686fdebcd92461a31a2cd24608c0c2850b7d555555cb84105f554a598ccd56226ddb8eb6b4b43c595d5dfd108e5818f41021ad843cf0c003f1bababab57bf6ec79aba9a9a9c2300c4f3aaf9f0d104208cbb2ac8f3efa28004c04dac904215eaf97b56bd7aab56bd776242a509cb8fe586b25c9f1591c88e0989804839427692344d7f56465e240178ef5722c43e190613104e19e36426ebdf5569e7aeaa964454cc64d2b082150437420a58d90a79e7a0aa514efbfff3eab57af1e6bddd431b02c8bbd7bf7aa1d3b760cf9dcb40af59e9e1e317dfaf4090f3ffc70795f5f9fb42c6b4c12a394b21b1b1b3bafbcf2ca761cb5f7cc7759008140c05b5555f5359fcf779bdfef5763d1bb2884909665450dc3580bfc08a7eb36067b7eda0859b06001d3a74fd78195c033c0598087b1a76541c2e721a5acb46d3b309413d346c8e6cd9b939b16d08df356b8187b26faa48a6bd8b6ddc710959bb476590c6858a1c4672cb68e54d864ca7492625c5443ad44aec2e7f3118b9dd431f8b148ab71f1b5d75ea3a4a4c4130c06dddddddda2afaf6fccb590847151eddab5cb7cf4d147e389dd99d1b2ce39e79c7ee3a26ddb63dab8d8dadafae4a38f3efa50625f668c8bf7dd775fbcaeae6ecdae5dbbde3874e85085aeeb1e31d6ecef806ddb564b4b4b07703699322e161414b06edd3ab56eddba2e1c197214d0d275fd2c4252cbd2851091841b62d0481b21e1709844450c9c40ba1ec6669705098baf52ca66880185692364f7eeddcc98312359199381e0afb186fefbcecfcf27128964c6b83863c60c945284c361d78e1d3bdcb66dd3d1d131e644881002d33469686830972f5f9e941d99d1b2745d777b3c9e2f5e72c9255799a6698f455b168e96a55f78e1851b962f5fbe9e449ac1604f4e2b211b366c50b5b5b507dadbdbff1608048ae2f1b89b2178cb720022d1428cfafa7a1ba8648881e9692364e6cc995c7bedb516b0056804ca0177baae9f6550802ea554b66d674686ecdab52b591113c7853bd66d59966ddb0619362e82330689e3a8bf63a5ab3a1ec96e3a738172c761ac47c60ffbdec7637b4719c60919651895849c247226db9403c731348c14f2919221a7052104adadad1228080402aeaeae2e2984c80a992484108661a88686065d08116588f274541202e0f7fb27e4e7e7ff72c284093312ba7c56b49244d449a4babafac96f7ce31b8f3030141814462d21f7dd775fd7942953beb67dfbf6a99d9d9d2596656585295f08816559768a3fe428d94ec8d2a54b59b56a958993131f05f271e45d56b4129cb19821840867cc1f924eac5ab50a9c9b8ae1bc6182ec21230995202373093b23802185618e420cb9eea352edede93926934165eb2767d4dee2e26294526cd9b2456cd8b0411ac6a04363338e8450a7bebe5e2554f5cc587bd38d7038ecaea9a939b7aaaaaa3012896493fc10b66d5b4d4d4d6dafbefaea61ce60f4fb097fb264c9127efef39f9fc62507609a66797e7efe8352ca595eaf17b247a80bdbb663c160f027c0c33856ef918d7eafacaca4a1a1a1f0e8d1a3de482422a2d1a8d075ddb8fcf2cbfb18620ad7c9b06cd9324a4a4a8e02d700938032b22b705b0171b7db5d6e18c6d1a19c382c42962d5be6292d2d5d5b565676594272d9e170f843e0cb38898e3aa7f1f056ae5c090331c2dd89eb659b2bd8300c23c299705099a629955213344d3b0b48469b848099c01e1c07d5e93ebc64026932c62b9bc848be3c4356db874548381c3e7e324c158bc5bc38ddcb41d2d7df67f33450c3aaf3b0083959ac956ddb9263f3d2d3d9c5642321c3c2a81c188e658c1332ca907142dc19afc1e8c219893ab9f762b4da4a64811b615a1034503fdc86f56117b691620bfde3bfc0c2dfc3d042cb720be924a49f849716e3bdb01caf5be2366c8a8a3d7c420a2a04e4d90a6528621797d3da1aa1cd52e85183d89fdb885eb681380965604609ecee4e63edb204e9214408a46dca7228bc773ee72d9acc055e8d85122e9282a9273b65820fa6158361531f3579775a31af4d29e2fd8e183df7be4f647777d69bde8785d327c48c23224151d9f466d95faee1bfce2d67e6604f15804732cbe36156b187dbaafd341f8ef0649ec66fdf0d70f8a583843501961a3bc40c8b903e7c0acb8058103e781136de4f61a0a5e0dc0a669ecea3f348a67cb290fbefba80db3f33891fe8162fbfda4c72fead3141ca500951000b8ffcc6cf960945bcf1001cdae34ca0e1e1844766296c4b61db0a4b2994022500211002a426909ac475fc30d3ab31694e254f3c5dc7e2a5efb1fcd7fb69c4b167e57cfefb500991f75ccc9485d6f65bdcbfbc792e0a671af914580a3b6e61e8367a632f47767773784f0f6d2d7d043b6284f35c70561ebe73fd949d5fc6e4e9c55495fba870493c9a18a88f0026e5f36f3f9ecf3fe4bbb8f3e9ddd4e3182e739a945313229cf80261c5e51dd3a8f9ce6c7ee4d198e894258e51604b4df5e956744f0fcdcfede783c71bd819b368c3310c8670e68bd719485e71013ea0e8a6f39875fbf95c3eab8c4bbc927c2106c647255e2e5e71098fb784f9da6bcdd47b35a2ba95bba47c2c21791a442de8a140a18744c18edff91fa9e3db9a9692eaac004d424105ed65b37aae7a70d3b35b8334006d4000e8c021248663b94d9dfb2369fbf23eb397bf3fb397376e3a8fb9df9bc36d930b982585f33f0228f372e1e397f2fdea67f9ba6e71c82389c67394928f1d27479df7585dd3fc44a1f6c62abf6bdd1d9e63c800c82b82e90b50776f523d37fc2ab4354883807ae03d9c55630ee01013c46921111c726289ed10d029042dc0ee67f6f2d2dc17b9635b07eb554ad72405727201f35ff92cb70065713b7733b34e2024d5aa1eb811ff25a2f1dbf20f2bca8f6f4b76e104c5d5f7c3dd6fc0e40bd08c3e05f42868c621a10fa755243d8827d39214602b852520ecd1683f1ae5c36bdfe47b1f74f08bd403dd92fc4bcfe6ba697e2e000a4f56f75cc03137a5be95101940eb0d1496f9f88e4772776abbb015ea48dc133cfa8535dd2cb82b71627fe86dd27f3cd4d5779402e21696df4de4608803dfdfca836d11de4af5ace4bba87c643ed703a5621407689c0efa09e9b909c403cef681ebc99b90c77fba044b530fb614f6fe5e5a17bfee59d75531abfd24d74bfa4086eda0ea359c94b8973fe2c0abcdacb0ed810001af46de45657c0a98a29cf0d26c097c18342440e3f550fc8cb3a3fd465c530ab9c125b83ff54025a4aaefe4e0dc17f84553c4b3bdd45fd03782f55240ac3bcedfdb63fcb67faf80420f155f9ac66c72b4db9200d5cf393f1e9c8328f430df2d5973ec511a91c973f58b5fe0b95e83bf9f555eb2c3eff78747ba72af7c446720ca2bfd3b14b804de4f4fe47cc04f0ea65d1ff386dd7201555e8d678fd92f04d6d4b976f8a6e7a2ca11d6fb6a6a6a9add6ef7888713be759858b74e8352031a9726707fa280b3812272508ef43ff8835fa2a0c8cd1382c4a02f8180eeea0e7ee99988f015291ccda9bba6a62636d273987812352bf512b31447fa2b2c90856efc3832243709d9f4cfb826e673b3142c4e2dec3388def5176da3955fa14bd11f9663e7e7e78fb8a12f39f0f3695808e2294502671e2e37d995333228c8b995f08fe54c724b7e985a60d8988fede4ede79bb46d3e8fcb48040e9b30bc64c6e122cf8526a134f9db56d8e178ff1a8a39450680acef4274c570f519fc9f61130147c5792fc0be6f6f6153698167afdbed8e4b29873ce5693a90a7512a0525c9df96c26a8dd08333d6c939038a8c5970de6f38e4ff194bde3ec29a884947678c8eeb37f112d0545c5cbc4fd3b4e440ef8cbe910dd7915fe0667eff0ee1b4dcad1d1ce1582b40ce2019c06c037d97ff8187be3283f74b3cd41c8e500fecaeaeaeeef8b84510471a93f229714bae4edd173589bdd8c4411cdb58b2ebca1952925a8a8d935c19f8e96e5e07b624eef2e8f9e79f7f467ddbea1e10ff0bcf2f427a24b334415db2ccb4b0f7f570b83dc61101bd2a073d89a96aa3c279e3ba8170e22ecdcaca4aef89a78d0c9abee89001f0d9c94cf46afc777fa180b049f48583ec0082ca592839e756ac3e991e6fe338920084659d997b5ebf18aa9e75b68fde88cfe7e26a2958942c570a5ac31c7db89ead3899b97de4a250cf7405001efb147ce133cef6772f42f83dccf7481e4c3da6374ef8a77b780f382c1c07987ec2857200191fe96ebe0a2efb0a886b9cdfff53cb451ec9e3405ef2184b616fefa471f587bc0bb42867c6ba9cebae20c3841cb81ece790ef883f33b7233177a246b85e0bcd4e39afb68bff3cfbc0e1cc27180252775c939648c90e012284de487beb808f9d9a9d47a258f4b416dea711d317a57ed60d3ce2e3e948203b6a2931c5e012e2384bc77f500192d5fc65deea3ce2bf989382eecb4374ee4378dfcf5f106de96827db6a2951c951d496484907f7ad9f90e2ec15be0e6f36ec9d3380ea77ef4c689ac6f62cb9d7fe26501fb6c45234e5044ce6956a9c8a896a5e02c4df018c79111b731df6c65e757dee645609f721249735690a722a3843cbd9b8e8321965bea5899a09c94858826e800f625be739e0cc82021f7d6c2b7fe4aecfa4dbcb4a79b27535526af86fbdfab98f7bbcb9907484b41d919b31764161923e47b5ba1cc8bdad24ed757dfe1a1963e7e9f5aae09bc574d65c9cfeaf857a0b44b47cb73e59effe37864b4cbead2513e17e6bb015a96fd8de55d3a5b53cbdd92c2ebce61d9f7e7b008288e9ae3848c3862a6e31afef57ef63e5ccfd2b0c947a9e5f92e26fc470df7947999468ec662a522e38424a080d80fb6b1f5b9fd2cd52d82c9c71e36d11b82f49678f82403b158394b4ada08494e4283f37087e3c9b381de5bde61d3a666be6b9a447b747a9fdfcf9f3eb3815f3586083010a6aa12ff99aeea8f1aa46d60a8699a3671e2c4e22baeb8a2fcf6db6f374a4b4b6ddb1eda184e0ac1ae964ef9c10b4fbc531cfae3d3cda1f8d45bf7f9dfa9ad2d6a9f397346f7e73ef739dfecd9b32bdd6eb77df0e0c1981022428ed9b4d24288104254545414af5fbffebaaaaaaa3abfdf1f95520eeb414d9c34894fd7fe58b6f7463cdece4eb14dc517959496868a8b8bfbdc6eb795b23cf66660238e5d2b67c628696b2145454545f3e6cd5b98b6eb1516503da9f2a4658661d8dddddd79c0361c67558c1c6929a345a80f099665c50f1f3e5c8a331d949b1c2103864948228c3463537f0b215c96657971727f732a606e585d56281452baae1f8c46a3d5baaebb1273659d11082144341a8d0583c120391e753268ac5ebd5a5fbd7af5ddc00ca00a279bf64cc2064252ca1edbb6738a94614d1c80f34022c07ee00867befb528069db762f39e6b01aae9625185884385373f62413496db24f86a88f1ba39d9290840017524af737bff9cd0be6cd9be79b3367ceb9050505166476b42c84c8bad1ba10826834aa0b216a841027f42ca724c4344d9452bacbe572af58b1e21edbb693339266db5b396a5058580810370c43eaba6e92129f7c4a429a9b9bed8e8e8e8d6d6d6de78442a1024065cb7a50a31cc2e5727976eedcd9c4406ac5a05673d670a698a9022ac8d2c1e42886e976bb038661b400d1c11022189828c633a2551b9b48ae241407aca1ca81f1d6917e1c33edc8ff0311504d2a89d602380000000049454e44ae426082 + + + + + + + + ShapeItem1 + + + + + ReportHeader1 + + + + + + + + + + + + ShapeItem2 + + + + + ReportHeader1 + + + + + + + + + + + + TextItem9 + + + + + ReportHeader1 + + + REPORT + + + + + + + + + + + + + + + TextItem10 + + + + + ReportHeader1 + + + HEADER + + + + + + + + + + + + + + + + + ReportPage1 + + + + + + + + + + DataBand1 + + + + TextItem3 + + + + + DataBand1 + + + $D{orders.OrderDate} + + + + + + + + + + + + + + + TextItem4 + + + + + DataBand1 + + + $D{orders.OrderID} + + + + + + + + + + + + + + + TextItem12 + + + + + DataBand1 + + + DATA BAND + + + + + + + + + + + + + + + TextItem16 + + + + + DataBand1 + + + OrderID + + + + + + + + + + + + + + + TextItem17 + + + + + DataBand1 + + + Order Date + + + + + + + + + + + + + + + + + ReportPage1 + + + + + + + orders + + + + + + + GroupBandHeader1 + + + + TextItem2 + + + + + GroupBandHeader1 + + + $D{orders.CompanyName} + + + + + + + + + + + + + + + ShapeItem3 + + + + + GroupBandHeader1 + + + + + + + + + + + + TextItem11 + + + + + GroupBandHeader1 + + + GROUP HEADER + + + + + + + + + + + + + + + + + ReportPage1 + + + + DataBand1 + + + CompanyName + + + + + SubDetailBand1 + + + + TextItem5 + + + + + SubDetailBand1 + + + $D{orderitems.ProductName} + + + + + + + + + + + + + + + TextItem6 + + + + + SubDetailBand1 + + + $D{orderitems.Quantity} + + + + + + + + + + + + + + + TextItem7 + + + + + SubDetailBand1 + + + $S{line("SubDetailBand1")} + + + + + + + + + + + + + + + TextItem13 + + + + + SubDetailBand1 + + + SUBDETAIL BAND + + + + + + + + + + + + + + + + + ReportPage1 + + + + DataBand1 + + + orderitems + + + + SubDetailFooterBand1 + + + + TextItem8 + + + + + SubDetailFooterBand1 + + + $S{SUM($D{orderitems.Quantity},"SubDetailBand1")} + + + + + + + + + + + + + + + TextItem14 + + + + + SubDetailFooterBand1 + + + SUBDETAIL FOOTER + + + + + + + + + + + + + + + TextItem15 + + + + + SubDetailFooterBand1 + + + Total + + + + + + + + + + + + + + + ShapeItem4 + + + + + SubDetailFooterBand1 + + + + + + + + + + + + + + ReportPage1 + + + + SubDetailBand1 + + + + + + + + + + + + + + + + + + + datasources + + + + northwind + QSQLITE + ./demo_reports/northwind.db + + + + + + + + + + orders + Select * from orders +inner join customers on customers.customerid = orders.customerid order by companyname +limit 50 + northwind + + + + + + orderitems + Select * from orderitems + inner join products on products.productid = orderitems.productid +where orderid = $D{orders.orderid} + northwind + orders + + + + + + + diff --git a/demo_r2/demo_reports/northwind.db b/demo_r2/demo_reports/northwind.db new file mode 100644 index 0000000..42a4ef6 Binary files /dev/null and b/demo_r2/demo_reports/northwind.db differ diff --git a/demo_r2/images/First.png b/demo_r2/images/First.png new file mode 100644 index 0000000..0c98969 Binary files /dev/null and b/demo_r2/images/First.png differ diff --git a/demo_r2/images/FitPage.png b/demo_r2/images/FitPage.png new file mode 100644 index 0000000..c79ca9d Binary files /dev/null and b/demo_r2/images/FitPage.png differ diff --git a/demo_r2/images/FitWidth.png b/demo_r2/images/FitWidth.png new file mode 100644 index 0000000..899f3d1 Binary files /dev/null and b/demo_r2/images/FitWidth.png differ diff --git a/demo_r2/images/Last.png b/demo_r2/images/Last.png new file mode 100644 index 0000000..c705017 Binary files /dev/null and b/demo_r2/images/Last.png differ diff --git a/demo_r2/images/Next.png b/demo_r2/images/Next.png new file mode 100644 index 0000000..3b2dd70 Binary files /dev/null and b/demo_r2/images/Next.png differ diff --git a/demo_r2/images/OneToOne.png b/demo_r2/images/OneToOne.png new file mode 100644 index 0000000..4b7184b Binary files /dev/null and b/demo_r2/images/OneToOne.png differ diff --git a/demo_r2/images/PDF.png b/demo_r2/images/PDF.png new file mode 100644 index 0000000..6e68818 Binary files /dev/null and b/demo_r2/images/PDF.png differ diff --git a/demo_r2/images/Prev.png b/demo_r2/images/Prev.png new file mode 100644 index 0000000..8912f07 Binary files /dev/null and b/demo_r2/images/Prev.png differ diff --git a/demo_r2/images/Print.png b/demo_r2/images/Print.png new file mode 100644 index 0000000..8ce4960 Binary files /dev/null and b/demo_r2/images/Print.png differ diff --git a/demo_r2/images/ZoomIn.png b/demo_r2/images/ZoomIn.png new file mode 100644 index 0000000..ecbff88 Binary files /dev/null and b/demo_r2/images/ZoomIn.png differ diff --git a/demo_r2/images/ZoomOut.png b/demo_r2/images/ZoomOut.png new file mode 100644 index 0000000..da1e2ef Binary files /dev/null and b/demo_r2/images/ZoomOut.png differ diff --git a/demo_r2/images/design.png b/demo_r2/images/design.png new file mode 100644 index 0000000..24e41bb Binary files /dev/null and b/demo_r2/images/design.png differ diff --git a/demo_r2/images/folder3.png b/demo_r2/images/folder3.png new file mode 100644 index 0000000..d857735 Binary files /dev/null and b/demo_r2/images/folder3.png differ diff --git a/demo_r2/images/logo.png b/demo_r2/images/logo.png new file mode 100644 index 0000000..a466bbb Binary files /dev/null and b/demo_r2/images/logo.png differ diff --git a/demo_r2/images/logo1.png b/demo_r2/images/logo1.png new file mode 100644 index 0000000..29f3370 Binary files /dev/null and b/demo_r2/images/logo1.png differ diff --git a/demo_r2/images/lr.png b/demo_r2/images/lr.png new file mode 100644 index 0000000..2206744 Binary files /dev/null and b/demo_r2/images/lr.png differ diff --git a/demo_r2/images/new_leaf1.png b/demo_r2/images/new_leaf1.png new file mode 100644 index 0000000..d89f8d3 Binary files /dev/null and b/demo_r2/images/new_leaf1.png differ diff --git a/demo_r2/main.cpp b/demo_r2/main.cpp new file mode 100644 index 0000000..b48f94e --- /dev/null +++ b/demo_r2/main.cpp @@ -0,0 +1,11 @@ +#include "mainwindow.h" +#include + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + MainWindow w; + w.show(); + + return a.exec(); +} diff --git a/demo_r2/main.ico b/demo_r2/main.ico new file mode 100644 index 0000000..6bd0818 Binary files /dev/null and b/demo_r2/main.ico differ diff --git a/demo_r2/mainicon.rc b/demo_r2/mainicon.rc new file mode 100644 index 0000000..83c0128 --- /dev/null +++ b/demo_r2/mainicon.rc @@ -0,0 +1 @@ +DI_ICON1 ICON "main.ico" diff --git a/demo_r2/mainwindow.cpp b/demo_r2/mainwindow.cpp new file mode 100644 index 0000000..45e4b84 --- /dev/null +++ b/demo_r2/mainwindow.cpp @@ -0,0 +1,123 @@ +#include "mainwindow.h" +#include "ui_mainwindow.h" +#include +#include +#include +#include + +MainWindow::MainWindow(QWidget *parent) : + QMainWindow(parent), + ui(new Ui::MainWindow) +{ + ui->setupUi(this); + m_preview = m_report.createPreviewWidget(); + connect(m_preview,SIGNAL(scalePercentChanged(int)), this, SLOT(slotScalePercentChanged(int))); + ui->groupBox_2->layout()->addWidget(m_preview); + buildReportsTree(QApplication::applicationDirPath()+"/demo_reports/", ui->treeWidget); + connect(ui->tbZoomIn, SIGNAL(clicked(bool)), m_preview, SLOT(zoomIn())); + connect(ui->tbZoomOut, SIGNAL(clicked(bool)), m_preview, SLOT(zoomOut())); + connect(ui->tbFirstPage, SIGNAL(clicked(bool)), m_preview, SLOT(firstPage())); + connect(ui->tbPrevPage, SIGNAL(clicked(bool)), m_preview, SLOT(priorPage())); + connect(ui->tbNextPage, SIGNAL(clicked(bool)), m_preview, SLOT(nextPage())); + connect(ui->tbLastPage, SIGNAL(clicked(bool)), m_preview, SLOT(lastPage())); + connect(ui->cbScalePercent, SIGNAL(currentIndexChanged(QString)), this, SLOT(scaleComboboxChanged(QString))); + connect(ui->tbFitWidth, SIGNAL(clicked(bool)), m_preview, SLOT(fitWidth())); + connect(ui->tbFitPage, SIGNAL(clicked(bool)), m_preview, SLOT(fitPage())); + connect(m_preview, SIGNAL(pagesSet(int)), this, SLOT(slotPagesSet(int))); + connect(m_preview, SIGNAL(pageChanged(int)), this, SLOT(slotPageChanged(int))); + connect(ui->tbPDFExport, SIGNAL(clicked(bool)), m_preview, SLOT(printToPDF())); + connect(ui->tbPrint, SIGNAL(clicked(bool)), m_preview, SLOT(print())); + initPercentCombobox(); + enableUI(false); + QDesktopWidget *desktop = QApplication::desktop(); + + int screenWidth = desktop->screenGeometry().width(); + int screenHeight = desktop->screenGeometry().height(); + + int x = screenWidth*0.1; + int y = screenHeight*0.1; + + resize(screenWidth*0.8, screenHeight*0.8); + move(x, y); + if (QFile::exists(QApplication::applicationDirPath()+"/demo_reports/categories.lrxml")){ + m_report.loadFromFile(QApplication::applicationDirPath()+"/demo_reports/categories.lrxml"); + m_preview->refreshPages(); + } +} + +MainWindow::~MainWindow() +{ + delete ui; +} + +void MainWindow::enableUI(bool value) +{ + ui->tbDesign->setEnabled(value); + ui->tbPrint->setEnabled(value); + ui->tbPDFExport->setEnabled(value); + ui->tbFirstPage->setEnabled(value); + ui->tbPrevPage->setEnabled(value); + ui->tbNextPage->setEnabled(value); + ui->tbLastPage->setEnabled(value); + ui->tbZoomIn->setEnabled(value); + ui->tbZoomOut->setEnabled(value); + ui->tbFitWidth->setEnabled(value); + ui->tbFitPage->setEnabled(value); + ui->tbOneToOne->setEnabled(value); + ui->sbPageNavigator->setEnabled(value); + ui->cbScalePercent->setEnabled(value); +} + +void MainWindow::slotScalePercentChanged(int percent) +{ + ui->cbScalePercent->setCurrentText(QString("%1%").arg(percent)); +} + +void MainWindow::scaleComboboxChanged(QString text) +{ + m_preview->setScalePercent(text.remove(text.count()-1,1).toInt()); +} + +void MainWindow::slotPagesSet(int pagesCount) +{ + ui->sbPageNavigator->setSuffix(tr(" of %1").arg(pagesCount)); + ui->sbPageNavigator->setMinimum(1); + ui->sbPageNavigator->setMaximum(pagesCount); + ui->sbPageNavigator->setValue(1); + enableUI(true); +} + +void MainWindow::slotPageChanged(int page) +{ + ui->sbPageNavigator->setValue(page); +} + +void MainWindow::on_treeWidget_itemClicked(QTreeWidgetItem *item, int ) +{ + m_report.loadFromFile(item->data(0,Qt::UserRole).toString()); + m_preview->refreshPages(); +} + +void MainWindow::initPercentCombobox() +{ + for (int i = 10; i<310; i+=10){ + ui->cbScalePercent->addItem(QString("%1%").arg(i)); + } + ui->cbScalePercent->setCurrentIndex(4); +} + +void MainWindow::on_sbPageNavigator_valueChanged(int arg1) +{ + m_preview->pageNavigatorChanged(arg1); +} + +void MainWindow::on_tbDesign_clicked() +{ + m_report.designReport(); + m_preview->refreshPages(); +} + +void MainWindow::on_tbOneToOne_clicked() +{ + m_preview->setScalePercent(100); +} diff --git a/demo_r2/mainwindow.h b/demo_r2/mainwindow.h new file mode 100644 index 0000000..5d9d176 --- /dev/null +++ b/demo_r2/mainwindow.h @@ -0,0 +1,61 @@ +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include +#include +#include +#include +#include + +namespace Ui { +class MainWindow; +} + +class MainWindow : public QMainWindow +{ + Q_OBJECT + +public: + explicit MainWindow(QWidget *parent = 0); + ~MainWindow(); +private: + void enableUI(bool value); +private slots: + void slotScalePercentChanged(int percent); + void scaleComboboxChanged(QString text); + void slotPagesSet(int pagesCount); + void slotPageChanged(int page); + void on_treeWidget_itemClicked(QTreeWidgetItem *item, int); + void on_sbPageNavigator_valueChanged(int arg1); + void on_tbDesign_clicked(); + void on_tbOneToOne_clicked(); +private: + template< typename T > + void buildReportsTree(const QString &path, T* parentItem) + { + QDir reportsDir(path); + QStringList items = reportsDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot); + foreach( QString dir, items){ + QTreeWidgetItem* listItem = new QTreeWidgetItem(parentItem); + listItem->setText(0,dir); + listItem->setIcon(0,QIcon(":/images/images/folder.png")); + buildReportsTree(reportsDir.path()+"/"+dir, listItem); + } + QStringList nameFilters; + nameFilters <<"*.lrxml"; + items = reportsDir.entryList(nameFilters, QDir::Files); + foreach( QString file, items){ + QTreeWidgetItem* listItem = new QTreeWidgetItem(parentItem); + listItem->setIcon(0,QIcon(":/images/images/report.png")); + listItem->setText(0,file); + listItem->setData(0,Qt::UserRole,reportsDir.path()+"/"+file); + } + } + void initPercentCombobox(); +private: + Ui::MainWindow *ui; + LimeReport::ReportEngine m_report; + LimeReport::PreviewReportWidget* m_preview; +}; + +#endif // MAINWINDOW_H diff --git a/demo_r2/mainwindow.ui b/demo_r2/mainwindow.ui new file mode 100644 index 0000000..84ccfc8 --- /dev/null +++ b/demo_r2/mainwindow.ui @@ -0,0 +1,587 @@ + + + MainWindow + + + + 0 + 0 + 1157 + 554 + + + + Lime Report Demo + + + + :/images/images/logo1.png:/images/images/logo1.png + + + + + + + + + + + + 75 + true + + + + Reports + + + + + + + 0 + 0 + + + + + 200 + 16777215 + + + + + 50 + false + + + + false + + + false + + + + 1 + + + + + + + + + + + 7 + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 50 + 59 + + + + + + + :/images/images/logo1.png + + + true + + + + + + + 1 + + + 5 + + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + + + + + + 127 + 170 + 24 + + + + + + + 0 + 189 + 0 + + + + + + + + + 127 + 170 + 24 + + + + + + + 0 + 189 + 0 + + + + + + + + + 190 + 190 + 190 + + + + + + + 190 + 190 + 190 + + + + + + + + + 14 + 75 + true + + + + Lime Report + + + Qt::AlignCenter + + + + + + + + 14 + 75 + true + + + + DEMO + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + + + + + + + + 75 + true + + + + Preview + + + + 4 + + + + + 2 + + + + + + 6 + + + + ... + + + + :/images/images/design.png:/images/images/design.png + + + + 24 + 24 + + + + true + + + + + + + QFrame::VLine + + + QFrame::Sunken + + + + + + + + + + ... + + + + :/images/images/Print.png:/images/images/Print.png + + + + 24 + 24 + + + + true + + + + + + + ... + + + + :/images/images/PDF.png:/images/images/PDF.png + + + + 24 + 24 + + + + true + + + + + + + QFrame::VLine + + + QFrame::Sunken + + + + + + + + + + ... + + + + :/images/images/ZoomIn.png:/images/images/ZoomIn.png + + + + 24 + 24 + + + + true + + + + + + + ... + + + + :/images/images/ZoomOut.png:/images/images/ZoomOut.png + + + + 24 + 24 + + + + true + + + + + + + true + + + true + + + + + + + ... + + + + :/images/images/OneToOne.png:/images/images/OneToOne.png + + + + 24 + 24 + + + + true + + + + + + + ... + + + + :/images/images/FitWidth.png:/images/images/FitWidth.png + + + + 24 + 24 + + + + true + + + + + + + ... + + + + :/images/images/FitPage.png:/images/images/FitPage.png + + + + 24 + 24 + + + + true + + + + + + + QFrame::VLine + + + QFrame::Sunken + + + + + + + + + + ... + + + + :/images/images/First.png:/images/images/First.png + + + + 24 + 24 + + + + true + + + + + + + ... + + + + :/images/images/Prev.png:/images/images/Prev.png + + + + 24 + 24 + + + + true + + + + + + + Page: + + + 10000000 + + + + + + + ... + + + + :/images/images/Next.png:/images/images/Next.png + + + + 24 + 24 + + + + true + + + + + + + ... + + + + :/images/images/Last.png:/images/images/Last.png + + + + 24 + 24 + + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/UserManualEn.pdf b/docs/UserManualEn.pdf new file mode 100644 index 0000000..623eb32 Binary files /dev/null and b/docs/UserManualEn.pdf differ diff --git a/docs/UserManualRu.pdf b/docs/UserManualRu.pdf new file mode 100644 index 0000000..9d3e4b0 Binary files /dev/null and b/docs/UserManualRu.pdf differ diff --git a/include/lrpreviewreportwidget.h b/include/lrpreviewreportwidget.h index 220843b..d9cde20 100644 --- a/include/lrpreviewreportwidget.h +++ b/include/lrpreviewreportwidget.h @@ -24,20 +24,25 @@ public: ~PreviewReportWidget(); public slots: void refreshPages(); - void slotZoomIn(); - void slotZoomOut(); + void zoomIn(); + void zoomOut(); - void slotFirstPage(); - void slotPriorPage(); - void slotNextPage(); - void slotLastPage(); + void firstPage(); + void priorPage(); + void nextPage(); + void lastPage(); - void slotPrint(); - void slotPrintToPDF(); - void slotPageNavigatorChanged(int value); - void slotSaveToFile(); + void print(); + void printToPDF(); + void pageNavigatorChanged(int value); + void saveToFile(); + void setScalePercent(int percent); + void fitWidth(); + void fitPage(); signals: void pageChanged(int page); + void scalePercentChanged(int percent); + void pagesSet(int pageCount); private slots: void slotSliderMoved(int value); void reportEngineDestroyed(QObject* object); @@ -45,6 +50,7 @@ private: void initPreview(); void setErrorsMesagesVisible(bool visible); void setErrorMessages(const QStringList &value); + void emitPageSet(); private: Ui::PreviewReportWidget *ui; PreviewReportWidgetPrivate* d_ptr; diff --git a/limereport.pro b/limereport.pro index 9ec2517..2b46b10 100644 --- a/limereport.pro +++ b/limereport.pro @@ -9,7 +9,7 @@ SUBDIRS += \ CONFIG += ordered -SUBDIRS += demo_r1 +SUBDIRS += demo_r1 demo_r2 diff --git a/limereport/images/FitPage.png b/limereport/images/FitPage.png new file mode 100644 index 0000000..a630918 Binary files /dev/null and b/limereport/images/FitPage.png differ diff --git a/limereport/images/FitWidth.png b/limereport/images/FitWidth.png new file mode 100644 index 0000000..af2fed9 Binary files /dev/null and b/limereport/images/FitWidth.png differ diff --git a/limereport/images/OneToOne.png b/limereport/images/OneToOne.png new file mode 100644 index 0000000..0858cdf Binary files /dev/null and b/limereport/images/OneToOne.png differ diff --git a/limereport/limereport.pro b/limereport/limereport.pro index 309a17a..341a3b4 100644 --- a/limereport/limereport.pro +++ b/limereport/limereport.pro @@ -32,7 +32,6 @@ unix:{ for(FILE,EXTRA_FILES){ QMAKE_POST_LINK += $$QMAKE_COPY $$quote($$FILE) $$quote($${DEST_INCLUDE_DIR}) $$escape_expand(\\n\\t) # inside of libs make /include/files } - } macx{ for(FILE,EXTRA_FILES){ @@ -40,21 +39,21 @@ unix:{ } QMAKE_POST_LINK += mkdir -p $$quote($${DESTDIR}/include) $$escape_expand(\\n\\t) } - QMAKE_POST_LINK += $(COPY_DIR) $$quote($${DEST_INCLUDE_DIR}*) $$quote($${DESTDIR}/include) + QMAKE_POST_LINK += $$QMAKE_COPY_DIR $$quote($${DEST_INCLUDE_DIR}) $$quote($${DESTDIR}) } win32 { EXTRA_FILES ~= s,/,\\,g BUILD_DIR ~= s,/,\\,g DESTDIR = $${BUILD_DIR}/$${BUILD_TYPE}/lib - DEST_DIR = $$DESTDIR/include/ + DEST_DIR = $$DESTDIR/include DEST_DIR ~= s,/,\\,g DEST_INCLUDE_DIR ~= s,/,\\,g for(FILE,EXTRA_FILES){ QMAKE_POST_LINK += $$QMAKE_COPY $$quote($$FILE) $$quote($${DEST_INCLUDE_DIR}) $$escape_expand(\\n\\t) } - QMAKE_POST_LINK += $(COPY_DIR) $$quote($${DEST_INCLUDE_DIR}*) $$quote($${DEST_DIR}) + QMAKE_POST_LINK += $$QMAKE_COPY_DIR $$quote($${DEST_INCLUDE_DIR}\\*) $$quote($${DEST_DIR}) } contains(CONFIG,zint){ diff --git a/limereport/lrpreviewreportwidget.cpp b/limereport/lrpreviewreportwidget.cpp index 7becc8d..47b3fb9 100644 --- a/limereport/lrpreviewreportwidget.cpp +++ b/limereport/lrpreviewreportwidget.cpp @@ -46,9 +46,17 @@ void PreviewReportWidgetPrivate::setPages(ReportPages pages) if (pages.at(0)) pages.at(0)->setSelected(true); m_changingPage = false; q_ptr->initPreview(); + q_ptr->emitPageSet(); } } +PageItemDesignIntf::Ptr PreviewReportWidgetPrivate::currentPage() +{ + if (m_reportPages.count()>m_currentPage) + return m_reportPages.at(m_currentPage-1); + else return PageItemDesignIntf::Ptr(0); +} + PreviewReportWidget::PreviewReportWidget(ReportEnginePrivate *report, QWidget *parent) : QWidget(parent), ui(new Ui::PreviewReportWidget), d_ptr(new PreviewReportWidgetPrivate(this)) @@ -75,9 +83,11 @@ PreviewReportWidget::~PreviewReportWidget() void PreviewReportWidget::initPreview() { - ui->graphicsView->setScene(d_ptr->m_previewPage); + if (ui->graphicsView->scene()!=d_ptr->m_previewPage) + ui->graphicsView->setScene(d_ptr->m_previewPage); + ui->graphicsView->resetMatrix(); ui->graphicsView->centerOn(0, 0); - ui->graphicsView->scale(0.5,0.5); + setScalePercent(d_ptr->m_scalePercent); } void PreviewReportWidget::setErrorsMesagesVisible(bool visible) @@ -85,17 +95,20 @@ void PreviewReportWidget::setErrorsMesagesVisible(bool visible) ui->errorsView->setVisible(visible); } -void PreviewReportWidget::slotZoomIn() +void PreviewReportWidget::zoomIn() { - ui->graphicsView->scale(1.2,1.2); + d_ptr->m_scalePercent += 10; + setScalePercent(d_ptr->m_scalePercent); } -void PreviewReportWidget::slotZoomOut() +void PreviewReportWidget::zoomOut() { - ui->graphicsView->scale(1/1.2,1/1.2); + if (d_ptr->m_scalePercent>0) + d_ptr->m_scalePercent -= 10; + setScalePercent(d_ptr->m_scalePercent); } -void PreviewReportWidget::slotFirstPage() +void PreviewReportWidget::firstPage() { d_ptr->m_changingPage=true; if ((!d_ptr->m_reportPages.isEmpty())&&(d_ptr->m_currentPage>1)){ @@ -106,7 +119,7 @@ void PreviewReportWidget::slotFirstPage() d_ptr->m_changingPage=false; } -void PreviewReportWidget::slotPriorPage() +void PreviewReportWidget::priorPage() { d_ptr->m_changingPage=true; if ((!d_ptr->m_reportPages.isEmpty())&&(d_ptr->m_currentPage>1)){ @@ -117,7 +130,7 @@ void PreviewReportWidget::slotPriorPage() d_ptr->m_changingPage=false; } -void PreviewReportWidget::slotNextPage() +void PreviewReportWidget::nextPage() { d_ptr->m_changingPage=true; if ((!d_ptr->m_reportPages.isEmpty())&&(d_ptr->m_reportPages.count()>(d_ptr->m_currentPage))){ @@ -128,7 +141,7 @@ void PreviewReportWidget::slotNextPage() d_ptr->m_changingPage=false; } -void PreviewReportWidget::slotLastPage() +void PreviewReportWidget::lastPage() { d_ptr->m_changingPage=true; if ((!d_ptr->m_reportPages.isEmpty())&&(d_ptr->m_reportPages.count()>(d_ptr->m_currentPage))){ @@ -139,7 +152,7 @@ void PreviewReportWidget::slotLastPage() d_ptr->m_changingPage=false; } -void PreviewReportWidget::slotPrint() +void PreviewReportWidget::print() { QPrinter printer(QPrinter::HighResolution); QPrintDialog dialog(&printer,QApplication::activeWindow()); @@ -150,10 +163,13 @@ void PreviewReportWidget::slotPrint() printer, PrintRange(dialog.printRange(),dialog.fromPage(),dialog.toPage()) ); + foreach(PageItemDesignIntf::Ptr pageItem, d_ptr->m_reportPages){ + d_ptr->m_previewPage->reactivatePageItem(pageItem); + } } } -void PreviewReportWidget::slotPrintToPDF() +void PreviewReportWidget::printToPDF() { QString fileName = QFileDialog::getSaveFileName(this,tr("PDF file name"),"","PDF(*.pdf)" ); if (!fileName.isEmpty()){ @@ -169,7 +185,7 @@ void PreviewReportWidget::slotPrintToPDF() } } -void PreviewReportWidget::slotPageNavigatorChanged(int value) +void PreviewReportWidget::pageNavigatorChanged(int value) { if (d_ptr->m_changingPage) return; d_ptr->m_changingPage = true; @@ -180,7 +196,7 @@ void PreviewReportWidget::slotPageNavigatorChanged(int value) d_ptr->m_changingPage=false; } -void PreviewReportWidget::slotSaveToFile() +void PreviewReportWidget::saveToFile() { QString fileName = QFileDialog::getSaveFileName(this,tr("Report file name")); if (!fileName.isEmpty()){ @@ -192,6 +208,32 @@ void PreviewReportWidget::slotSaveToFile() } } +void PreviewReportWidget::setScalePercent(int percent) +{ + ui->graphicsView->resetMatrix(); + d_ptr->m_scalePercent = percent; + qreal scaleSize = percent/100.0; + ui->graphicsView->scale(scaleSize, scaleSize); + emit scalePercentChanged(percent); +} + +void PreviewReportWidget::fitWidth() +{ + if (d_ptr->currentPage()){ + qreal scalePercent = ui->graphicsView->viewport()->width() / ui->graphicsView->scene()->width(); + setScalePercent(scalePercent*100); + } +} + +void PreviewReportWidget::fitPage() +{ + if (d_ptr->currentPage()){ + qreal vScale = ui->graphicsView->viewport()->width() / ui->graphicsView->scene()->width(); + qreal hScale = ui->graphicsView->viewport()->height() / d_ptr->currentPage()->height(); + setScalePercent(qMin(vScale,hScale)*100); + } +} + void PreviewReportWidget::setErrorMessages(const QStringList &value) { foreach (QString line, value) { @@ -199,6 +241,11 @@ void PreviewReportWidget::setErrorMessages(const QStringList &value) } } +void PreviewReportWidget::emitPageSet() +{ + emit pagesSet(d_ptr->m_reportPages.count()); +} + void PreviewReportWidget::refreshPages() { if (d_ptr->m_report){ @@ -207,15 +254,7 @@ void PreviewReportWidget::refreshPages() ReportPages pages = d_ptr->m_report->renderToPages(); d_ptr->m_report->dataManager()->setDesignTime(true); if (pages.count()>0){ - d_ptr->m_reportPages = pages; - if (!d_ptr->m_reportPages.isEmpty()){ - d_ptr->m_previewPage->setPageItems(d_ptr->m_reportPages); - d_ptr->m_changingPage = true; - d_ptr->m_currentPage = 1; - if (pages.at(0)) pages.at(0)->setSelected(true); - d_ptr->m_changingPage = false; - } - ui->graphicsView->centerOn(0, 0); + d_ptr->setPages(pages); } } catch (ReportError &exception){ d_ptr->m_report->saveError(exception.what()); diff --git a/limereport/lrpreviewreportwidget.h b/limereport/lrpreviewreportwidget.h index 220843b..d9cde20 100644 --- a/limereport/lrpreviewreportwidget.h +++ b/limereport/lrpreviewreportwidget.h @@ -24,20 +24,25 @@ public: ~PreviewReportWidget(); public slots: void refreshPages(); - void slotZoomIn(); - void slotZoomOut(); + void zoomIn(); + void zoomOut(); - void slotFirstPage(); - void slotPriorPage(); - void slotNextPage(); - void slotLastPage(); + void firstPage(); + void priorPage(); + void nextPage(); + void lastPage(); - void slotPrint(); - void slotPrintToPDF(); - void slotPageNavigatorChanged(int value); - void slotSaveToFile(); + void print(); + void printToPDF(); + void pageNavigatorChanged(int value); + void saveToFile(); + void setScalePercent(int percent); + void fitWidth(); + void fitPage(); signals: void pageChanged(int page); + void scalePercentChanged(int percent); + void pagesSet(int pageCount); private slots: void slotSliderMoved(int value); void reportEngineDestroyed(QObject* object); @@ -45,6 +50,7 @@ private: void initPreview(); void setErrorsMesagesVisible(bool visible); void setErrorMessages(const QStringList &value); + void emitPageSet(); private: Ui::PreviewReportWidget *ui; PreviewReportWidgetPrivate* d_ptr; diff --git a/limereport/lrpreviewreportwidget_p.h b/limereport/lrpreviewreportwidget_p.h index 6d2a8b9..695b605 100644 --- a/limereport/lrpreviewreportwidget_p.h +++ b/limereport/lrpreviewreportwidget_p.h @@ -12,11 +12,13 @@ class PreviewReportWidget; class PreviewReportWidgetPrivate { public: - PreviewReportWidgetPrivate(PreviewReportWidget* previewReportWidget): q_ptr(previewReportWidget), - m_currentPage(1), m_changingPage(false), m_priorScrolValue(0){} + PreviewReportWidgetPrivate(PreviewReportWidget* previewReportWidget): + m_currentPage(1), m_changingPage(false), m_priorScrolValue(0), m_scalePercent(50), + q_ptr(previewReportWidget) {} bool pageIsVisible(); QRectF calcPageShift(); void setPages( ReportPages pages); + PageItemDesignIntf::Ptr currentPage(); public: PageDesignIntf* m_previewPage; ReportPages m_reportPages; @@ -25,6 +27,7 @@ public: int m_currentPage; bool m_changingPage; int m_priorScrolValue; + int m_scalePercent; PreviewReportWidget* q_ptr; }; diff --git a/limereport/lrpreviewreportwindow.cpp b/limereport/lrpreviewreportwindow.cpp index b4ec3ac..c0b33fc 100644 --- a/limereport/lrpreviewreportwindow.cpp +++ b/limereport/lrpreviewreportwindow.cpp @@ -61,6 +61,13 @@ PreviewReportWindow::PreviewReportWindow(ReportEnginePrivate *report,QWidget *pa setCentralWidget(m_previewReportWidget); layout()->setContentsMargins(1,1,1,1); connect(m_previewReportWidget,SIGNAL(pageChanged(int)), this,SLOT(slotPageChanged(int)) ); + + + m_scalePercent = new QComboBox(this); + ui->toolBar->insertWidget(ui->actionZoomOut, m_scalePercent); + initPercentCombobox(); + connect(m_previewReportWidget, SIGNAL(scalePercentChanged(int)), this, SLOT(slotScalePercentChanged(int))); + connect(m_scalePercent, SIGNAL(currentIndexChanged(QString)), this, SLOT(scaleComboboxChanged(QString))); restoreSetting(); } @@ -203,32 +210,32 @@ void PreviewReportWindow::moveEvent(QMoveEvent* e) void PreviewReportWindow::slotPrint() { - m_previewReportWidget->slotPrint(); + m_previewReportWidget->print(); } void PreviewReportWindow::slotPriorPage() { - m_previewReportWidget->slotPriorPage(); + m_previewReportWidget->priorPage(); } void PreviewReportWindow::slotNextPage() { - m_previewReportWidget->slotNextPage(); + m_previewReportWidget->nextPage(); } void PreviewReportWindow::slotZoomIn() { - m_previewReportWidget->slotZoomIn(); + m_previewReportWidget->zoomIn(); } void PreviewReportWindow::slotZoomOut() { - m_previewReportWidget->slotZoomOut(); + m_previewReportWidget->zoomOut(); } void PreviewReportWindow::slotPageNavigatorChanged(int value) { - m_previewReportWidget->slotPageNavigatorChanged(value); + m_previewReportWidget->pageNavigatorChanged(value); } void PreviewReportWindow::slotShowErrors() @@ -241,24 +248,32 @@ ItemsReaderIntf *PreviewReportWindow::reader() return m_reader.data(); } +void PreviewReportWindow::initPercentCombobox() +{ + for (int i = 10; i<310; i+=10){ + m_scalePercent->addItem(QString("%1%").arg(i)); + } + m_scalePercent->setCurrentIndex(4); +} + void PreviewReportWindow::on_actionSaveToFile_triggered() { - m_previewReportWidget->slotSaveToFile(); + m_previewReportWidget->saveToFile(); } void PreviewReportWindow::slotFirstPage() { - m_previewReportWidget->slotFirstPage(); + m_previewReportWidget->firstPage(); } void PreviewReportWindow::slotLastPage() { - m_previewReportWidget->slotLastPage(); + m_previewReportWidget->lastPage(); } void PreviewReportWindow::slotPrintToPDF() { - m_previewReportWidget->slotPrintToPDF(); + m_previewReportWidget->printToPDF(); } void PreviewReportWindow::slotPageChanged(int pageIndex) @@ -266,4 +281,35 @@ void PreviewReportWindow::slotPageChanged(int pageIndex) m_pagesNavigator->setValue(pageIndex); } +void PreviewReportWindow::on_actionFit_page_width_triggered() +{ + m_previewReportWidget->fitWidth(); +} + +void PreviewReportWindow::on_actionFit_page_triggered() +{ + m_previewReportWidget->fitPage(); +} + +void PreviewReportWindow::on_actionOne_to_one_triggered() +{ + m_previewReportWidget->setScalePercent(100); +} + +void PreviewReportWindow::scaleComboboxChanged(QString text) +{ + m_previewReportWidget->setScalePercent(text.remove(text.count()-1,1).toInt()); +} + +void PreviewReportWindow::slotScalePercentChanged(int percent) +{ + m_scalePercent->setCurrentText(QString("%1%").arg(percent)); +} + }// namespace LimeReport + + + + + + diff --git a/limereport/lrpreviewreportwindow.h b/limereport/lrpreviewreportwindow.h index c23d5dc..6a68f82 100644 --- a/limereport/lrpreviewreportwindow.h +++ b/limereport/lrpreviewreportwindow.h @@ -33,6 +33,7 @@ #include #include #include +#include #include "lrpagedesignintf.h" #include "lrreportrender.h" @@ -78,8 +79,15 @@ public slots: void slotLastPage(); void slotPrintToPDF(); void slotPageChanged(int pageIndex); +private slots: + void on_actionFit_page_width_triggered(); + void on_actionFit_page_triggered(); + void on_actionOne_to_one_triggered(); + void scaleComboboxChanged(QString text); + void slotScalePercentChanged(int percent); private: ItemsReaderIntf* reader(); + void initPercentCombobox(); //bool pageIsVisible(PageItemDesignIntf::Ptr page); //QRectF calcPageShift(PageItemDesignIntf::Ptr page); private: @@ -91,6 +99,7 @@ private: QSettings* m_settings; bool m_ownedSettings; PreviewReportWidget* m_previewReportWidget; + QComboBox* m_scalePercent; }; } //namespace LimeReport #endif // LRPREVIEWREPORTWINDOW_H diff --git a/limereport/lrpreviewreportwindow.ui b/limereport/lrpreviewreportwindow.ui index a7c2170..7618999 100644 --- a/limereport/lrpreviewreportwindow.ui +++ b/limereport/lrpreviewreportwindow.ui @@ -77,6 +77,9 @@ + + + @@ -224,10 +227,37 @@ Print To PDF + + + + :/report/images/FitWidth.png:/report/images/FitWidth.png + + + Fit page width + + + + + + :/report/images/FitPage.png:/report/images/FitPage.png + + + Fit page + + + + + + :/report/images/OneToOne.png:/report/images/OneToOne.png + + + One to one + + - + diff --git a/limereport/report.qrc b/limereport/report.qrc index 75b1d3b..a8e1b17 100644 --- a/limereport/report.qrc +++ b/limereport/report.qrc @@ -161,5 +161,8 @@ images/settings.png images/grid.png images/magnet.png + images/FitPage.png + images/FitWidth.png + images/OneToOne.png