From 7345de27b184c7dbae2c1a4a5921da610854208a Mon Sep 17 00:00:00 2001 From: shaina7837 Date: Sun, 14 Sep 2014 19:51:40 +0200 Subject: [PATCH 01/24] toolbar set --- Arrowhead-Right-32.png | Bin 0 -> 4196 bytes Document-New-128.png | Bin 0 -> 65838 bytes Open-128.png | Bin 0 -> 65838 bytes Save-128.png | Bin 0 -> 65838 bytes axes.png | Bin 0 -> 463 bytes back.png | Bin 0 -> 955 bytes bottom.png | Bin 0 -> 885 bytes down.png | Bin 0 -> 1029 bytes front.png | Bin 0 -> 1029 bytes grid.png | Bin 0 -> 641 bytes left.png | Bin 0 -> 910 bytes openscad.png | Bin 0 -> 884 bytes openscad.pro | 6 +- openscad.pro.user | 2 +- openscad.qrc | 34 +++++++--- right.png | Bin 0 -> 882 bytes src/MainWindow.h | 1 + src/MainWindow.ui | 138 +++++++++++++++++++++++++++++++++++++++-- src/mainwin.cc | 14 ++++- up.png | Bin 0 -> 884 bytes 20 files changed, 175 insertions(+), 20 deletions(-) create mode 100644 Arrowhead-Right-32.png create mode 100644 Document-New-128.png create mode 100644 Open-128.png create mode 100644 Save-128.png create mode 100644 axes.png create mode 100644 back.png create mode 100644 bottom.png create mode 100644 down.png create mode 100644 front.png create mode 100644 grid.png create mode 100644 left.png create mode 100644 openscad.png create mode 100644 right.png create mode 100644 up.png diff --git a/Arrowhead-Right-32.png b/Arrowhead-Right-32.png new file mode 100644 index 0000000000000000000000000000000000000000..42dd282b0f9b21968a3c2635067f15217bf5e039 GIT binary patch literal 4196 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEV2xxn{IEF-UGAan%e-9KL1*0KA zI0SzG{+;*b%NHHODruzR-@kv|K>Yga*RNJIvI4)cAP4*h0wDeQ`}gl2_*K(D7Ulq` zBYyt)@gs@`*5Ec0*#S^T{Qdd!XC7`HRF*+^0MrrxfBpK^Ol7OE8;8vSNRF6!_wHR5 z>^i9=ipv2YM}Pn@o34KP^eG3Gtiv>hkOM%D`19w_-ZyXF@L}qvf(S7V06F6C-@m8d zzke@A1uIdFAl3m;N8J4U`LhD52^8{3aRAg2Pl2T-^@?s%9RO7S{@b^2b`<&>p`8>5 z0Mo&9pzjS3x~ae-)&W4vZv*3Bg$h=p8bOQ$fR>;C`0=9zs!l5L2sr>)1{?%tKLILP zhiMEx2LMaKjc?z+rCliqatvtV)dshUQJK*YAU_0nCf>fy SS6IImWP+!wpUXO@geCx7iR=yl literal 0 HcmV?d00001 diff --git a/Document-New-128.png b/Document-New-128.png new file mode 100644 index 0000000000000000000000000000000000000000..7225b928d260bbc131f52ba2e4282375ed739533 GIT binary patch literal 65838 zcmeHQeP~tZ8NUr7IA`4`qZE-6ij=PFir7;8V{@s?oEGQGaF9t?+$a*pkRme57*$t_ zNEuy`BKu&@KIgsXoO^Qa$D%w3 zPTue5dC%|py`SejH)~#B@YBa9PMMg=WFDV4xA7NnSIRx14u9Kb{bqM2Q=ggF`0B!U z9?LYWY*~R=y9@zCzz{G53;{#H5HJJ`0YktLFa!(%L%hC)rQput)&0{{rk6W+_N+9*Mx^ z%a>QXt=4VHI$aZme!6MON!e@HuC0o!U?mccZ<_gII}4CUwzajj21fV;4M{gm>rY#j z<%V%xym)bTzINuTI06`tm%so+X$&4!h6asFkBXOagM)*u6@O?`Fp2=i;J47|h6H%t zVw|C&p^>|H?^g8I`sf!IbA!8>Al93WDvSUoe{V{c8`c`JDp-8}{P~G;_x1I8F2hOP zV&yJexG)n$8xZ|sc{wMcW1!pS0A;jwfvE28 z?rC@K+{uO+nXN4>?ZANpGYf=OAVLVhdT0V#4^RfMySloj!uXvU;H3V&d-pzHhAI>l zK>`Q~NdR$;07apT&w!1TC$W>apP+`da>j+Z2M-?nPP~Tlq(ZmX1GsfC0+fI+woxa; z`0W~0A%a{wj(*0|&Ba&c6)kl6a{%fW*9ef305JYUbo;H^xB@7zsCY@2G`VDV7?Z}T z5kPcOH(et@3Id!wd2$l=@HcBf#V;3ub^TtV^9Retk?Ys5SCs%x6)M*Qe6Q=*|9sTX z0_@naV*+;aHi^;WZj!;xLt{uhj&EH*e*Ab<$N;_md_dRDdV?|a2D^6cs>A#J4Prck zs9i4-f0!PY#ysNU-TY@`P+wA3s51hTg5Z%OM`~`}y7jR(U@3kf2~G;VQA(Z0QWp9G zdjhPx^#BP`ymIBryKLFwx_-vd6@ckyULA*(L?`wGCMHy0ayIDp383p`1V{jFe}DgS zeYnFls2El*0y`QChIJV^D*%~|2~?LY3-tR0U|q#E0u+H5FM7OVT{LPjSCc>+UCK!q ztAM)zy{U-WvL{1*0Rf~wMt~TovGkjYHTz&OqbEs6s~^Io?+Y9lnGvJ1Vo5M|fB>ws z5g-QgQ>RYVg8;*BOU7_;8SesK$Hve?yxVWWWUdKIxjiU2UyLq?yl5Uux3H$5s$0!TT1Sq~6}7~)9)F$nJ*c&T~-Q6(>cLq)gm-{The^>lyWxRZ#|}aiUzT9lhhmVd;=LjJHv1+uPeGNxtvl}m@?;;?4C3}Q85gTZh4d`^_}djKuZ zdH^C6;)W3*XOLI|h$x)@s>4ElDU5R6vtrJW+D~KVWHKo*<|j=*b3Z$?w{Bfb!i;em4b|;5Rr=^W*vr|K$lPbbWtua z1W=9ze1(t!-Zv=3WQejO1 zr}d4Q03sGM_Q{x_y^pzp_d|kW1bs0~CzLhl>+WeWc!3d#luAo=7r0w{yK zUJ^incdnuYz%N79qRU?u*X7f2j_jgA7Z3H%8nblDK#8n{@P1Ym1XZY%+C7;qAneg8oIo!A224g-CKAz&R0^B!8U_L-uMt~RuD@g#f;Egmeje#+IGYnhs zbENXR7x}+rKDroY{uERFKoZK>d?0{Gf&dAi4JCfuCG`OKPg9dHsq+nuN!&1&avvQ! zbZ7!dAoGa8TmZwxbd-@pgKuNv=l_EMY%_Ny{f|+Q>GuFyzV!exLFRs(5`lEzDxlShvp^?zjoZ~tDDw}82Nj3EC4mW^{EGtdK2hY=tKwI~7r z{E~VAbmwcufH3Y=bnlJ23OG7ehnC$-10(O}I$iwuoTv`(7uE=Qu;SR{riX=%0AZ*U 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 literal 0 HcmV?d00001 diff --git a/Save-128.png b/Save-128.png new file mode 100644 index 0000000000000000000000000000000000000000..f56c70b1fa669dca313b4bbf9b1535c41621c300 GIT binary patch literal 65838 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 WFCKpD_#wUa!50o4`0n|4KKTdmM+Hv+ literal 0 HcmV?d00001 diff --git a/axes.png b/axes.png new file mode 100644 index 0000000000000000000000000000000000000000..e7cb8e1f8d39d9a0ea64fd2daf86c3ce81a4ef2d GIT binary patch literal 463 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v_d#0*}aI z1_o|n5N2eUHAey{$X?><>&kwQO_WE6)kp2|cA$`CiEBiObAE1aYF-J0b5UwyNotBh zd1gt5g1e`0KzJjcI0FNtxu=U`NW|f{)Ao8X2MV;Nzq{IUL?J`4hDY$Ni$KoSiy~sv z?3(iv^f~Mr_V#87>$21`uN892ie%Y%;my6B^S8Fzr%aD+`TJm6@v}RUY<(WSzP@}7 zrVH4AWSYkK@vk;K7Av^&j6+@)^Z(loGixoLPqL9RuIx(g>A&||K}lAyQnR#V^2rp{ zmV)fG&Y5!=iXA>rzpjzPv})J7RkK&EGCa0c;Lz0KbNtCjDMD+%qZNtyLb>5}ngR^w{%iD^9>?`Lg2w)BnN=}oy0 z*eqC1*(N72?_ld|NV|D<`q?*37Jidb_Pu%LeZaDStEBtNzt^HJf;+`0?ptLSE^3$d znjbP0l+XkK DA(po& literal 0 HcmV?d00001 diff --git a/back.png b/back.png new file mode 100644 index 0000000000000000000000000000000000000000..35d2646445c76660dba1d4062cdf7ab425e4e9ef GIT binary patch literal 955 zcmV;s14R6ZP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00SdQL_t(o!|hg0Xk1kk{?5Jk zz1JDXFwkaEhT^6LK~cnoKPzKeD~)5ojV=`m;z|%ikh*o<3fbt!tsB8f6{4i6MH4}= zqCu)CX#|OMGc+^v-rRf7J;y~;s3PrT5|P4u>wCZRo&N(&Fu??OGgQ^6s@n?(jq_<^ zW8*-p)q2cYI|rZ;ktOHcB_itorvg;9>Ajz|*3KJaP5_9i8UZwk=pr+BVvI|TM&r+Y z6;PJtkvz{&0hlMECsg&Ss-9QXj;dDH+UJOwR@e2{@*!kJs-aZsU zc$=BOVdm@1yv)q6S5$;@lae2tlZODVk6&PKgM{*IR|6R^8n_IF)xY8viE)wfHHHNh>ojj zPgOr<=8lN;i=z1WPULRH>Mye_TT|7GA%qXDwQT@x=iK|M3IJC`WI3TU8Yj(W-1;brVpCOnHyU8Dd4~ud z*mnV=!Wwf7B4@n!kNhtJlE?-C%JV$zr3QAraEQnOfHB61h%q8ZHO6C5{e$xS+mRw* zt@Qw=vMhVKs;ZM)TU+;x&@uHG<11D>7po3F!MYSJxxSi5m|^aewkVOun=9b)?Nqm<1ogI zyo^-Uh7caO+51Fvzp8#GB3~F|<^VVm=@?^XiRe*P{aHj7Rdq4X^K}4+g!wJw+&d|y zHbf5FEIWI1N$qMKmt}dxId^JjB0fn(_wI0P16WhlP6*+%dcFSpEe^DV`3*yK6@Z7e zOGLD}r-P*1?KT^Y#*8uMSpXy=OM}7SLbKWI{_8C7_YWImT&-5SMnrx;PqJ)%eLbHX drxV=O_zPa5)p#H_la&Af002ovPDHLkV1g7?uyOzZ literal 0 HcmV?d00001 diff --git a/bottom.png b/bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..3e7a213c1fffc9c8d5e6838851b80f8ee9245363 GIT binary patch literal 885 zcmV-*1B(2KP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00P}fL_t(o!|j$oh+I_^#=m>- z`!oAyje{g&Vca4X5g}lNfU+VX_%C5&VIvW=Qz4C#B9KBGEtAv{1c|25D(ss0XVHZu zXd_}Vh_00&Op(CAWahoO_kQ;ri)=AzmUVWs64v+dx0J8=zf-}=G|_$ z*h~#GO;W$#@66859=6uL48VxUccanh$4;lyzo#A7b-g!)@D9lO2PraS7Vl&+F| zx325Qw$uStbs>Z&opTES7K}0bRrOa9S+>?51CWWxqP6yjG3IGi{ZmAiRCTE+imovx zZKmV7l+sy}t0Zrc{EFlos=7y2TWd}%_j$@TWg)>}*|mCm_AjPbLos;+P7 zof=aE_rG3EgP?RL98w=Dpw>b&<) zk^CUbvM&G}1aP3Ls*53n554yXS5{WC|57vC;Fn#+7>|g^@hr=Z0oVoL2a@LjsI_*% zT6+?}oAdMYSDL0-6p`Up0nFxk{thuNz~&4I%tAGcz+1@K7-;qyGt&lqE#S5;%J z9Zr1~30RUn262h?GT9{J!k~#+c;2zeF<2^PJexj;7SV8BfN0tXYKD00000 LNkvXXu0mjf6f2wF literal 0 HcmV?d00001 diff --git a/down.png b/down.png new file mode 100644 index 0000000000000000000000000000000000000000..149ccb5e16f65bf434e738197a84f9de23eeb321 GIT binary patch literal 1029 zcmV+g1p51lP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00V7FL_t(o!|hg0XkA4V{?6RF z?`ce9f@TpzD}sxPB87q?DjE_IjA@Z9DvF{|sIFYOk*>OMr3;lTtVrDy>_QhWtr8`q zl$g2@TQrJFODrN3BfQt-<=%JioHL(`7>Tyc&ui-{-}cOz^Ua*^n>oN1wy=dZLDG@* z*Se2vHeqgV?xz0!{s)sJ83s^|F-~~zPl-tLh7uszT@=M&k|cYbb58&WBm;nM5jm-< zwGhHYXJ_Zd>q;QYvh9^hU5sxPfkru`88UUgqIg+VGgUpUs(+~Jc{6)A zgfK+1V^!gsLkNRr_KumI`+MyvRn1zh*6ZulSNuE&ET8yz-tyVwX$U*%E)SsnkdYa_PvMfJJl4JzHi1+?5NdWjM#yCcD zd}e0myMciLU0hte|4J?bunoZPA`&-D;2*n)7=SYX&a_&sV`-Xx0KjKiw!f>Z>&JBt zF@P9f0J#(7+WktmOQ_7%xI()R7;;`_FrN zdWsEgo+L>Dpes$&m-0OCXfztreSLjP>-4)rRUZK`Dk8T5$dV+f08n`Ur-&4n_vk7p z%knD`855C5(=dxdAawl8>?3?86qeum=7D5SBK?{Jo#f00000NkvXXu0mjfJ0j7l literal 0 HcmV?d00001 diff --git a/front.png b/front.png new file mode 100644 index 0000000000000000000000000000000000000000..5e791c04035af2e5d8be66c07f76c7d04e07e61d GIT binary patch literal 1029 zcmV+g1p51lP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00V7FL_t(o!|hg0XkA4V{?6RF z?`ce9f@TpzD}sxPB87q?DjE_IjA@Z9DvF{|sIFYOk*>OMr3;lTtVrDy>_QhWtr8`q zl$g2@TQrJFODrN3BfQt-<=%JioHL(`7>Tyc&ui-{-}cOz^Ua*^n>oN1wy=dZLDG@* z*Se2vHeqgV?xz0!{s)sJ83s^|F-~~zPl-tLh7uszT@=M&k|cYbb58&WBm;nM5jm-< zwGhHYXJ_Zd>q;QYvh9^hU5sxPfkru`88UUgqIg+VGgUpUs(+~Jc{6)A zgfK+1V^!gsLkNRr_KumI`+MyvRn1zh*6ZulSNuE&ET8yz-tyVwX$U*%E)SsnkdYa_PvMfJJl4JzHi1+?5NdWjM#yCcD zd}e0myMciLU0hte|4J?bunoZPA`&-D;2*n)7=SYX&a_&sV`-Xx0KjKiw!f>Z>&JBt zF@P9f0J#(7+WktmOQ_7%xI()R7;;`_FrN zdWsEgo+L>Dpes$&m-0OCXfztreSLjP>-4)rRUZK`Dk8T5$dV+f08n`Ur-&4n_vk7p z%knD`855C5(=dxdAawl8>?3?86qeum=7D5SBK?{Jo#f00000NkvXXu0mjfG8NMV literal 0 HcmV?d00001 diff --git a/grid.png b/grid.png new file mode 100644 index 0000000000000000000000000000000000000000..1b3006275ce7c667ce30e1b8c511becd65804c28 GIT binary patch literal 641 zcmV-{0)G98P)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00HSqL_t(o!|hf*ixfc+t*V|c zrrDF#VeS>00sbW(Z>KxS6%C1=iDt3c?e+PoO?MMjgGs> zFf#z0i!mMn*!SMQv)0bm)h8`CNLBTSnWq3W&-0(&`xy~EP}MVUCL#*pgZKVgk|a+> zBrS?!AHWx8cD)F!S1L> zWVR4bL?quyfn5+|+>GVFHoE_xfT}h`qdKH22(`Fvi65Dtmxy!ZYG5q;ez3zDX3rXunLK(y9I0H0!v_gYp5 zRsAR;H<(Vj8p(mG#IRitUU7h}wcC|k*2wxw=c z7I^RdD*z1<{c4)#ZI)%<0nA#Qhloh)x}KC}`7FjbA)?pDn4Pj9-Q;6&MxOx4hA-WK b0bTe52c8AtpJx@)00000NkvXXu0mjf3$y?L02y>e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00Q<&L_t(o!|hi=i(Ewz{;Ip* zJm;;(kxhgJlfw#bB1;eyL!r|U}jeUJQYGfmStClam%tSvMgKh-p`LB zz->h^vlf5_0M|t1LjYap+;KDW!}y&}=Q{wG0nEo3_ikIjU@$lg-~}_g6+(F2%)SM1 zjF}G(<4;XZ^#GhBqWvL+quXkcUa$8AGk-23NmXx~*$*P}hN`ZM$Oko5+an^EMdU)e z-EQ62re@~*{r-Ltd0SO4s;a1}rIbunuf`bnsp=OZa<$*@&zRXm!xl5YCnD{ts$L!0 zgoDB0nUvCr5W*aQ86vvJq|Iit$IOc%gtJ+eeWI$}p?B-tqeS!w5xrt&=ZUD=Qhe zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00P`eL_t(o!|j*Ni(Ew%#m~J} z@72t6Xd89J0VAlOi9!&}Mp0ypfqXETMV2mfA?lytLhv65xN#75(P$?p*XR-S72#)wk|-F^PZYAb1<{(L?m-PeO=cFMWiPpH=3q7JZT@E`0Bhr4&ZSjdc-+*Vy>qz%ksgL z(nVD@RW%X$W;7Z-`oC{%X6?GJ&%_u%Nh!%50UBfcylI+OhQr|lx6_mUOHox-2l6~W z31A(-GXU#=hNyeFRMlY!;j@_}p_x@#mR&Kk%Q41}opWmd*1Y#0ni&B6tg0Jk*6DV;Kd!E>%3v@! zJo6|fq6FX?fNOPKf0||4M*w_PRj;*Lt)J$agdv12GaKyYQn@wvD4rE}jDXu7+eGB2 zZtR?E0JO3!dv!D#72Dg}->s~yl>g$GLPVYeaE6HPW#(#P0Wrq!LkJrH*0L;HUtV6m zBqCop=f1j``+H-1IfQUbMAnJuMI!2}>PAZG!c@b^%v_A|$y?qhqJw63RaGxC^Cbiv#P3xW openscad - Qt4ProjectManager.Qt4RunConfiguration:/home/shaina/letsbegin/openscad/openscad.pro + Qt4ProjectManager.Qt4RunConfiguration:/home/shaina/openscad/openscad.pro openscad.pro false diff --git a/openscad.qrc b/openscad.qrc index 6fd7e479..6a578f9d 100644 --- a/openscad.qrc +++ b/openscad.qrc @@ -1,12 +1,26 @@ - - icons/prefsFeatures.png - icons/stopbutton.png - icons/prefsAdvanced.png - icons/prefs3DView.png - icons/prefsEditor.png - icons/prefsUpdate.png - icons/flattr.png - src/AboutDialog.html - + + icons/prefsFeatures.png + icons/stopbutton.png + icons/prefsAdvanced.png + icons/prefs3DView.png + icons/prefsEditor.png + icons/prefsUpdate.png + icons/flattr.png + src/AboutDialog.html + Arrowhead-Right-32.png + axes.png + back.png + bottom.png + Document-New-128.png + down.png + front.png + grid.png + left.png + Open-128.png + openscad.png + right.png + Save-128.png + up.png + diff --git a/right.png b/right.png new file mode 100644 index 0000000000000000000000000000000000000000..0635ca3842a32534f503202425dac115ca5c1605 GIT binary patch literal 882 zcmV-&1C9KNP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00P=cL_t(o!|hf*h+I_|{l5GD zX5Z>E777b$3JX&#DO7}@U=e>%S%XN>%0|#4AcB<`6v5aFVqqmhuo2X3cH<(OCd;C( zMG#kw5G?GHU1zeHeQ)O8^W9@Jg_xPyAv++#9Js}MoOe0zp7WjeM5dTxivJio4ymfD zLwTM*VrIoCUXmnLRaI+qb939{3P|@OkW6BXuai8PB+2dw>TRl;G#ZWfMC5~soj|YG zJCY>H7bGu+5Iz+V+_Z^mnPu7gs`@a=P4E4QvMm3ch(`e42C!Y%^;5$*A%tT9t^!yG za2>#FYF@%|nWSrm~A?RI;8m_^RH=S1WNfYT!Kqlg?Q**vg-G)iRAZYwgVt~ z@6YV*?cIIL0zwGS188~g-y+!uB9~S5Jb*JrQC!+L z16x~L+83w&uE+;1k|{|M5e}VmRTYsu##jJI$10+Qg#{l%Sar^wh%uhs+1dGU5N~#N z_E1@tpE>6iMP&V7Z_fU`WivaU=lL&LmSOA+wA<}F%xnd~+V1Y|&=7j>-|ct6i)Qu% zfWP`7{Hm_&`)+v*o6Tm62$V9-V~%5V@E`OQ`N^v{tDpS#02Dd{xg7c&bgC~Mq_aVwMkM* zE)_-b`@{sOs?~M 0 - + + 0 + + + 0 + + + 0 + + 0 @@ -30,7 +39,16 @@ - + + 0 + + + 0 + + + 0 + + 0 @@ -64,7 +82,16 @@ 0 - + + 0 + + + 0 + + + 0 + + 0 @@ -120,7 +147,7 @@ 0 0 936 - 22 + 25 @@ -243,6 +270,7 @@ + @@ -270,7 +298,16 @@ - + + 0 + + + 0 + + + 0 + + 0 @@ -378,7 +415,16 @@ - + + 0 + + + 0 + + + 0 + + 0 @@ -394,7 +440,35 @@ + + + toolBar + + + TopToolBarArea + + + false + + + + + + + + + + + + + + + + + + :/Document-New-128.png:/Document-New-128.png + &New @@ -403,6 +477,10 @@ + + + :/Open-128.png:/Open-128.png + &Open... @@ -411,6 +489,10 @@ + + + :/Save-128.png:/Save-128.png + &Save @@ -583,6 +665,10 @@ + + + :/Arrowhead-Right-32.png:/Arrowhead-Right-32.png + &Render @@ -668,6 +754,10 @@ true + + + :/grid.png:/grid.png + Show Edges @@ -679,6 +769,10 @@ true + + + :/axes.png:/axes.png + Show Axes @@ -706,6 +800,10 @@ + + + :/up.png:/up.png + Top @@ -714,6 +812,10 @@ + + + :/bottom.png:/bottom.png + Bottom @@ -722,6 +824,10 @@ + + + :/left.png:/left.png + Left @@ -730,6 +836,10 @@ + + + :/right.png:/right.png + Right @@ -738,6 +848,10 @@ + + + :/front.png:/front.png + Front @@ -746,6 +860,10 @@ + + + :/back.png:/back.png + Back @@ -953,6 +1071,14 @@ View All + + + true + + + Hide Toolbar + + diff --git a/src/mainwin.cc b/src/mainwin.cc index 85b5a75a..80cadb93 100644 --- a/src/mainwin.cc +++ b/src/mainwin.cc @@ -387,6 +387,7 @@ MainWindow::MainWindow(const QString &filename) connect(this->viewActionViewAll, SIGNAL(triggered()), this, SLOT(viewAll())); connect(this->viewActionPerspective, SIGNAL(triggered()), this, SLOT(viewPerspective())); connect(this->viewActionOrthogonal, SIGNAL(triggered()), this, SLOT(viewOrthogonal())); + connect(this->toolBarActionHide, SIGNAL(triggered()), this, SLOT(hideToolbar())); connect(this->viewActionHide, SIGNAL(triggered()), this, SLOT(hideConsole())); connect(this->viewActionZoomIn, SIGNAL(triggered()), qglview, SLOT(ZoomIn())); connect(this->viewActionZoomOut, SIGNAL(triggered()), qglview, SLOT(ZoomOut())); @@ -443,7 +444,8 @@ MainWindow::MainWindow(const QString &filename) connect(this->replaceButton, SIGNAL(clicked()), this, SLOT(replace())); connect(this->replaceAllButton, SIGNAL(clicked()), this, SLOT(replaceAll())); connect(this->replaceInputField, SIGNAL(returnPressed()), this->replaceButton, SLOT(animateClick())); - + + toolBar->setStyleSheet("QToolBar{background-color:black;}"); // make sure it looks nice.. QSettings settings; QByteArray windowState = settings.value("window/state", QByteArray()).toByteArray(); @@ -2198,6 +2200,15 @@ void MainWindow::setDockWidgetTitle(QDockWidget *dockWidget, QString prefix, boo dockWidget->setWindowTitle(title); } +void MainWindow::hideToolbar() +{ + if(toolBarActionHide->isChecked()){ + toolBar->hide(); + } else { + toolBar->show(); + } +} + void MainWindow::hideEditor() { if (editActionHide->isChecked()) { @@ -2208,6 +2219,7 @@ void MainWindow::hideEditor() } void MainWindow::hideConsole() + { if (viewActionHide->isChecked()) { consoleDock->hide(); diff --git a/up.png b/up.png new file mode 100644 index 0000000000000000000000000000000000000000..ec525008e9c5853306f23c6c008289aaeccd2f19 GIT binary patch literal 884 zcmV-)1B?8LP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00P`eL_t(o!|j*Ni(Ew%#m~J} z@72t6Xd89J0VAlOi9!&}Mp0ypfqXETMV2mfA?lytLhv65xN#75(P$?p*XR-S72#)wk|-F^PoYONPf|*zqeS!$0B>ejMC7dZ{(feDSXKY_ zfQiVM`Erc$*DTBKBBB=nJmJ0n4Z!;o2}mgw&bb8ODuBnl_wSk6w<)D}V~pL!#l`ZL z)|Aq-W_BXa^S8{bWoBIfM^trb+8`Q^$K$uX_h9DJM05(k$q>TVF~$x6W9Bs?dWnbz zs(MaDHdS>PLilVZNoZzOmStDW>~f6pW9Qr&fHm*^hh_!)R_mv^CSeF+%ghG5xm0e=J&I?=9V6hj$2Jl9 zsT(`z8UU><%U&IgM#c8__IE2QE9Jj9rVx?m0GuJBdzrbKSU`;N`w+qgfVC{k)|Z!; zFNw$(&bhB{=KkK;UJfA~6OnZydXb3ws=ARiz9Ay#M5LcmlC(=drF33I-mI$Xp_z~4 zf70*w+e=GJtIT{H0IBMQvMevP+wJ~bEo5d{uh+}>{|Ecr(fkR*@`?I8Jhb)z0000< KMNUMnLSTZlf}v9Y literal 0 HcmV?d00001 From efb23fc9bda4ce1e794eda0e0b2c37e513e51502 Mon Sep 17 00:00:00 2001 From: shaina7837 Date: Sun, 14 Sep 2014 20:00:26 +0200 Subject: [PATCH 02/24] toolBar-subclass of QToolBar added --- images/Arrowhead-Right-32.png | Bin 0 -> 4196 bytes images/Document-New-128.png | Bin 0 -> 65838 bytes images/Open-128.png | Bin 0 -> 65838 bytes images/Save-128.png | Bin 0 -> 65838 bytes images/axes.png | Bin 0 -> 463 bytes images/back.png | Bin 0 -> 955 bytes bottom.png => images/bottom.png | Bin images/down.png | Bin 0 -> 1029 bytes images/front.png | Bin 0 -> 1029 bytes images/grid.png | Bin 0 -> 641 bytes left.png => images/left.png | Bin images/openscad.png | Bin 0 -> 884 bytes images/right.png | Bin 0 -> 882 bytes images/up.png | Bin 0 -> 884 bytes openscad.pro | 10 +++---- openscad.qrc | 28 +++++++++---------- src/MainWindow.h | 2 ++ src/MainWindow.ui | 24 ---------------- src/mainwin.cc | 22 +++++++++++++-- src/toolbar.cpp | 48 ++++++++++++++++++++++++++++++++ src/toolbar.h | 21 ++++++++++++++ 21 files changed, 110 insertions(+), 45 deletions(-) create mode 100644 images/Arrowhead-Right-32.png create mode 100644 images/Document-New-128.png create mode 100644 images/Open-128.png create mode 100644 images/Save-128.png create mode 100644 images/axes.png create mode 100644 images/back.png rename bottom.png => images/bottom.png (100%) create mode 100644 images/down.png create mode 100644 images/front.png create mode 100644 images/grid.png rename left.png => images/left.png (100%) create mode 100644 images/openscad.png create mode 100644 images/right.png create mode 100644 images/up.png create mode 100644 src/toolbar.cpp create mode 100644 src/toolbar.h diff --git a/images/Arrowhead-Right-32.png b/images/Arrowhead-Right-32.png new file mode 100644 index 0000000000000000000000000000000000000000..42dd282b0f9b21968a3c2635067f15217bf5e039 GIT binary patch literal 4196 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEV2xxn{IEF-UGAan%e-9KL1*0KA zI0SzG{+;*b%NHHODruzR-@kv|K>Yga*RNJIvI4)cAP4*h0wDeQ`}gl2_*K(D7Ulq` zBYyt)@gs@`*5Ec0*#S^T{Qdd!XC7`HRF*+^0MrrxfBpK^Ol7OE8;8vSNRF6!_wHR5 z>^i9=ipv2YM}Pn@o34KP^eG3Gtiv>hkOM%D`19w_-ZyXF@L}qvf(S7V06F6C-@m8d zzke@A1uIdFAl3m;N8J4U`LhD52^8{3aRAg2Pl2T-^@?s%9RO7S{@b^2b`<&>p`8>5 z0Mo&9pzjS3x~ae-)&W4vZv*3Bg$h=p8bOQ$fR>;C`0=9zs!l5L2sr>)1{?%tKLILP zhiMEx2LMaKjc?z+rCliqatvtV)dshUQJK*YAU_0nCf>fy SS6IImWP+!wpUXO@geCx7iR=yl literal 0 HcmV?d00001 diff --git a/images/Document-New-128.png b/images/Document-New-128.png new file mode 100644 index 0000000000000000000000000000000000000000..7225b928d260bbc131f52ba2e4282375ed739533 GIT binary patch literal 65838 zcmeHQeP~tZ8NUr7IA`4`qZE-6ij=PFir7;8V{@s?oEGQGaF9t?+$a*pkRme57*$t_ zNEuy`BKu&@KIgsXoO^Qa$D%w3 zPTue5dC%|py`SejH)~#B@YBa9PMMg=WFDV4xA7NnSIRx14u9Kb{bqM2Q=ggF`0B!U z9?LYWY*~R=y9@zCzz{G53;{#H5HJJ`0YktLFa!(%L%hC)rQput)&0{{rk6W+_N+9*Mx^ z%a>QXt=4VHI$aZme!6MON!e@HuC0o!U?mccZ<_gII}4CUwzajj21fV;4M{gm>rY#j z<%V%xym)bTzINuTI06`tm%so+X$&4!h6asFkBXOagM)*u6@O?`Fp2=i;J47|h6H%t zVw|C&p^>|H?^g8I`sf!IbA!8>Al93WDvSUoe{V{c8`c`JDp-8}{P~G;_x1I8F2hOP zV&yJexG)n$8xZ|sc{wMcW1!pS0A;jwfvE28 z?rC@K+{uO+nXN4>?ZANpGYf=OAVLVhdT0V#4^RfMySloj!uXvU;H3V&d-pzHhAI>l zK>`Q~NdR$;07apT&w!1TC$W>apP+`da>j+Z2M-?nPP~Tlq(ZmX1GsfC0+fI+woxa; z`0W~0A%a{wj(*0|&Ba&c6)kl6a{%fW*9ef305JYUbo;H^xB@7zsCY@2G`VDV7?Z}T z5kPcOH(et@3Id!wd2$l=@HcBf#V;3ub^TtV^9Retk?Ys5SCs%x6)M*Qe6Q=*|9sTX z0_@naV*+;aHi^;WZj!;xLt{uhj&EH*e*Ab<$N;_md_dRDdV?|a2D^6cs>A#J4Prck zs9i4-f0!PY#ysNU-TY@`P+wA3s51hTg5Z%OM`~`}y7jR(U@3kf2~G;VQA(Z0QWp9G zdjhPx^#BP`ymIBryKLFwx_-vd6@ckyULA*(L?`wGCMHy0ayIDp383p`1V{jFe}DgS zeYnFls2El*0y`QChIJV^D*%~|2~?LY3-tR0U|q#E0u+H5FM7OVT{LPjSCc>+UCK!q ztAM)zy{U-WvL{1*0Rf~wMt~TovGkjYHTz&OqbEs6s~^Io?+Y9lnGvJ1Vo5M|fB>ws z5g-QgQ>RYVg8;*BOU7_;8SesK$Hve?yxVWWWUdKIxjiU2UyLq?yl5Uux3H$5s$0!TT1Sq~6}7~)9)F$nJ*c&T~-Q6(>cLq)gm-{The^>lyWxRZ#|}aiUzT9lhhmVd;=LjJHv1+uPeGNxtvl}m@?;;?4C3}Q85gTZh4d`^_}djKuZ zdH^C6;)W3*XOLI|h$x)@s>4ElDU5R6vtrJW+D~KVWHKo*<|j=*b3Z$?w{Bfb!i;em4b|;5Rr=^W*vr|K$lPbbWtua z1W=9ze1(t!-Zv=3WQejO1 zr}d4Q03sGM_Q{x_y^pzp_d|kW1bs0~CzLhl>+WeWc!3d#luAo=7r0w{yK zUJ^incdnuYz%N79qRU?u*X7f2j_jgA7Z3H%8nblDK#8n{@P1Ym1XZY%+C7;qAneg8oIo!A224g-CKAz&R0^B!8U_L-uMt~RuD@g#f;Egmeje#+IGYnhs zbENXR7x}+rKDroY{uERFKoZK>d?0{Gf&dAi4JCfuCG`OKPg9dHsq+nuN!&1&avvQ! zbZ7!dAoGa8TmZwxbd-@pgKuNv=l_EMY%_Ny{f|+Q>GuFyzV!exLFRs(5`lEzDxlShvp^?zjoZ~tDDw}82Nj3EC4mW^{EGtdK2hY=tKwI~7r z{E~VAbmwcufH3Y=bnlJ23OG7ehnC$-10(O}I$iwuoTv`(7uE=Qu;SR{riX=%0AZ*U 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 literal 0 HcmV?d00001 diff --git a/images/Save-128.png b/images/Save-128.png new file mode 100644 index 0000000000000000000000000000000000000000..f56c70b1fa669dca313b4bbf9b1535c41621c300 GIT binary patch literal 65838 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 WFCKpD_#wUa!50o4`0n|4KKTdmM+Hv+ literal 0 HcmV?d00001 diff --git a/images/axes.png b/images/axes.png new file mode 100644 index 0000000000000000000000000000000000000000..e7cb8e1f8d39d9a0ea64fd2daf86c3ce81a4ef2d GIT binary patch literal 463 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v_d#0*}aI z1_o|n5N2eUHAey{$X?><>&kwQO_WE6)kp2|cA$`CiEBiObAE1aYF-J0b5UwyNotBh zd1gt5g1e`0KzJjcI0FNtxu=U`NW|f{)Ao8X2MV;Nzq{IUL?J`4hDY$Ni$KoSiy~sv z?3(iv^f~Mr_V#87>$21`uN892ie%Y%;my6B^S8Fzr%aD+`TJm6@v}RUY<(WSzP@}7 zrVH4AWSYkK@vk;K7Av^&j6+@)^Z(loGixoLPqL9RuIx(g>A&||K}lAyQnR#V^2rp{ zmV)fG&Y5!=iXA>rzpjzPv})J7RkK&EGCa0c;Lz0KbNtCjDMD+%qZNtyLb>5}ngR^w{%iD^9>?`Lg2w)BnN=}oy0 z*eqC1*(N72?_ld|NV|D<`q?*37Jidb_Pu%LeZaDStEBtNzt^HJf;+`0?ptLSE^3$d znjbP0l+XkK DA(po& literal 0 HcmV?d00001 diff --git a/images/back.png b/images/back.png new file mode 100644 index 0000000000000000000000000000000000000000..35d2646445c76660dba1d4062cdf7ab425e4e9ef GIT binary patch literal 955 zcmV;s14R6ZP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00SdQL_t(o!|hg0Xk1kk{?5Jk zz1JDXFwkaEhT^6LK~cnoKPzKeD~)5ojV=`m;z|%ikh*o<3fbt!tsB8f6{4i6MH4}= zqCu)CX#|OMGc+^v-rRf7J;y~;s3PrT5|P4u>wCZRo&N(&Fu??OGgQ^6s@n?(jq_<^ zW8*-p)q2cYI|rZ;ktOHcB_itorvg;9>Ajz|*3KJaP5_9i8UZwk=pr+BVvI|TM&r+Y z6;PJtkvz{&0hlMECsg&Ss-9QXj;dDH+UJOwR@e2{@*!kJs-aZsU zc$=BOVdm@1yv)q6S5$;@lae2tlZODVk6&PKgM{*IR|6R^8n_IF)xY8viE)wfHHHNh>ojj zPgOr<=8lN;i=z1WPULRH>Mye_TT|7GA%qXDwQT@x=iK|M3IJC`WI3TU8Yj(W-1;brVpCOnHyU8Dd4~ud z*mnV=!Wwf7B4@n!kNhtJlE?-C%JV$zr3QAraEQnOfHB61h%q8ZHO6C5{e$xS+mRw* zt@Qw=vMhVKs;ZM)TU+;x&@uHG<11D>7po3F!MYSJxxSi5m|^aewkVOun=9b)?Nqm<1ogI zyo^-Uh7caO+51Fvzp8#GB3~F|<^VVm=@?^XiRe*P{aHj7Rdq4X^K}4+g!wJw+&d|y zHbf5FEIWI1N$qMKmt}dxId^JjB0fn(_wI0P16WhlP6*+%dcFSpEe^DV`3*yK6@Z7e zOGLD}r-P*1?KT^Y#*8uMSpXy=OM}7SLbKWI{_8C7_YWImT&-5SMnrx;PqJ)%eLbHX drxV=O_zPa5)p#H_la&Af002ovPDHLkV1g7?uyOzZ literal 0 HcmV?d00001 diff --git a/bottom.png b/images/bottom.png similarity index 100% rename from bottom.png rename to images/bottom.png diff --git a/images/down.png b/images/down.png new file mode 100644 index 0000000000000000000000000000000000000000..149ccb5e16f65bf434e738197a84f9de23eeb321 GIT binary patch literal 1029 zcmV+g1p51lP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00V7FL_t(o!|hg0XkA4V{?6RF z?`ce9f@TpzD}sxPB87q?DjE_IjA@Z9DvF{|sIFYOk*>OMr3;lTtVrDy>_QhWtr8`q zl$g2@TQrJFODrN3BfQt-<=%JioHL(`7>Tyc&ui-{-}cOz^Ua*^n>oN1wy=dZLDG@* z*Se2vHeqgV?xz0!{s)sJ83s^|F-~~zPl-tLh7uszT@=M&k|cYbb58&WBm;nM5jm-< zwGhHYXJ_Zd>q;QYvh9^hU5sxPfkru`88UUgqIg+VGgUpUs(+~Jc{6)A zgfK+1V^!gsLkNRr_KumI`+MyvRn1zh*6ZulSNuE&ET8yz-tyVwX$U*%E)SsnkdYa_PvMfJJl4JzHi1+?5NdWjM#yCcD zd}e0myMciLU0hte|4J?bunoZPA`&-D;2*n)7=SYX&a_&sV`-Xx0KjKiw!f>Z>&JBt zF@P9f0J#(7+WktmOQ_7%xI()R7;;`_FrN zdWsEgo+L>Dpes$&m-0OCXfztreSLjP>-4)rRUZK`Dk8T5$dV+f08n`Ur-&4n_vk7p z%knD`855C5(=dxdAawl8>?3?86qeum=7D5SBK?{Jo#f00000NkvXXu0mjfJ0j7l literal 0 HcmV?d00001 diff --git a/images/front.png b/images/front.png new file mode 100644 index 0000000000000000000000000000000000000000..5e791c04035af2e5d8be66c07f76c7d04e07e61d GIT binary patch literal 1029 zcmV+g1p51lP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00V7FL_t(o!|hg0XkA4V{?6RF z?`ce9f@TpzD}sxPB87q?DjE_IjA@Z9DvF{|sIFYOk*>OMr3;lTtVrDy>_QhWtr8`q zl$g2@TQrJFODrN3BfQt-<=%JioHL(`7>Tyc&ui-{-}cOz^Ua*^n>oN1wy=dZLDG@* z*Se2vHeqgV?xz0!{s)sJ83s^|F-~~zPl-tLh7uszT@=M&k|cYbb58&WBm;nM5jm-< zwGhHYXJ_Zd>q;QYvh9^hU5sxPfkru`88UUgqIg+VGgUpUs(+~Jc{6)A zgfK+1V^!gsLkNRr_KumI`+MyvRn1zh*6ZulSNuE&ET8yz-tyVwX$U*%E)SsnkdYa_PvMfJJl4JzHi1+?5NdWjM#yCcD zd}e0myMciLU0hte|4J?bunoZPA`&-D;2*n)7=SYX&a_&sV`-Xx0KjKiw!f>Z>&JBt zF@P9f0J#(7+WktmOQ_7%xI()R7;;`_FrN zdWsEgo+L>Dpes$&m-0OCXfztreSLjP>-4)rRUZK`Dk8T5$dV+f08n`Ur-&4n_vk7p z%knD`855C5(=dxdAawl8>?3?86qeum=7D5SBK?{Jo#f00000NkvXXu0mjfG8NMV literal 0 HcmV?d00001 diff --git a/images/grid.png b/images/grid.png new file mode 100644 index 0000000000000000000000000000000000000000..1b3006275ce7c667ce30e1b8c511becd65804c28 GIT binary patch literal 641 zcmV-{0)G98P)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00HSqL_t(o!|hf*ixfc+t*V|c zrrDF#VeS>00sbW(Z>KxS6%C1=iDt3c?e+PoO?MMjgGs> zFf#z0i!mMn*!SMQv)0bm)h8`CNLBTSnWq3W&-0(&`xy~EP}MVUCL#*pgZKVgk|a+> zBrS?!AHWx8cD)F!S1L> zWVR4bL?quyfn5+|+>GVFHoE_xfT}h`qdKH22(`Fvi65Dtmxy!ZYG5q;ez3zDX3rXunLK(y9I0H0!v_gYp5 zRsAR;H<(Vj8p(mG#IRitUU7h}wcC|k*2wxw=c z7I^RdD*z1<{c4)#ZI)%<0nA#Qhloh)x}KC}`7FjbA)?pDn4Pj9-Q;6&MxOx4hA-WK b0bTe52c8AtpJx@)00000NkvXXu0mjfe zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00P`eL_t(o!|j*Ni(Ew%#m~J} z@72t6Xd89J0VAlOi9!&}Mp0ypfqXETMV2mfA?lytLhv65xN#75(P$?p*XR-S72#)wk|-F^PZYAb1<{(L?m-PeO=cFMWiPpH=3q7JZT@E`0Bhr4&ZSjdc-+*Vy>qz%ksgL z(nVD@RW%X$W;7Z-`oC{%X6?GJ&%_u%Nh!%50UBfcylI+OhQr|lx6_mUOHox-2l6~W z31A(-GXU#=hNyeFRMlY!;j@_}p_x@#mR&Kk%Q41}opWmd*1Y#0ni&B6tg0Jk*6DV;Kd!E>%3v@! zJo6|fq6FX?fNOPKf0||4M*w_PRj;*Lt)J$agdv12GaKyYQn@wvD4rE}jDXu7+eGB2 zZtR?E0JO3!dv!D#72Dg}->s~yl>g$GLPVYeaE6HPW#(#P0Wrq!LkJrH*0L;HUtV6m zBqCop=f1j``+H-1IfQUbMAnJuMI!2}>PAZG!c@b^%v_A|$y?qhqJw63RaGxC^Cbiv#P3xWe zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00P=cL_t(o!|hf*h+I_|{l5GD zX5Z>E777b$3JX&#DO7}@U=e>%S%XN>%0|#4AcB<`6v5aFVqqmhuo2X3cH<(OCd;C( zMG#kw5G?GHU1zeHeQ)O8^W9@Jg_xPyAv++#9Js}MoOe0zp7WjeM5dTxivJio4ymfD zLwTM*VrIoCUXmnLRaI+qb939{3P|@OkW6BXuai8PB+2dw>TRl;G#ZWfMC5~soj|YG zJCY>H7bGu+5Iz+V+_Z^mnPu7gs`@a=P4E4QvMm3ch(`e42C!Y%^;5$*A%tT9t^!yG za2>#FYF@%|nWSrm~A?RI;8m_^RH=S1WNfYT!Kqlg?Q**vg-G)iRAZYwgVt~ z@6YV*?cIIL0zwGS188~g-y+!uB9~S5Jb*JrQC!+L z16x~L+83w&uE+;1k|{|M5e}VmRTYsu##jJI$10+Qg#{l%Sar^wh%uhs+1dGU5N~#N z_E1@tpE>6iMP&V7Z_fU`WivaU=lL&LmSOA+wA<}F%xnd~+V1Y|&=7j>-|ct6i)Qu% zfWP`7{Hm_&`)+v*o6Tm62$V9-V~%5V@E`OQ`N^v{tDpS#02Dd{xg7c&bgC~Mq_aVwMkM* zE)_-b`@{sOs?~Me zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00P`eL_t(o!|j*Ni(Ew%#m~J} z@72t6Xd89J0VAlOi9!&}Mp0ypfqXETMV2mfA?lytLhv65xN#75(P$?p*XR-S72#)wk|-F^PoYONPf|*zqeS!$0B>ejMC7dZ{(feDSXKY_ zfQiVM`Erc$*DTBKBBB=nJmJ0n4Z!;o2}mgw&bb8ODuBnl_wSk6w<)D}V~pL!#l`ZL z)|Aq-W_BXa^S8{bWoBIfM^trb+8`Q^$K$uX_h9DJM05(k$q>TVF~$x6W9Bs?dWnbz zs(MaDHdS>PLilVZNoZzOmStDW>~f6pW9Qr&fHm*^hh_!)R_mv^CSeF+%ghG5xm0e=J&I?=9V6hj$2Jl9 zsT(`z8UU><%U&IgM#c8__IE2QE9Jj9rVx?m0GuJBdzrbKSU`;N`w+qgfVC{k)|Z!; zFNw$(&bhB{=KkK;UJfA~6OnZydXb3ws=ARiz9Ay#M5LcmlC(=drF33I-mI$Xp_z~4 zf70*w+e=GJtIT{H0IBMQvMevP+wJ~bEo5d{uh+}>{|Ecr(fkR*@`?I8Jhb)z0000< KMNUMnLSTZlf}v9Y literal 0 HcmV?d00001 diff --git a/openscad.pro b/openscad.pro index 2051914f..d43fd5fd 100644 --- a/openscad.pro +++ b/openscad.pro @@ -307,7 +307,7 @@ src/FontCache.h \ \ src/AutoUpdater.h \ src/legacyeditor.h \ - src/scadlexer.h + src/toolbar.h SOURCES += src/version_check.cc \ src/ProgressWidget.cc \ @@ -362,9 +362,9 @@ SOURCES += src/version_check.cc \ src/ModuleCache.cc \ src/GeometryCache.cc \ src/Tree.cc \ -src/DrawingCallback.cc \ -src/FreetypeRenderer.cc \ -src/FontCache.cc \ + src/DrawingCallback.cc \ + src/FreetypeRenderer.cc \ + src/FontCache.cc \ \ src/rendersettings.cc \ src/highlighter.cc \ @@ -395,7 +395,7 @@ src/FontCache.cc \ src/mainwin.cc \ src/FontListDialog.cc \ src/legacyeditor.cc \ - src/scadlexer.cpp + src/toolbar.cpp # ClipperLib SOURCES += src/polyclipping/clipper.cpp diff --git a/openscad.qrc b/openscad.qrc index 6a578f9d..2f7aa662 100644 --- a/openscad.qrc +++ b/openscad.qrc @@ -8,19 +8,19 @@ icons/prefsUpdate.png icons/flattr.png src/AboutDialog.html - Arrowhead-Right-32.png - axes.png - back.png - bottom.png - Document-New-128.png - down.png - front.png - grid.png - left.png - Open-128.png - openscad.png - right.png - Save-128.png - up.png + images/Arrowhead-Right-32.png + images/axes.png + images/back.png + images/Document-New-128.png + images/down.png + images/front.png + images/grid.png + images/Open-128.png + images/openscad.png + images/right.png + images/Save-128.png + images/up.png + images/bottom.png + images/left.png diff --git a/src/MainWindow.h b/src/MainWindow.h index 84e5d5f3..4175ff08 100644 --- a/src/MainWindow.h +++ b/src/MainWindow.h @@ -8,6 +8,7 @@ #include "Tree.h" #include "memory.h" #include "editor.h" +#include "toolbar.h" #include #include #include @@ -110,6 +111,7 @@ private: void setDockWidgetTitle(QDockWidget *dockWidget, QString prefix, bool topLevel); EditorInterface *editor; + ToolBar *toolBar; class QMessageBox *openglbox; class FontListDialog *font_list_dialog; diff --git a/src/MainWindow.ui b/src/MainWindow.ui index 2c952a38..9f4016e1 100644 --- a/src/MainWindow.ui +++ b/src/MainWindow.ui @@ -440,30 +440,6 @@ - - - toolBar - - - TopToolBarArea - - - false - - - - - - - - - - - - - - - diff --git a/src/mainwin.cc b/src/mainwin.cc index 80cadb93..1124c5c8 100644 --- a/src/mainwin.cc +++ b/src/mainwin.cc @@ -269,8 +269,9 @@ MainWindow::MainWindow(const QString &filename) connect(this->appActionUpdateCheck, SIGNAL(triggered()), this, SLOT(actionUpdateCheck())); #endif #endif + // File menu - connect(this->fileActionNew, SIGNAL(triggered()), this, SLOT(actionNew())); + connect(this->fileActionNew, SIGNAL(triggered()), this, SLOT(actionNew())); connect(this->fileActionOpen, SIGNAL(triggered()), this, SLOT(actionOpen())); connect(this->fileActionSave, SIGNAL(triggered()), this, SLOT(actionSave())); connect(this->fileActionSaveAs, SIGNAL(triggered()), this, SLOT(actionSaveAs())); @@ -445,7 +446,24 @@ MainWindow::MainWindow(const QString &filename) connect(this->replaceAllButton, SIGNAL(clicked()), this, SLOT(replaceAll())); connect(this->replaceInputField, SIGNAL(returnPressed()), this->replaceButton, SLOT(animateClick())); - toolBar->setStyleSheet("QToolBar{background-color:black;}"); + + //Toolbar + toolBar = new ToolBar(this); + verticalLayout_2->addWidget(toolBar); + connect(toolBar->buttonNew, SIGNAL(clicked()), this, SLOT(actionNew())); + connect(toolBar->buttonOpen, SIGNAL(clicked()), this, SLOT(actionOpen())); + connect(toolBar->buttonSave, SIGNAL(clicked()), this, SLOT(actionSave())); + connect(toolBar->buttonRender, SIGNAL(clicked()), this, SLOT(actionRender())); + connect(toolBar->buttonTop, SIGNAL(clicked()), this, SLOT(viewAngleTop())); + connect(toolBar->buttonBottom, SIGNAL(clicked()), this, SLOT(viewAngleBottom())); + connect(toolBar->buttonLeft, SIGNAL(clicked()), this, SLOT(viewAngleLeft())); + connect(toolBar->buttonRight, SIGNAL(clicked()), this, SLOT(viewAngleRight())); + connect(toolBar->buttonFront, SIGNAL(clicked()), this, SLOT(viewAngleFront())); + connect(toolBar->buttonBack, SIGNAL(clicked()), this, SLOT(viewAngleBack())); + + toolBar->setStyleSheet("QToolBar{background-color:black;}" + "QToolButton:hover{background-color:green;}"); + // make sure it looks nice.. QSettings settings; QByteArray windowState = settings.value("window/state", QByteArray()).toByteArray(); diff --git a/src/toolbar.cpp b/src/toolbar.cpp new file mode 100644 index 00000000..061a09c2 --- /dev/null +++ b/src/toolbar.cpp @@ -0,0 +1,48 @@ +#include "toolbar.h" + +ToolBar::ToolBar(QWidget *parent) : + QToolBar(parent) +{ + buttonNew = new QToolButton; + buttonNew->setIcon(QIcon("://images/Document-New-128.png")); + + buttonOpen = new QToolButton; + buttonOpen->setIcon(QIcon("://images/Open-128.png")); + + buttonSave = new QToolButton; + buttonSave->setIcon(QIcon("://images/Save-128.png")); + + buttonRender = new QToolButton; + buttonRender->setIcon(QIcon("://images/Arrowhead-Right-32.png")); + + buttonTop = new QToolButton; + buttonTop->setIcon(QIcon("://images/up.png")); + + buttonBottom = new QToolButton; + buttonBottom->setIcon(QIcon("://images/bottom.png")); + + buttonLeft = new QToolButton; + buttonLeft->setIcon(QIcon("://images/left.png")); + + buttonRight = new QToolButton; + buttonRight->setIcon(QIcon("://images/right.png")); + + buttonFront = new QToolButton; + buttonFront->setIcon(QIcon("://images/front.png")); + + buttonBack = new QToolButton; + buttonBack->setIcon(QIcon("://images/back.png")); + + this->addWidget(buttonNew); + this->addWidget(buttonOpen); + this->addWidget(buttonSave); + this->addWidget(buttonRender); + this->addSeparator(); + this->addWidget(buttonTop); + this->addWidget(buttonBottom); + this->addWidget(buttonLeft); + this->addWidget(buttonRight); + this->addWidget(buttonFront); + this->addWidget(buttonBack); + +} diff --git a/src/toolbar.h b/src/toolbar.h new file mode 100644 index 00000000..a743d6ff --- /dev/null +++ b/src/toolbar.h @@ -0,0 +1,21 @@ +#ifndef TOOLBAR_H +#define TOOLBAR_H + +#include +#include +class ToolBar : public QToolBar +{ + Q_OBJECT +public: + explicit ToolBar(QWidget *parent = 0); + QToolButton *buttonNew, *buttonOpen, *buttonSave, *buttonRender; + QToolButton *buttonTop, *buttonBottom, *buttonLeft, *buttonRight; + QToolButton *buttonFront, *buttonBack; + +signals: + +public slots: + +}; + +#endif // TOOLBAR_H From 3f37cf8c505fc870c9a0fe9ddbbec2f89e5535f5 Mon Sep 17 00:00:00 2001 From: shaina7837 Date: Sun, 14 Sep 2014 20:14:14 +0200 Subject: [PATCH 03/24] toolbar splitted into two --- images/Open-32(1).png | Bin 0 -> 4196 bytes images/Open-32.png | Bin 0 -> 4196 bytes images/Rotation-32.png | Bin 0 -> 4196 bytes images/Save-32.png | Bin 0 -> 4196 bytes images/Shape-Cube-32.png | Bin 0 -> 4196 bytes images/blackNew.png | Bin 0 -> 4196 bytes images/blackRender.png | Bin 0 -> 4196 bytes images/blackUp.png | Bin 0 -> 942 bytes images/blackUp1.png | Bin 0 -> 939 bytes images/blackUp2.png | Bin 0 -> 920 bytes images/blackUp4.png | Bin 0 -> 909 bytes images/blackUp5.png | Bin 0 -> 942 bytes images/blackaxes.png | Bin 0 -> 200 bytes images/blackback.png | Bin 0 -> 1053 bytes images/blackbottom (copy).png | Bin 0 -> 1412 bytes images/blackbottom.png | Bin 0 -> 1412 bytes images/blackbottom1.png | Bin 0 -> 1504 bytes images/blackfront.png | Bin 0 -> 1071 bytes images/blackleft (copy).png | Bin 0 -> 1504 bytes images/blackleft.png | Bin 0 -> 1504 bytes images/blackright (copy).png | Bin 0 -> 1463 bytes images/blackright.png | Bin 0 -> 1463 bytes images/blackright1.png | Bin 0 -> 1435 bytes images/rightright.png | Bin 0 -> 1496 bytes images/zoomin.png | Bin 0 -> 945 bytes images/zoomout.png | Bin 0 -> 938 bytes openscad.pro | 6 ++-- openscad.qrc | 19 ++++++++++ src/MainWindow.h | 2 ++ src/editortoolbar.cpp | 30 ++++++++++++++++ src/editortoolbar.h | 21 ++++++++++++ src/mainwin.cc | 39 +++++++++++++++------ src/toolbar.cpp | 63 ++++++++++++++++++++-------------- src/toolbar.h | 7 ++-- 34 files changed, 145 insertions(+), 42 deletions(-) create mode 100644 images/Open-32(1).png create mode 100644 images/Open-32.png create mode 100644 images/Rotation-32.png create mode 100644 images/Save-32.png create mode 100644 images/Shape-Cube-32.png create mode 100644 images/blackNew.png create mode 100644 images/blackRender.png create mode 100644 images/blackUp.png create mode 100644 images/blackUp1.png create mode 100644 images/blackUp2.png create mode 100644 images/blackUp4.png create mode 100644 images/blackUp5.png create mode 100644 images/blackaxes.png create mode 100644 images/blackback.png create mode 100644 images/blackbottom (copy).png create mode 100644 images/blackbottom.png create mode 100644 images/blackbottom1.png create mode 100644 images/blackfront.png create mode 100644 images/blackleft (copy).png create mode 100644 images/blackleft.png create mode 100644 images/blackright (copy).png create mode 100644 images/blackright.png create mode 100644 images/blackright1.png create mode 100644 images/rightright.png create mode 100644 images/zoomin.png create mode 100644 images/zoomout.png create mode 100644 src/editortoolbar.cpp create mode 100644 src/editortoolbar.h diff --git a/images/Open-32(1).png b/images/Open-32(1).png new file mode 100644 index 0000000000000000000000000000000000000000..576e58e2a2247a8e6010402543913636031c40e4 GIT binary patch literal 4196 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEV2xxn{IEF-UGAan%e-9KL1*0J_ z8UmvsfEoh&`ua(@u!)I@6RK+bJTEUV1#4?-75u8uWK~pD{^P=$nwl%ol;h<(Iy#!D ztE)e@va(Xbs}NZdm*pUFH8r)fKso~%1I5yuot;HMX1KYz$ru z+Y8bMbi_lV9RbonECw3<+RV(%4v4LQ7VcJ6RsD-gFVT(w8t{=A4D|U+OG`@wV0x** zXECyafKhl8IkYKe8yOkJ!7Kne=r_=U_rQ?&2x7y;VKh+eEij~PD7F-4KvYx|8_>e1 zIyyQtfgxd$nVHD}lPfDLV*@5Y6=1F@0XaZJL*u@Mg@p!89xn}4{GLes5g7Epaj69+ z#Mi*YX$ExUSzB9M3A~mfOTvPTQW_W)e?vk-#5_Da_>j#f$fnd{n0}B0Dl03Q2wI4) z0A>KC^r!1G(#($dNZ2?=4dwY8Pg)zwV{@~3NRYOV+3yCC&IhvboFGgLK5 zGa;;@p>f>C#s+Ao)^b%<)xWsZljR7YVMT;6&~hDhb#<^$aaj%$2Rd*&S)o8k6VTw5 zz@R=24Ehp7Lqk6!BO^Bh1A{PNI;jAL&UujK+S=OlgMxxs2$_W;4+>sF80h=&*wg@n zd?_dq0v*957_A0<)nQG4|k8L&y?*@*oG`G?-Wkd=?Or8+E|& z2mxUB0_A10Ffa?I5S!LU)s2S0Xb6mkz<`Iqj(U-U>{rc>gB;@N>gTe~DWM4fc(5ef literal 0 HcmV?d00001 diff --git a/images/Rotation-32.png b/images/Rotation-32.png new file mode 100644 index 0000000000000000000000000000000000000000..616080493add243f70c282d276f4c6f19c7c503e GIT binary patch literal 4196 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEV2xxn{IEF-UGAan%e-9KL1*0J_ z8Ulkf1dNT1jWjhiH)?5VEwr|_mLS!c4h{}{+S=MPfo5zqGBUCwRX+nz<9!tsmH!|N zbi`7S0YG+@va)gwAq-T<0kpgyre94>jr0OXLqp>;%m5&JC)5G^ftDX8gn{~afR0`a z)32(k`j_Mo(9_dP1G@Yx(DLWNAhaRX0231v9iZO(Kr?;<&8i|*KUlq&mlso9TpSZw znt__q($bhbJv~{-)enmEZXk{$*8rg203e=8u6~dM_5*PSq9Id=CshaBT==Zv`0ukq8W` zj;F))gDN$W9bjl^=m7NjaiHbfLBUC?0l-F#7%&vptE;P@HZU*nsVl_mH7g6kVkS3j3^P6|swP4;HMRG^g!hmX4AMijTmUnOT$ez_n!mupr@;!%Q~loCIFtc B*ku3! literal 0 HcmV?d00001 diff --git a/images/Shape-Cube-32.png b/images/Shape-Cube-32.png new file mode 100644 index 0000000000000000000000000000000000000000..d04505894c79968c63859ae474664557b325ac17 GIT binary patch literal 4196 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEV2xxn{IEF-UGAan%e-9KL1*0J_ z8Umz;fRB$4mw|ynnzpv~RV^*8$9j5t70%AiLZq8Sq7DZK2MM5M%^DgSuhrDl{;R92 ze+RPPgV;d&v#zf0R4XehH4=>_tlZMlQcp)mXFkY6kY$>hnlFJ4X#_e*%)`TjPhVd@ z4;T`+p^o|s44KWQrlt;rO~#|5y1JUl#Kgo4XxMI$!5|E@+gBb)g^e)gxZp4~kVPRne46%za{lKW1NUUDC zI-sTfFatm|kbfHJo2c;caGbu0h=^bTs)+!qJ&CLr=zx`QgNbFp9AIN(lLqw7N?`o| z1{n&Be^9C~b8&Hjr+QacR{@|{2~h4KNDW9WP|s>dN5>ElpCShUEz$!y+Sb-q0ccP! zFtvXK846AHlR?1?Vnf9~0{Q(QwIDsw(a|zga{$Od5P+uo0$_r?3o;ypfj++v%n1b` zIfyC$Ll?A`TL>)cf5I$-(I7FP z@0SAAnBdS(Jz-!&L<(5uw*uq%H4wiAvfJ(L?PaKE!>CE4Auy6cpzXJK#&xaYT#%nV MUHx3vIVCg!0DX`regFUf literal 0 HcmV?d00001 diff --git a/images/blackNew.png b/images/blackNew.png new file mode 100644 index 0000000000000000000000000000000000000000..8e9b14395971dcdeb78bec3dab3a542870c3e4a7 GIT binary patch literal 4196 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEV2xxn{IEF-UGAan%e-9KL1*0J_ z8Umz;Kze#QlaZ0pa&2wx|G2QezW!@7GqVWNO(&ouEiDaX`D~!YzYPrycjCf2Iy!H4 zb#*_-$H#-p1nL136O)M`Ujq&Qh|g4@nz`q_~m<$Y&7@!;z$N?!SDOgiE(7}|a0iY#ZK+8diZauPZfmx9Q z#<#SzYz471Gc%dIy}jWno~90Pbab>ZHa6}AW-%dPsC@VE@K6Dk2kRXi9Q0rgqp1Tx zmH-psMIe3(wCF$35g&o<`ylc1@^Yr==x8RIIG~`QfX&+4x(aCFLSWQf1z8TmK>k;t zBVGd2$4Va`9|4*;0OZ5q;9w45f@}m9wHP@ASXRshsR03+IRF^ne8Bi#4f8n~{TG-^ zrn|el(Uj>#Dc|Gb;&_l9Ofnl7uMt4QKBJ{} rc>c#F4ze7WEwf0ra8$!+2#mN8n7`e|?}ikY7s%tDu6{1-oD!M!PA876*VF@n2h8dv0K0AgH9L zEx_dfkRvoTHTOC=IM6nS;Bx@T5uhAmZf;Jy974zeAV)xRh!suZf*1#Y90AQCVN`bn z2@d$JudkmqAPxZf{xh)1_M*DwAOi`705B0gHZ?Uhpo!~}9OSt~0mDVkZ1&jDIm zS{q$lTzF_|IW7n2=;-uEL_{#r+;VgW023Q+QaV1Lz!D+Q@{cr2>4Y2rOz97SDP0er sI-1D=3zwxdPw6ys{iwmCAuyOjVA|6ittSsWyAN`sr>mdKI;Vst07YENzyJUM literal 0 HcmV?d00001 diff --git a/images/blackUp.png b/images/blackUp.png new file mode 100644 index 0000000000000000000000000000000000000000..0f6375d0308b313c75f7f0d4770aa90e82f9f16f GIT binary patch literal 942 zcmV;f15x~mP)(Bm6i2DWCb6Bf(Vx$1^ZP(iV7s62OlCz zD?|uXe260U$sooc$b4DYl14X5$TU~iU@^$u)tR~DPA{WKDC@4}zWBj?JLi1goIB@! z2O!TN_LzUjs$t|yKsx{w1HjjObdLf64FJC6>-tUsfN7o5{U)~oKx~VETl>n+^So~h zxd{MfeSLlLfBy*^8X8Ip3kz>9E-nsPUDyOdsNHV2mseI+ev3w<%h|LtBkJnvq(mao zi7^i7y3Wqd&Ta@g!m_L?%kpo6APk4YLE3D#G)a=Ld7gg|4u{|6ETF5a3yqGBHm|L% zbz+SD001OOM&{?|=NlUv&y0+Ws9WP(TU(K$D5q6b?Zg<@Tk)S5hUsxQ94~^wpq`Zg zNs?};s(KFqfTF1HJkMVWhr@4n(=o5tTa!#Chjd++000<>2|vViA17*gWN*NPB|#k*9d}efu`w~hGDo;snoN{ z$;lZ>l5Y6@{-TYTrlzLDk|bSM6lErrN-xob zJpQ@5y84yJ#KcL<Z_B-?C8Wy{OUS1`us0RT}H^|Yv{sBdg+Yyl2%fCFTSKY!*(CM)qB QjsO4v07*qoM6N<$f+T{i3IG5A literal 0 HcmV?d00001 diff --git a/images/blackUp1.png b/images/blackUp1.png new file mode 100644 index 0000000000000000000000000000000000000000..8d132b918ab8ce608362ea68afc1ae43ac9638cf GIT binary patch literal 939 zcmV;c162HpP)_wD@boJ3OOxT!-(t-!Ox7EC7Fg~SAdpl)KLs|f5@2`Ma)h%UMi zDXlOe(C{LH=&B$_5M&YzR>INc4^|qRGZ^clow;+)cec~b3@K%9mAmnQbN9aQ^L)?u zz2|)aN(|#)=I_bX&`Kqs3jnGBV7?UYkpQ3oz+9=W?-&5+xzDoG zGTDPM_N%IDT3TBA^CU*2*3i&E7z~CiK@cxlmc1Pch29kHKwn=UN~hCDDk>@-NRl*= z$z<#VLCh~ME^?d2>$;8-i3FI<=64uluc9cYs;jGy*VWafJs!{8?Cfl&AO{3N=#^!; z9{_+P$uBI+o)3jWueRfu%jG&GNzx-#RRsV5nx^l~%*(R1wrWb zdcBqFG41W`dj&zbB8uYYR4VmE)3ierMLnyntv!*ieqI44lPMSuhkYE!HPJMEN7wao zS(f{w(dbv3&34~rv)zqEA`w}Z2XtNEOVjia$8k;JaQH+`O-(RgePX-qGC4W93;>rq zIy!EyuCAWO7e#0i)5lOi|Rg zmX?+#Q51&?B`-?AI>yGvwA>ih#>dBt9>)kuj9meF1!S{Xw%Fp5B$X8{z+f;)006OA z>^0BxBW}0*;C6}KZufqk=Z6;-7Cz+W#P@;))YsSFVi=|yArw|z%M;wNtNL+BBbG`0W$ N002ovPDHLkV1i2@wh;gT literal 0 HcmV?d00001 diff --git a/images/blackUp2.png b/images/blackUp2.png new file mode 100644 index 0000000000000000000000000000000000000000..fa9ec136b8b116047b9dddce3594ab0c5b44f844 GIT binary patch literal 920 zcmV;J184k+P)?sk86$B5j+sdJ(P+Q7SG6DHFMN=`87p%-!VRDt~$5yKuNLc#}; z(h8FT4Id&1UrLA(1eq^`m2kQ=1;fy0FzjKwxx4$_?t0M>OLS9{zz^KZ{l34?_jBL- z{sZ{WVLfaC`e8b+0RRI4x(-Xg_jLj3!xCU@dh)X+!LqrOmzU?*^6EleT^)JgpIlp8 znITD$Rt`v>T(!%1R-TNVFk@0)}B&=I7`CuyHsXQHEjc zCX-3War_O#F!#dY@cW&(&D$Mxc6MT^RO)n2PR?UVl6uqWvvp@{=bD+6pTf^bt5#f4-t z`9jmQa*`xR3knJv_gsb+izO6^M4DKZEukptzF`>0WLfT6US9sj^ZX;8=N~LBEiK8i z+-n%daf+h)S(Yt{L?VrLyFIiMKfc>?nV6VZ1c3I2hK8<{m6eMKp%z6^ZU6w7&E`d# zrf=ux=MM*i!T5nTqF^u>7e%q(>-C;Ao6U>7(jlSbJZqVoRId|*W=kt|v95*mG zH}?quz%Y!T84D;XD(a?bx&_0qsH&=0VzJogva+%n*yQBo8CjOw5JI&80630MQ54muD9RlS!z=_r+)@;!P17{j z`tbT-u~_MF ux�iK@d-EHrv4X`1mp$;Rr{_5WfHc$U|JGY)#Ps0000>Z~cXy1GJzV^Q8u_Qe?!9crWV(WplYHn^w(2dgqLL7$9wed% zA3{niL*PuUbYZ%&8>0-e&GlA;dg%D z&*9v2em{W!SeJ59F=ca65%B<^=7O&TfV2xhI&5>pF7tdC4ig}{7of4R@kw`gx9Oid zyIiiCeRi(`fND0IlN`rQc6D{Nl~Pl4kfhGePCl7T4rVf$3u|j@)P6ZFEiLN^q2n5j zCacrw-Wm*shl`7g@5=@l85u!yb924h+uMT}V>bZ6%F0SnSc}E-5o3HB06?eHeW567 zyt%pgrO)S+_sd6x3i@v=@y5o+hA4_-s;X8~6g9yxOlvqC?yIY- z3l^)dJLq*;SXfvGfT7;r-us)Io0l=h1Ck`&1OU)#wd*uZ->t2!oe2a2iBhg1D)lW0 z1Of>`5GEWB$4RYLyH1ki_l}N^RzVOZN;NMFAg`I383h0o08nOUXO(j6AgHj80Ez-+ zv)Qs+Z7P*AmJOiMXi@+Gu~_UK%d%5Wr_+2;W2e*E#JUr$d@Xa9H} z$jjkyw5L+3TNq=ns;cCkBa;b&@EMK9@nA6c>8}nX`%Ff4TU%QA}K*fg$qNjpbiYOCeVapiZD526=U4vl*+g+KNJMQ$dD^ZEgTJ4J;+^4zseBb@f zJ#!8~jzMhl{I+xqBUb`C0AL3Ie8`1+6aZ)d@IF`RI|Kk`dKLX|avK0de-d#1zp`^2 z=lhA=1OT(Pwsyxqe}r{)bvp|R3i=in7Dm%9tO6m_;cz%g%FD|?Mk0}z6)V?8O-+p$ zkH@<)#(rJb?X$D9zu$x)jIy#a(q^-zNRoWaaon{~DD+~z*l4W}{r&x@s;cUM)9HK~ zi^XJJ*N+hd@ljEf$4yO5Y+C&4YHMp_^7Hc#lO*{HV|;LFY3X@oW#wB*l8!bvH`A6K z5Jj<9Rn;p102D=i<~Z(jC=`0K5y!k<@4iGLF{XRsn zz4i6=g_%7K4Gr5xQ9LKh@~31ndCxG6eKbu!C@Cpv$@&dsV7J?Y;c&Q>=lKeTVXm8| zS)i)wmHGMkFD{qsmdoY35s5@1s;XW!O>;ZLFoQhLSA@gimg3^#;Ck`Njh4&A#Kar` z^fWd$URqpSJdQE$)HJOlT>*0}%U&odDjEp{0^hBaHnRHT2m}J(Wmz8ddcAuHf|#Re z`fGJ{b%iX;gI3A25|F{j$cT|{!^YUySk~Zzt$O#$FpA$ghz^^yw`R83_>W%vTUcr;poY_9k;i)qsht1gQ}`_V~pzn07#OY zVi;yX)3l2SAv;A;eVV3q8;0RdH?Nm=yM4gzc0U{*9!_m~9{8opbzzMCrfJf@q)ewM z>Oo#!-as%IeEnAkl0QsF#j#lIEXMc*03eE@?i3al-X0$xpNB1MVG9=V1CG-?bh-&` QhyVZp07*qoM6N<$g3dRr8~^|S literal 0 HcmV?d00001 diff --git a/images/blackaxes.png b/images/blackaxes.png new file mode 100644 index 0000000000000000000000000000000000000000..c1714bc8dc0b1bb61c47b27e1dc919085a1ae54d GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v_d#0*}aI z1_o|n5N2eUHAey{$X?><>&kwQO_I&PD0Ho2H&7_l)5S3);_%z4j$8*6cvy~Kn*ZZ} z`HwXfCl|UeT=}TLGb_p literal 0 HcmV?d00001 diff --git a/images/blackback.png b/images/blackback.png new file mode 100644 index 0000000000000000000000000000000000000000..e3c021fcda6ca5a2e0de7bab57788f26eebde46d GIT binary patch literal 1053 zcmV+&1mgRNP)$nr@Lu3JXPt7eaSav||@T>ekVT$VNMG zqwJ!vvJY*CI681R*e6~T3nLDMi6BCl?r7$q!{IPZ#w0-+qvxFWvifsi~>CIXyj{eWC!-X!K|{ zo4sh7<^|ifs~LvT8HUkq+jbK|ws@ZZva+)B`rO>yoyQ8$+S;n-a=8IYX}9Az63eoG z^F05V$Kx51BuP)F)2~uW`z*_Pnqe55(>B)=lMSrMR_A0kN;TCiG{=AlUrL`Uznz;0)QxrHuGOqcdM%Uwx(&T`F#Ex%d$=if-vFp`OfZ@e@_5OlI9bMM3>j=Z4yQC z6UT9m=(>I_nN0o}2n0S21OnIB*Vor|UH{N=9JeTn!(OkqDUnE=t*fh>-zz^??su7; zom~U)R!2w2`{{JLhf>;S7{;3bz_RR`EX(iJ*4B>2VzGO>?`vgcrCQf@h@yD#6L?Uu zSnQsrX~W@g_!!HwYl0yB)zZ?^q-omleZ>Lb%;MtWVmh6Ev@0m3v9U1=fCa!BA0M|K zV!0*D@<)oIJQ;v;WEe*DzXWjEw*9OqidbD;Jp~{K;PZbI;4~rRPA->&&*%FYz!?DN z0X(-a0Nb{e0|LAV09930kR)jbz|wBYvH%!{*#dx6DmCr*`$r>@$nkP3M$7YLxy2oA%sXg z&tEnSW5BYk69BNex%qoGo3&gn*YlZ7<^=$w0KNlo`H=>aVwdYL&IQ5)S7!1&KT%Op zF*H9ve;mLS0CfPC0ek@9)?*vVqS0twCX=~HDSZt9;d%b1$Kx59nVCr*PPvCV)PD63 Xlbe0bt-=Ky00000NkvXXu0mjfy4(3+ literal 0 HcmV?d00001 diff --git a/images/blackbottom (copy).png b/images/blackbottom (copy).png new file mode 100644 index 0000000000000000000000000000000000000000..4acdd60e20c547b94476a5b26d161ab35d35cc1a GIT binary patch literal 1412 zcmV-~1$+95P)bZMH5g17L8WY8hlVPO#0x1Vn{H`gAXPGral;f2(~FU!8UEsrZfrM!}tmv^bXz5PmCTbsXXfYQ=ZnwXg2 z#>U1CuIs+%dEP!|&L^TtBKk@QQKPkfg@`^Sq8nQ4MrN*M=BEMNB%(pfvd$G27Jhx< z!iBjNOHff!QN3>6x({5}?NmzbB%&$PG(Q(Y93L4OIbB#-Sk25$06y#J=r}brG<1cT ze+F=khy;LLp6BgNr_)8n#l<(Kr>AEh1R(Al)Ya8J=Qz#@rPM(o#P7Ck9}a~=Z^YyA zkB5hc`vE{}Etr|K)}phslLiL|r-p}zzb_~#_=Jd#Mx)U;iRe0jZCdN64jnr5K$(rZ z#&KreWZU*}!!SOIL?RQty}h}AX-1>~FcF1?5HmS7Qlf62Z)GrM3iRc zh}PO#B4z+1;s#>dAEA%p`!GjmKSwLA&-?AgOwYoCY~h$!UyejWfE zIdX)O$>jR8XV1Qr%jJ%0t=qKL3(TC*T6Z{(^Py>)hqczV0N^-|?|I%$03I_hxlisX z!}j)e-nw$=TBB^gAdlv3780J1`ej8bZY>$>j?Ar_>RLjb<;egDVu^76^9 zuC6=JhA{wRyLazCpH8QXGMP-XQtDmb_qQ;!YZ!(Ig+ja%fJ{(k3?L+g_{}hk)0Smj zj7Fm~U0q!&*f&P-Bq=2g3=CAqbSV|cyE-s#o$K&Ui z`FuDWzFJmRHhbpG8NKF)q_wqGj*N_~7ebVIp0{^?etzfl^z?S6)IU30O4(gnT6&_g zva;K8oLhZ;eLnsRYieqWr&6iSQp!ug?ZyDuFpL*Zo;)cYWmEh*fY|`xGJq!^byrRR zh68|B0HL)^W~?HH0sIgw{1breS^!r2bMXg&Q2bZMH5g17L8WY8hlVPO#0x1Vn{H`gAXPGral;f2(~FU!8UEsrZfrM!}tmv^bXz5PmCTbsXXfYQ=ZnwXg2 z#>U1CuIs+%dEP!|&L^TtBKk@QQKPkfg@`^Sq8nQ4MrN*M=BEMNB%(pfvd$G27Jhx< z!iBjNOHff!QN3>6x({5}?NmzbB%&$PG(Q(Y93L4OIbB#-Sk25$06y#J=r}brG<1cT ze+F=khy;LLp6BgNr_)8n#l<(Kr>AEh1R(Al)Ya8J=Qz#@rPM(o#P7Ck9}a~=Z^YyA zkB5hc`vE{}Etr|K)}phslLiL|r-p}zzb_~#_=Jd#Mx)U;iRe0jZCdN64jnr5K$(rZ z#&KreWZU*}!!SOIL?RQty}h}AX-1>~FcF1?5HmS7Qlf62Z)GrM3iRc zh}PO#B4z+1;s#>dAEA%p`!GjmKSwLA&-?AgOwYoCY~h$!UyejWfE zIdX)O$>jR8XV1Qr%jJ%0t=qKL3(TC*T6Z{(^Py>)hqczV0N^-|?|I%$03I_hxlisX z!}j)e-nw$=TBB^gAdlv3780J1`ej8bZY>$>j?Ar_>RLjb<;egDVu^76^9 zuC6=JhA{wRyLazCpH8QXGMP-XQtDmb_qQ;!YZ!(Ig+ja%fJ{(k3?L+g_{}hk)0Smj zj7Fm~U0q!&*f&P-Bq=2g3=CAqbSV|cyE-s#o$K&Ui z`FuDWzFJmRHhbpG8NKF)q_wqGj*N_~7ebVIp0{^?etzfl^z?S6)IU30O4(gnT6&_g zva;K8oLhZ;eLnsRYieqWr&6iSQp!ug?ZyDuFpL*Zo;)cYWmEh*fY|`xGJq!^byrRR zh68|B0HL)^W~?HH0sIgw{1breS^!r2bMXg&Q2$&V6s@z04a=Y!7y07(fPtgf-TXSd7MQ!A0tZia47D)Jp6rt`e0N zP&ZwoW`UGs(PguVP?J@J+PX-f0wqYMiN_{nK*$xYGmh~L*z)*!e%`zHoNit>k)bi( zR0>Br($%}?ocHOTd%pVt-*>Y%Tj0Wl3lxvX)$!xUapT4f96EG}^7%Y@o~Mo+If7!b z_{@CT$j|od*+Z#Rs!K#(VrG|_V@fHDh-?5c5pjvg1>lN^LqwHgvH16A)wDMPAe~Nk z`@Vk~K$4jg06ZdkNkrNrPXX{m!~p;z`ZAx-S8m_F{ne%c3=IuA&1Ulrt@W<}XrY7C)?3tMiMCi`9jNh2{DA`PKRP`L(&ZxyJ6@yVtbV4XyPtW|q;>(JPaa zlN$$+%jM|tn?>TmtYBfVkHBX9o@(*s@+;sZ^5o_V%xB+x}QY zQd;Y`3WY-3h5_{U_O^#%_)}wyMMT#!nM{?LuM^RIX8v)r*?jeBxp(f|Sp#r|h{{^) zqm4#m--cVTb?eq$)oOLDR;$s<%F0K@VsR#)&(~|U+RMyb06^QfZ@;s!u&{dY;6WN5 z9;S|t4%OAwr9975M6@U(?Evy3vewtvceh+FH^1u?j9Qj8Mns2=G1DUQTL4!8U|?V% ztF`_;fQ(Y=PfDo=0NMb&OhlfDBt#^ploDp{(^?+}Fs+pOU8z+1>{&dJ1MqVIhXG`a zFFIL z0AdkoKfR>2ViO3MqAb_`sXhA9U zWarMEJUu znwn|>KsK9A6Hybu=Z@n%xOC|fKdl7};7Q~U0bH?dd%uYM2Ec1dsf;m(m>I^HEPw$3 zQ^{oV+Qh`f@_LtOaB#4v(P#_-aFkO2Y_(cXzUvq^0F=+3J^R;8Ci91$o}T%1Iz5_7 zr3OYvN8`qr0)TEJn(%%9$}2f(0+R9x5n$Jp3dxL)qa$Vl86Gaw?nEX$ghnVFg0FcATO<2cJAG9Hh| zXI$6)NxfcwT}1kc=%(-cQ>RXylBcj}2EZ_Y$B9JZYBrmFzQ^eP{rl3}+q)VBL5DHs z1b`hPl1wBLe~iUqcl-MKtbP0TA(2SX-o1ONtE)?OcXuntafX5*I739A9X)#VgNqk0 z@^e4OU9ylG7c z0Q>jv&jmqnLPQ`UHh{HA0o4Gk0q}{a4j?3=z_P4`+1c5dm6a9Qv?h#%>6hhl`Q0E0 z$g-?}h%_^^=Xs{pYQY#IN-1_6hp%71&Uj%j?1lZm+kXJ(M5>4rqb|At0000nfcL$wF#MdDLw%(Cp=rlzKw%gf6@AFF|$o*t=GDvc9Dh77|H zEEdZjEX#iEa5$y}K~QqJ+^d9;QBBjHq9{sd80Jfx&Gvpg9{>8t1|}vZ==u5i{+*qj zaY9Hh05A-b;y5nS-roM{+}xb<*Z6QaOv|!-K~a=(Ldf%G{0}_ON8E1r=h0|XZODKm zNmms`xd8wy%l>M!+1`l9iwC510EhzE2Jqle1A-u| zq*AFtr_jG`#-8HUl!^ZcaK>Fi9UQWslW zTUYj_V*z{xAPv9;;Bltj-(_iOX&u0u{r&y#=5o0(A!M{#tzH2Di^Z~TwOZeHxm+`` zSgiOrX~F;u0N2cQJKgBR5sSr&vMf&q0)cZDi)EeTxZk_GyE|oBo;*Yx0ImSI(@+i6 z!pzK!20#O#&Cbqhbx^thhydn~#XuuSr_(_IDRcRgc?~ZD0CN%s+-~=SWHPA(umgDM z#81G)a{!hbeg|}2w;ffnTrS%IKvh*9z!Lzzt=j-aQDp$w*w|PQMe$ZJ7<{H);b1WM zv?z*GYin!Y1330_xoQE zMe$xfpMRvP>Lr?{H>_6c=;r2T0zd*lrQvowJUmRVuC5N4T`pvHxdhMik!rR24o%Yn z%d*$1)#|vWX}`j`F}1k3m^~o;SpW|Kv;)Ze7jx&x pLDhc}cnF}|EWQh;^ZzMo;ZINMdLOFbSfT&`002ovPDHLkV1l73_(uQ$ literal 0 HcmV?d00001 diff --git a/images/blackleft (copy).png b/images/blackleft (copy).png new file mode 100644 index 0000000000000000000000000000000000000000..7a94a7a4232f3c0451cdffdd133cd8419be281ea GIT binary patch literal 1504 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 RuF?Pi002ovPDHLkV1lE*zH9&h literal 0 HcmV?d00001 diff --git a/images/blackright.png b/images/blackright.png new file mode 100644 index 0000000000000000000000000000000000000000..b5cad6a03d2c2147a2ff2a7216e3bbdd936893ba GIT binary patch literal 1463 zcmV;o1xWgdP)aGEY+2ETPzO-bYH+GYET5x1W1UQn5Yku zfQe5$5MF%IHxd$SygfijKrWJk@Iq=@1YClEps}zE+siKQPG_fc&Ya_eg>Y-RnfTIw zGRfpSx8Ho{od0~lw5Ihxi|*ASl}Z^w5ST#_*hFLl2y3mY0aO!FwbnWUpqg`DIC=8q z?*9y6>C&a)Y&QF;);gxO4gwSHF{SN}bCu_KR_3GQc?{5Mi ziKqf#3_yv9t`X5yA}WMJp;6Ac<+|=W0N^;zM#k96APCeW14t>~4TVB-&YU@mqtWOU z(=>g{vV?8h(lCr591aItwrue_J3BW52sr0uA;fE`RH`Euiybc%3aY=q|KYY^(V|7| zg+k$|VHo?BQtN{tZ~%aFj={k}q|<5a-u>@(x3skM5z!NtWo;fC8{29a#(pAt&-eWT z=NzVKqPe*lJ9g~2D?sROLC0~{0(i_YjIX=9yIsRDFmvWioH=s_j^o@|ytA|Od98H| zV{BhE8vW8RjNTv!Rxrles;a6WrNr3S7|xwLH)#g$09e0%eYFr`31jS{l=A$ZJ$sZ8 z0gv$i+FDa8l{OGjnRC7^kx1m%tXcEZfddEHhK7cg zkBp2|%H{Ied_IpvBH<4W4c%V`eBV!pLZOJ(x-XZ@l`PA`>C>k%d-iOYrU|VzJkP`E z=x7>1l8An6X=yp@c^-D|+$p7$e`&2DrToP6yvqQ#XEK>?0M7!5P6^P_(b1~4P67BS z5{V1|!070xF@OI2=*Y-Oqm(j9M2k7+F9{)56OqRl`#F=zjN7)2rluwUxcyV#0I(Op zHUKSCUPIS)Q(Ef|0L5~-yo)hrd!ASkV>V{)6;`fr%v4t z5CHfaz#jm10T`STKx-XLWMxJu6siZ{1MmQh04PmNRv@Aw01Zm1mxU1No}QkAH%&8q z)B8yPA19N^qnS+R-bTbZKOF?Yaivt;vaEHbQt3!zVgp?;^UnY@ zyRQ2o0Ho7tGnq^-sIRYA;c$5G{anLa01h2GUuhx%`&Cb+E6G|s;#a4>VW|!l(#HvtJZpUsZ`pa)a3t_VzF2>O>>LZ zy2f?gO|e*Pt`Oom&iRpp2M^{Q$9Zrg%IEW{p`qbVDP^}1;zirGzn?Kn#O@Z%X0x)fv9aj; z{z@T4q^_=Re=e6(wY9ZqYHC6*mjeLQ)YRbGwQFkDtXU<;aaJg$ni*r40c;u{9~X=< zn5K#P`g&ZraN)r#qSn^dUzAd9@pyb0W323XUQ|jMlTyZ&QrDkZMARUq>;eGGvNm(h zw-QmMt*s5)w{L&=lB~VGeYNYlpKGn-06;_lpaBRX@`=a;P$43hh{^y8wrzhfFfefb zkqZ(4IC0{{cgbY35x|o~GzP!{P@braN)zT(0#GKRvew$Uixp36TGN_R{{Ye9a{7|) RuF?Pi002ovPDHLkV1lE*zH9&h literal 0 HcmV?d00001 diff --git a/images/blackright1.png b/images/blackright1.png new file mode 100644 index 0000000000000000000000000000000000000000..26e306bffa82ae3eee11469d7e86832c9547ba08 GIT binary patch literal 1435 zcmV;M1!Ve(P){G zK~z}7?U!3@6lE00|L1%&JKb%uEzp+6t|3T}rfE%A8fsChXhIPaj6rEajNyTRCW?uP zuRi&r4`T4fBQcd45))8Nh$sOz;Zi6B+Db|R8@X*8SZH^L-JSW)@nubbQtt6VIZyLl z&u`B6Ki`}I9@!)NzZ*?9(A?b2K@iaN>C-6)0um86#*pWE$Y!(5%q$|tTI+hAhj=`G zdGqGY^3VX9nwsiGq)t^M0320~0*C>KscM<3P5}@jqL7F<5{Z1z%tv~Ad+!Otxm9OJ zM@QxG@bHHKTCM{nRdt960F;OVBFc(Lt+lp_nNeC=dKN(HfdMXDxbV7&bP~}CA{qja zB_f}h$C-J|7&9IO!R2T)IxU;czE4C^YwfCQ*RK84)zvk!a^*_BZ-9*(H=6b9*LN^; zp{%Uz;miD(9Z-grEIE}c&A&15o1(&=w`ux!~fK6&!wQ>vN(P^zl+%>1^9a2SRq03sq115gH_ zLRFhpwbU4MsJgoP{B`@~0r*968vyM9S^=B_@Ckq|w*zxvEwX(G#k=iintq z7=RFw0tkx^0sx+>W&t3d&;JueTO7{=&|>>4fQtZj0T?XqG4Tiv95@g*G&EeW*8T-x z8Z+-;<`W`fm^lQHQ&k_p7yw^H>WQdRM4n5h(?0|Fqv+5lq5?BpRox>Z-vZcPeCy!0 z8mO$S97w0rzl%tni1hXK^?f>-a1x2c;ao2FxQHya)-GDJX3fy1O`Af`^Vk^UMx)Vv zH8nLK^!D}+6v6JChRI~|s_VMH0m!K8n~jZ)Ew}kloioP#LPR1WukPKux3;~#-Kndq zYpSZMik6p`@2;+{9=?=DT zM4mOq3|ebP3x&cuW-g0FBA+Fb$uswS5$)feZ`9@4F!B?Chk|r%%rw8ynlr%;#gV*b2|{#)BYmRn-xZ zNEn8mwYJprJl9&g%=i6u0LXRSJpf+o@9!Ufpo*xmvC&i2FT*fg<$2yWs%llWOhg`2 z)tIW55>ZJ}LsLX#7Jx!57JGNjoH^IPbQO>A4*M_NF)pqwTZ}7BFY2Et7@V69IC1n5h0?Gne)t? pJ#^^MDEF zCO4To=bJBc&Uf+w|M!ry9oVvE3mJwXIyyQ~TU$$)FJH#)-Mc9giHL36w&BQ;Blkss zW;>8fCRa1_JRa^=EICbLlpaYjnH&vBgVzVDmN zYy?4IE2Tn8sjzL^l9|`%^ZAznn8jkT+w;6H0L-1h)~#DxyNyw(UT`n zy0-&avSi6~LWqJ8;#Z|qlWp6}H*enj?STUa)SOhn%+1AOaSst)H4NkJTrM|0F)=YC zKq8S?<$2yNDdh#zG(S{IJwZg3nM|gC{`~nj#>em64&vV%ZEbB8N~ulE95D>z^UBJ~ zKZb^eX6))^%a+wDrCtDF0r=Rq?OrM6d1hWlL=BltX4VqiLSTA&x=AUufr!Qce0TQj z+5GL2UDr)&t)C>KVXgJ?csxEqM8|?4kiPFf)7aQpc~3pi-rio7&1Rnh5GJDiM3kzp zua}LDjqErM*Votcl`B_p;=~DFx^(FR*L62Avni$gx}l+A?9ib@L1ks-St(_%tgLKR zG#dQ`z|>t2qUPr24z2ZT01}2_92G*Owbn#LJ`oj|IS=4(05`POk7=!+2QX$B#;fPf zof|B{tRbS;rIZO~J{knUJ^;P5zCa?8Fg(wj$ISDIs9I~imYLTvvjD(E!~lYlyo$^m zV&=S*^0RO_JbDveIWyZzDFeW20E+?a0&o<-rvT2(NT8viL8sH{Nv-u&0A)mU5Ws0> zmPF(*vkf2&paMWOGq(b$1;C+D$iGQdq0*ufeyp@=0GtOf1i-(AKyPoaP9~EVT-W^> zzycz=G&neTprms<2m&dD5K1WkFo|fL*7_B#_0p-SsThEZrAtEqoSRDgBY^iy-|^Bb z&fJ8a=S>PBe$rZR(ptB-wzhtC`t<3msZ{EgskUOpieuSqb|Zi#K@hY6xG01mDP>%1 z9RYBhh~896r2tFuSrg_JzaYH~RbgC-2)6Mx#+$xNza4 zK@h~4*#clPvr`&I<;)ym<_ZAiM5KramSugEN~O*`P*Vy3ot>S+^E{!o7E(&GZ5#P~ yUJ4;Z$st*mWpO+npFDW*pvJ>^7!TvW6#oGH41za@$xEF800005D*z_>6n_8!13pPa zK~z}7?N(1n6j2!e-pt#X-I*MgB}G?UbnPGu+7hTc+n-%TL6N#xc<2xvLJAU!F5#hT z&^dyzsEd%G6m%)0NCJ0T&}BstiLlaDS6SUnrI~rY*JTIRO+y`}4*p;ckN11;`+f7h z?+?Hcj_{9xc1x_UuMe-UuXj;O&jElN0Ca@V6wmXoT`t$d;o;%rp$KShZdT^!=bvbr zb`b!8F$M^2J;rg|nj}fL;_-OzUIp-f+iYoRIW{{x`(D@eW&rrZunESPU>L@Qii(P# zi;IgR2PQz0q(_>jwVP`}5I#$ibf>tu_?{$5&lqDrD5a+uV|D-lLP$$>b@jVsGWo-D z2!g?2&C=4+1f`S%0B|@QPwVRHy88P12mmnitg5QsbUOWk5aIy<5JmCR; zq@XX@v)SxGI2=BHpzYX1TU(oFd3o8*^SoYOUOqiAFtAozTl-*RW8+RfPZY(se!stc zyXt94z;@{D?8M{a<8O3bZz^bJ_Y;Z4-9r}u01yg=N){FtVrEmyg@`JO(lI(Z`tr~P z?;fQ zig-N!*lxG?nuSRe#g}DeWmoo{hWmln>%A!mLPVD39#vI4hK7c+NAv#?{#*P8Y7t{a TTqf2K00000NkvXXu0mjfELXCb literal 0 HcmV?d00001 diff --git a/images/zoomout.png b/images/zoomout.png new file mode 100644 index 0000000000000000000000000000000000000000..bd012c7eb202e71fe109e1e35ba3152744780675 GIT binary patch literal 938 zcmV;b16BNqP)5D=lLtND2S|12;)T zK~z}7?UqkS6j2<@7HL0ba<%=Tv&QBb5V79Ki8hmeAVz)N`O z8gz~zEbJmECw1>fjgNVR+wp@AG)? z_XpriXZpuNhc#AJRRy=Uw%RDA*8so;06IcwhUfWrPN(zv$jC_SQ~>Jh>y@RYrB|A! z-2?z&i~&M_{>E|KrX)#^B9TbfQ33daCL04m0g&E~ft2wx>h>d4E>dm>3vH)Cv`QhJFoW(NQugfx_um3@fCV)K@- z!0-2$udc36QA#-g0Effzy0Wset*57lWcpN9^&}FBPlOOR0DvfpU#6$0uO1eF+ixP3 zO5J9RaR?!>*=*muUhne*LM@PRaigFJj1PCF}b^S^p5b#(App@1!#(*&f7~?m6 zeSP|V-f%cPgfaeU`jg3IwPgUqFmlaPQA%e4fE_S^F*alRHBEC`2EZ8am|=%8cBS9T zegim;b7lB9Edy{I7d1oAFpOIVE#mk4%LyS~)2}E>)G~l9%e@)b;rID`5BBmkHa1G@ z>+7!=V_f?5v$eIgQOkK?adGiSK|w)~5K@wcXmYt+d0ww~YHn^W+1}ocDW!Gsc)Z6j zjB4}rvMjd`3=Bk1Bo(WwT9Qa4#&&mi^D|R0#(0BLYNwRiv(s}Ohq9`rnmLr?>$x&995A>images/up.png images/bottom.png images/left.png + images/blackUp.png + images/blackNew.png + images/blackRender.png + images/Rotation-32.png + images/Shape-Cube-32.png + images/Open-32.png + images/Open-32(1).png + images/Save-32.png + images/blackbottom.png + images/blackleft (copy).png + images/blackright (copy).png + images/blackright.png + images/blackright1.png + images/rightright.png + images/blackfront.png + images/blackback.png + images/blackaxes.png + images/zoomin.png + images/zoomout.png diff --git a/src/MainWindow.h b/src/MainWindow.h index 4175ff08..fd7b8b12 100644 --- a/src/MainWindow.h +++ b/src/MainWindow.h @@ -8,6 +8,7 @@ #include "Tree.h" #include "memory.h" #include "editor.h" +#include "editortoolbar.h" #include "toolbar.h" #include #include @@ -111,6 +112,7 @@ private: void setDockWidgetTitle(QDockWidget *dockWidget, QString prefix, bool topLevel); EditorInterface *editor; + EditorToolBar *editortoolbar; ToolBar *toolBar; class QMessageBox *openglbox; diff --git a/src/editortoolbar.cpp b/src/editortoolbar.cpp new file mode 100644 index 00000000..9bf3c389 --- /dev/null +++ b/src/editortoolbar.cpp @@ -0,0 +1,30 @@ +#include "editortoolbar.h" + +EditorToolBar::EditorToolBar(QWidget *parent) : + QToolBar(parent) +{ + int defaultColor = this->palette().background().color().lightness(); + + buttonNew = new QToolButton; + buttonOpen = new QToolButton; + buttonSave = new QToolButton; + buttonZoomIn = new QToolButton; + buttonZoomOut = new QToolButton; + + if(defaultColor > 165) + { + buttonNew->setIcon(QIcon("://images/blackNew.png")); + buttonOpen->setIcon(QIcon("://images/Open-32(1).png")); + buttonSave->setIcon(QIcon("://images/Save-32.png")); + } else { + + buttonNew->setIcon(QIcon("://images/Document-New-128.png")); + buttonOpen->setIcon(QIcon("://images/Open-128.png")); + buttonSave->setIcon(QIcon("://images/Save-128.png")); + } + + this->addWidget(buttonNew); + this->addWidget(buttonOpen); + this->addWidget(buttonSave); + +} diff --git a/src/editortoolbar.h b/src/editortoolbar.h new file mode 100644 index 00000000..c85dae4d --- /dev/null +++ b/src/editortoolbar.h @@ -0,0 +1,21 @@ +#ifndef EDITORTOOLBAR_H +#define EDITORTOOLBAR_H + +#include +#include + +class EditorToolBar : public QToolBar +{ + Q_OBJECT +public: + explicit EditorToolBar(QWidget *parent = 0); + QToolButton *buttonNew, *buttonOpen, *buttonSave; + QToolButton *buttonZoomIn, *buttonZoomOut; + +signals: + +public slots: + +}; + +#endif // EDITORTOOLBAR_H diff --git a/src/mainwin.cc b/src/mainwin.cc index 1124c5c8..182f4315 100644 --- a/src/mainwin.cc +++ b/src/mainwin.cc @@ -23,6 +23,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ +#include #include "GeometryCache.h" #include "ModuleCache.h" #include "MainWindow.h" @@ -173,6 +174,7 @@ MainWindow::MainWindow(const QString &filename) editortype = Preferences::inst()->getValue("editor/editortype").toString(); useScintilla = (editortype == "QScintilla Editor"); + #ifdef USE_SCINTILLA_EDITOR if (useScintilla) { editor = new ScintillaEditor(editorDockContents); @@ -183,6 +185,9 @@ MainWindow::MainWindow(const QString &filename) editorDockContents->layout()->addWidget(editor); + editortoolbar = new EditorToolBar(this); + editorDockContents->layout()->addWidget(editortoolbar); + setCorner(Qt::TopLeftCorner, Qt::LeftDockWidgetArea); setCorner(Qt::TopRightCorner, Qt::RightDockWidgetArea); setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea); @@ -398,7 +403,7 @@ MainWindow::MainWindow(const QString &filename) connect(this->helpActionHomepage, SIGNAL(triggered()), this, SLOT(helpHomepage())); connect(this->helpActionManual, SIGNAL(triggered()), this, SLOT(helpManual())); connect(this->helpActionLibraryInfo, SIGNAL(triggered()), this, SLOT(helpLibrary())); - connect(this->helpActionFontInfo, SIGNAL(triggered()), this, SLOT(helpFontInfo())); + connect(this->helpActionFontInfo, SIGNAL(triggered()), this, SLOT(viewModeShowAxes())); setCurrentOutput(); @@ -446,24 +451,32 @@ MainWindow::MainWindow(const QString &filename) connect(this->replaceAllButton, SIGNAL(clicked()), this, SLOT(replaceAll())); connect(this->replaceInputField, SIGNAL(returnPressed()), this->replaceButton, SLOT(animateClick())); - + //EditorToolbar + connect(editortoolbar->buttonNew, SIGNAL(clicked()), this, SLOT(actionNew())); + connect(editortoolbar->buttonOpen, SIGNAL(clicked()), this, SLOT(actionOpen())); + connect(editortoolbar->buttonSave, SIGNAL(clicked()), this, SLOT(actionSave())); + //Toolbar - toolBar = new ToolBar(this); - verticalLayout_2->addWidget(toolBar); - connect(toolBar->buttonNew, SIGNAL(clicked()), this, SLOT(actionNew())); - connect(toolBar->buttonOpen, SIGNAL(clicked()), this, SLOT(actionOpen())); - connect(toolBar->buttonSave, SIGNAL(clicked()), this, SLOT(actionSave())); + toolBar = new ToolBar(this); + verticalLayout_2->addWidget(toolBar); connect(toolBar->buttonRender, SIGNAL(clicked()), this, SLOT(actionRender())); connect(toolBar->buttonTop, SIGNAL(clicked()), this, SLOT(viewAngleTop())); connect(toolBar->buttonBottom, SIGNAL(clicked()), this, SLOT(viewAngleBottom())); connect(toolBar->buttonLeft, SIGNAL(clicked()), this, SLOT(viewAngleLeft())); connect(toolBar->buttonRight, SIGNAL(clicked()), this, SLOT(viewAngleRight())); connect(toolBar->buttonFront, SIGNAL(clicked()), this, SLOT(viewAngleFront())); - connect(toolBar->buttonBack, SIGNAL(clicked()), this, SLOT(viewAngleBack())); - - toolBar->setStyleSheet("QToolBar{background-color:black;}" - "QToolButton:hover{background-color:green;}"); + connect(toolBar->buttonBack, SIGNAL(clicked()), this, SLOT(viewModeShowAxes())); + connect(toolBar->buttonAxes, SIGNAL(triggered()), this, SLOT(viewModeShowAxes())); + connect(toolBar->buttonEdges, SIGNAL(clicked()), this, SLOT(viewModeShowEdges())); + connect(toolBar->buttonZoomIn, SIGNAL(clicked()), qglview, SLOT(ZoomIn())); + connect(toolBar->buttonZoomOut, SIGNAL(clicked()), qglview, SLOT(ZoomOut())); + + toolBar->setStyleSheet("QToolBar{border:1 solid black;}" ); + // "QToolButton:hover{background-color:green;}"); + //std::cout<< toolBar->palette().background().color().name().toStdString()<palette().background().color().lightness()<setChecked(settings.value("view/hideEditor").toBool()); hideEditor(); + toolBarActionHide->setChecked(settings.value("view/hideToolbar").toBool()); + hideToolbar(); updateMdiMode(settings.value("advanced/mdi").toBool()); updateUndockMode(settings.value("advanced/undockableWindows").toBool()); } @@ -2222,8 +2237,10 @@ void MainWindow::hideToolbar() { if(toolBarActionHide->isChecked()){ toolBar->hide(); + editortoolbar->hide(); } else { toolBar->show(); + editortoolbar->show(); } } diff --git a/src/toolbar.cpp b/src/toolbar.cpp index 061a09c2..5462f9f9 100644 --- a/src/toolbar.cpp +++ b/src/toolbar.cpp @@ -3,39 +3,47 @@ ToolBar::ToolBar(QWidget *parent) : QToolBar(parent) { - buttonNew = new QToolButton; - buttonNew->setIcon(QIcon("://images/Document-New-128.png")); - - buttonOpen = new QToolButton; - buttonOpen->setIcon(QIcon("://images/Open-128.png")); - - buttonSave = new QToolButton; - buttonSave->setIcon(QIcon("://images/Save-128.png")); - + int defaultColor = this->palette().background().color().lightness(); + buttonRender = new QToolButton; - buttonRender->setIcon(QIcon("://images/Arrowhead-Right-32.png")); - buttonTop = new QToolButton; - buttonTop->setIcon(QIcon("://images/up.png")); - buttonBottom = new QToolButton; - buttonBottom->setIcon(QIcon("://images/bottom.png")); - buttonLeft = new QToolButton; - buttonLeft->setIcon(QIcon("://images/left.png")); - buttonRight = new QToolButton; - buttonRight->setIcon(QIcon("://images/right.png")); - buttonFront = new QToolButton; - buttonFront->setIcon(QIcon("://images/front.png")); - buttonBack = new QToolButton; - buttonBack->setIcon(QIcon("://images/back.png")); + buttonAxes = new QAction(this); + buttonEdges = new QToolButton; + buttonZoomIn = new QToolButton; + buttonZoomOut = new QToolButton; + + if(defaultColor > 165) + { + buttonRender->setIcon(QIcon("://images/blackRender.png")); + buttonTop->setIcon(QIcon("://images/blackUp.png")); + buttonBottom->setIcon(QIcon("://images/blackbottom.png")); + buttonLeft->setIcon(QIcon("://images/blackleft (copy).png")); + buttonRight->setIcon(QIcon("://images/rightright.png")); + buttonFront->setIcon(QIcon("://images/blackfront.png")); + buttonBack->setIcon(QIcon("://images/blackback.png")); + buttonAxes->setIcon(QIcon("://images/blackaxes.png")); + buttonEdges->setIcon(QIcon("://images/Rotation-32.png")); + buttonZoomIn->setIcon(QIcon("://images/zoomin.png")); + buttonZoomOut->setIcon(QIcon("://images/zoomout.png")); + } else { + + buttonRender->setIcon(QIcon("://images/Arrowhead-Right-32.png")); + buttonTop->setIcon(QIcon("://images/up.png")); + buttonBottom->setIcon(QIcon("://images/bottom.png")); + buttonLeft->setIcon(QIcon("://images/left.png")); + buttonRight->setIcon(QIcon("://images/right.png")); + buttonFront->setIcon(QIcon("://images/front.png")); + buttonBack->setIcon(QIcon("://images/back.png")); + buttonAxes->setIcon(QIcon("://images/axes.png")); + buttonEdges->setIcon(QIcon("://images/grid.png")); + + } - this->addWidget(buttonNew); - this->addWidget(buttonOpen); - this->addWidget(buttonSave); this->addWidget(buttonRender); this->addSeparator(); this->addWidget(buttonTop); @@ -44,5 +52,8 @@ ToolBar::ToolBar(QWidget *parent) : this->addWidget(buttonRight); this->addWidget(buttonFront); this->addWidget(buttonBack); - + this->addAction(buttonAxes); + this->addWidget(buttonEdges); + this->addWidget(buttonZoomIn); + this->addWidget(buttonZoomOut); } diff --git a/src/toolbar.h b/src/toolbar.h index a743d6ff..7777876a 100644 --- a/src/toolbar.h +++ b/src/toolbar.h @@ -3,15 +3,16 @@ #include #include +#include class ToolBar : public QToolBar { Q_OBJECT public: explicit ToolBar(QWidget *parent = 0); - QToolButton *buttonNew, *buttonOpen, *buttonSave, *buttonRender; + QToolButton *buttonZoomIn, *buttonZoomOut, *buttonRender; QToolButton *buttonTop, *buttonBottom, *buttonLeft, *buttonRight; - QToolButton *buttonFront, *buttonBack; - + QToolButton *buttonFront, *buttonBack, *buttonEdges; + QAction *buttonAxes; signals: public slots: From 8e3b3e1919b902ff24586152c8c3621981bcf487 Mon Sep 17 00:00:00 2001 From: shaina7837 Date: Sat, 28 Jun 2014 20:07:12 +0530 Subject: [PATCH 04/24] added few more icons with tool tips --- images/blackback.png | Bin 1053 -> 889 bytes images/blackfront.png | Bin 1071 -> 864 bytes images/surface.png | Bin 0 -> 1444 bytes images/wireframe1.png | Bin 0 -> 922 bytes openscad.qrc | 2 ++ src/MainWindow.h | 1 + src/editortoolbar.cpp | 18 ++++++++++++++---- src/mainwin.cc | 33 +++++++++++++++++++++------------ src/toolbar.cpp | 30 ++++++++++++++++++++---------- src/toolbar.h | 4 ++-- 10 files changed, 60 insertions(+), 28 deletions(-) create mode 100644 images/surface.png create mode 100644 images/wireframe1.png diff --git a/images/blackback.png b/images/blackback.png index e3c021fcda6ca5a2e0de7bab57788f26eebde46d..3f9fcea262d0edb11a76e21db994983b24c9af37 100644 GIT binary patch delta 819 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 Y#1sEA01hF`4FCWD07*qoM6N<$f|Yf5)&Kwi delta 1002 zcmV2CoQ^Q-2u+J2YK<<17FG1H4H@K~z}7?N(iABUKnZGnv1HbSc4xO^YoW z>nfcL$wF#Md~J`y1VK=8x!kLSkWo$3 zo}ws9XBg&7n}5yremoxk`p5<*CMM|l`T72xot<$)NG|{|43pwGF4ErK{^{J@obuQB za5zlMvV1{NlyO4H^Je@HJkLkmZujTWXjE;;fFwy*6-BuL04&S?YO~qih{xmi>p8JN zAaK51F5gjARRRE>=RZs)lVbjG`#-8HUl!^ZcaK>Fi9UQWslWTUYj_V*z{xAPv9;;Bltj-(_iO zX&u0u{r&y#=5o0(A!M{#tzH2Di^Z~TwOZeHxm+``SgiOrX~F;u0N2cQJKgBR5sSr& zvMf&q0)cZDi)EeTxZk_GyE|oBo;*Yx0ImSI(|=G6)WXcnj0Qjhpv}(CYIRV$0EhtQ zkHtVENT<_504a0%lX(p<0swOo2HbAl>BLXK#B%_a8-53LUAG-ov0N_O z0YFt%9>5a-zOCB;MNwq{*x1-u5JmA;Fc^HMUg2Oc__QdBQ)_E$-vdCgSmXfg0*Kdb zpns#IhOs}r44wzjoWOlg(&-0OLwfYWC(*nz~*Q(X(xTa}dvw3|Z2tvf` z_0COCPwN2g1Na5NrGGS#m|bqnoC~;pS7WBKEE~1k?U9w0mGAax6ab6?xO*%kStt~0 z-P+o^ObB@m0L`-OZHL1#wYa#LJs|v901pAQ1IYXrbLYrG)qfIr2%y_6z6+=G|0!zW YPfzN4AFAM3q5uE@07*qoM6N<$g05Zc@&Et; diff --git a/images/surface.png b/images/surface.png new file mode 100644 index 0000000000000000000000000000000000000000..7839cecb26c665f6f730a51a741dd95e79971d55 GIT binary patch literal 1444 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 literal 0 HcmV?d00001 diff --git a/openscad.qrc b/openscad.qrc index 72b9f359..6fa311fa 100644 --- a/openscad.qrc +++ b/openscad.qrc @@ -41,5 +41,7 @@ images/blackaxes.png images/zoomin.png images/zoomout.png + images/wireframe1.png + images/surface.png diff --git a/src/MainWindow.h b/src/MainWindow.h index fd7b8b12..e80bf19d 100644 --- a/src/MainWindow.h +++ b/src/MainWindow.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include "ui_MainWindow.h" #include "openscad.h" #include "modcontext.h" diff --git a/src/editortoolbar.cpp b/src/editortoolbar.cpp index 9bf3c389..6f957282 100644 --- a/src/editortoolbar.cpp +++ b/src/editortoolbar.cpp @@ -16,15 +16,25 @@ EditorToolBar::EditorToolBar(QWidget *parent) : buttonNew->setIcon(QIcon("://images/blackNew.png")); buttonOpen->setIcon(QIcon("://images/Open-32(1).png")); buttonSave->setIcon(QIcon("://images/Save-32.png")); + buttonZoomIn->setIcon(QIcon("://images/zoomin.png")); + buttonZoomOut->setIcon(QIcon("://images/zoomout.png")); } else { - buttonNew->setIcon(QIcon("://images/Document-New-128.png")); - buttonOpen->setIcon(QIcon("://images/Open-128.png")); - buttonSave->setIcon(QIcon("://images/Save-128.png")); - } + buttonNew->setIcon(QIcon("://images/Document-New-128.png")); + buttonOpen->setIcon(QIcon("://images/Open-128.png")); + buttonSave->setIcon(QIcon("://images/Save-128.png")); + } + + buttonNew->setToolTip("New"); + buttonOpen->setToolTip("Open"); + buttonSave->setToolTip("Save"); + buttonZoomIn->setToolTip("Zoom In"); + buttonZoomOut->setToolTip("Zoom Out"); this->addWidget(buttonNew); this->addWidget(buttonOpen); this->addWidget(buttonSave); + this->addWidget(buttonZoomIn); + this->addWidget(buttonZoomOut); } diff --git a/src/mainwin.cc b/src/mainwin.cc index 182f4315..db6efcc6 100644 --- a/src/mainwin.cc +++ b/src/mainwin.cc @@ -451,14 +451,26 @@ MainWindow::MainWindow(const QString &filename) connect(this->replaceAllButton, SIGNAL(clicked()), this, SLOT(replaceAll())); connect(this->replaceInputField, SIGNAL(returnPressed()), this->replaceButton, SLOT(animateClick())); - //EditorToolbar - connect(editortoolbar->buttonNew, SIGNAL(clicked()), this, SLOT(actionNew())); - connect(editortoolbar->buttonOpen, SIGNAL(clicked()), this, SLOT(actionOpen())); - connect(editortoolbar->buttonSave, SIGNAL(clicked()), this, SLOT(actionSave())); + //EditorToolbar + connect(editortoolbar->buttonNew, SIGNAL(clicked()), this, SLOT(actionNew())); + connect(editortoolbar->buttonOpen, SIGNAL(clicked()), this, SLOT(actionOpen())); + connect(editortoolbar->buttonSave, SIGNAL(clicked()), this, SLOT(actionSave())); + connect(editortoolbar->buttonZoomIn, SIGNAL(clicked()), editor, SLOT(zoomIn())); + connect(editortoolbar->buttonZoomOut, SIGNAL(clicked()), editor, SLOT(zoomOut())); + //Toolbar - toolBar = new ToolBar(this); - verticalLayout_2->addWidget(toolBar); + toolBar = new ToolBar(this); + verticalLayout_2->addWidget(toolBar); + int defaultcolor = toolBar->palette().background().color().lightness(); + + if(defaultcolor > 165){ + viewActionShowAxes->setIcon(QIcon("://images/blackaxes.png")); + toolBar->addAction(viewActionShowAxes); + viewActionShowEdges->setIcon(QIcon("://images/Rotation-32.png")); + toolBar->addAction(viewActionShowEdges); + } + connect(toolBar->buttonRender, SIGNAL(clicked()), this, SLOT(actionRender())); connect(toolBar->buttonTop, SIGNAL(clicked()), this, SLOT(viewAngleTop())); connect(toolBar->buttonBottom, SIGNAL(clicked()), this, SLOT(viewAngleBottom())); @@ -466,16 +478,13 @@ MainWindow::MainWindow(const QString &filename) connect(toolBar->buttonRight, SIGNAL(clicked()), this, SLOT(viewAngleRight())); connect(toolBar->buttonFront, SIGNAL(clicked()), this, SLOT(viewAngleFront())); connect(toolBar->buttonBack, SIGNAL(clicked()), this, SLOT(viewModeShowAxes())); - connect(toolBar->buttonAxes, SIGNAL(triggered()), this, SLOT(viewModeShowAxes())); - connect(toolBar->buttonEdges, SIGNAL(clicked()), this, SLOT(viewModeShowEdges())); connect(toolBar->buttonZoomIn, SIGNAL(clicked()), qglview, SLOT(ZoomIn())); connect(toolBar->buttonZoomOut, SIGNAL(clicked()), qglview, SLOT(ZoomOut())); - + connect(toolBar->buttonSurface, SIGNAL(clicked()), this, SLOT(viewModeSurface())); + connect(toolBar->buttonWireframe, SIGNAL(clicked()), this, SLOT(viewModeWireframe())); + toolBar->setStyleSheet("QToolBar{border:1 solid black;}" ); - // "QToolButton:hover{background-color:green;}"); - //std::cout<< toolBar->palette().background().color().name().toStdString()<palette().background().color().lightness()< 165) { buttonRender->setIcon(QIcon("://images/blackRender.png")); + buttonRender->setToolTip("Render"); buttonTop->setIcon(QIcon("://images/blackUp.png")); buttonBottom->setIcon(QIcon("://images/blackbottom.png")); buttonLeft->setIcon(QIcon("://images/blackleft (copy).png")); buttonRight->setIcon(QIcon("://images/rightright.png")); buttonFront->setIcon(QIcon("://images/blackfront.png")); buttonBack->setIcon(QIcon("://images/blackback.png")); - buttonAxes->setIcon(QIcon("://images/blackaxes.png")); - buttonEdges->setIcon(QIcon("://images/Rotation-32.png")); buttonZoomIn->setIcon(QIcon("://images/zoomin.png")); buttonZoomOut->setIcon(QIcon("://images/zoomout.png")); + buttonWireframe->setIcon(QIcon("://images/wireframe1.png")); + buttonSurface->setIcon(QIcon("://images/surface.png")); } else { buttonRender->setIcon(QIcon("://images/Arrowhead-Right-32.png")); @@ -39,11 +40,20 @@ ToolBar::ToolBar(QWidget *parent) : buttonRight->setIcon(QIcon("://images/right.png")); buttonFront->setIcon(QIcon("://images/front.png")); buttonBack->setIcon(QIcon("://images/back.png")); - buttonAxes->setIcon(QIcon("://images/axes.png")); - buttonEdges->setIcon(QIcon("://images/grid.png")); } - + buttonRender->setToolTip("Render"); + buttonTop->setToolTip("Top"); + buttonBottom->setToolTip("Bottom"); + buttonLeft->setToolTip("Left"); + buttonRight->setToolTip("Right"); + buttonFront->setToolTip("Front"); + buttonBack->setToolTip("Back"); + buttonZoomIn->setToolTip("Zoom in"); + buttonZoomOut->setToolTip("Zoom out"); + buttonWireframe->setToolTip("Wireframe"); + buttonSurface->setToolTip("Surfaces"); + this->addWidget(buttonRender); this->addSeparator(); this->addWidget(buttonTop); @@ -52,8 +62,8 @@ ToolBar::ToolBar(QWidget *parent) : this->addWidget(buttonRight); this->addWidget(buttonFront); this->addWidget(buttonBack); - this->addAction(buttonAxes); - this->addWidget(buttonEdges); this->addWidget(buttonZoomIn); this->addWidget(buttonZoomOut); + this->addWidget(buttonWireframe); + this->addWidget(buttonSurface); } diff --git a/src/toolbar.h b/src/toolbar.h index 7777876a..08ebdcb4 100644 --- a/src/toolbar.h +++ b/src/toolbar.h @@ -11,8 +11,8 @@ public: explicit ToolBar(QWidget *parent = 0); QToolButton *buttonZoomIn, *buttonZoomOut, *buttonRender; QToolButton *buttonTop, *buttonBottom, *buttonLeft, *buttonRight; - QToolButton *buttonFront, *buttonBack, *buttonEdges; - QAction *buttonAxes; + QToolButton *buttonFront, *buttonBack, *buttonWireframe, *buttonSurface; + signals: public slots: From 642407c241eb86f00aad293d854194ed18e8ec44 Mon Sep 17 00:00:00 2001 From: shaina7837 Date: Sun, 14 Sep 2014 20:20:54 +0200 Subject: [PATCH 05/24] improved syntax color scheme and added more icons --- images/Open-32(1).png | Bin 4196 -> 0 bytes images/Open-32.png | Bin 4196 -> 4196 bytes images/Preview-32 (1).png | Bin 0 -> 4196 bytes images/Preview-32.png | Bin 0 -> 4196 bytes images/Zoom-In-32.png | Bin 0 -> 4196 bytes images/Zoom-Out-32.png | Bin 0 -> 4196 bytes images/animate.jpg | Bin 0 -> 773 bytes images/animate.png | Bin 0 -> 2268 bytes images/blackright (copy).png | Bin 1463 -> 0 bytes images/blackright.png | Bin 1463 -> 0 bytes images/blackright1.png | Bin 1435 -> 0 bytes images/cross.png | Bin 0 -> 317 bytes images/crosswhite.png | Bin 0 -> 325 bytes images/down.png | Bin 1029 -> 0 bytes images/orthogonal.png | Bin 0 -> 570 bytes images/orthogonalwhite.png | Bin 0 -> 518 bytes images/perspective1.png | Bin 0 -> 368 bytes images/perspective1white.png | Bin 0 -> 361 bytes images/surfaceWhite.png | Bin 0 -> 1197 bytes images/wireframeWhite.png | Bin 0 -> 710 bytes openscad.qrc | 18 +++++-- src/editortoolbar.cpp | 37 +------------ src/editortoolbar.h | 2 - src/mainwin.cc | 97 ++++++++++++++++++++++++++--------- src/toolbar.cpp | 63 ----------------------- src/toolbar.h | 3 -- 26 files changed, 86 insertions(+), 134 deletions(-) delete mode 100644 images/Open-32(1).png create mode 100644 images/Preview-32 (1).png create mode 100644 images/Preview-32.png create mode 100644 images/Zoom-In-32.png create mode 100644 images/Zoom-Out-32.png create mode 100644 images/animate.jpg create mode 100644 images/animate.png delete mode 100644 images/blackright (copy).png delete mode 100644 images/blackright.png delete mode 100644 images/blackright1.png create mode 100644 images/cross.png create mode 100644 images/crosswhite.png delete mode 100644 images/down.png create mode 100644 images/orthogonal.png create mode 100644 images/orthogonalwhite.png create mode 100644 images/perspective1.png create mode 100644 images/perspective1white.png create mode 100644 images/surfaceWhite.png create mode 100644 images/wireframeWhite.png diff --git a/images/Open-32(1).png b/images/Open-32(1).png deleted file mode 100644 index 576e58e2a2247a8e6010402543913636031c40e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4196 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEV2xxn{IEF-UGAan%e-9KL1*0J_ z8UmvsfEoh&`ua(@u!)I@6RK+bJTEUV1#4?-75u8uWK~pD{^P=$nwl%ol;h<(Iy#!D ztE)e@va(Xbs}NZdm*pUFH8r)fKso~%1I5yuot;HMX1KYz$ru z+Y8bMbi_lV9RbonECw3<+RV(%4v4LQ7VcJ6RsD-gFVT(w8t{=A4D|U+OG`@wV0x** zXECyafKhl8IkYKe8yOkJ!7Kne=r_=U_rQ?&2x7y;VKh+eEij~PD7F-4KvYx|8_>e1 zIyyQtfgxd$nVHD}lPfDLV*@5Y6=1F@0XaZJL*u@Mg@p!89xn}4{GLes5g7Epaj69+ z#Mi*YX$ExUSzB9M3A~mfOTvPTQW_W)e?vk-#5_Da_>j#f$fnd{n0}B0Dl03Q2wI4) z0A>KC^r! z+Y8bMbi_lV9RbonECw3<+RV(%4v4LQ7VcJ6RsD-gFVT(w8t{=A4D|U+OG`@wV0x** zXECyafKhl8IkYKe8yOkJ!7Kne=r_=U_rQ?&2x7y;VKh+eEij~PD7F-4KvYx|8_>e1 zIyyQtfgxd$nVHD}lPfDLV*@5Y6=1F@0XaZJL*u@Mg@p!89xn}4{GLes5g7Epaj69+ z#Mi*YX$ExUSzB9M3A~mfOTvPTQW_W)e?vk-#5_Da_>j#f$fnd{n0}B0Dl03Q2wI4) z0A>KC^r!1G(#($dNZ2?=4dwY8Pg)zwV{@~3NRYOV+3yCC&IhvboFGgLK5 zGa;;@p>f>C#s+Ao)^b%<)xWsZljR7YVMT;6&~hDhb#<^$aaj%$2Rd*&S)o8k6VTw5 zz@R=24Ehp7Lqk6!BO^Bh1A{PNI;jAL&UujK+S=OlgMxxs2$_W;4+>sF80h=&*wg@n zd?_dq0v*957_A0<)nQG4|k8L&y?*@*oG`G?-Wkd=?Or8+E|& z2mxUB0_A10Ffa?I5S!LU)s2S0Xb6mkz<`Iqj(U-U>{rc>gB;@N>gTe~DWM4fc(5ef diff --git a/images/Preview-32 (1).png b/images/Preview-32 (1).png new file mode 100644 index 0000000000000000000000000000000000000000..26f718c2fea3d91e8d1f04bfa6fdb6ffea00b9cc GIT binary patch literal 4196 zcmeH}JBSle6o$tjON_hA6takfB}I@0m#r)*<{{Qr5}n>@dsxUv*F z6;c#sDSkC}gE=B2xWMOwWU{3w>X~@#!p&R9jzrX7HMG9?8SpdkcNxfJGJ(Nh@b=I} zMx)Uow$IgSRj%P|q~Gtq8Y10p_nvd~dcB820=?Y-=?mb`1OR-^%{%&#N#Kr~-ILBR zjHEah0jTWeY-R*V?R^Ve2vFy}xe);THsC`67Gd3^6q|D+0Ol6y-^pgPE0szmTrQVY z3tZE*aJ$_;Td&toiVm_t2x>Ip^m;%D5b;+FROU{nvrZXytg=Xk*l$B7ifygcYMr;A z_q28r0A!73tD%=>{LT2t*f;k@UDsDV0Xo0zBtWE}1dOu0&gb(-<$S4B3ZmZCVz`qn@V$nkNVQ39Z3A|Q7Nk*el5! zlu9K#MTxY()$)t%e4%#S@Ap@t3@2 z$Qh30!)X@YpxRxeL*Yr-mJ#Vu8$;3=HsJU%QaeI76miVXn*;T+ zPb5HijAkWiJvUb!{tqsK!0~s3GLp;XW^H?}z^rrjvyJsF*0zv!uh*krwx_6(yUk|v hxKl0!*aR^%@ZV;jb7gex+16K?0;tNh@{{7`%|F{C;luy{ literal 0 HcmV?d00001 diff --git a/images/Zoom-In-32.png b/images/Zoom-In-32.png new file mode 100644 index 0000000000000000000000000000000000000000..214a75616b1f1028b20a5fcaf24adcb8cbb48889 GIT binary patch literal 4196 zcmeHJy-NaN9KImJB*7sfq(K}SjMj#x3Zq;kLPDCHBN}RxXlMwcskQ!s2Kx^pA|f23 z!NEx)B0>a@JX6o}qvsLjKJ>(|+wS1!z3=aR-sgGV-}~O3mph>?m($}E1i=;D4(#IY zWjLnrdlHKk1i`%&46KJE(-U6zhls3w*%h!W&|d`#g@Q*>l&e~;mO?0uYPFhTj${3? z42hCuIa06JrH0AHF=B?K?>!B~VF=XP+7!de9}utY9Ph*cyVsj-z|nj@KZ{a}S|PNP zq$!unK0}@+ekDno8&Jj^j{Q9~iu5u-Ease25{r9A&5qat+1C&Tenym4r}MPafZ;Mdgv4RaqslO1 zt5T^P8pPS{X#jJMMwC^j=W;nGw&BxY!qfn_Occc#m0=7mJnySK?HUtoCy;yB2UxLxN=scbJWh*6|gIyufWC4TUzn^mzfQ2h648+(er=D Ch2B^I literal 0 HcmV?d00001 diff --git a/images/Zoom-Out-32.png b/images/Zoom-Out-32.png new file mode 100644 index 0000000000000000000000000000000000000000..f09c91f49dc7488057c2ced8b0b1736f73c790f5 GIT binary patch literal 4196 zcmeHJF-yZh7>yuOi-is%QXD$Dba!x4sc4rXQlyAOXAuY8iZ}=k;^gcvaHzA3h=_wY zI&=~d5iP+6o3u1dQ+;1;N{OWRT}ihDu9w{RzVE$zce(UrExi&6$HI!DL{h8Cb@Xv+ zp)vgK=ktc5L=&mxVkSF25|6%U7!9t#fxrQt1BPM5EXz8zZM%qOQEN7vMH)kFhF4`k zlxdpTR;#7|cw7_%W^=&u{nJo50|MKFyE{x6U^n_#lZ;j>l}T8wby);A5b>?+`jjM% zHyrDGAmIELM$VykMac*@**!5}X0++5{TeWBG01t4r16G>@Vz78+#B^50ahg}`jQCC zj-%My00KVP1R@~pye0uM7jkYyb=mPoqp>4HPFUpZvI#`Ma=9GFGQ4s{(2{AIHX*7j z6|dLp^Vs24jtJniTCFxKMZf_=#2jY#%nj5!er2aXe8Tc20eM;cEp Kr<0dUxuai4&;IHF literal 0 HcmV?d00001 diff --git a/images/animate.jpg b/images/animate.jpg new file mode 100644 index 0000000000000000000000000000000000000000..64a8d5543115db52facc27d2de0025aa0f5454bb GIT binary patch literal 773 zcmex=Ov?YZl zwMhp54=@OFFlaDnFf%GKFbOg;3o`yc!XU-Kz|05)3<$u+&dS2U43skxU|?ioVP<9J zV1~*vGBGo-unMvX39}nI1{R7cCN>^YGBS2bnmB2pnsW$Hj|hrUU~M2#L1YUcqPG}$ zm>Gc%VHRYtXV`Hl*IVY5?n@s-f75VDRlPIQO`gsU7o2xwO`iw*nxwa__aZIdeToBhY zTAjAxQEnioQJfBUna%5rWmWY-#5;_&Gyv%-c;Ol>uwSgOb4*a}!=APOL hsnu&HEL+-KRdiM(&r;8;<3X6eBZ~l^0Z`Zfn*cd=5zhbs literal 0 HcmV?d00001 diff --git a/images/animate.png b/images/animate.png new file mode 100644 index 0000000000000000000000000000000000000000..80455a588c3410b0e7a42919681d62873a6d3212 GIT binary patch literal 2268 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 RuF?Pi002ovPDHLkV1lE*zH9&h diff --git a/images/blackright.png b/images/blackright.png deleted file mode 100644 index b5cad6a03d2c2147a2ff2a7216e3bbdd936893ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1463 zcmV;o1xWgdP)aGEY+2ETPzO-bYH+GYET5x1W1UQn5Yku zfQe5$5MF%IHxd$SygfijKrWJk@Iq=@1YClEps}zE+siKQPG_fc&Ya_eg>Y-RnfTIw zGRfpSx8Ho{od0~lw5Ihxi|*ASl}Z^w5ST#_*hFLl2y3mY0aO!FwbnWUpqg`DIC=8q z?*9y6>C&a)Y&QF;);gxO4gwSHF{SN}bCu_KR_3GQc?{5Mi ziKqf#3_yv9t`X5yA}WMJp;6Ac<+|=W0N^;zM#k96APCeW14t>~4TVB-&YU@mqtWOU z(=>g{vV?8h(lCr591aItwrue_J3BW52sr0uA;fE`RH`Euiybc%3aY=q|KYY^(V|7| zg+k$|VHo?BQtN{tZ~%aFj={k}q|<5a-u>@(x3skM5z!NtWo;fC8{29a#(pAt&-eWT z=NzVKqPe*lJ9g~2D?sROLC0~{0(i_YjIX=9yIsRDFmvWioH=s_j^o@|ytA|Od98H| zV{BhE8vW8RjNTv!Rxrles;a6WrNr3S7|xwLH)#g$09e0%eYFr`31jS{l=A$ZJ$sZ8 z0gv$i+FDa8l{OGjnRC7^kx1m%tXcEZfddEHhK7cg zkBp2|%H{Ied_IpvBH<4W4c%V`eBV!pLZOJ(x-XZ@l`PA`>C>k%d-iOYrU|VzJkP`E z=x7>1l8An6X=yp@c^-D|+$p7$e`&2DrToP6yvqQ#XEK>?0M7!5P6^P_(b1~4P67BS z5{V1|!070xF@OI2=*Y-Oqm(j9M2k7+F9{)56OqRl`#F=zjN7)2rluwUxcyV#0I(Op zHUKSCUPIS)Q(Ef|0L5~-yo)hrd!ASkV>V{)6;`fr%v4t z5CHfaz#jm10T`STKx-XLWMxJu6siZ{1MmQh04PmNRv@Aw01Zm1mxU1No}QkAH%&8q z)B8yPA19N^qnS+R-bTbZKOF?Yaivt;vaEHbQt3!zVgp?;^UnY@ zyRQ2o0Ho7tGnq^-sIRYA;c$5G{anLa01h2GUuhx%`&Cb+E6G|s;#a4>VW|!l(#HvtJZpUsZ`pa)a3t_VzF2>O>>LZ zy2f?gO|e*Pt`Oom&iRpp2M^{Q$9Zrg%IEW{p`qbVDP^}1;zirGzn?Kn#O@Z%X0x)fv9aj; z{z@T4q^_=Re=e6(wY9ZqYHC6*mjeLQ)YRbGwQFkDtXU<;aaJg$ni*r40c;u{9~X=< zn5K#P`g&ZraN)r#qSn^dUzAd9@pyb0W323XUQ|jMlTyZ&QrDkZMARUq>;eGGvNm(h zw-QmMt*s5)w{L&=lB~VGeYNYlpKGn-06;_lpaBRX@`=a;P$43hh{^y8wrzhfFfefb zkqZ(4IC0{{cgbY35x|o~GzP!{P@braN)zT(0#GKRvew$Uixp36TGN_R{{Ye9a{7|) RuF?Pi002ovPDHLkV1lE*zH9&h diff --git a/images/blackright1.png b/images/blackright1.png deleted file mode 100644 index 26e306bffa82ae3eee11469d7e86832c9547ba08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1435 zcmV;M1!Ve(P){G zK~z}7?U!3@6lE00|L1%&JKb%uEzp+6t|3T}rfE%A8fsChXhIPaj6rEajNyTRCW?uP zuRi&r4`T4fBQcd45))8Nh$sOz;Zi6B+Db|R8@X*8SZH^L-JSW)@nubbQtt6VIZyLl z&u`B6Ki`}I9@!)NzZ*?9(A?b2K@iaN>C-6)0um86#*pWE$Y!(5%q$|tTI+hAhj=`G zdGqGY^3VX9nwsiGq)t^M0320~0*C>KscM<3P5}@jqL7F<5{Z1z%tv~Ad+!Otxm9OJ zM@QxG@bHHKTCM{nRdt960F;OVBFc(Lt+lp_nNeC=dKN(HfdMXDxbV7&bP~}CA{qja zB_f}h$C-J|7&9IO!R2T)IxU;czE4C^YwfCQ*RK84)zvk!a^*_BZ-9*(H=6b9*LN^; zp{%Uz;miD(9Z-grEIE}c&A&15o1(&=w`ux!~fK6&!wQ>vN(P^zl+%>1^9a2SRq03sq115gH_ zLRFhpwbU4MsJgoP{B`@~0r*968vyM9S^=B_@Ckq|w*zxvEwX(G#k=iintq z7=RFw0tkx^0sx+>W&t3d&;JueTO7{=&|>>4fQtZj0T?XqG4Tiv95@g*G&EeW*8T-x z8Z+-;<`W`fm^lQHQ&k_p7yw^H>WQdRM4n5h(?0|Fqv+5lq5?BpRox>Z-vZcPeCy!0 z8mO$S97w0rzl%tni1hXK^?f>-a1x2c;ao2FxQHya)-GDJX3fy1O`Af`^Vk^UMx)Vv zH8nLK^!D}+6v6JChRI~|s_VMH0m!K8n~jZ)Ew}kloioP#LPR1WukPKux3;~#-Kndq zYpSZMik6p`@2;+{9=?=DT zM4mOq3|ebP3x&cuW-g0FBA+Fb$uswS5$)feZ`9@4F!B?Chk|r%%rw8ynlr%;#gV*b2|{#)BYmRn-xZ zNEn8mwYJprJl9&g%=i6u0LXRSJpf+o@9!Ufpo*xmvC&i2FT*fg<$2yWs%llWOhg`2 z)tIW55>ZJ}LsLX#7Jx!57JGNjoH^IPbQO>A4*M_NF)pqwTZ}7BFY2Et7@V69IC1n5h0?Gne)t? pJ#^^MDEPyJDYhhUcNc~Z5G?NMQuI%^N*|}KwTtniTfkKict`Q~9`MJ5Nc_j?aMX8A;sVNHO znI#zt?w-B@;f;LaKt)SET^vIq4!@o5$=9I39HoqrO$R~W=gsD zxIBJxusg%KP=PyJDYhhUcNc~;Ab9^^ycAG`v%n*= zn1O*?7=#%aX3dcR3bL1Y`ns~;W9MK~Rlb}1PaP;ES>hT|;+&tGo0?a`;9QiNSdyBe zP@Y+mq2TW68xY>eCk|A!*3-o?B;xSfh?Bex20VvFXK(!P^WkA&Xo#iMmD6>MN*fI` zJuLZ}6gn;z?0+$9v1+5KneJCD8^g?*O+6ZM<&VTZnbhY0I9tUV$Wpm#;?}OK_qa6~ z8KzukRIs1+=nUT!&$X)^yyHp_e0h6<}F-kh!zWJ-6Y`#1lY= OGkCiCxvXe zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00V7FL_t(o!|hg0XkA4V{?6RF z?`ce9f@TpzD}sxPB87q?DjE_IjA@Z9DvF{|sIFYOk*>OMr3;lTtVrDy>_QhWtr8`q zl$g2@TQrJFODrN3BfQt-<=%JioHL(`7>Tyc&ui-{-}cOz^Ua*^n>oN1wy=dZLDG@* z*Se2vHeqgV?xz0!{s)sJ83s^|F-~~zPl-tLh7uszT@=M&k|cYbb58&WBm;nM5jm-< zwGhHYXJ_Zd>q;QYvh9^hU5sxPfkru`88UUgqIg+VGgUpUs(+~Jc{6)A zgfK+1V^!gsLkNRr_KumI`+MyvRn1zh*6ZulSNuE&ET8yz-tyVwX$U*%E)SsnkdYa_PvMfJJl4JzHi1+?5NdWjM#yCcD zd}e0myMciLU0hte|4J?bunoZPA`&-D;2*n)7=SYX&a_&sV`-Xx0KjKiw!f>Z>&JBt zF@P9f0J#(7+WktmOQ_7%xI()R7;;`_FrN zdWsEgo+L>Dpes$&m-0OCXfztreSLjP>-4)rRUZK`Dk8T5$dV+f08n`Ur-&4n_vk7p z%knD`855C5(=dxdAawl8>?3?86qeum=7D5SBK?{Jo#f00000NkvXXu0mjfJ0j7l diff --git a/images/orthogonal.png b/images/orthogonal.png new file mode 100644 index 0000000000000000000000000000000000000000..65306b2ef730453e188ef05998f2e73b63803a0d GIT binary patch literal 570 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/axes.png images/back.png images/Document-New-128.png - images/down.png images/front.png images/grid.png images/Open-128.png @@ -28,13 +27,9 @@ images/Rotation-32.png images/Shape-Cube-32.png images/Open-32.png - images/Open-32(1).png images/Save-32.png images/blackbottom.png images/blackleft (copy).png - images/blackright (copy).png - images/blackright.png - images/blackright1.png images/rightright.png images/blackfront.png images/blackback.png @@ -43,5 +38,18 @@ images/zoomout.png images/wireframe1.png images/surface.png + images/Zoom-In-32.png + images/Zoom-Out-32.png + images/surfaceWhite.png + images/wireframeWhite.png + images/orthogonal.png + images/cross.png + images/perspective1.png + images/Preview-32.png + images/animate.png + images/Preview-32 (1).png + images/orthogonalwhite.png + images/perspective1white.png + images/crosswhite.png diff --git a/src/editortoolbar.cpp b/src/editortoolbar.cpp index 6f957282..0bdd22fc 100644 --- a/src/editortoolbar.cpp +++ b/src/editortoolbar.cpp @@ -2,39 +2,4 @@ EditorToolBar::EditorToolBar(QWidget *parent) : QToolBar(parent) -{ - int defaultColor = this->palette().background().color().lightness(); - - buttonNew = new QToolButton; - buttonOpen = new QToolButton; - buttonSave = new QToolButton; - buttonZoomIn = new QToolButton; - buttonZoomOut = new QToolButton; - - if(defaultColor > 165) - { - buttonNew->setIcon(QIcon("://images/blackNew.png")); - buttonOpen->setIcon(QIcon("://images/Open-32(1).png")); - buttonSave->setIcon(QIcon("://images/Save-32.png")); - buttonZoomIn->setIcon(QIcon("://images/zoomin.png")); - buttonZoomOut->setIcon(QIcon("://images/zoomout.png")); - } else { - - buttonNew->setIcon(QIcon("://images/Document-New-128.png")); - buttonOpen->setIcon(QIcon("://images/Open-128.png")); - buttonSave->setIcon(QIcon("://images/Save-128.png")); - } - - buttonNew->setToolTip("New"); - buttonOpen->setToolTip("Open"); - buttonSave->setToolTip("Save"); - buttonZoomIn->setToolTip("Zoom In"); - buttonZoomOut->setToolTip("Zoom Out"); - - this->addWidget(buttonNew); - this->addWidget(buttonOpen); - this->addWidget(buttonSave); - this->addWidget(buttonZoomIn); - this->addWidget(buttonZoomOut); - -} +{ } diff --git a/src/editortoolbar.h b/src/editortoolbar.h index c85dae4d..7568a415 100644 --- a/src/editortoolbar.h +++ b/src/editortoolbar.h @@ -9,8 +9,6 @@ class EditorToolBar : public QToolBar Q_OBJECT public: explicit EditorToolBar(QWidget *parent = 0); - QToolButton *buttonNew, *buttonOpen, *buttonSave; - QToolButton *buttonZoomIn, *buttonZoomOut; signals: diff --git a/src/mainwin.cc b/src/mainwin.cc index db6efcc6..3824ee83 100644 --- a/src/mainwin.cc +++ b/src/mainwin.cc @@ -451,40 +451,87 @@ MainWindow::MainWindow(const QString &filename) connect(this->replaceAllButton, SIGNAL(clicked()), this, SLOT(replaceAll())); connect(this->replaceInputField, SIGNAL(returnPressed()), this->replaceButton, SLOT(animateClick())); - //EditorToolbar - connect(editortoolbar->buttonNew, SIGNAL(clicked()), this, SLOT(actionNew())); - connect(editortoolbar->buttonOpen, SIGNAL(clicked()), this, SLOT(actionOpen())); - connect(editortoolbar->buttonSave, SIGNAL(clicked()), this, SLOT(actionSave())); - connect(editortoolbar->buttonZoomIn, SIGNAL(clicked()), editor, SLOT(zoomIn())); - connect(editortoolbar->buttonZoomOut, SIGNAL(clicked()), editor, SLOT(zoomOut())); - - //Toolbar toolBar = new ToolBar(this); verticalLayout_2->addWidget(toolBar); int defaultcolor = toolBar->palette().background().color().lightness(); if(defaultcolor > 165){ + fileActionNew->setIcon(QIcon("://images/blackNew.png")); + fileActionOpen->setIcon(QIcon("://images/Open-32(1).png")); + fileActionSave->setIcon(QIcon("://images/Save-32.png")); + editActionZoomIn->setIcon(QIcon("://images/zoomin.png")); + editActionZoomOut->setIcon(QIcon("://images/zoomout.png")); + designActionRender->setIcon(QIcon("://images/blackRender.png")); viewActionShowAxes->setIcon(QIcon("://images/blackaxes.png")); - toolBar->addAction(viewActionShowAxes); - viewActionShowEdges->setIcon(QIcon("://images/Rotation-32.png")); - toolBar->addAction(viewActionShowEdges); - } - - connect(toolBar->buttonRender, SIGNAL(clicked()), this, SLOT(actionRender())); - connect(toolBar->buttonTop, SIGNAL(clicked()), this, SLOT(viewAngleTop())); - connect(toolBar->buttonBottom, SIGNAL(clicked()), this, SLOT(viewAngleBottom())); - connect(toolBar->buttonLeft, SIGNAL(clicked()), this, SLOT(viewAngleLeft())); - connect(toolBar->buttonRight, SIGNAL(clicked()), this, SLOT(viewAngleRight())); - connect(toolBar->buttonFront, SIGNAL(clicked()), this, SLOT(viewAngleFront())); - connect(toolBar->buttonBack, SIGNAL(clicked()), this, SLOT(viewModeShowAxes())); - connect(toolBar->buttonZoomIn, SIGNAL(clicked()), qglview, SLOT(ZoomIn())); - connect(toolBar->buttonZoomOut, SIGNAL(clicked()), qglview, SLOT(ZoomOut())); + viewActionShowEdges->setIcon(QIcon("://images/Rotation-32.png")); + viewActionZoomIn->setIcon(QIcon("://images/zoomin.png")); + viewActionZoomOut->setIcon(QIcon("://images/zoomout.png")); + viewActionTop->setIcon(QIcon("://images/blackUp.png")); + viewActionBottom->setIcon(QIcon("://images/blackbottom.png")); + viewActionLeft->setIcon(QIcon("://images/blackleft (copy).png")); + viewActionRight->setIcon(QIcon("://images/rightright.png")); + viewActionFront->setIcon(QIcon("://images/blackfront.png")); + viewActionBack->setIcon(QIcon("://images/blackback.png")); + viewActionSurfaces->setIcon(QIcon("://images/surface.png")); + viewActionWireframe->setIcon(QIcon("://images/wireframe1.png")); + viewActionShowCrosshairs->setIcon(QIcon("://images/cross.png")); + viewActionPerspective->setIcon(QIcon("://images/perspective1.png")); + viewActionOrthogonal->setIcon(QIcon("://images/orthogonal.png")); + viewActionPreview->setIcon(QIcon("://images/Preview-32.png")); + viewActionAnimate->setIcon(QIcon("://images/animate.png")); - connect(toolBar->buttonSurface, SIGNAL(clicked()), this, SLOT(viewModeSurface())); - connect(toolBar->buttonWireframe, SIGNAL(clicked()), this, SLOT(viewModeWireframe())); + } else { + fileActionNew->setIcon(QIcon("://images/Document-New-128.png")); + fileActionOpen->setIcon(QIcon("://images/Open-128.png")); + fileActionSave->setIcon(QIcon("://images/Save-128.png")); + editActionZoomIn->setIcon(QIcon("://images/Zoom-In-32.png")); + editActionZoomOut->setIcon(QIcon("://images/Zoom-Out-32.png")); + designActionRender->setIcon(QIcon("://images/Arrowhead-Right-32.png")); + viewActionZoomIn->setIcon(QIcon("://images/Zoom-In-32.png")); + viewActionZoomOut->setIcon(QIcon("://images/Zoom-Out-32.png")); + viewActionShowAxes->setIcon(QIcon("://images/axes.png")); + viewActionShowEdges->setIcon(QIcon("://images/grid.png")); + viewActionTop->setIcon(QIcon("://images/up.png")); + viewActionBottom->setIcon(QIcon("://images/bottom.png")); + viewActionLeft->setIcon(QIcon("://images/left.png")); + viewActionRight->setIcon(QIcon("://images/right.png")); + viewActionFront->setIcon(QIcon("://images/front.png")); + viewActionBack->setIcon(QIcon("://images/back.png")); + viewActionSurfaces->setIcon(QIcon("://images/surfaceWhite.png")); + viewActionWireframe->setIcon(QIcon("://images/wireframeWhite.png")); + viewActionShowCrosshairs->setIcon(QIcon("://images/crosswhite.png")); + viewActionPreview->setIcon(QIcon("://images/Preview-32(1).png")); + viewActionPerspective->setIcon(QIcon("://images/perspective1white.png")); + viewActionOrthogonal->setIcon(QIcon("://images/orthogonalwhite.png")); + viewActionAnimate->setIcon(QIcon("://images/animate.png")); + } + + editortoolbar->addAction(fileActionNew); + editortoolbar->addAction(fileActionOpen); + editortoolbar->addAction(fileActionSave); + editortoolbar->addAction(editActionZoomIn); + editortoolbar->addAction(editActionZoomOut); + editortoolbar->addAction(designActionRender); - toolBar->setStyleSheet("QToolBar{border:1 solid black;}" ); + toolBar->addAction(viewActionPreview); + toolBar->addAction(viewActionSurfaces); + toolBar->addAction(viewActionWireframe); + toolBar->addAction(viewActionShowAxes); + toolBar->addAction(viewActionShowEdges); + toolBar->addAction(viewActionZoomIn); + toolBar->addAction(viewActionZoomOut); + toolBar->addAction(viewActionTop); + toolBar->addAction(viewActionBottom); + toolBar->addAction(viewActionLeft); + toolBar->addAction(viewActionRight); + toolBar->addAction(viewActionFront); + toolBar->addAction(viewActionBack); + toolBar->addAction(viewActionShowCrosshairs); + toolBar->addAction(viewActionPerspective); + toolBar->addAction(viewActionOrthogonal); + toolBar->addAction(viewActionAnimate); + toolBar->setStyleSheet("QToolBar{border:1 solid black;}" ); // make sure it looks nice.. QSettings settings; diff --git a/src/toolbar.cpp b/src/toolbar.cpp index 1492b182..dddb6f82 100644 --- a/src/toolbar.cpp +++ b/src/toolbar.cpp @@ -3,67 +3,4 @@ ToolBar::ToolBar(QWidget *parent) : QToolBar(parent) { - int defaultColor = this->palette().background().color().lightness(); - - buttonRender = new QToolButton; - buttonTop = new QToolButton; - buttonBottom = new QToolButton; - buttonLeft = new QToolButton; - buttonRight = new QToolButton; - buttonFront = new QToolButton; - buttonBack = new QToolButton; - buttonZoomIn = new QToolButton; - buttonZoomOut = new QToolButton; - buttonWireframe = new QToolButton; - buttonSurface = new QToolButton; - - if(defaultColor > 165) - { - buttonRender->setIcon(QIcon("://images/blackRender.png")); - buttonRender->setToolTip("Render"); - buttonTop->setIcon(QIcon("://images/blackUp.png")); - buttonBottom->setIcon(QIcon("://images/blackbottom.png")); - buttonLeft->setIcon(QIcon("://images/blackleft (copy).png")); - buttonRight->setIcon(QIcon("://images/rightright.png")); - buttonFront->setIcon(QIcon("://images/blackfront.png")); - buttonBack->setIcon(QIcon("://images/blackback.png")); - buttonZoomIn->setIcon(QIcon("://images/zoomin.png")); - buttonZoomOut->setIcon(QIcon("://images/zoomout.png")); - buttonWireframe->setIcon(QIcon("://images/wireframe1.png")); - buttonSurface->setIcon(QIcon("://images/surface.png")); - } else { - - buttonRender->setIcon(QIcon("://images/Arrowhead-Right-32.png")); - buttonTop->setIcon(QIcon("://images/up.png")); - buttonBottom->setIcon(QIcon("://images/bottom.png")); - buttonLeft->setIcon(QIcon("://images/left.png")); - buttonRight->setIcon(QIcon("://images/right.png")); - buttonFront->setIcon(QIcon("://images/front.png")); - buttonBack->setIcon(QIcon("://images/back.png")); - - } - buttonRender->setToolTip("Render"); - buttonTop->setToolTip("Top"); - buttonBottom->setToolTip("Bottom"); - buttonLeft->setToolTip("Left"); - buttonRight->setToolTip("Right"); - buttonFront->setToolTip("Front"); - buttonBack->setToolTip("Back"); - buttonZoomIn->setToolTip("Zoom in"); - buttonZoomOut->setToolTip("Zoom out"); - buttonWireframe->setToolTip("Wireframe"); - buttonSurface->setToolTip("Surfaces"); - - this->addWidget(buttonRender); - this->addSeparator(); - this->addWidget(buttonTop); - this->addWidget(buttonBottom); - this->addWidget(buttonLeft); - this->addWidget(buttonRight); - this->addWidget(buttonFront); - this->addWidget(buttonBack); - this->addWidget(buttonZoomIn); - this->addWidget(buttonZoomOut); - this->addWidget(buttonWireframe); - this->addWidget(buttonSurface); } diff --git a/src/toolbar.h b/src/toolbar.h index 08ebdcb4..bc0cef26 100644 --- a/src/toolbar.h +++ b/src/toolbar.h @@ -9,9 +9,6 @@ class ToolBar : public QToolBar Q_OBJECT public: explicit ToolBar(QWidget *parent = 0); - QToolButton *buttonZoomIn, *buttonZoomOut, *buttonRender; - QToolButton *buttonTop, *buttonBottom, *buttonLeft, *buttonRight; - QToolButton *buttonFront, *buttonBack, *buttonWireframe, *buttonSurface; signals: From 3fd08be98eda85c35d3ab200891fd174cd43eab6 Mon Sep 17 00:00:00 2001 From: shaina7837 Date: Wed, 13 Aug 2014 09:51:34 +0530 Subject: [PATCH 06/24] render icon is shifted to rendering window toolbar --- src/mainwin.cc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/mainwin.cc b/src/mainwin.cc index 3824ee83..f27083b5 100644 --- a/src/mainwin.cc +++ b/src/mainwin.cc @@ -512,13 +512,13 @@ MainWindow::MainWindow(const QString &filename) editortoolbar->addAction(fileActionSave); editortoolbar->addAction(editActionZoomIn); editortoolbar->addAction(editActionZoomOut); - editortoolbar->addAction(designActionRender); + toolBar->addAction(designActionRender); toolBar->addAction(viewActionPreview); - toolBar->addAction(viewActionSurfaces); - toolBar->addAction(viewActionWireframe); + //toolBar->addAction(viewActionSurfaces); + //toolBar->addAction(viewActionWireframe); toolBar->addAction(viewActionShowAxes); - toolBar->addAction(viewActionShowEdges); + //toolBar->addAction(viewActionShowEdges); toolBar->addAction(viewActionZoomIn); toolBar->addAction(viewActionZoomOut); toolBar->addAction(viewActionTop); @@ -527,7 +527,7 @@ MainWindow::MainWindow(const QString &filename) toolBar->addAction(viewActionRight); toolBar->addAction(viewActionFront); toolBar->addAction(viewActionBack); - toolBar->addAction(viewActionShowCrosshairs); + //toolBar->addAction(viewActionShowCrosshairs); toolBar->addAction(viewActionPerspective); toolBar->addAction(viewActionOrthogonal); toolBar->addAction(viewActionAnimate); From 56ebdd92f10044de32001712ad86a0eb9d7f5a79 Mon Sep 17 00:00:00 2001 From: shaina7837 Date: Sun, 14 Sep 2014 20:26:31 +0200 Subject: [PATCH 07/24] Added toolbars in Designer, make search panel appear below toolbar --- src/MainWindow.h | 4 -- src/MainWindow.ui | 107 ++++++++++++++++++---------------------------- src/mainwin.cc | 5 +-- 3 files changed, 43 insertions(+), 73 deletions(-) diff --git a/src/MainWindow.h b/src/MainWindow.h index e80bf19d..e8b201b4 100644 --- a/src/MainWindow.h +++ b/src/MainWindow.h @@ -9,8 +9,6 @@ #include "Tree.h" #include "memory.h" #include "editor.h" -#include "editortoolbar.h" -#include "toolbar.h" #include #include #include @@ -113,8 +111,6 @@ private: void setDockWidgetTitle(QDockWidget *dockWidget, QString prefix, bool topLevel); EditorInterface *editor; - EditorToolBar *editortoolbar; - ToolBar *toolBar; class QMessageBox *openglbox; class FontListDialog *font_list_dialog; diff --git a/src/MainWindow.ui b/src/MainWindow.ui index 9f4016e1..cbc56d8f 100644 --- a/src/MainWindow.ui +++ b/src/MainWindow.ui @@ -15,16 +15,7 @@ 0 - - 0 - - - 0 - - - 0 - - + 0 @@ -35,20 +26,11 @@ 0 - - - - + 0 - - 0 - - - 0 - - + 0 @@ -67,7 +49,7 @@ - + true @@ -82,16 +64,7 @@ 0 - - 0 - - - 0 - - - 0 - - + 0 @@ -134,9 +107,13 @@ + + + animate_panel qglview + toolBar @@ -147,7 +124,7 @@ 0 0 936 - 25 + 22 @@ -297,20 +274,17 @@ 1 - - + + 0 - + 0 - - 0 - - - 0 - - + + + + true @@ -415,16 +389,7 @@ - - 0 - - - 0 - - - 0 - - + 0 @@ -442,7 +407,7 @@ - + :/Document-New-128.png:/Document-New-128.png @@ -454,7 +419,7 @@ - + :/Open-128.png:/Open-128.png @@ -466,7 +431,7 @@ - + :/Save-128.png:/Save-128.png @@ -642,7 +607,7 @@ - + :/Arrowhead-Right-32.png:/Arrowhead-Right-32.png @@ -731,7 +696,7 @@ true - + :/grid.png:/grid.png @@ -746,7 +711,7 @@ true - + :/axes.png:/axes.png @@ -777,7 +742,7 @@ - + :/up.png:/up.png @@ -789,7 +754,7 @@ - + :/bottom.png:/bottom.png @@ -801,7 +766,7 @@ - + :/left.png:/left.png @@ -813,7 +778,7 @@ - + :/right.png:/right.png @@ -825,7 +790,7 @@ - + :/front.png:/front.png @@ -837,7 +802,7 @@ - + :/back.png:/back.png @@ -1063,6 +1028,18 @@
QGLView.h
1 + + EditorToolBar + QWidget +
editortoolbar.h
+ 1 +
+ + ToolBar + QWidget +
toolbar.h
+ 1 +
diff --git a/src/mainwin.cc b/src/mainwin.cc index f27083b5..dc063f6d 100644 --- a/src/mainwin.cc +++ b/src/mainwin.cc @@ -171,8 +171,7 @@ MainWindow::MainWindow(const QString &filename) { setupUi(this); - editortype = Preferences::inst()->getValue("editor/editortype").toString(); - + editortype = Preferences::inst()->getValue("editor/editortype").toString(); useScintilla = (editortype == "QScintilla Editor"); #ifdef USE_SCINTILLA_EDITOR @@ -452,8 +451,6 @@ MainWindow::MainWindow(const QString &filename) connect(this->replaceInputField, SIGNAL(returnPressed()), this->replaceButton, SLOT(animateClick())); //Toolbar - toolBar = new ToolBar(this); - verticalLayout_2->addWidget(toolBar); int defaultcolor = toolBar->palette().background().color().lightness(); if(defaultcolor > 165){ From c251683c202aee03d3f43af206949363d80c1722 Mon Sep 17 00:00:00 2001 From: Torsten Paul Date: Sun, 14 Sep 2014 21:17:27 +0200 Subject: [PATCH 08/24] Move ToolBar setup to GUI design file. --- src/MainWindow.ui | 123 ++++++++++++++++++++++++++++++++-------------- src/mainwin.cc | 31 +----------- 2 files changed, 87 insertions(+), 67 deletions(-) diff --git a/src/MainWindow.ui b/src/MainWindow.ui index cbc56d8f..071df825 100644 --- a/src/MainWindow.ui +++ b/src/MainWindow.ui @@ -6,7 +6,7 @@ 0 0 - 936 + 1397 586
@@ -108,7 +108,26 @@
- + + + + + + + + + + + + + + + + + + + +
animate_panel @@ -123,8 +142,8 @@ 0 0 - 936 - 22 + 1397 + 34
@@ -282,7 +301,11 @@ 0 - + + + + + @@ -407,8 +430,8 @@ - - :/Document-New-128.png:/Document-New-128.png + + :/images/blackNew.png:/images/blackNew.png &New @@ -419,8 +442,8 @@ - - :/Open-128.png:/Open-128.png + + :/images/Open-32.png:/images/Open-32.png &Open... @@ -431,8 +454,8 @@ - - :/Save-128.png:/Save-128.png + + :/images/Save-32.png:/images/Save-32.png &Save @@ -598,6 +621,10 @@ + + + :/images/Preview-32.png:/images/Preview-32.png + &Preview @@ -607,8 +634,8 @@ - - :/Arrowhead-Right-32.png:/Arrowhead-Right-32.png + + :/images/blackRender.png:/images/blackRender.png &Render @@ -696,8 +723,8 @@ true - - :/grid.png:/grid.png + + :/images/Rotation-32.png:/images/Rotation-32.png Show Edges @@ -711,8 +738,8 @@ true - - :/axes.png:/axes.png + + :/images/blackaxes.png:/images/blackaxes.png Show Axes @@ -725,6 +752,10 @@ true + + + :/images/cross.png:/images/cross.png + Show Crosshairs @@ -742,8 +773,8 @@ - - :/up.png:/up.png + + :/images/blackUp.png:/images/blackUp.png Top @@ -754,8 +785,8 @@ - - :/bottom.png:/bottom.png + + :/images/blackbottom.png:/images/blackbottom.png Bottom @@ -766,8 +797,8 @@ - - :/left.png:/left.png + + :/images/blackleft (copy).png:/images/blackleft (copy).png Left @@ -778,8 +809,8 @@ - - :/right.png:/right.png + + :/images/rightright.png:/images/rightright.png Right @@ -790,8 +821,8 @@ - - :/front.png:/front.png + + :/images/blackfront.png:/images/blackfront.png Front @@ -802,8 +833,8 @@ - - :/back.png:/back.png + + :/images/blackback.png:/images/blackback.png Back @@ -829,6 +860,10 @@ true + + + :/images/perspective1.png:/images/perspective1.png + Perspective @@ -837,6 +872,10 @@ true + + + :/images/orthogonal.png:/images/orthogonal.png + Orthogonal @@ -992,6 +1031,10 @@ + + + :/images/zoomin.png:/images/zoomin.png + Zoom In @@ -1000,6 +1043,10 @@ + + + :/images/zoomout.png:/images/zoomout.png + Zoom Out @@ -1028,20 +1075,22 @@
QGLView.h
1 - - EditorToolBar - QWidget -
editortoolbar.h
- 1 -
ToolBar - QWidget + QToolBar
toolbar.h
1
+ + EditorToolBar + QToolBar +
editortoolbar.h
+ 1 +
- + + + fileActionClose diff --git a/src/mainwin.cc b/src/mainwin.cc index dc063f6d..34ffba8a 100644 --- a/src/mainwin.cc +++ b/src/mainwin.cc @@ -184,9 +184,6 @@ MainWindow::MainWindow(const QString &filename) editorDockContents->layout()->addWidget(editor); - editortoolbar = new EditorToolBar(this); - editorDockContents->layout()->addWidget(editortoolbar); - setCorner(Qt::TopLeftCorner, Qt::LeftDockWidgetArea); setCorner(Qt::TopRightCorner, Qt::RightDockWidgetArea); setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea); @@ -455,7 +452,7 @@ MainWindow::MainWindow(const QString &filename) if(defaultcolor > 165){ fileActionNew->setIcon(QIcon("://images/blackNew.png")); - fileActionOpen->setIcon(QIcon("://images/Open-32(1).png")); + fileActionOpen->setIcon(QIcon("://images/Open-32.png")); fileActionSave->setIcon(QIcon("://images/Save-32.png")); editActionZoomIn->setIcon(QIcon("://images/zoomin.png")); editActionZoomOut->setIcon(QIcon("://images/zoomout.png")); @@ -504,32 +501,6 @@ MainWindow::MainWindow(const QString &filename) viewActionAnimate->setIcon(QIcon("://images/animate.png")); } - editortoolbar->addAction(fileActionNew); - editortoolbar->addAction(fileActionOpen); - editortoolbar->addAction(fileActionSave); - editortoolbar->addAction(editActionZoomIn); - editortoolbar->addAction(editActionZoomOut); - - toolBar->addAction(designActionRender); - toolBar->addAction(viewActionPreview); - //toolBar->addAction(viewActionSurfaces); - //toolBar->addAction(viewActionWireframe); - toolBar->addAction(viewActionShowAxes); - //toolBar->addAction(viewActionShowEdges); - toolBar->addAction(viewActionZoomIn); - toolBar->addAction(viewActionZoomOut); - toolBar->addAction(viewActionTop); - toolBar->addAction(viewActionBottom); - toolBar->addAction(viewActionLeft); - toolBar->addAction(viewActionRight); - toolBar->addAction(viewActionFront); - toolBar->addAction(viewActionBack); - //toolBar->addAction(viewActionShowCrosshairs); - toolBar->addAction(viewActionPerspective); - toolBar->addAction(viewActionOrthogonal); - toolBar->addAction(viewActionAnimate); - toolBar->setStyleSheet("QToolBar{border:1 solid black;}" ); - // make sure it looks nice.. QSettings settings; QByteArray windowState = settings.value("window/state", QByteArray()).toByteArray(); From f9b0a7e9a944bc7db4400a1a1bd22b5268e5e69d Mon Sep 17 00:00:00 2001 From: Torsten Paul Date: Sun, 14 Sep 2014 21:39:15 +0200 Subject: [PATCH 09/24] Add more icons. --- images/export-white.png | Bin 0 -> 425 bytes images/export.png | Bin 0 -> 500 bytes openscad.qrc | 108 ++++++++++++++++++++-------------------- src/MainWindow.ui | 9 ++++ src/mainwin.cc | 1 + 5 files changed, 65 insertions(+), 53 deletions(-) create mode 100644 images/export-white.png create mode 100644 images/export.png diff --git a/images/export-white.png b/images/export-white.png new file mode 100644 index 0000000000000000000000000000000000000000..9aeeade8c11446e104d349aa56d47c5485a63de9 GIT binary patch literal 425 zcmV;a0apHrP) zF;2rU7=`U9N+YK`8(e~!NSvYr0|OI6%!nN^cSLH%RJ_5`p2*u_zt z__0t4Mbu5&rUS~i#d-4o{^!^+AvHBMYcLoLoH&j-ENHFYgb=M&bJ4QJhr^*0hT&bK z(Kt<#OeXs_ol~;-4P)$*5JJ*4 zO;^ZGkvR(+kWyYT#;zC7uItKeBwEOT5aJ>Tg4^F?S(ZgRF%U)3Nwe8(=f{&I>HV?p z0Dv+ET-!^|xgP|lu|vLRw zv2WTy6vp2@4qU9TRqEIo-G;$zLCVs90ih06gJdBOR7(AAK7Z%;d+**^42x|%EofALe!u@gN?Aw5 z$zU*ert>kzJ}RYNdY<9G+`(J+qMs<)9L$_jfj(b0VtQt&pppOSzk}5)7`(EyJC!~C;%Iqu+?fk>h*dT zi1@=Wj4!_LBc;@&lzyvJDxWy#x&~ZAw6_8P08~oRAPBy5&fos|!f~813D!rWQJpac z!{LzZ - - icons/prefsFeatures.png - icons/stopbutton.png - icons/prefsAdvanced.png - icons/prefs3DView.png - icons/prefsEditor.png - icons/prefsUpdate.png - icons/flattr.png - src/AboutDialog.html - images/Arrowhead-Right-32.png - images/axes.png - images/back.png - images/Document-New-128.png - images/front.png - images/grid.png - images/Open-128.png - images/openscad.png - images/right.png - images/Save-128.png - images/up.png - images/bottom.png - images/left.png - images/blackUp.png - images/blackNew.png - images/blackRender.png - images/Rotation-32.png - images/Shape-Cube-32.png - images/Open-32.png - images/Save-32.png - images/blackbottom.png - images/blackleft (copy).png - images/rightright.png - images/blackfront.png - images/blackback.png - images/blackaxes.png - images/zoomin.png - images/zoomout.png - images/wireframe1.png - images/surface.png - images/Zoom-In-32.png - images/Zoom-Out-32.png - images/surfaceWhite.png - images/wireframeWhite.png - images/orthogonal.png - images/cross.png - images/perspective1.png - images/Preview-32.png - images/animate.png - images/Preview-32 (1).png - images/orthogonalwhite.png - images/perspective1white.png - images/crosswhite.png - + + icons/prefsFeatures.png + icons/stopbutton.png + icons/prefsAdvanced.png + icons/prefs3DView.png + icons/prefsEditor.png + icons/prefsUpdate.png + icons/flattr.png + src/AboutDialog.html + images/Arrowhead-Right-32.png + images/export.png + images/axes.png + images/export-white.png + images/back.png + images/Document-New-128.png + images/front.png + images/grid.png + images/Open-128.png + images/openscad.png + images/right.png + images/Save-128.png + images/up.png + images/bottom.png + images/left.png + images/blackUp.png + images/blackNew.png + images/blackRender.png + images/Rotation-32.png + images/Shape-Cube-32.png + images/Open-32.png + images/Save-32.png + images/blackbottom.png + images/blackleft (copy).png + images/rightright.png + images/blackfront.png + images/blackback.png + images/blackaxes.png + images/zoomin.png + images/zoomout.png + images/wireframe1.png + images/surface.png + images/Zoom-In-32.png + images/Zoom-Out-32.png + images/surfaceWhite.png + images/wireframeWhite.png + images/orthogonal.png + images/cross.png + images/perspective1.png + images/Preview-32.png + images/animate.png + images/Preview-32 (1).png + images/orthogonalwhite.png + images/perspective1white.png + images/crosswhite.png + diff --git a/src/MainWindow.ui b/src/MainWindow.ui index 071df825..79611b55 100644 --- a/src/MainWindow.ui +++ b/src/MainWindow.ui @@ -305,6 +305,11 @@ + + + + +
@@ -665,6 +670,10 @@ + + + :/images/export.png:/images/export.png + Export as &STL... diff --git a/src/mainwin.cc b/src/mainwin.cc index 34ffba8a..e111e723 100644 --- a/src/mainwin.cc +++ b/src/mainwin.cc @@ -499,6 +499,7 @@ MainWindow::MainWindow(const QString &filename) viewActionPerspective->setIcon(QIcon("://images/perspective1white.png")); viewActionOrthogonal->setIcon(QIcon("://images/orthogonalwhite.png")); viewActionAnimate->setIcon(QIcon("://images/animate.png")); + designActionExportSTL->setIcon(QIcon(":/images/export-white.png")) } // make sure it looks nice.. From cbddc6313ec0c7c9d251e3c55b054f122a78b5d9 Mon Sep 17 00:00:00 2001 From: Torsten Paul Date: Mon, 15 Sep 2014 17:47:15 +0200 Subject: [PATCH 10/24] Fix build. --- src/mainwin.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mainwin.cc b/src/mainwin.cc index e111e723..bddac7af 100644 --- a/src/mainwin.cc +++ b/src/mainwin.cc @@ -499,7 +499,7 @@ MainWindow::MainWindow(const QString &filename) viewActionPerspective->setIcon(QIcon("://images/perspective1white.png")); viewActionOrthogonal->setIcon(QIcon("://images/orthogonalwhite.png")); viewActionAnimate->setIcon(QIcon("://images/animate.png")); - designActionExportSTL->setIcon(QIcon(":/images/export-white.png")) + designActionExportSTL->setIcon(QIcon(":/images/export-white.png")); } // make sure it looks nice.. From 97424f0447601310fbeeff65e89c682e968d9baa Mon Sep 17 00:00:00 2001 From: Torsten Paul Date: Thu, 18 Sep 2014 22:55:06 +0200 Subject: [PATCH 11/24] Add keyboard shortcut to the tooltip of toolbar actions. --- src/MainWindow.h | 1 + src/mainwin.cc | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/MainWindow.h b/src/MainWindow.h index 0dbfafea..d8a7f88a 100644 --- a/src/MainWindow.h +++ b/src/MainWindow.h @@ -107,6 +107,7 @@ private: QString get2dExportFilename(QString format, QString extension); void show_examples(); void setDockWidgetTitle(QDockWidget *dockWidget, QString prefix, bool topLevel); + void addKeyboardShortCut(const QList &actions); EditorInterface *editor; diff --git a/src/mainwin.cc b/src/mainwin.cc index 4df92844..429dff38 100644 --- a/src/mainwin.cc +++ b/src/mainwin.cc @@ -436,6 +436,9 @@ MainWindow::MainWindow(const QString &filename) connect(this->replaceAllButton, SIGNAL(clicked()), this, SLOT(replaceAll())); connect(this->replaceInputField, SIGNAL(returnPressed()), this->replaceButton, SLOT(animateClick())); + addKeyboardShortCut(this->toolBar->actions()); + addKeyboardShortCut(this->editortoolbar->actions()); + //Toolbar int defaultcolor = toolBar->palette().background().color().lightness(); @@ -533,6 +536,24 @@ MainWindow::MainWindow(const QString &filename) clearCurrentOutput(); } +void MainWindow::addKeyboardShortCut(const QList &actions) +{ + foreach (QAction *action, actions) { + // prevent adding shortcut twice if action is added to multiple toolbars + if (action->toolTip().contains(" ")) { + continue; + } + + const QString shortCut(action->shortcut().toString(QKeySequence::NativeText)); + if (shortCut.isEmpty()) { + continue; + } + + const QString toolTip("%1  %2"); + action->setToolTip(toolTip.arg(action->toolTip(), shortCut)); + } +} + void MainWindow::loadViewSettings(){ QSettings settings; if (settings.value("view/showEdges").toBool()) { From d039729878d2b31ba667953340642d9a3f259962 Mon Sep 17 00:00:00 2001 From: Torsten Paul Date: Thu, 18 Sep 2014 23:14:12 +0200 Subject: [PATCH 12/24] Add "ViewAll" and remove "Crosshair" icon from toolbar. --- images/zoom-all-white.png | Bin 0 -> 927 bytes images/zoom-all.png | Bin 0 -> 934 bytes openscad.qrc | 2 ++ src/MainWindow.ui | 6 +++++- src/mainwin.cc | 1 + 5 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 images/zoom-all-white.png create mode 100644 images/zoom-all.png diff --git a/images/zoom-all-white.png b/images/zoom-all-white.png new file mode 100644 index 0000000000000000000000000000000000000000..251fe217671dbc9f078a40e923100a0e0c43866c GIT binary patch literal 927 zcmV;Q17Q4#P)bCX+@@ zG^iL+7g9tLM58sB&{pljKVXWKEJ_zeS}disnqiMPj z0%`~)DTP!72|95mndj{$14A%6N$g|cS>8GK+;bn_V*oDjkAaE@2qEM|B0}gip-Sgr zLoUw{G0Hg!lu^NGG&)*aTRVj@z77Cw03Z@V;)F1O>5yMxYiLI@z zSsf0?BEvBL!Z;LbtEzg;^ZX;X+r3aqry>KvV6d*Eqhp<>=_`eAP)d&w0vyLZ?(gq^ zQI3IA-+;s6nAa8u0FWdpn$2c!rPFEG{{H?D&-2d|MLE zG&eVIV~jBXKrWYi6N|;B0)c?6=WT3kblL6pb&8@o0RRL+_~LT8t{HuVB~QR=wFVGE zm=FSzBz@o6*|}G|H~@gp=S#9IdzTObgb*;9OjkppP*>FkFvi0OAwUR$EX!{vCnv>H zT#v^Slx6v+#<$sQo~jMdG~J->3S*owkO$%#pJ5n#)dpl)&TEfLmgTmygj7{+)A5h1 zHlV6%ObaiXrf;4m5)OxZD2j4we3oTnRU6V6 zB;vH$Y#%6!x@<&{5R&ii?!I&`sTcrYczAdxl}h#Ha=95vl718|CX1pNDGEn(JRVP- zYeS;n#mdS`XH!#Co1!RUI-O4V{r=-vEH-DcSf1$T2!arFI-TPcSHp4|j-{m~s<*fI zlgVVdp&#dY{&`3hwq(u(PvJ-=YgUf&1K%r~$G&D4P)<=h; zC~PK^8S;9)iHdtdqwshO}i{Euzn+<{i(DwiU002ovPDHLkV1kJv Bp7HF|82{ePo1NL2 zW{5=+U0QMpj15hqRcEPILPHOoDkM5YhmeAVs7plmLI^t4AuQ@5BnSpw(t{?!t_kkC z(h?dKNv^1@yQ?nEAK&ZZ#J26$>TJ}(-|_MLzW4jy``&N90ocJm1}d;dx4^X>$Jh|M z9nLSnr6%s^G9;{Z?%06IeGJ znsx>NfKmzw{T#+H%$g{Q*P_vAZ?Qbv642Jxwrg%~Zp1K*BLDyhA)vHyVF)3RB5LeBoc}H*5&{J9LK$tW%-=j?LJspS?L!=@ixn{DeGji*=&#B?+2yA+udnaw>+3Ufd8(>_vX{M9{r4%s6&-(lO z^l}s7+3!>5yMpH z@Yie$U>GK5JukyB&i*b*AP_iUnx@aP0_Z)@V+S*U$ z9!P%hIyyQ$%gf8vEX(R{w|iz_U|_ATuC6DW&ECij;CX&19*>{2a|I=TH#$2z@$~fc zD_z%5ZR!i4ovvR;m&D5obUCkOw!fX%6?F_lWawq6GS z0L!u&m&@f3hrsd!89dc9X24o6s$q+6=0o*o_^&g}dF?cl$~cL1tX#*7s5XaE2J07*qo IM6N<$g4_bH4gdfE literal 0 HcmV?d00001 diff --git a/openscad.qrc b/openscad.qrc index 2de2e60c..f202c2d4 100644 --- a/openscad.qrc +++ b/openscad.qrc @@ -45,6 +45,8 @@ images/surface.png images/Zoom-In-32.png images/Zoom-Out-32.png + images/zoom-all.png + images/zoom-all-white.png images/surfaceWhite.png images/wireframeWhite.png images/orthogonal.png diff --git a/src/MainWindow.ui b/src/MainWindow.ui index 79611b55..c47daf90 100644 --- a/src/MainWindow.ui +++ b/src/MainWindow.ui @@ -112,6 +112,7 @@ + @@ -125,7 +126,6 @@ -
@@ -1064,6 +1064,10 @@ + + + :/images/zoom-all.png:/images/zoom-all.png + View All diff --git a/src/mainwin.cc b/src/mainwin.cc index 429dff38..b524db7a 100644 --- a/src/mainwin.cc +++ b/src/mainwin.cc @@ -492,6 +492,7 @@ MainWindow::MainWindow(const QString &filename) viewActionOrthogonal->setIcon(QIcon("://images/orthogonalwhite.png")); viewActionAnimate->setIcon(QIcon("://images/animate.png")); designActionExportSTL->setIcon(QIcon(":/images/export-white.png")); + viewActionViewAll->setIcon(QIcon(":/images/zoom-all-white.png")); } // make sure it looks nice.. From 42507526b660c5642cca381cc6634bf3e31abc2e Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Fri, 19 Sep 2014 14:17:04 -0400 Subject: [PATCH 13/24] minor cosmetics --- src/MainWindow.ui | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/MainWindow.ui b/src/MainWindow.ui index c47daf90..95996aef 100644 --- a/src/MainWindow.ui +++ b/src/MainWindow.ui @@ -143,7 +143,7 @@ 0 0 1397 - 34 + 22 @@ -1077,7 +1077,7 @@ true - Hide Toolbar + Hide toolbars
From 8d067fe3cb8667eca6620ff60b09954b7cba14c7 Mon Sep 17 00:00:00 2001 From: Torsten Paul Date: Sat, 20 Sep 2014 23:46:30 +0200 Subject: [PATCH 14/24] Change categories property to only list a single main category. --- icons/openscad.desktop | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/icons/openscad.desktop b/icons/openscad.desktop index 4af6d186..1b397cf8 100644 --- a/icons/openscad.desktop +++ b/icons/openscad.desktop @@ -5,4 +5,4 @@ Name=OpenSCAD Icon=openscad Exec=openscad %f MimeType=application/x-openscad; -Categories=Graphics;3DGraphics;Engineering;Development; +Categories=Graphics;3DGraphics;Engineering; From 4eb53d33559b176929b27d7659af5809736d1a9e Mon Sep 17 00:00:00 2001 From: Torsten Paul Date: Sun, 21 Sep 2014 21:38:40 +0200 Subject: [PATCH 15/24] Add fonts folder to 'make install'. --- openscad.pro | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/openscad.pro b/openscad.pro index fe72122f..9c8c0b96 100644 --- a/openscad.pro +++ b/openscad.pro @@ -474,6 +474,10 @@ libraries.path = $$PREFIX/share/openscad/libraries/ libraries.files = libraries/* INSTALLS += libraries +fonts.path = $$PREFIX/share/openscad/fonts/ +fonts.files = fonts/* +INSTALLS += fonts + applications.path = $$PREFIX/share/applications applications.files = icons/openscad.desktop INSTALLS += applications From f98d565714636a3a343ac6c2e5b0e868a127c626 Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Tue, 23 Sep 2014 12:36:27 -0400 Subject: [PATCH 16/24] Use python's difflib instead of calling the diff cmd. Fixes issue where diff isn't always available on Windows. Fixed #960 --- tests/test_cmdline_tool.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/tests/test_cmdline_tool.py b/tests/test_cmdline_tool.py index 89e51b9e..3a2a539c 100755 --- a/tests/test_cmdline_tool.py +++ b/tests/test_cmdline_tool.py @@ -25,6 +25,7 @@ import getopt import shutil import platform import string +import difflib #_debug_tcct = True _debug_tcct = False @@ -99,12 +100,15 @@ def compare_text(expected, actual): return get_normalized_text(expected) == get_normalized_text(actual) def compare_default(resultfilename): - print >> sys.stderr, 'diff text compare: ' + print >> sys.stderr, 'text comparison: ' print >> sys.stderr, ' expected textfile: ', expectedfilename print >> sys.stderr, ' actual textfile: ', resultfilename - if not compare_text(expectedfilename, resultfilename): + expected_text = get_normalized_text(expectedfilename) + actual_text = get_normalized_text(resultfilename) + if not expected_text == actual_text: if resultfilename: - execute_and_redirect("diff", ["-u", expectedfilename, resultfilename], sys.stderr) + differences = difflib.unified_diff(expected_text.splitlines(1), actual_text.splitlines(1)) + for line in differences: sys.stderr.write(line) return False return True From e00292b445e9ec59e5c0c25e232b036297b6b0b1 Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Tue, 30 Sep 2014 15:27:24 -0400 Subject: [PATCH 17/24] Updated OpenCSG build to correctly set the install name --- patches/OpenCSG-1.4.0-MacOSX-port.patch | 21 +++++++++++++++------ scripts/macosx-build-dependencies.sh | 2 +- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/patches/OpenCSG-1.4.0-MacOSX-port.patch b/patches/OpenCSG-1.4.0-MacOSX-port.patch index c26d6470..8b0a5d70 100644 --- a/patches/OpenCSG-1.4.0-MacOSX-port.patch +++ b/patches/OpenCSG-1.4.0-MacOSX-port.patch @@ -1,4 +1,5 @@ diff --git a/opencsg.pro b/opencsg.pro +index b56e622..5cf2d6d 100644 --- a/opencsg.pro +++ b/opencsg.pro @@ -1,2 +1,2 @@ @@ -6,17 +7,25 @@ diff --git a/opencsg.pro b/opencsg.pro -SUBDIRS = src example +SUBDIRS = src diff --git a/src/src.pro b/src/src.pro ---- OpenCSG-1.4.0/src/src.pro 2014-09-15 16:25:33.000000000 -0400 -+++ OpenCSG-1.4.0-mac/src/src.pro 2014-09-15 18:17:09.000000000 -0400 -@@ -8,10 +8,9 @@ +index 9091251..598112a 100644 +--- a/src/src.pro ++++ b/src/src.pro +@@ -3,15 +3,14 @@ TARGET = opencsg + VERSION = 1.4.0 + + CONFIG += opengl warn_on release ++CONFIG += absolute_library_soname + INCLUDEPATH += ../include ../ + CONFIG -= qt LIBS += -lGLEW - DESTDIR = ../lib +-DESTDIR = ../lib -INSTALLDIR = /usr/local headers.files = ../include/opencsg.h - headers.path = $$INSTALLDIR/include +-headers.path = $$INSTALLDIR/include -target.path = /usr/local/lib -+target.path = $$INSTALLDIR/lib ++headers.path = $$DESTDIR/include ++target.path = $$DESTDIR/lib INSTALLS += target headers HEADERS = ../include/opencsg.h \ diff --git a/scripts/macosx-build-dependencies.sh b/scripts/macosx-build-dependencies.sh index 8359de50..52441051 100755 --- a/scripts/macosx-build-dependencies.sh +++ b/scripts/macosx-build-dependencies.sh @@ -427,7 +427,7 @@ build_opencsg() OPENCSG_EXTRA_FLAGS="x86" fi qmake -r QMAKE_CXXFLAGS+="-I$DEPLOYDIR/include" QMAKE_LFLAGS+="-L$DEPLOYDIR/lib" CONFIG+="x86_64 $OPENCSG_EXTRA_FLAGS" - INSTALL_ROOT=$DEPLOYDIR make install + make install } build_eigen() From 7a1737c09f15807a7fde08c19ffda0f7cceb4ee5 Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Tue, 30 Sep 2014 16:47:14 -0400 Subject: [PATCH 18/24] toolBar -> viewerToolBar, indendation fixes --- src/MainWindow.ui | 4 +- src/mainwin.cc | 113 +++++++++++++++++++++++----------------------- 2 files changed, 58 insertions(+), 59 deletions(-) diff --git a/src/MainWindow.ui b/src/MainWindow.ui index 3f41882b..ae0d991d 100644 --- a/src/MainWindow.ui +++ b/src/MainWindow.ui @@ -108,7 +108,7 @@ - + @@ -132,7 +132,7 @@ animate_panel qglview - toolBar + viewerToolBar diff --git a/src/mainwin.cc b/src/mainwin.cc index b524db7a..83603198 100644 --- a/src/mainwin.cc +++ b/src/mainwin.cc @@ -436,63 +436,62 @@ MainWindow::MainWindow(const QString &filename) connect(this->replaceAllButton, SIGNAL(clicked()), this, SLOT(replaceAll())); connect(this->replaceInputField, SIGNAL(returnPressed()), this->replaceButton, SLOT(animateClick())); - addKeyboardShortCut(this->toolBar->actions()); + addKeyboardShortCut(this->viewerToolBar->actions()); addKeyboardShortCut(this->editortoolbar->actions()); //Toolbar - int defaultcolor = toolBar->palette().background().color().lightness(); + int defaultcolor = viewerToolBar->palette().background().color().lightness(); - if(defaultcolor > 165){ - fileActionNew->setIcon(QIcon("://images/blackNew.png")); - fileActionOpen->setIcon(QIcon("://images/Open-32.png")); - fileActionSave->setIcon(QIcon("://images/Save-32.png")); - editActionZoomIn->setIcon(QIcon("://images/zoomin.png")); - editActionZoomOut->setIcon(QIcon("://images/zoomout.png")); - designActionRender->setIcon(QIcon("://images/blackRender.png")); - viewActionShowAxes->setIcon(QIcon("://images/blackaxes.png")); - viewActionShowEdges->setIcon(QIcon("://images/Rotation-32.png")); - viewActionZoomIn->setIcon(QIcon("://images/zoomin.png")); - viewActionZoomOut->setIcon(QIcon("://images/zoomout.png")); - viewActionTop->setIcon(QIcon("://images/blackUp.png")); - viewActionBottom->setIcon(QIcon("://images/blackbottom.png")); - viewActionLeft->setIcon(QIcon("://images/blackleft (copy).png")); - viewActionRight->setIcon(QIcon("://images/rightright.png")); - viewActionFront->setIcon(QIcon("://images/blackfront.png")); - viewActionBack->setIcon(QIcon("://images/blackback.png")); - viewActionSurfaces->setIcon(QIcon("://images/surface.png")); - viewActionWireframe->setIcon(QIcon("://images/wireframe1.png")); - viewActionShowCrosshairs->setIcon(QIcon("://images/cross.png")); - viewActionPerspective->setIcon(QIcon("://images/perspective1.png")); - viewActionOrthogonal->setIcon(QIcon("://images/orthogonal.png")); - viewActionPreview->setIcon(QIcon("://images/Preview-32.png")); - viewActionAnimate->setIcon(QIcon("://images/animate.png")); - + if (defaultcolor > 165) { + fileActionNew->setIcon(QIcon("://images/blackNew.png")); + fileActionOpen->setIcon(QIcon("://images/Open-32.png")); + fileActionSave->setIcon(QIcon("://images/Save-32.png")); + editActionZoomIn->setIcon(QIcon("://images/zoomin.png")); + editActionZoomOut->setIcon(QIcon("://images/zoomout.png")); + designActionRender->setIcon(QIcon("://images/blackRender.png")); + viewActionShowAxes->setIcon(QIcon("://images/blackaxes.png")); + viewActionShowEdges->setIcon(QIcon("://images/Rotation-32.png")); + viewActionZoomIn->setIcon(QIcon("://images/zoomin.png")); + viewActionZoomOut->setIcon(QIcon("://images/zoomout.png")); + viewActionTop->setIcon(QIcon("://images/blackUp.png")); + viewActionBottom->setIcon(QIcon("://images/blackbottom.png")); + viewActionLeft->setIcon(QIcon("://images/blackleft (copy).png")); + viewActionRight->setIcon(QIcon("://images/rightright.png")); + viewActionFront->setIcon(QIcon("://images/blackfront.png")); + viewActionBack->setIcon(QIcon("://images/blackback.png")); + viewActionSurfaces->setIcon(QIcon("://images/surface.png")); + viewActionWireframe->setIcon(QIcon("://images/wireframe1.png")); + viewActionShowCrosshairs->setIcon(QIcon("://images/cross.png")); + viewActionPerspective->setIcon(QIcon("://images/perspective1.png")); + viewActionOrthogonal->setIcon(QIcon("://images/orthogonal.png")); + viewActionPreview->setIcon(QIcon("://images/Preview-32.png")); + viewActionAnimate->setIcon(QIcon("://images/animate.png")); } else { - fileActionNew->setIcon(QIcon("://images/Document-New-128.png")); - fileActionOpen->setIcon(QIcon("://images/Open-128.png")); - fileActionSave->setIcon(QIcon("://images/Save-128.png")); - editActionZoomIn->setIcon(QIcon("://images/Zoom-In-32.png")); - editActionZoomOut->setIcon(QIcon("://images/Zoom-Out-32.png")); - designActionRender->setIcon(QIcon("://images/Arrowhead-Right-32.png")); - viewActionZoomIn->setIcon(QIcon("://images/Zoom-In-32.png")); - viewActionZoomOut->setIcon(QIcon("://images/Zoom-Out-32.png")); - viewActionShowAxes->setIcon(QIcon("://images/axes.png")); - viewActionShowEdges->setIcon(QIcon("://images/grid.png")); - viewActionTop->setIcon(QIcon("://images/up.png")); - viewActionBottom->setIcon(QIcon("://images/bottom.png")); - viewActionLeft->setIcon(QIcon("://images/left.png")); - viewActionRight->setIcon(QIcon("://images/right.png")); - viewActionFront->setIcon(QIcon("://images/front.png")); - viewActionBack->setIcon(QIcon("://images/back.png")); - viewActionSurfaces->setIcon(QIcon("://images/surfaceWhite.png")); - viewActionWireframe->setIcon(QIcon("://images/wireframeWhite.png")); - viewActionShowCrosshairs->setIcon(QIcon("://images/crosswhite.png")); - viewActionPreview->setIcon(QIcon("://images/Preview-32(1).png")); - viewActionPerspective->setIcon(QIcon("://images/perspective1white.png")); - viewActionOrthogonal->setIcon(QIcon("://images/orthogonalwhite.png")); - viewActionAnimate->setIcon(QIcon("://images/animate.png")); - designActionExportSTL->setIcon(QIcon(":/images/export-white.png")); - viewActionViewAll->setIcon(QIcon(":/images/zoom-all-white.png")); + fileActionNew->setIcon(QIcon("://images/Document-New-128.png")); + fileActionOpen->setIcon(QIcon("://images/Open-128.png")); + fileActionSave->setIcon(QIcon("://images/Save-128.png")); + editActionZoomIn->setIcon(QIcon("://images/Zoom-In-32.png")); + editActionZoomOut->setIcon(QIcon("://images/Zoom-Out-32.png")); + designActionRender->setIcon(QIcon("://images/Arrowhead-Right-32.png")); + viewActionZoomIn->setIcon(QIcon("://images/Zoom-In-32.png")); + viewActionZoomOut->setIcon(QIcon("://images/Zoom-Out-32.png")); + viewActionShowAxes->setIcon(QIcon("://images/axes.png")); + viewActionShowEdges->setIcon(QIcon("://images/grid.png")); + viewActionTop->setIcon(QIcon("://images/up.png")); + viewActionBottom->setIcon(QIcon("://images/bottom.png")); + viewActionLeft->setIcon(QIcon("://images/left.png")); + viewActionRight->setIcon(QIcon("://images/right.png")); + viewActionFront->setIcon(QIcon("://images/front.png")); + viewActionBack->setIcon(QIcon("://images/back.png")); + viewActionSurfaces->setIcon(QIcon("://images/surfaceWhite.png")); + viewActionWireframe->setIcon(QIcon("://images/wireframeWhite.png")); + viewActionShowCrosshairs->setIcon(QIcon("://images/crosswhite.png")); + viewActionPreview->setIcon(QIcon("://images/Preview-32(1).png")); + viewActionPerspective->setIcon(QIcon("://images/perspective1white.png")); + viewActionOrthogonal->setIcon(QIcon("://images/orthogonalwhite.png")); + viewActionAnimate->setIcon(QIcon("://images/animate.png")); + designActionExportSTL->setIcon(QIcon(":/images/export-white.png")); + viewActionViewAll->setIcon(QIcon(":/images/zoom-all-white.png")); } // make sure it looks nice.. @@ -2242,12 +2241,12 @@ void MainWindow::setDockWidgetTitle(QDockWidget *dockWidget, QString prefix, boo void MainWindow::hideToolbar() { - if(toolBarActionHide->isChecked()){ - toolBar->hide(); - editortoolbar->hide(); + if (toolBarActionHide->isChecked()) { + viewerToolBar->hide(); + editortoolbar->hide(); } else { - toolBar->show(); - editortoolbar->show(); + viewerToolBar->show(); + editortoolbar->show(); } } From bc863129972e54e8d3609b7d08c48c2788779247 Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Tue, 30 Sep 2014 16:48:36 -0400 Subject: [PATCH 19/24] bugfix: Font list was connected to wrong slot --- src/mainwin.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mainwin.cc b/src/mainwin.cc index 83603198..5edca776 100644 --- a/src/mainwin.cc +++ b/src/mainwin.cc @@ -388,7 +388,7 @@ MainWindow::MainWindow(const QString &filename) connect(this->helpActionHomepage, SIGNAL(triggered()), this, SLOT(helpHomepage())); connect(this->helpActionManual, SIGNAL(triggered()), this, SLOT(helpManual())); connect(this->helpActionLibraryInfo, SIGNAL(triggered()), this, SLOT(helpLibrary())); - connect(this->helpActionFontInfo, SIGNAL(triggered()), this, SLOT(viewModeShowAxes())); + connect(this->helpActionFontInfo, SIGNAL(triggered()), this, SLOT(helpFontInfo())); setCurrentOutput(); From a8e9f63928ab1fd586528c8fccdfc37674059636 Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Tue, 30 Sep 2014 17:18:40 -0400 Subject: [PATCH 20/24] Improved some variable naming --- src/MainWindow.h | 6 +++--- src/MainWindow.ui | 12 ++++++------ src/mainwin.cc | 26 +++++++++++++------------- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/MainWindow.h b/src/MainWindow.h index d8a7f88a..c0a83d93 100644 --- a/src/MainWindow.h +++ b/src/MainWindow.h @@ -135,9 +135,10 @@ private slots: private slots: void pasteViewportTranslation(); void pasteViewportRotation(); - void hideEditor(); void preferences(); - void hideToolbar(); + void hideToolbars(); + void hideEditor(); + void hideConsole(); private slots: void selectFindType(int); @@ -210,7 +211,6 @@ public slots: void viewOrthogonal(); void viewResetView(); void viewAll(); - void hideConsole(); void animateUpdateDocChanged(); void animateUpdate(); void dragEnterEvent(QDragEnterEvent *event); diff --git a/src/MainWindow.ui b/src/MainWindow.ui index ae0d991d..a310cc1b 100644 --- a/src/MainWindow.ui +++ b/src/MainWindow.ui @@ -266,9 +266,9 @@ - - - + + + @@ -609,7 +609,7 @@ Ctrl+- - + true @@ -889,7 +889,7 @@ Orthogonal - + true @@ -1072,7 +1072,7 @@ View All - + true diff --git a/src/mainwin.cc b/src/mainwin.cc index 5edca776..a5f3ddd3 100644 --- a/src/mainwin.cc +++ b/src/mainwin.cc @@ -314,7 +314,6 @@ MainWindow::MainWindow(const QString &filename) connect(this->editActionPasteVPR, SIGNAL(triggered()), this, SLOT(pasteViewportRotation())); connect(this->editActionZoomIn, SIGNAL(triggered()), editor, SLOT(zoomIn())); connect(this->editActionZoomOut, SIGNAL(triggered()), editor, SLOT(zoomOut())); - connect(this->editActionHide, SIGNAL(triggered()), this, SLOT(hideEditor())); connect(this->editActionPreferences, SIGNAL(triggered()), this, SLOT(preferences())); // Edit->Find connect(this->editActionFind, SIGNAL(triggered()), this, SLOT(find())); @@ -378,10 +377,11 @@ MainWindow::MainWindow(const QString &filename) connect(this->viewActionViewAll, SIGNAL(triggered()), this, SLOT(viewAll())); connect(this->viewActionPerspective, SIGNAL(triggered()), this, SLOT(viewPerspective())); connect(this->viewActionOrthogonal, SIGNAL(triggered()), this, SLOT(viewOrthogonal())); - connect(this->toolBarActionHide, SIGNAL(triggered()), this, SLOT(hideToolbar())); - connect(this->viewActionHide, SIGNAL(triggered()), this, SLOT(hideConsole())); connect(this->viewActionZoomIn, SIGNAL(triggered()), qglview, SLOT(ZoomIn())); connect(this->viewActionZoomOut, SIGNAL(triggered()), qglview, SLOT(ZoomOut())); + connect(this->viewActionHideToolBars, SIGNAL(triggered()), this, SLOT(hideToolbars())); + connect(this->viewActionHideEditor, SIGNAL(triggered()), this, SLOT(hideEditor())); + connect(this->viewActionHideConsole, SIGNAL(triggered()), this, SLOT(hideConsole())); // Help menu connect(this->helpActionAbout, SIGNAL(triggered()), this, SLOT(helpAbout())); @@ -573,12 +573,12 @@ void MainWindow::loadViewSettings(){ } else { viewPerspective(); } - viewActionHide->setChecked(settings.value("view/hideConsole").toBool()); + viewActionHideConsole->setChecked(settings.value("view/hideConsole").toBool()); hideConsole(); - editActionHide->setChecked(settings.value("view/hideEditor").toBool()); + viewActionHideEditor->setChecked(settings.value("view/hideEditor").toBool()); hideEditor(); - toolBarActionHide->setChecked(settings.value("view/hideToolbar").toBool()); - hideToolbar(); + viewActionHideToolBars->setChecked(settings.value("view/hideToolbar").toBool()); + hideToolbars(); updateMdiMode(settings.value("advanced/mdi").toBool()); updateUndockMode(settings.value("advanced/undockableWindows").toBool()); } @@ -2204,7 +2204,7 @@ void MainWindow::on_editorDock_visibilityChanged(bool visible) } QSettings settings; settings.setValue("view/hideEditor", !visible); - editActionHide->setChecked(!visible); + viewActionHideEditor->setChecked(!visible); editorTopLevelChanged(editorDock->isFloating()); } @@ -2215,7 +2215,7 @@ void MainWindow::on_consoleDock_visibilityChanged(bool visible) } QSettings settings; settings.setValue("view/hideConsole", !visible); - viewActionHide->setChecked(!visible); + viewActionHideConsole->setChecked(!visible); consoleTopLevelChanged(consoleDock->isFloating()); } @@ -2239,9 +2239,9 @@ void MainWindow::setDockWidgetTitle(QDockWidget *dockWidget, QString prefix, boo dockWidget->setWindowTitle(title); } -void MainWindow::hideToolbar() +void MainWindow::hideToolbars() { - if (toolBarActionHide->isChecked()) { + if (viewActionHideToolBars->isChecked()) { viewerToolBar->hide(); editortoolbar->hide(); } else { @@ -2252,7 +2252,7 @@ void MainWindow::hideToolbar() void MainWindow::hideEditor() { - if (editActionHide->isChecked()) { + if (viewActionHideEditor->isChecked()) { editorDock->close(); } else { editorDock->show(); @@ -2262,7 +2262,7 @@ void MainWindow::hideEditor() void MainWindow::hideConsole() { - if (viewActionHide->isChecked()) { + if (viewActionHideConsole->isChecked()) { consoleDock->hide(); } else { consoleDock->show(); From 7343290ffc5f800cea77f3fa3b928f5128a7758a Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Tue, 30 Sep 2014 17:25:01 -0400 Subject: [PATCH 21/24] Removed empty toolbar subtypes --- openscad.pro | 4 ---- src/MainWindow.ui | 16 ++-------------- src/editortoolbar.cpp | 5 ----- src/editortoolbar.h | 19 ------------------- src/toolbar.cpp | 6 ------ src/toolbar.h | 19 ------------------- 6 files changed, 2 insertions(+), 67 deletions(-) delete mode 100644 src/editortoolbar.cpp delete mode 100644 src/editortoolbar.h delete mode 100644 src/toolbar.cpp delete mode 100644 src/toolbar.h diff --git a/openscad.pro b/openscad.pro index 6260c2b4..c087d1ca 100644 --- a/openscad.pro +++ b/openscad.pro @@ -310,8 +310,6 @@ src/FontCache.h \ src/AutoUpdater.h \ src/launchingscreen.h \ src/legacyeditor.h \ - src/toolbar.h \ - src/editortoolbar.h \ src/LibraryInfoDialog.h SOURCES += src/version_check.cc \ @@ -402,8 +400,6 @@ SOURCES += src/version_check.cc \ src/FontListDialog.cc \ src/launchingscreen.cpp \ src/legacyeditor.cc \ - src/toolbar.cpp \ - src/editortoolbar.cpp \ src/LibraryInfoDialog.cc # ClipperLib diff --git a/src/MainWindow.ui b/src/MainWindow.ui index a310cc1b..a31e89cb 100644 --- a/src/MainWindow.ui +++ b/src/MainWindow.ui @@ -108,7 +108,7 @@ - + @@ -301,7 +301,7 @@ 0 - + @@ -1088,18 +1088,6 @@
QGLView.h
1 - - ToolBar - QToolBar -
toolbar.h
- 1 -
- - EditorToolBar - QToolBar -
editortoolbar.h
- 1 -
diff --git a/src/editortoolbar.cpp b/src/editortoolbar.cpp deleted file mode 100644 index 0bdd22fc..00000000 --- a/src/editortoolbar.cpp +++ /dev/null @@ -1,5 +0,0 @@ -#include "editortoolbar.h" - -EditorToolBar::EditorToolBar(QWidget *parent) : - QToolBar(parent) -{ } diff --git a/src/editortoolbar.h b/src/editortoolbar.h deleted file mode 100644 index 7568a415..00000000 --- a/src/editortoolbar.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef EDITORTOOLBAR_H -#define EDITORTOOLBAR_H - -#include -#include - -class EditorToolBar : public QToolBar -{ - Q_OBJECT -public: - explicit EditorToolBar(QWidget *parent = 0); - -signals: - -public slots: - -}; - -#endif // EDITORTOOLBAR_H diff --git a/src/toolbar.cpp b/src/toolbar.cpp deleted file mode 100644 index dddb6f82..00000000 --- a/src/toolbar.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "toolbar.h" - -ToolBar::ToolBar(QWidget *parent) : - QToolBar(parent) -{ -} diff --git a/src/toolbar.h b/src/toolbar.h deleted file mode 100644 index bc0cef26..00000000 --- a/src/toolbar.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef TOOLBAR_H -#define TOOLBAR_H - -#include -#include -#include -class ToolBar : public QToolBar -{ - Q_OBJECT -public: - explicit ToolBar(QWidget *parent = 0); - -signals: - -public slots: - -}; - -#endif // TOOLBAR_H From 1121c96a11c418f384467fdc2ca305718c546122 Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Tue, 30 Sep 2014 19:38:43 -0400 Subject: [PATCH 22/24] #964 Added testcases --- testdata/scad/bugs/issue964.scad | 16 ++++++++++++++++ testdata/scad/bugs/issue964b.scad | 1 + .../cgalpngtest/issue964-expected.png | Bin 0 -> 7546 bytes .../cgalpngtest/issue964b-expected.png | Bin 0 -> 8655 bytes .../monotonepngtest/issue964-expected.png | Bin 0 -> 7546 bytes .../opencsgtest/issue964-expected.png | Bin 0 -> 7805 bytes .../opencsgtest/issue964b-expected.png | Bin 0 -> 9065 bytes 7 files changed, 17 insertions(+) create mode 100644 testdata/scad/bugs/issue964.scad create mode 100644 testdata/scad/bugs/issue964b.scad create mode 100644 tests/regression/cgalpngtest/issue964-expected.png create mode 100644 tests/regression/cgalpngtest/issue964b-expected.png create mode 100644 tests/regression/monotonepngtest/issue964-expected.png create mode 100644 tests/regression/opencsgtest/issue964-expected.png create mode 100644 tests/regression/opencsgtest/issue964b-expected.png diff --git a/testdata/scad/bugs/issue964.scad b/testdata/scad/bugs/issue964.scad new file mode 100644 index 00000000..104309ba --- /dev/null +++ b/testdata/scad/bugs/issue964.scad @@ -0,0 +1,16 @@ +polyhedron(points=[ +[0,0,0], +[10,0,0], +[10,10,0], +[0,10,0], +[0,-20,20], +[10,-20,20], +[10,-20,30], +[0,-20,30] +], +faces = [[0,1,2,3],[4,5,6,7], +[1,2,5,4], +[2,3,6,5], +[3,0,6,5], +[0,1,4,7] +]); \ No newline at end of file diff --git a/testdata/scad/bugs/issue964b.scad b/testdata/scad/bugs/issue964b.scad new file mode 100644 index 00000000..c4202f95 --- /dev/null +++ b/testdata/scad/bugs/issue964b.scad @@ -0,0 +1 @@ +polyhedron(points = [[8.4991, -4.98973, 62.7876], [-0.423767, 0.0568668, 64.4948], [-0.505246, -10.1774, 62.6914], [9.17023, -6.28686, 70.9731], [0.213931, -1.18909, 69.6324], [0.168244, -11.4782, 71.0926], [6.96718, -1.88303, 76.9407], [0.507199, -1.73168, 68.8016], [-2.19023, -6.7664, 77.4835], [3.05033, 5.76153, 77.3746], [-2.1412, 3.4281, 68.6796], [-6.17499, 1.01119, 77.9472]], faces = [[0, 3, 4, 1], [1, 4, 5, 2], [2, 5, 3, 0], [3, 6, 7, 4], [4, 7, 8, 5], [5, 8, 6, 3], [6, 9, 10, 7], [7, 10, 11, 8], [8, 11, 9, 6], [2, 1, 0], [9, 10, 11]]); diff --git a/tests/regression/cgalpngtest/issue964-expected.png b/tests/regression/cgalpngtest/issue964-expected.png new file mode 100644 index 0000000000000000000000000000000000000000..56ee2112ca07927200a4d3afc49ae2aaa4d1941d GIT binary patch literal 7546 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 literal 0 HcmV?d00001 diff --git a/tests/regression/cgalpngtest/issue964b-expected.png b/tests/regression/cgalpngtest/issue964b-expected.png new file mode 100644 index 0000000000000000000000000000000000000000..1f87b43b6a982fea912203382c3fa290cf066e1b GIT binary patch literal 8655 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 literal 0 HcmV?d00001 diff --git a/tests/regression/opencsgtest/issue964-expected.png b/tests/regression/opencsgtest/issue964-expected.png new file mode 100644 index 0000000000000000000000000000000000000000..f33cb45574a47111190b522e71146e117689110f GIT binary patch literal 7805 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 literal 0 HcmV?d00001 diff --git a/tests/regression/opencsgtest/issue964b-expected.png b/tests/regression/opencsgtest/issue964b-expected.png new file mode 100644 index 0000000000000000000000000000000000000000..c611ecf26df46dd2dc0149101fcf35a847cd1a5c GIT binary patch literal 9065 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 cAwdc$1|r5&(bwkwK?A^Mi)|aTH*g~V57 Date: Wed, 1 Oct 2014 00:43:34 -0400 Subject: [PATCH 23/24] #964 Catch precondition exception for malformed (self-intersecting) polygons to avoid a crash --- src/polyset-utils.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/polyset-utils.cc b/src/polyset-utils.cc index bf2e881c..215c3c32 100644 --- a/src/polyset-utils.cc +++ b/src/polyset-utils.cc @@ -199,7 +199,9 @@ namespace PolysetUtils { triangles.push_back( pgon ); } } - } catch (const CGAL::Assertion_exception &e) { + } catch (const CGAL::Failure_exception &e) { + // Using failure exception to catch precondition errors for malformed polygons + // in e.g. CGAL::orientation_2(). PRINTB("CGAL error in triangulate_polygon(): %s", e.what()); err = true; } From 253b57f7471248365cbfbb475a6b322f40f7954c Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Thu, 2 Oct 2014 01:38:05 -0400 Subject: [PATCH 24/24] #964 Implemented a more robust polygon triangulator which will now handle intersecting edges properly. Should output more sane corner-case meshes, although they're not perfectly manifold --- src/polyset-utils-old.cc | 248 +++++++++++++++++++++++++++++++++++++++ src/polyset-utils.cc | 222 ++++++++--------------------------- 2 files changed, 295 insertions(+), 175 deletions(-) create mode 100644 src/polyset-utils-old.cc diff --git a/src/polyset-utils-old.cc b/src/polyset-utils-old.cc new file mode 100644 index 00000000..d6f206f9 --- /dev/null +++ b/src/polyset-utils-old.cc @@ -0,0 +1,248 @@ +#include "polyset-utils.h" +#include "polyset.h" +#include "Polygon2d.h" +#include "printutils.h" +#include "cgal.h" + +#ifdef NDEBUG +#define PREV_NDEBUG NDEBUG +#undef NDEBUG +#endif +#include +#include +#include +#include +#include +#include +#include +#ifdef PREV_NDEBUG +#define NDEBUG PREV_NDEBUG +#endif + +typedef CGAL::Exact_predicates_inexact_constructions_kernel K; +typedef CGAL::Triangulation_vertex_base_2 Vb; +typedef CGAL::Delaunay_mesh_face_base_2 Fb; +typedef CGAL::Triangulation_data_structure_2 Tds; +typedef CGAL::Constrained_Delaunay_triangulation_2 CDT; +//typedef CGAL::Delaunay_mesh_criteria_2 Criteria; + +typedef CDT::Vertex_handle Vertex_handle; +typedef CDT::Point CDTPoint; + +template class DummyCriteria { +public: + typedef double Quality; + class Is_bad { + public: + CGAL::Mesh_2::Face_badness operator()(const Quality) const { + return CGAL::Mesh_2::NOT_BAD; + } + CGAL::Mesh_2::Face_badness operator()(const typename T::Face_handle&, Quality&q) const { + q = 1; + return CGAL::Mesh_2::NOT_BAD; + } + }; + Is_bad is_bad_object() const { return Is_bad(); } +}; + +#include + +namespace PolysetUtils { + + // Project all polygons (also back-facing) into a Polygon2d instance. + // It's important to select all faces, since filtering by normal vector here + // will trigger floating point incertainties and cause problems later. + Polygon2d *project(const PolySet &ps) { + Polygon2d *poly = new Polygon2d; + + BOOST_FOREACH(const PolySet::Polygon &p, ps.polygons) { + Outline2d outline; + BOOST_FOREACH(const Vector3d &v, p) { + outline.vertices.push_back(Vector2d(v[0], v[1])); + } + poly->addOutline(outline); + } + return poly; + } + +/* Tessellation of 3d PolySet faces + + This code is for tessellating the faces of a 3d PolySet, assuming that + the faces are near-planar polygons. + + We do the tessellation by projecting each polygon of the Polyset onto a + 2-d plane, then running a 2d tessellation algorithm on the projected 2d + polygon. Then we project each of the newly generated 2d 'tiles' (the + polygons used for tessellation, typically triangles) back up into 3d + space. + + (in reality as of writing, we dont need to do a back-projection from 2d->3d + because the algorithm we are using doesn't create any new points, and we can + just use a 'map' to associate 3d points with 2d points). + + The code assumes the input polygons are simple, non-intersecting, without + holes, without duplicate input points, and with proper orientation. + + The purpose of this code is originally to fix github issue 349. Our CGAL + kernel does not accept polygons for Nef_Polyhedron_3 if each of the + points is not exactly coplanar. "Near-planar" or "Almost planar" polygons + often occur due to rounding issues on, for example, polyhedron() input. + By tessellating the 3d polygon into individual smaller tiles that + are perfectly coplanar (triangles, for example), we can get CGAL to accept + the polyhedron() input. +*/ + + typedef enum { XYPLANE, YZPLANE, XZPLANE, NONE } projection_t; + +// this is how we make 3d points appear as though they were 2d points to +//the tessellation algorithm. + Vector2d get_projected_point( Vector3d v, projection_t projection ) { + Vector2d v2(0,0); + if (projection==XYPLANE) { v2.x() = v.x(); v2.y() = v.y(); } + else if (projection==XZPLANE) { v2.x() = v.x(); v2.y() = v.z(); } + else if (projection==YZPLANE) { v2.x() = v.y(); v2.y() = v.z(); } + return v2; + } + + CGAL_Point_3 cgp( Vector3d v ) { return CGAL_Point_3( v.x(), v.y(), v.z() ); } + +/* Find a 'good' 2d projection for a given 3d polygon. the XY, YZ, or XZ + plane. This is needed because near-planar polygons in 3d can have 'bad' + projections into 2d. For example if the square 0,0,0 0,1,0 0,1,1 0,0,1 + is projected onto the XY plane you will not get a polygon, you wil get + a skinny line thing. It's better to project that square onto the yz + plane.*/ + projection_t find_good_projection( PolySet::Polygon pgon ) { + // step 1 - find 3 non-collinear points in the input + if (pgon.size()<3) return NONE; + Vector3d v1,v2,v3; + v1 = v2 = v3 = pgon[0]; + for (size_t i=0;i pl( cgp(v1), cgp(v2), cgp(v3) ); + NT3 qxy = pl.a()*pl.a()+pl.b()*pl.b(); + NT3 qyz = pl.b()*pl.b()+pl.c()*pl.c(); + NT3 qxz = pl.c()*pl.c()+pl.a()*pl.a(); + NT3 min = std::min(qxy,std::min(qyz,qxz)); + if (min==qxy) return XYPLANE; + else if (min==qyz) return YZPLANE; + return XZPLANE; + } + +/* triangulate the given 3d polygon using CGAL's 2d Constrained Delaunay + algorithm. Project the polygon's points into 2d using the given projection + before performing the triangulation. This code assumes input polygon is + simple, no holes, no self-intersections, no duplicate points, and is + properly oriented. output is a sequence of 3d triangles. */ + bool triangulate_polygon( const PolySet::Polygon &pgon, std::vector &triangles, projection_t projection ) + { + bool err = false; + CGAL::Failure_behaviour old_behaviour = CGAL::set_error_behaviour(CGAL::THROW_EXCEPTION); + try { + CDT cdt; + std::vector vhandles; + std::map vertmap; + CGAL::Orientation original_orientation; + std::vector orienpgon; + for (size_t i = 0; i < pgon.size(); i++) { + Vector3d v3 = pgon.at(i); + Vector2d v2 = get_projected_point( v3, projection ); + CDTPoint cdtpoint = CDTPoint(v2.x(),v2.y()); + vertmap[ cdtpoint ] = v3; + Vertex_handle vh = cdt.insert( cdtpoint ); + vhandles.push_back(vh); + orienpgon.push_back( cdtpoint ); + } + original_orientation = CGAL::orientation_2( orienpgon.begin(),orienpgon.end() ); + for (size_t i = 0; i < vhandles.size(); i++ ) { + int vindex1 = (i+0); + int vindex2 = (i+1)%vhandles.size(); + cdt.insert_constraint( vhandles[vindex1], vhandles[vindex2] ); + } + std::list list_of_seeds; + CGAL::refine_Delaunay_mesh_2_without_edge_refinement(cdt, + list_of_seeds.begin(), list_of_seeds.end(), DummyCriteria()); + + CDT::Finite_faces_iterator fit; + for( fit=cdt.finite_faces_begin(); fit!=cdt.finite_faces_end(); fit++ ) + { + if(fit->is_in_domain()) { + CDTPoint p1 = cdt.triangle( fit )[0]; + CDTPoint p2 = cdt.triangle( fit )[1]; + CDTPoint p3 = cdt.triangle( fit )[2]; + Vector3d v1 = vertmap[p1]; + Vector3d v2 = vertmap[p2]; + Vector3d v3 = vertmap[p3]; + PolySet::Polygon pgon; + if (CGAL::orientation(p1,p2,p3)==original_orientation) { + pgon.push_back(v1); + pgon.push_back(v2); + pgon.push_back(v3); + } else { + pgon.push_back(v3); + pgon.push_back(v2); + pgon.push_back(v1); + } + triangles.push_back( pgon ); + } + } + } catch (const CGAL::Failure_exception &e) { + // Using failure exception to catch precondition errors for malformed polygons + // in e.g. CGAL::orientation_2(). + PRINTB("CGAL error in triangulate_polygon(): %s", e.what()); + err = true; + } + CGAL::set_error_behaviour(old_behaviour); + return err; + } + +/* Given a 3d PolySet with 'near planar' polygonal faces, Tessellate the + faces. As of writing, our only tessellation method is Triangulation + using CGAL's Constrained Delaunay algorithm. This code assumes the input + polyset has simple polygon faces with no holes, no self intersections, no + duplicate points, and proper orientation. */ + void tessellate_faces(const PolySet &inps, PolySet &outps) { + int degeneratePolygons = 0; + for (size_t i = 0; i < inps.polygons.size(); i++) { + const PolySet::Polygon pgon = inps.polygons[i]; + if (pgon.size() < 3) { + degeneratePolygons++; + continue; + } + std::vector triangles; + if (pgon.size() == 3) { + triangles.push_back(pgon); + } + else { + projection_t goodproj = find_good_projection( pgon ); + if (goodproj==NONE) { + degeneratePolygons++; + continue; + } + bool err = triangulate_polygon(pgon, triangles, goodproj); + if (err) continue; + } + for (size_t j=0;j 0) PRINT("WARNING: PolySet has degenerate polygons"); + } +} diff --git a/src/polyset-utils.cc b/src/polyset-utils.cc index 215c3c32..5188ae11 100644 --- a/src/polyset-utils.cc +++ b/src/polyset-utils.cc @@ -10,40 +10,17 @@ #endif #include #include -#include -#include -#include -#include -#include +#include #ifdef PREV_NDEBUG #define NDEBUG PREV_NDEBUG #endif typedef CGAL::Exact_predicates_inexact_constructions_kernel K; -typedef CGAL::Triangulation_vertex_base_2 Vb; -typedef CGAL::Delaunay_mesh_face_base_2 Fb; -typedef CGAL::Triangulation_data_structure_2 Tds; -typedef CGAL::Constrained_Delaunay_triangulation_2 CDT; -//typedef CGAL::Delaunay_mesh_criteria_2 Criteria; - -typedef CDT::Vertex_handle Vertex_handle; -typedef CDT::Point CDTPoint; - -template class DummyCriteria { -public: - typedef double Quality; - class Is_bad { - public: - CGAL::Mesh_2::Face_badness operator()(const Quality) const { - return CGAL::Mesh_2::NOT_BAD; - } - CGAL::Mesh_2::Face_badness operator()(const typename T::Face_handle&, Quality&q) const { - q = 1; - return CGAL::Mesh_2::NOT_BAD; - } - }; - Is_bad is_bad_object() const { return Is_bad(); } -}; +typedef CGAL::Triangulation_2_filtered_projection_traits_3 Projection; +typedef CGAL::Triangulation_data_structure_2 < + CGAL::Triangulation_vertex_base_2, + CGAL::Constrained_triangulation_face_base_2 > Tds; +typedef CGAL::Constrained_Delaunay_triangulation_2 CDT; #include @@ -70,19 +47,6 @@ namespace PolysetUtils { This code is for tessellating the faces of a 3d PolySet, assuming that the faces are near-planar polygons. - We do the tessellation by projecting each polygon of the Polyset onto a - 2-d plane, then running a 2d tessellation algorithm on the projected 2d - polygon. Then we project each of the newly generated 2d 'tiles' (the - polygons used for tessellation, typically triangles) back up into 3d - space. - - (in reality as of writing, we dont need to do a back-projection from 2d->3d - because the algorithm we are using doesn't create any new points, and we can - just use a 'map' to associate 3d points with 2d points). - - The code assumes the input polygons are simple, non-intersecting, without - holes, without duplicate input points, and with proper orientation. - The purpose of this code is originally to fix github issue 349. Our CGAL kernel does not accept polygons for Nef_Polyhedron_3 if each of the points is not exactly coplanar. "Near-planar" or "Almost planar" polygons @@ -92,128 +56,12 @@ namespace PolysetUtils { the polyhedron() input. */ - typedef enum { XYPLANE, YZPLANE, XZPLANE, NONE } projection_t; - -// this is how we make 3d points appear as though they were 2d points to -//the tessellation algorithm. - Vector2d get_projected_point( Vector3d v, projection_t projection ) { - Vector2d v2(0,0); - if (projection==XYPLANE) { v2.x() = v.x(); v2.y() = v.y(); } - else if (projection==XZPLANE) { v2.x() = v.x(); v2.y() = v.z(); } - else if (projection==YZPLANE) { v2.x() = v.y(); v2.y() = v.z(); } - return v2; - } - - CGAL_Point_3 cgp( Vector3d v ) { return CGAL_Point_3( v.x(), v.y(), v.z() ); } - -/* Find a 'good' 2d projection for a given 3d polygon. the XY, YZ, or XZ - plane. This is needed because near-planar polygons in 3d can have 'bad' - projections into 2d. For example if the square 0,0,0 0,1,0 0,1,1 0,0,1 - is projected onto the XY plane you will not get a polygon, you wil get - a skinny line thing. It's better to project that square onto the yz - plane.*/ - projection_t find_good_projection( PolySet::Polygon pgon ) { - // step 1 - find 3 non-collinear points in the input - if (pgon.size()<3) return NONE; - Vector3d v1,v2,v3; - v1 = v2 = v3 = pgon[0]; - for (size_t i=0;i pl( cgp(v1), cgp(v2), cgp(v3) ); - NT3 qxy = pl.a()*pl.a()+pl.b()*pl.b(); - NT3 qyz = pl.b()*pl.b()+pl.c()*pl.c(); - NT3 qxz = pl.c()*pl.c()+pl.a()*pl.a(); - NT3 min = std::min(qxy,std::min(qyz,qxz)); - if (min==qxy) return XYPLANE; - else if (min==qyz) return YZPLANE; - return XZPLANE; - } - -/* triangulate the given 3d polygon using CGAL's 2d Constrained Delaunay - algorithm. Project the polygon's points into 2d using the given projection - before performing the triangulation. This code assumes input polygon is - simple, no holes, no self-intersections, no duplicate points, and is - properly oriented. output is a sequence of 3d triangles. */ - bool triangulate_polygon( const PolySet::Polygon &pgon, std::vector &triangles, projection_t projection ) - { - bool err = false; - CGAL::Failure_behaviour old_behaviour = CGAL::set_error_behaviour(CGAL::THROW_EXCEPTION); - try { - CDT cdt; - std::vector vhandles; - std::map vertmap; - CGAL::Orientation original_orientation; - std::vector orienpgon; - for (size_t i = 0; i < pgon.size(); i++) { - Vector3d v3 = pgon.at(i); - Vector2d v2 = get_projected_point( v3, projection ); - CDTPoint cdtpoint = CDTPoint(v2.x(),v2.y()); - vertmap[ cdtpoint ] = v3; - Vertex_handle vh = cdt.insert( cdtpoint ); - vhandles.push_back(vh); - orienpgon.push_back( cdtpoint ); - } - original_orientation = CGAL::orientation_2( orienpgon.begin(),orienpgon.end() ); - for (size_t i = 0; i < vhandles.size(); i++ ) { - int vindex1 = (i+0); - int vindex2 = (i+1)%vhandles.size(); - cdt.insert_constraint( vhandles[vindex1], vhandles[vindex2] ); - } - std::list list_of_seeds; - CGAL::refine_Delaunay_mesh_2_without_edge_refinement(cdt, - list_of_seeds.begin(), list_of_seeds.end(), DummyCriteria()); - - CDT::Finite_faces_iterator fit; - for( fit=cdt.finite_faces_begin(); fit!=cdt.finite_faces_end(); fit++ ) - { - if(fit->is_in_domain()) { - CDTPoint p1 = cdt.triangle( fit )[0]; - CDTPoint p2 = cdt.triangle( fit )[1]; - CDTPoint p3 = cdt.triangle( fit )[2]; - Vector3d v1 = vertmap[p1]; - Vector3d v2 = vertmap[p2]; - Vector3d v3 = vertmap[p3]; - PolySet::Polygon pgon; - if (CGAL::orientation(p1,p2,p3)==original_orientation) { - pgon.push_back(v1); - pgon.push_back(v2); - pgon.push_back(v3); - } else { - pgon.push_back(v3); - pgon.push_back(v2); - pgon.push_back(v1); - } - triangles.push_back( pgon ); - } - } - } catch (const CGAL::Failure_exception &e) { - // Using failure exception to catch precondition errors for malformed polygons - // in e.g. CGAL::orientation_2(). - PRINTB("CGAL error in triangulate_polygon(): %s", e.what()); - err = true; - } - CGAL::set_error_behaviour(old_behaviour); - return err; - } - -/* Given a 3d PolySet with 'near planar' polygonal faces, Tessellate the - faces. As of writing, our only tessellation method is Triangulation +/* Given a 3D PolySet with near planar polygonal faces, tessellate the + faces. As of writing, our only tessellation method is triangulation using CGAL's Constrained Delaunay algorithm. This code assumes the input - polyset has simple polygon faces with no holes, no self intersections, no - duplicate points, and proper orientation. */ + polyset has simple polygon faces with no holes. + The tessellation will be robust wrt. degenerate and self-intersecting +*/ void tessellate_faces(const PolySet &inps, PolySet &outps) { int degeneratePolygons = 0; for (size_t i = 0; i < inps.polygons.size(); i++) { @@ -227,23 +75,47 @@ namespace PolysetUtils { triangles.push_back(pgon); } else { - projection_t goodproj = find_good_projection( pgon ); - if (goodproj==NONE) { - degeneratePolygons++; - continue; + // Build a data structure that CGAL accepts + std::vector cgalpoints; + BOOST_FOREACH(const Vector3d &v, pgon) { + cgalpoints.push_back(K::Point_3(v[0], v[1], v[2])); + } + // Calculate best guess at face normal using Newell's method + K::Vector_3 normal; + CGAL::normal_vector_newell_3(cgalpoints.begin(), cgalpoints.end(), normal); + + // Pass the normal vector to the (undocumented) + // CGAL::Triangulation_2_filtered_projection_traits_3. This + // trait deals with projection from 3D to 2D using the normal + // vector as a hint, and allows for near-planar polygons to be passed to + // the Constrained Delaunay Triangulator. + Projection actualProjection(normal); + CDT cdt(actualProjection); + for (size_t i=0;i 0) PRINT("WARNING: PolySet has degenerate polygons"); } } -