* demo/Makefile.am,
* demo/demo.pro,
* demo/demo.qrc: build system based on qmake-qt4.
* demo/icons/document-open.png,
* demo/icons/edit-find.png,
* demo/icons/format-indent-more.png,
* demo/icons/go-next.png,
* demo/icons/image-x-generic.png,
* demo/icons/list-add.png,
* demo/icons/ocr.png,
* demo/icons/text-x-generic.png,
* demo/icons/view-refresh.png,
* demo/icons/x-office-spreadsheet.png: icon set.
* demo/src/main.cc,
* demo/src/mainwindow.cc,
* demo/src/mainwindow.hh,
* demo/ui/mainwindow.ui: main classes.
---
scribo/ChangeLog | 24 +++
scribo/demo/Makefile.am | 9 +
scribo/demo/demo.pro | 16 ++
scribo/demo/demo.qrc | 13 ++
scribo/demo/icons/document-open.png | Bin 0 -> 1550 bytes
scribo/demo/icons/edit-find.png | Bin 0 -> 1636 bytes
scribo/demo/icons/format-indent-more.png | Bin 0 -> 766 bytes
scribo/demo/icons/go-next.png | Bin 0 -> 1219 bytes
scribo/demo/icons/image-x-generic.png | Bin 0 -> 1163 bytes
scribo/demo/icons/list-add.png | Bin 0 -> 601 bytes
scribo/demo/icons/ocr.png | Bin 0 -> 14929 bytes
scribo/demo/icons/text-x-generic.png | Bin 0 -> 744 bytes
scribo/demo/icons/view-refresh.png | Bin 0 -> 2024 bytes
scribo/demo/icons/x-office-spreadsheet.png | Bin 0 -> 1518 bytes
scribo/demo/src/main.cc | 40 ++++
scribo/demo/src/mainwindow.cc | 305 ++++++++++++++++++++++++++++
scribo/demo/src/mainwindow.hh | 93 +++++++++
scribo/demo/ui/mainwindow.ui | 147 +++++++++++++
18 files changed, 647 insertions(+), 0 deletions(-)
create mode 100644 scribo/demo/Makefile.am
create mode 100644 scribo/demo/demo.pro
create mode 100644 scribo/demo/demo.qrc
create mode 100644 scribo/demo/icons/document-open.png
create mode 100644 scribo/demo/icons/edit-find.png
create mode 100644 scribo/demo/icons/format-indent-more.png
create mode 100644 scribo/demo/icons/go-next.png
create mode 100644 scribo/demo/icons/image-x-generic.png
create mode 100644 scribo/demo/icons/list-add.png
create mode 100644 scribo/demo/icons/ocr.png
create mode 100644 scribo/demo/icons/text-x-generic.png
create mode 100644 scribo/demo/icons/view-refresh.png
create mode 100644 scribo/demo/icons/x-office-spreadsheet.png
create mode 100644 scribo/demo/src/main.cc
create mode 100644 scribo/demo/src/mainwindow.cc
create mode 100644 scribo/demo/src/mainwindow.hh
create mode 100644 scribo/demo/ui/mainwindow.ui
diff --git a/scribo/ChangeLog b/scribo/ChangeLog
index a9b29a3..7129cb2 100644
--- a/scribo/ChangeLog
+++ b/scribo/ChangeLog
@@ -1,3 +1,27 @@
+2009-06-10 Guillaume Lazzara <lazzara(a)lrde.epita.fr>
+
+ Add Scribo's demo GUI.
+
+ * demo/Makefile.am,
+ * demo/demo.pro,
+ * demo/demo.qrc: build system based on qmake-qt4.
+
+ * demo/icons/document-open.png,
+ * demo/icons/edit-find.png,
+ * demo/icons/format-indent-more.png,
+ * demo/icons/go-next.png,
+ * demo/icons/image-x-generic.png,
+ * demo/icons/list-add.png,
+ * demo/icons/ocr.png,
+ * demo/icons/text-x-generic.png,
+ * demo/icons/view-refresh.png,
+ * demo/icons/x-office-spreadsheet.png: icon set.
+
+ * demo/src/main.cc,
+ * demo/src/mainwindow.cc,
+ * demo/src/mainwindow.hh,
+ * demo/ui/mainwindow.ui: main classes.
+
2009-06-10 Roland Levillain <roland(a)lrde.epita.fr>
Have SCRIBO compile.
diff --git a/scribo/demo/Makefile.am b/scribo/demo/Makefile.am
new file mode 100644
index 0000000..a5f584b
--- /dev/null
+++ b/scribo/demo/Makefile.am
@@ -0,0 +1,9 @@
+## Process this file through Automake to create Makefile.in.
+
+include $(top_srcdir)/scribo/scribo.mk
+
+
+Makefile:
+ qmake-qt4 $(top_srcdir)/scribo/src/demo/demo.pro -o Makefile
+
+all-local: Makefile
diff --git a/scribo/demo/demo.pro b/scribo/demo/demo.pro
new file mode 100644
index 0000000..01e36ee
--- /dev/null
+++ b/scribo/demo/demo.pro
@@ -0,0 +1,16 @@
+######################################################################
+# Automatically generated by qmake (2.01a) Mon Jun 1 10:28:31 2009
+######################################################################
+
+TEMPLATE = app
+TARGET =
+DEPENDPATH += . src ui
+INCLUDEPATH += . src ../../ ../../milena
+DEFINES += NDEBUG
+
+# Input
+HEADERS += src/mainwindow.hh
+FORMS += ui/mainwindow.ui
+SOURCES += src/main.cc src/mainwindow.cc
+
+RESOURCES = demo.qrc
diff --git a/scribo/demo/demo.qrc b/scribo/demo/demo.qrc
new file mode 100644
index 0000000..8492d35
--- /dev/null
+++ b/scribo/demo/demo.qrc
@@ -0,0 +1,13 @@
+<RCC>
+ <qresource prefix="/" >
+ <file>icons/go-next.png</file>
+ <file>icons/view-refresh.png</file>
+ <file>icons/format-indent-more.png</file>
+ <file>icons/document-open.png</file>
+ <file>icons/text-x-generic.png</file>
+ <file>icons/x-office-spreadsheet.png</file>
+ <file>icons/image-x-generic.png</file>
+ <file>icons/edit-find.png</file>
+ <file>icons/list-add.png</file>
+ </qresource>
+</RCC>
diff --git a/scribo/demo/icons/document-open.png b/scribo/demo/icons/document-open.png
new file mode 100644
index 0000000000000000000000000000000000000000..f35f2583540678b7a544d9175245096082f302af
GIT binary patch
literal 1550
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
AC;$Ke
literal 0
HcmV?d00001
diff --git a/scribo/demo/icons/edit-find.png b/scribo/demo/icons/edit-find.png
new file mode 100644
index 0000000000000000000000000000000000000000..5594785d10896bc17095baf387437d01bcb1fcf5
GIT binary patch
literal 1636
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
literal 0
HcmV?d00001
diff --git a/scribo/demo/icons/format-indent-more.png
b/scribo/demo/icons/format-indent-more.png
new file mode 100644
index 0000000000000000000000000000000000000000..6a18867ca760573a9391b9b5ca9d72a5c40aebee
GIT binary patch
literal 766
zcmV<a0s;MrP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800004b3#c}2nYxW
zd<bNS0008DNkl<ZScS!x&rj1}7{@=`>KqY0$Sy#XFcU7^!9=~NNATttg2SL5G#>py
zybB^C8a)`j2&ib(KS52{zktDBNIb9>6Azkgb#1zOsI%?bvaW3SByaZi{n77_=Xtli
z@Sh`Mf0$pG6E#ikYb9VTCggh#^&U>A(>j1)pVTz9@79gmt;A=3;a+lMW1}7T=^{{#
za`|`DfephTk!S-9$9S~qNIu|(Vf^ho=R6%~G!_?^>aH0dAM+e<3W14<tZS^Q+Ei>g
z&=LY}U<-6t2n0#N=xC;O1hU!lwj$d_2b`e0Ou!Dhy!>+8wdr)4+VdZpfS2mAv2!j5
z%x7nR#{}F~``I0wK%j3z3(Rbliuw8G?FyQvx#s;^C<3*h_O_Z^<-x=I6bgmr6YvAI
zw`eqqD2hza+(DA1ZP!*R4G^$z)O8(A(@<5Fa=DD6lqi;p6pKaTd*T3Wec$5l><sH)
z*F96UodcdlSlyti8uFHel+TlwBxG4ek|ktWLRD4Ao>HmA<0p?8NoP2I?1X2*hH}8F
z?)stYI<Hq=@&3a*bX~7eADRGI$1E6=PoF>X?D<m^MX?>n9XVj%9E`-;mo=7_U(|KL
zvj)tHb-Lj9kH#;0dsAdGqgd)2EJCO4hHbol3=9l1a&`nkh}BI&AOb=2ABjX59vbG<
z$<wY=5Xu2T5a{mern{@_UmEN$y*YIqMNt4qBobuDv-J1(d#DcWfcFoOwZ@E&jt(wO
zUZ%6N)1|t4iW+vn57e#-3{t5SlNT=1-oDRQb*L2htF}}P4jg58=nSz~)K|6Dw?Y)f
zcrAf8;9zwynM``Jt&OW!t_50G6OmjlcLaz7KdJ=cK*E4;vvbouVcr@v41-^ro0}0J
w0nXd;Uf=+*AJdU$-x)MO2TGV1(*jWW0}B`e&>~*k`v3p{07*qoM6N<$f)vPN&;S4c
literal 0
HcmV?d00001
diff --git a/scribo/demo/icons/go-next.png b/scribo/demo/icons/go-next.png
new file mode 100644
index 0000000000000000000000000000000000000000..a68e2db77531cb15a2cddd62f567f030513b60fa
GIT binary patch
literal 1219
zcmV;!1U&nRP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800004b3#c}2nYxW
zd<bNS000DfNkl<ZScUDDe`r-@7{@>Fd(Ls*Wa_5Q6f;u`ihh?a=O`)@EeXr|Ly9sZ
zC=5b3BMHKwqR9S{L?bMO<qxEV7-g(!vo_pvD(0`y&6!g-o7%R!yL*1T@7o{uoOyTM
z=A7VPd*Hdx%RT3LzTfkGp7Xv325ry=Xaz;KnNe&#cfEDw^(0Rod*{Z&VtXYZ23o@!
zXyPpea^;7weQU>)t&cFZZhGEqz3tp@_}5zJx)hL7Fu!o|&;^gZF(;OA_T|6Jgd0l0
zQ!YoFtGH)szVrIL_irC&WgjdkwrAWh0$K+ogE&W<Dj7LqxP1GCk8(y0A6s6q%v#jn
z8a)nAL6L0`boQBPh<*CjcN}Oe!&5HCXvSnuWK3)lo6FWD>zfXLJ-$IL-MSSuAOasO
zUW;WpNF+iC1OlQMW=di6=cym@wTspYgC;v`G*d=DNO?_Zvij)GJxLkNul<bH-U!&e
zQ#0&7u?Z=xE*C<ik-02|)*5XL+9+B&PSc*ez@rb%9Xcv!Y~jyUoBzsRE}yLa+&$hC
zOs_MbjKWtQzV-;Thp%0Hm0AaQC_Ho+mGDr)MUlGR?p~ng)OIFLxXpfP&XNhkoUGcJ
zMfOwIM8FuG0#hEoa`Ckrf`l%70^y;Aj}|@(m$=`;#bhJrJ5F-0t&ZKtH{n@v@#?&H
zvU5h{ZJW8=S=#RwXsrmehd?5w#1>YHuasf`1<C|;c$a8Pwvh1K(Mq9}NpooayMa6M
zrt|XLC9!Q4B_C6Kd{*VE;F+ru@U=_AYr~Q@j^hw$g9#Ky1q8;$)p0zPzz6_?v<YVf
zQa>7F3`RqsJv{BAO(1|N{Zb&|wbRsAkC0$F63Z4?wm{kfX$hnR>7?EXgTQEmj=+Th
zBftpm9{&V+vB_-Nv97bV{o?A%Rl$m@5$HA-(h^83jJCiEqm%*>-f0XN9VuV{gDqk_
zJn32dxHjLHZRkvNbiP@=T5SSMUj#(@e?q4Adnv=Gj=;NA5Fr7B(czN=!<<~E-TXZD
zC+mWWnzFXmMzi41W>rh-@Kfm|G6~3Z1zvn$MHf({f{-csg-rFk?97+=fs0nDnqy)U
zxi|M|D);X84j!qkJM~Af@JtP7!@A)lU)~*iYJmV)yXBJ}E_Ju!B`dHTfewf7*6jP3
z6w7D(FQv(b(+xY1Y*fqITZpIEC1dx^Bwzqt^+hlo7y>w<r>`BrDJ-@t5M)`FKpTs@
zMm|o=9Y;y&2KV28F0QHlMy&(<ux7e<I~y_y=+G4qglr@4BG^?#2!>|e#QnLmxOBGD
zl>D?laqd`h>9HTwt}s7xmA3A42uTCJLYcHe7Jw~=FfC^x`}gk)cK!ZqOXEKM%E@wd
zA_Lq{i&uOx^+dn`UI-Wg2jRUI(I5$o@}aDv+&yq)@4@;V{-UPC{FgyAiZ1kgEcfSQ
z(!K&5WI>UAAuo5F-*o<L$)WY?y?C5}%PovZ`@I48r9h@dQbx1T^{O^EH!a_@T75<L
h0gF@{v_b2a{SV9&9x2I+Scw1t002ovPDHLkV1o1PM3evk
literal 0
HcmV?d00001
diff --git a/scribo/demo/icons/image-x-generic.png
b/scribo/demo/icons/image-x-generic.png
new file mode 100644
index 0000000000000000000000000000000000000000..6f118cd0875464017b8b9ace2419b4f03f10d1a2
GIT binary patch
literal 1163
zcmV;61a$j}P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800004b3#c}2nYxW
zd<bNS000C+Nkl<ZScUDD+iP4^6o<ck&fGGSNivf*O>Cu96a@{{M-ibf{U<Cw_&4~f
zAoM|t`0h(lO6!}!7oQqvXiF^xtyW80OdHzfewoRc>zT7J%ZIs~Nv3TSLqY6<&0hP$
z`F(q>wKoS|*#F%Wz{R<X7Z5&p&dT4NJaO_A0JC$mPM)*P&doZ21b~Prfcg3P7*MI6
zFCshOyW?l|&sv+Fp6+QTc1Pyxv*%ID!|Mk?5GObhoO6hCIOnjP-nsU?wYD>ko3*yH
zuf6B=ryuXo+X0}IBH{aNrQgEy6iPuptI1|9wWcDdcxa<=POwg})^+^2w@!Af+b*0F
zCY#p>N?{-ZzVDOIrSUyDcBH|(Z~IJ)6{*y#T>GuTt-HfSmbSP^ENtTlb^U%wCxYMd
z_6AT2vgsuGT*Q0FecpWKeG*=g$?<?x@+zf3v$i?Z328^DU%WftTZ=&{59kj9Ai_{O
z$w)4uI5tGWD*_(A8l#XO<3M4RT0Pavsq587+}l<aU0uT)J+>n?)m_Cr0MM=8Oge!`
zhDt5KjBnz5<A@8WHUo?qBAZF}6=k~@iBDc$xr68s!H_Dxj<pH_0&53u)Dr+K*-R2h
za&IBTOI)FlAEq8QxpyCQG(k3_5Q%}?5bbek={CAqL6XC)|9Oq0?;IpIItjq0r`T;z
zjKEMjfkIKO9pdI6A(>Q*$c)o$rOBkcZl+=YX<yYwrNqPAS4rn5$Yru1LS^X|lZTH2
zbZ(Y<Iskxkj%+$byf2M0-~qX`bc6vUh5(|-aO3)qgv|!yQzIn(_6Nj-jOH>O0PooV
zA_C4al1tLRO?G)*VF2rdNE_yVzs~mNG601_fsK`i0KEFfaSn{O0sOrpAR^QoAwU0m
zpZ<OQb<-2Jj<BU^MFyiARMwXmIrtg?i_04XtB)8i9%C&?vU%e!0L?Jk8$fGKP^kd)
zAYuSP8%L|9(Z=-Vbr?{qM>uBy@Kl6LzeKfZV7p8zqk(pM_XLQvrqTfbg>w#LEXG>2
zvF!(Cz&!li6k)YYE!f04%V^;c%|?|{aEJWZ1i5^1Zvbm8K@bq>b)1udJG-Z;6q%7j
zG^$&ytvq71I7OpUre0s5FyY8L2SBM@LOT8vQV_Adz5UOGcbk_Xk@YE+);ROYhkXkt
zSXy0VX=M?u^&kMW^Hix-{~bWj(r9COdFlwRb7Er*ODjv#2peBL72t4oW1j#Z3PY^5
zY;A4f`#vjcD-yQC$LGE|cV+-UDaDsxobLJk^Sk}OJ9qQeFBoIcTJw1Mv8&apYv0ez
zoSK`PGcka|Ip@6T>FIqtIkcmB<)_Qse=yJ1_Lf~;UcGq!+=b5<78VwPMhpPoUb=GW
zqwas&ewc``vA#jIQl(tpesJyb)z4;Tez*zLfej!6*e$4lp-xNf7Yyw;JnFOt;P&y`
dFYG^Ve*q5@n(l(H*RlWr002ovPDHLkV1jy_DSZF{
literal 0
HcmV?d00001
diff --git a/scribo/demo/icons/list-add.png b/scribo/demo/icons/list-add.png
new file mode 100644
index 0000000000000000000000000000000000000000..2acdd8f514c199a37b7b14f53081467f88ef7bff
GIT binary patch
literal 601
zcmV-f0;c_mP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800004b3#c}2nYxW
zd<bNS0006INkl<ZScUDDv1=4T6vltMo4dV8Bm_h&L9h@Mt5~HJ#6Q78TSK%F{SU;#
zMi47OL7UiIVPR<_b|Qj;g26&8Ohh7R?rd_od7s71?S)Nt&)th!cpnTqyq)*n_r94o
zyD-576Z~UDRUPIR+q02+KX!Zf>i&hw@usRe0Hlp%^VXF!>2}-I+fVC+BCh2Xu(H}=
zWwkR-i17&Q1@?r1slIQmGmt?bz+``iz=_N4nTEMJnWp6PdlDi4$xDysihSSRJ^#HD
zfm0WkcL*Ezw|WjD;wX`Y@`<u7*k`Qm7R#Ah6tsM)0(Y*R&6}Fw_uP<A4w#7>OQ$i>
zk~|wHA%P^W-+NY=qm+O%@!?CCIP&DpgbAGaz)s%w=F<kwffMwdvUPnYjvQ>2r6?z`
z-r3~+=g{XtaVheZ<!ykp-R7VBr^_$Lk%w^M*Z~yOFdJ6wOuYWMffRB4@C+tzGYNCT
z@CuCT&{6_7A3QI7w{&hHtK1|WK7KK(mTClwJ}mQ#?b#&S`f8?hAhQc?Q0HS*`zCaz
zY_FZGe-&0G5cPh3i!%ZP1(Xr^BMQX$t!e^kckNx85g;fqyop;t3N(P^cL<H@f+P?~
z2J>Eby-7%X^w2a;hK35HfD6NN^I8P7V;(0mQ@Z@*Wtm@8FfUzLwkFPvfh|u~3@f)V
nN>6CzLo>o}j6Z`3{#X10^GpxssPJ~100000NkvXXu0mjfzW5Zm
literal 0
HcmV?d00001
diff --git a/scribo/demo/icons/ocr.png b/scribo/demo/icons/ocr.png
new file mode 100644
index 0000000000000000000000000000000000000000..25231728ca35cd55bbf305e2df297e43ea307243
GIT binary patch
literal 14929
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
P00000NkvXXu0mjfmla@5
literal 0
HcmV?d00001
diff --git a/scribo/demo/icons/text-x-generic.png b/scribo/demo/icons/text-x-generic.png
new file mode 100644
index 0000000000000000000000000000000000000000..928a67995ee9713bc3c86159ed84c0bc568675d9
GIT binary patch
literal 744
zcmV<E0vG*>P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800004b3#c}2nYxW
zd<bNS0007?Nkl<ZScT=6O==r46vuxvQrwo{Vkk}91NbXWAOT~@HF|+`kzMZ4ZI@kn
z8Sn{ukSx5lu?+zi(p?Kp1F<_AbrEZ-ku_g#yXu2sB+dA}zkcs&B*Xu1fjcl94&O>C
zM?hT&K^TU_ag0(bxuPga?shwG47iJ;=-p^E`eetGTZ)3<>f+*}zG)Lh5mHLD)~WaG
ze#v(I^78Tu$QPiLY5?5a+z<o-N-6gD_gSykMj%1(8=T$t^^K5&g9Fy<b;EtOB|vMP
z1ToIsw(p)5yvVi$#BrPoY6n^@7RmE6L4^>sTCLRNN(nF&Tp`V7^WPItN~Ijy6m}ud
zZnu+uX#&3BK@iYtwRR$4#!Cq>1bjs}pU+WBmBucFpwsCj{YnA=#^W)kr>BVkgVVPv
zio{eBV2W@s7^K$!Y&NS*pxf<M7hoL6ahwX!ZnrbP4@F{ttpd&!V4DeK2xJ9w$Al0Z
z9v&wB$|-PXY6{A?Lb62JR*Jx8=knTgI!!q#+6ROX^m@H&0^DV2U)^rE)IQ-et@Z9T
zkY!n^@CAno1hRI->2#V}hDF=55Q3wlqb(u10_+;NzP_g4?<ajX1-{D`;|o}dfU&c)
zGghlr;?xkZgXH0tQgVEJTwQ=sZg3mtWeC{s|1kk~R+GsjbF=dOW+wus27E{jfiMh9
zQP5f!Qpin#Ylc8p{-u<hoSalT8D*xxK9(7?Yaok)dn_-aQ0Y@_n{n!jEK_)S0_tHH
ze%D$*Z!{i{@JcE6_Vy|}Hf9T~)oORZYv3EOas||Zm$$dKAI{Iu-viHfikL0rVYys>
z1l|Aw_yWW>zZ&ogcmXtkCz}`lhCT2&*?ZtC@EQ04o<FCXz)v@Vsvq?I76U(d#J&QO
aeEtFfNrWO3lKaU30000<MNUMnLSTYuo=&U)
literal 0
HcmV?d00001
diff --git a/scribo/demo/icons/view-refresh.png b/scribo/demo/icons/view-refresh.png
new file mode 100644
index 0000000000000000000000000000000000000000..606ea9eba46b82eea04678e64369b97e595f9da5
GIT binary patch
literal 2024
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
GLSTY33DUU$
literal 0
HcmV?d00001
diff --git a/scribo/demo/icons/x-office-spreadsheet.png
b/scribo/demo/icons/x-office-spreadsheet.png
new file mode 100644
index 0000000000000000000000000000000000000000..c0ccb7ab6fea5c4c77208b0ba10cd49d5b8b394d
GIT binary patch
literal 1518
zcmV<K1rhp*P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800004b3#c}2nYxW
zd<bNS000H0Nkl<ZScT=6&1+Ow7{-6+-aC^~XOfI&GHNDGlo%(eP`_F&ly=dD1wo5o
zbyIL53RSvsQK+<kK-bkprI2n~s30^I3T>e!SS+O0LQSIiAj!mJK1`w$lg!-jE;9G@
z-pQ9)bkzfgd*1V&bKd7X@AKZd1ON9Xswb{pyLL*`v@Rf~sw#@2;5ZJpZOd+1mVElh
zYs~@AEz3IB)zx*&A5U9`NQf`bpFba~jOD!Rx`B0m`vu3bOP4Nv39Jpkw(WX=(a}+a
z5E6v{=?CT?uVi~b8XFri45Pl<w+w*mx-!U(8#hQK5`m!ke4b=7DeXd`Kr)$>`wN8v
zjg5`co}QlO!i5XVK&=YEaU6M*R4PR(l?vRdrluw^7l}kjrBZT_-}e08+Uhi}3czE*
zJGA;)otl+s_qVnDD``NEr>3T`Z95RGP$&e}<nwt<)0F;vKJTes`Zvsgci7III|K9z
zA<#69<HwK7Lq|qNXlrYeYler1r42AVJdC0!FAl)Foe+X-HjCpp%S1RdG$hwgOiTno
zXEGUS17tE8(&_ZZ0RZgSv4iI3<^TXyRoT0Due3v<P=EnV(*g`=nzpeN*tRW2n9Jps
zZ73893=R&;fd3f-o(7tmo25?(K`0cG2YR-j0aaDmvuBUoqpGT8zz=L)0D#nhcetnW
zM~@y!JCn%-K(E9=M@PrT81PcyRe`_uRaGUOP6zDv_I3$C)3g8sehs`31O6KJzX!aY
z%jE(Z7#|xWd+#3k`}cV^GQxZ=M?_I@G>!1qttg2E;dAHceEaQ<rNFO&>MBU5)7Yj-
z?^j<jaQ!;_8X9<O*DhK*JBb}SgzGpsrb%&bj<H;hzAIPgE|-ba)o~iaH^EpJfXBc}
z?}0yidbsn+Cme`Ixq9*>o5NvXDaW>9;Fu<kX%Z2F_J#)9>grfnT;!*L0q(+YAHb>W
zFtI8CPXkR&O_BkR6=9m(y?T{*J3Bet)&`Z7Ii`tiSu(g|n%KT^$g+5+wUtCDbojgB
z;U6!+(J!F5t_C~?JOD#CZ*nLe=Ws^{=sJ#VuNW{e=L5Dc9%pFVwsil@%tye-Yo?%D
z140P;A3o&uvuANF3%gWWH{dc*uFHW$g1(uVv#SE|>UC;rN{&4i^yz78YiqHdKE)}O
z{tZwGYMUnGZ|vvW@@wF_n1+FF7+8jZZkRZ>Nvl&tJpA+}Kv|OkPXjXlLU7-8d6Lbt
zdCL~;a(USeZP%v!egoUOi~PBmM%N7tLr2#Qblo7LxkP6d0aPHmss@A*OioS)-h=>3
zEJkln56LrUP-bSZt5_($5+@hVvTOg}^!Dt+vg}H?2y4(D(aC4Vh(jKTC~Kvlsi}#U
zmKNDtTU)8!w~v9zN&fiZ2TI8#ZZf&_>0K^kl}cm|3#Rok9`AU}E1|EKF67#5k8k3&
zSee1c1>$`_Q-V8yy=n?v*IkhT_uxUE_w{jabd-f+k)6ADv%Rg2aH)hnH%s<NgtAq{
zvUQ?wJ>ccu)6^R<J=jOjqQ;)yZpe>3`wKn?7S=4oix)2jDnJN<ec}WIZ@$Ux%a?hc
z&$HJsnCS0kQ#6W|jxzUGjF1Ajuu#@9{_f)Yg`+eVv+VD^g`OLkegGdnfPSD{4Iri{
z%AD)Ewe|J?e!^FOR318ZjE38{`Q@|E_`SQESSUnN*HIrYFh2eaXOqBjT|zS!N?$*(
zKKvD@SfH?Vt91u1W}z2&0>Qs#F(7f|$dUJ2T3S8@HdV9ZZ?5ZN7zWn-JT;S(L}q8H
znV&~93>3@4(KO6Z2t6956pvHdzTFtj<-Qmk9Q+0t2eN?U2M`95z&4;Bs9~v8)@uq7
z0XA3mXq7nthov8$r+^MT17=zJ9hk3Xz-u*?1H-HM*K4BEy{`|q0>rF<(0xAs0iPb2
UWFB|2M*si-07*qoM6N<$f{C8cCjbBd
literal 0
HcmV?d00001
diff --git a/scribo/demo/src/main.cc b/scribo/demo/src/main.cc
new file mode 100644
index 0000000..b467a07
--- /dev/null
+++ b/scribo/demo/src/main.cc
@@ -0,0 +1,40 @@
+// Copyright (C) 2009
+ EPITA Research and Development Laboratory (LRDE)
+//
+// This file is part of Olena.
+//
+// Olena is free software: you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation, version 2 of the License.
+//
+// Olena is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Olena. If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License. This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
+
+#include <QApplication>
+#include <QtGui>
+
+#include <src/mainwindow.hh>
+
+int main(int argc, char *argv[])
+{
+ QApplication app(argc, argv);
+
+ scribo::demo::MainWindow win;
+
+ win.show();
+ return app.exec();
+}
diff --git a/scribo/demo/src/mainwindow.cc b/scribo/demo/src/mainwindow.cc
new file mode 100644
index 0000000..720e086
--- /dev/null
+++ b/scribo/demo/src/mainwindow.cc
@@ -0,0 +1,305 @@
+// Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
+//
+// This file is part of Olena.
+//
+// Olena is free software: you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation, version 2 of the License.
+//
+// Olena is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Olena. If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License. This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
+
+#include <QtCore>
+#include <QtGui>
+
+#include <mln/core/image/image2d.hh>
+#include <mln/logical/not.hh>
+#include <mln/io/pbm/all.hh>
+
+#include <src/mainwindow.hh>
+
+
+const char * modes[][4] = {
+ { "Text in pictures", "pics", "text_in_photo",
"image-x-generic.png" },
+ { (const char *)(1), 0, 0, 0}, // Separator
+ { "Handwritten text lines", "hsc", "input_to_lines",
"text-x-generic.png" },
+ { "Handwritten text words", "hsc", "input_to_words",
"text-x-generic.png" },
+ { (const char *)(1), 0, 0, 0}, // Separator
+ { "Horizontal and Vertical Lines", "hvl",
"extract/primitive/find_discontinued_lines", "list-add.png" },
+ { "Tables", "tables", "table/extract",
"x-office-spreadsheet.png" },
+ { "Pre-processing", "pproc", "preprocess",
"format-indent-more.png" },
+ { "OCR", "ocr", "recognition", "edit-find.png"
},
+ { 0, 0, 0 } // Empty line, do NOT delete.
+};
+
+
+// Allow to set up to 3 extra arguments to the binaries.
+//
+// A program will be launched as follow:
+//
+// ./my_program input.pbm <arg1> <arg2> <arg3> output.ppm
+//
+// Unused arguments are set to 0.
+// Each line must be mapped to the related on in the previous
+// array "modes". So DO preserve the order.
+//
+const char *args_list[][3] = {
+ { 0, 0, 0 }, // Text in Pictures
+ { (const char *)(1), 0, 0}, // Separator
+ { "/dev/null", 0, 0 }, // Handwritten text lines
+ { "/dev/null", 0, 0 }, // Handwritten text words
+ { (const char *)(1), 0, 0}, // Separator
+ { "51", "6", 0 }, // Horizontal and Vertical lines
+ { "/dev/null", 0, 0 }, // Tables
+ { 0, 0, 0 }, // Pre-processing
+ { 0, 0, 0 }, // OCR
+ // Not empty line needed.
+};
+
+
+
+namespace scribo
+{
+
+ namespace demo
+ {
+
+ MainWindow::MainWindow(QWidget *parent)
+ : QMainWindow(parent), context_(this)
+ {
+ setupUi(this);
+
+ mainItem_ = 0;
+ exec_prefix_ = "../";
+ pdialog_.setRange(0,0);
+ pdialog_.setLabelText(tr("Please wait while computing..."));
+ pdialog_.setWindowModality(Qt::WindowModal);
+
+ connect(&pdialog_, SIGNAL(canceled()), this, SLOT(compute_canceled()));
+ connect(&exec_, SIGNAL(finished(int, QProcess::ExitStatus)),
+ this, SLOT(exec_finished(int, QProcess::ExitStatus)));
+ connect(&exec_, SIGNAL(error(QProcess::ProcessError)),
+ this, SLOT(exec_error(QProcess::ProcessError)));
+
+ connect(&context_, SIGNAL(triggered(QAction *)),
+ this, SLOT(context_changed(QAction *)));
+
+ context_.setExclusive(true);
+
+ initToolBar();
+ setup_scene();
+ }
+
+
+ void MainWindow::initToolBar()
+ {
+ QToolBar *tbar = new QToolBar("Tools");
+ tbar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
+
+ for (unsigned i = 0; modes[i][0]; ++i)
+ {
+ if (modes[i][0] == (const char *)(1))
+ {
+ tbar->addSeparator();
+ continue;
+ }
+
+ QAction *action = tbar->addAction(modes[i][0]);
+ context_.addAction(action);
+ action->setCheckable(true);
+ action->setData(i);
+
+ if (modes[i][3] != 0)
+ action->setIcon(QIcon(QString(":/icons/") + modes[i][3]));
+ }
+
+ addToolBar(Qt::TopToolBarArea, tbar);
+ context_.actions().first()->trigger();
+ }
+
+
+
+ void MainWindow::on_browseBtn_clicked(bool)
+ {
+ QString current_dir = modes[mode_][1] + QString("/");
+
+ QString
+ filename = QFileDialog::getOpenFileName(this,
+ tr("Open Image."),
+ QCoreApplication::applicationDirPath() + "/" + current_dir,
+ tr("Images (*.pbm *.pgm *.ppm)"));
+
+ if (!filename.isEmpty())
+ {
+ filepath->setText(filename);
+ update_pixmap(filepath->text());
+ }
+ }
+
+
+ void MainWindow::on_runBtn_clicked(bool)
+ {
+ wait_for_result();
+
+ QStringList args;
+ args << filepath->text();
+ for (unsigned i = 0; args_list[mode_][i]; ++i)
+ args << args_list[mode_][i];
+
+ if (!is_in_ocr_mode())
+ {
+ QTemporaryFile f;
+ f.open();
+ args << f.fileName();
+ last_output_ = f.fileName();
+ }
+
+ exec_.start(exec_prefix_ + modes[mode_][2], args);
+ }
+
+
+ void MainWindow::on_displayBtn_clicked(bool)
+ {
+ update_pixmap(filepath->text());
+ }
+
+
+ void MainWindow::on_filepath_textChanged()
+ {
+ bool b = !filepath->text().isEmpty();
+
+ runBtn->setEnabled(b);
+ displayBtn->setEnabled(b);
+ }
+
+
+ void MainWindow::update_pixmap(const QString& name)
+ {
+ QPixmap pixmap;
+ if (!pixmap.load(name))
+ {
+ qDebug() << "Invalid file format!";
+ update_status_message(tr("Invalid file format!"));
+ return;
+ }
+
+ imageResult->scene()->removeItem(mainItem_);
+ mainItem_ = imageResult->scene()->addPixmap(pixmap);
+ imageResult->scene()->setSceneRect(mainItem_->boundingRect());
+ Q_ASSERT(mainItem_ != 0);
+ }
+
+
+ void MainWindow::exec_finished(int rvalue, QProcess::ExitStatus status)
+ {
+ pdialog_.hide();
+ qDebug() << rvalue;
+ if (rvalue == 0)
+ {
+ if (status != QProcess::CrashExit)
+ {
+ setEnabled(true);
+ if (is_in_ocr_mode())
+ {
+ textBrowser->setText(exec_.readAllStandardOutput());
+ on_displayBtn_clicked(true);
+ tabWidget->setCurrentIndex(1);
+ }
+ else
+ update_pixmap(last_output_);
+ }
+ // Else : canceled.
+ }
+ else
+ exec_error(tr("Error during last run."));
+ }
+
+
+ void MainWindow::setup_scene()
+ {
+ QGraphicsScene *scene = new QGraphicsScene();
+ imageResult->setScene(scene);
+
+ update_status_message(tr("1) Choose an algorithm.\n\
+2) Select an image.\n3) Run."));
+
+ imageResult->show();
+ }
+
+
+ void MainWindow::wait_for_result()
+ {
+ pdialog_.show();
+ setEnabled(false);
+
+ if (!is_in_ocr_mode())
+ update_status_message(tr("Please wait while computing..."));
+ }
+
+
+ void MainWindow::update_status_message(const QString& msg)
+ {
+ if (mainItem_ != 0)
+ imageResult->scene()->removeItem(mainItem_);
+ mainItem_ = imageResult->scene()->addText(msg);
+ }
+
+
+ void MainWindow::exec_error(const QString& msg)
+ {
+ setEnabled(true);
+ QMessageBox::critical(0, tr("Error!"),
+ tr("The result cannot be computed!"));
+ update_status_message(msg);
+ qDebug() << exec_.readAllStandardOutput();
+ }
+
+ void MainWindow::exec_error(QProcess::ProcessError error)
+ {
+ pdialog_.reset();
+ if (error == QProcess::FailedToStart)
+ exec_error(tr("This program does not exist: ")
+ + exec_prefix_ + modes[mode_][2]);
+ else
+ qDebug() << "The computation stopped.";
+ }
+
+
+ void MainWindow::context_changed(QAction *action)
+ {
+ mode_ = action->data().toInt();
+ filepath->clear();
+ tabWidget->setTabEnabled(1, is_in_ocr_mode());
+ }
+
+
+ void MainWindow::compute_canceled()
+ {
+ setEnabled(true);
+ exec_.kill();
+ update_status_message("Computation canceled.");
+ }
+
+
+ bool MainWindow::is_in_ocr_mode()
+ {
+ return (QString(modes[mode_][1]) == "ocr");
+ }
+
+ } // end of namespace scribo::demo
+
+} // end of namespace scribo
diff --git a/scribo/demo/src/mainwindow.hh b/scribo/demo/src/mainwindow.hh
new file mode 100644
index 0000000..698186b
--- /dev/null
+++ b/scribo/demo/src/mainwindow.hh
@@ -0,0 +1,93 @@
+// Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
+//
+// This file is part of Olena.
+//
+// Olena is free software: you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation, version 2 of the License.
+//
+// Olena is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Olena. If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License. This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
+
+#ifndef SCRIBO_APPS_DEMO_SRC_MAINWINDOW_HH
+
+# include <QStringList>
+# include <QProcess>
+# include <QtGui/QWidget>
+# include <QProgressDialog>
+# include <ui_mainwindow.h>
+
+namespace scribo
+{
+
+ namespace demo
+ {
+
+ class MainWindow : public QMainWindow, private Ui::MainWindow
+ {
+ Q_OBJECT
+
+
+ public:
+ MainWindow(QWidget *parent = 0);
+
+
+ private slots:
+ void initToolBar();
+
+ void on_browseBtn_clicked(bool b);
+ void on_runBtn_clicked(bool b);
+ void on_displayBtn_clicked(bool b);
+ void on_filepath_textChanged();
+
+ void exec_finished(int rvalue, QProcess::ExitStatus status);
+ void exec_error(QProcess::ProcessError error);
+
+ void context_changed(QAction *action);
+
+ void compute_canceled();
+
+ private: // Members
+ void setup_scene();
+ void update_pixmap(const QString& name);
+
+ void exec_error(const QString& msg);
+
+ void wait_for_result();
+
+ void update_status_message(const QString& msg);
+
+ bool is_in_ocr_mode();
+
+ private: // Attributes
+ QGraphicsItem *mainItem_;
+ QString exec_prefix_;
+
+ QActionGroup context_;
+ int mode_;
+ QString last_output_;
+ QProcess exec_;
+
+ QProgressDialog pdialog_;
+ };
+
+
+ } // end of namespace scribo::demo
+
+} // end of namespace scribo
+
+#endif // ! SCRIBO_APPS_DEMO_SRC_MAINWINDOW_HH
diff --git a/scribo/demo/ui/mainwindow.ui b/scribo/demo/ui/mainwindow.ui
new file mode 100644
index 0000000..9a237be
--- /dev/null
+++ b/scribo/demo/ui/mainwindow.ui
@@ -0,0 +1,147 @@
+<ui version="4.0" >
+ <class>MainWindow</class>
+ <widget class="QMainWindow" name="MainWindow" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>658</width>
+ <height>459</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>Scribo Demo - v0.1</string>
+ </property>
+ <property name="dockOptions" >
+
<set>QMainWindow::AllowNestedDocks|QMainWindow::AllowTabbedDocks|QMainWindow::AnimatedDocks</set>
+ </property>
+ <widget class="QWidget" name="centralwidget" >
+ <layout class="QVBoxLayout" name="verticalLayout_2" >
+ <item>
+ <layout class="QVBoxLayout" name="verticalLayout" >
+ <item>
+ <layout class="QGridLayout" name="gridLayout" >
+ <item row="0" column="0" colspan="4" >
+ <widget class="QLabel" name="description" >
+ <property name="text" >
+ <string>Write description here.</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLineEdit" name="filepath" />
+ </item>
+ <item row="1" column="1" >
+ <widget class="QPushButton" name="browseBtn" >
+ <property name="text" >
+ <string>&Browse</string>
+ </property>
+ <property name="icon" >
+ <iconset resource="../demo.qrc" >
+
<normaloff>:/icons/document-open.png</normaloff>:/icons/document-open.png</iconset>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2" >
+ <widget class="QPushButton" name="displayBtn" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="text" >
+ <string>Display</string>
+ </property>
+ <property name="icon" >
+ <iconset resource="../demo.qrc" >
+
<normaloff>:/icons/view-refresh.png</normaloff>:/icons/view-refresh.png</iconset>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="3" >
+ <widget class="QPushButton" name="runBtn" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="text" >
+ <string>Run</string>
+ </property>
+ <property name="icon" >
+ <iconset resource="../demo.qrc" >
+
<normaloff>:/icons/go-next.png</normaloff>:/icons/go-next.png</iconset>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QTabWidget" name="tabWidget" >
+ <property name="currentIndex" >
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="tab" >
+ <attribute name="title" >
+ <string>Image</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_3" >
+ <item>
+ <widget class="QGraphicsView" name="imageResult" />
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="tab_2" >
+ <attribute name="title" >
+ <string>Text</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_4" >
+ <item>
+ <widget class="QTextBrowser" name="textBrowser" >
+ <property name="html" >
+ <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML
4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext"
content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans
Serif'; font-size:9pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px;
margin-right:0px; -qt-block-indent:0;
text-indent:0px;">Test</p></body></html></string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QMenuBar" name="menubar" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>658</width>
+ <height>31</height>
+ </rect>
+ </property>
+ </widget>
+ <widget class="QStatusBar" name="statusbar" />
+ </widget>
+ <resources>
+ <include location="../demo.qrc" />
+ </resources>
+ <connections>
+ <connection>
+ <sender>filepath</sender>
+ <signal>returnPressed()</signal>
+ <receiver>displayBtn</receiver>
+ <slot>click()</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>201</x>
+ <y>92</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>516</x>
+ <y>92</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
--
1.5.6.5