From 9667e5a176c43989f2ad3c9e34e2d10fcdf8a2d0 Mon Sep 17 00:00:00 2001 From: falkTX Date: Fri, 29 Mar 2013 05:40:49 +0000 Subject: [PATCH] Add Canvas menu; set-up some keyboard shortcuts --- resources/16x16/document-print.png | Bin 0 -> 566 bytes resources/16x16/media-playback-pause.png | Bin 0 -> 484 bytes resources/16x16/media-seek-backward.png | Bin 0 -> 505 bytes resources/16x16/media-seek-forward.png | Bin 0 -> 506 bytes resources/16x16/view-sort-ascending.png | Bin 0 -> 609 bytes resources/16x16/zoom-fit-best.png | Bin 0 -> 454 bytes resources/16x16/zoom-in.png | Bin 0 -> 791 bytes resources/16x16/zoom-original.png | Bin 0 -> 781 bytes resources/16x16/zoom-out.png | Bin 0 -> 786 bytes resources/resources.qrc | 9 ++ resources/ui/carla.ui | 148 ++++++++++++++++++++++- source/carla.py | 72 +++++++++++ 12 files changed, 228 insertions(+), 1 deletion(-) create mode 100644 resources/16x16/document-print.png create mode 100644 resources/16x16/media-playback-pause.png create mode 100644 resources/16x16/media-seek-backward.png create mode 100644 resources/16x16/media-seek-forward.png create mode 100644 resources/16x16/view-sort-ascending.png create mode 100644 resources/16x16/zoom-fit-best.png create mode 100644 resources/16x16/zoom-in.png create mode 100644 resources/16x16/zoom-original.png create mode 100644 resources/16x16/zoom-out.png diff --git a/resources/16x16/document-print.png b/resources/16x16/document-print.png new file mode 100644 index 0000000000000000000000000000000000000000..5977b3dba72d9c062f36c53af5a47f519f653868 GIT binary patch literal 566 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GXl47&!ubLR|m<{|^*_gN}|4I2*_S zawkrlxO(;KRjXD3*;}@3S+Zowx^?TeZ{H5&u3Wj2ot>SNlhe=7FFZUvGBPqMDk?fU zIw2t;DJdx>B_%B_D=)9Gq@<+0yu7lqvZ|`8y}cb`=H$tfr%s(ZbLPxBbLPyOw-9LT z%9X3vtXZ>m?dJ9C*KgXiaoe^%KwI|gIkn(W2M!!Kc<|uSqeoAjI(7Q= z`7>wET)uq$+O?ZEZrr|e=l;EW5ANN2`0(MAMwE%KaKh8YF{I*F?75p#jR6v^5AW*~cTTYM5;U58=5xTLhyUImsoOHQ z;{3JpEewS_4AgJbJiHKoqnr6-)$NY>9sgT@oUB>!)8KJK#gADVZoD-AyzD*8&S#Ac z3gPUVpH}UTJNILrOv{SIDG_FKy_QC9%aI6NptJgj!Oa-G(*~)h7d2elGHuZn*Ny8m zbbS{$+Pqu-D#b>oPyJQN`bh$_y-%`Cn_^|y@!_Y>!n<$#f89+|JMYf$P-^wzpG9^i pmK#FNzN=UL+7nh#@Y~Q_O1`^8h3zsIgDNPxJzf1=);T3K0RTr+DVYEO literal 0 HcmV?d00001 diff --git a/resources/16x16/media-playback-pause.png b/resources/16x16/media-playback-pause.png new file mode 100644 index 0000000000000000000000000000000000000000..a9b3113fb0b3067163f8186bc42d66151b6f7b73 GIT binary patch literal 484 zcmVMzCV_|S* zE^l&Yo9;Xs0004FNklB9I38p(Iz6IO^dEMQjt>}>^t3llMXiwcw)!{H|)}++uwH(K|-~|IrqGh@yQpO zH=a3ThfpD++=dBxU5K?1eFDKBVp?BowuED$I} zkR>PRm)K&!hzw1}kQOC^{*qJ33LIZ~rbLxp_E@EaXM7bn6PpN9cKz5(7SqMlOZ>Pz a(ftDwiElIZXxcXb0000MzCV_|S* zE^l&Yo9;Xs0004aNklEaX+%P?;$Kvd*GRS1 z5<{t*egGFi(7{b1K|~#NbC7~MNO5tA6{SSs4Kd|s2|+IRaJd`~_nsq2tFG5v*K-0V zaJ`ya*GcyYI9gSfRgrZZoGunAtEzOglu*&i{u&!x(%^+APu;1+8fCwtB?Mcpu+Jm! zwE5#QoNi)D9)8$MBVxMLFlpO}yaGc50j zd2fLSLSpVIF$-K`01+*gnD;~>uxZfdiY+WgxhBsL5Yz5%3W3N6MV<*cV}b#CIcJ0( zphL(u`9N4+AyJ4qWspALnEq5@4$BjkYj8n}2smUIfFmHHiGj5vru3XzbJ z!X~Gtbb&DC7`wa?5)uFVaKIR*Oq`t5Oh3aC4O+AbyWONn2GgI^(y&a;kXe->Pl-*Y v$&gisG}Exs%ISui^~QtoAnO@!?mzB76^d>}5T;jt00000NkvXXu0mjf(OJw5 literal 0 HcmV?d00001 diff --git a/resources/16x16/media-seek-forward.png b/resources/16x16/media-seek-forward.png new file mode 100644 index 0000000000000000000000000000000000000000..6c3b1c45643c612bae09a60e0b42fd2cb7382371 GIT binary patch literal 506 zcmVMzCV_|S* zE^l&Yo9;Xs0004bNkleeL)p+oS72=)Ow#GpKcc=57~V!VQPSa1CL{Xz&K4$Axee%c%LM*VcZ ze^3@eh!CPz+D*E7+oqnLO>NzLH|dpx2(ex24mLb-V(7bb-<;U8p*z?vi4dJ+%}ZbX zF!sk^nV&Aau%?rUNXqMZ$C=-9|4f}KOk^%?TF;YmwED|F`6c%m?D&X6W@uS!FILh= zzQ_~~oucKQcbK@cY9)=OQOD3&p{4HFeYeawQW)E@G>XMh+nLPNjBDPSaotVtO=X^0 z97Qu-GBj4W;}Eyq@Ct>ohni_L`!&a|OdNr`UW18qHO;+PDA)7HE@TSu0TePF^?acm zqLIvc?owu=FjbhyyfLehh!FFo#-L)=(3P>w*txcf#$diALWoAGmQ?eKMO&VFprV@B wl15305JHH0xz?|ybECOYHLdmQWg&$452k)?+rkR07XSbN07*qoM6N<$g3ib1wEzGB literal 0 HcmV?d00001 diff --git a/resources/16x16/view-sort-ascending.png b/resources/16x16/view-sort-ascending.png new file mode 100644 index 0000000000000000000000000000000000000000..8140b333d69980efa55f191cce4a1a54450d743f GIT binary patch literal 609 zcmV-n0-pVeP)QRJ=;DN*8zY;ctg=9K|v?L=VXPac6U^E3VwVrg+c+PQVEqx1=VVmlzD<-Xcpsv6b_o^u=9#r8<5Rr;cz(MbUMNF zJZiNXyk0Ln9uLapG6>x_eRwFuU>x>i+a-HzKt7*Gu~?*6SwOvBCuN?{b)Cofdl3hQ z1Z+8H(*`sfps9z&1jKk6v7|)GJfZWd9nS(07zcT5KFw(Z!jULzfU{WDVWuJYXW*Nj zC1swl=dum2gAwe%<-n#>ldUZzQfX>|O_unmIL;u8*CctjDvnE_F7n{7>?Pg5K z1sJYbF#O^(KK;mGj4mI0npxNPr2B7xBuU8Sa?K{_7ZgIuxGYN8b@nCt$7Zm;?{T@~ v=%XWTFVj*eg^LgT(Cs^Mr@2i3z0Q9CURcF}x=$Ge00000NkvXXu0mjfV9OG< literal 0 HcmV?d00001 diff --git a/resources/16x16/zoom-fit-best.png b/resources/16x16/zoom-fit-best.png new file mode 100644 index 0000000000000000000000000000000000000000..fbe21c39bb6c44c67c292eeb9cd9202e4aaae568 GIT binary patch literal 454 zcmV;%0XhDOP)+yF!$_ zJ{{-n+`|xRcNQLanaw=Ud*(0;@vKrd=Ls_tvyC}NF;jvlicqaqaak;)NHJrW zsa(b>!S#9_uIs|{JovtkAPC@i0n!x#q1ym}YUXtx z-uy|BGa8NlLZcT5f^Ek^rR7e6VHi#(SwM&4wF{5VKX^PIbLdl(1rD`)wDyVNFgyeD zlN0H0pxU`PcPFRdZnq1=Fwkr^(Qdc#`O{H?tyzIO91C`ff(3Ci!}L_)e*N<;xbJ-?0C(N3XP*VEv!4`GkFKJ+0??eH0C;$Ke07*qoM6N<$g75ywBme*a literal 0 HcmV?d00001 diff --git a/resources/16x16/zoom-in.png b/resources/16x16/zoom-in.png new file mode 100644 index 0000000000000000000000000000000000000000..6b7a6826a5dfceacd46838d29fe3641993a4c252 GIT binary patch literal 791 zcmV+y1L*vTP)p@A6^g+~yr4T(3bu-rza>ca$fvG!nPTk$+*6ojXmxK`5D)If~^WY0Fz7W_6 zMN#lZtIHyA;v$T|hggg($q;2-@0T3W84jZIB`W;@;X#X-Xi2k|J+f|Kcq zd|?iz(P_1}2L}hDe*>WBFZwm3=FoLUBHOG|=EH1!+!hjv@Ka+Jj#;!PsftAXt*tlO z008`M0J+)TUO-2ZG9!U_|LP~Hn=1)0MplgYgs zfH8?g{e2Y*pr?*aEehhMT|8o;0|;0Gh@BJ&zink_7_I9Fg<+T)#7Mw#9KpqlX(UNZ zy?Z>|AxJq6Sf2>=UF~UL18z{!{oqMJB%uIUB4PsJaF|RH!*Om1MAZ))?xZImp=Wn( zPj9{K>R1kQ!UgAsl)wZ+h6$0e0N8B)I+QEr4*Zy3#e-3nhhQj75IjHxaEM`fo*~y$ z@}z9)%*@PCEC6vjooj`8IpPv|+GUG}_e8Kne?e9L5E+PyJhRJLD#WWUk|zi=Gvu#y zIvx230JfW)G)$b%Nkdf`2e09wErrMzI3eHkR+R9|#j}RDbF`1nK6k#lQB_-O(d+eA zzu*5G*jd(K&`*qyei%qaqw}oWKEGi8IMVm1`<~5a)j$9wcs!n}(z3Ek+sK;DW}9}o zTwu@1<#MRGx%qx)XD4g?Wa5lQV~<*`hIc;re>6>lU@$mN5X8E7W1|Kqh_gziGHv_x z9szrdqA1{SI6f;Bin&NQT!*4)ad~-pE(G>bZ*Olkj^nR=K3^BuZWdP)Fe|P6?o_}^~>fM~ZP*b5avtYUet#pXS+=~JQO^}Mvd{>|^EQ$mn ze7!g3OMO*}kr2L+bhFJBxe5NeE&Q`hr%vxSw{E-bertsgn3ni?@jNe{FCQNGBH$1l z$HBXi(F-(1-$pT1E{fvTw%a}4(4et{fACw-(sB=PY-;Ma+PIE6JBRWRiQ-WaTs)r` zy;?}>Mn^`T4i687PZA&lZw7Uf*5CtPrZ}ilm!Oc4M$nKDHGW!v{Dv*H{u(jZ-u|c~ zmW>`2V2?XHOF1D`XM^;HN>lFqKL1T_(i=&oTE$4I49EHw9~9XA8dYiD2eaAiJ}N*- znM}L9jrj3P`Nq{a$t+AsojW)Xqb`6ks~B#H6y%y#JQz!oq!t_l3L&Ind@={gBu{{l zI?i1$8*}YRfIkAQJRxY;wNx4 zj9{oplW`KB4?2$(SgrG8#hEaLU)!co5lROizIZL{E+YeNPx>%HNZ_5G^vjuIhQ(qT zJF$hXuI@g0an1b+Bx^LUM6r>cB=NI9A_>gmR#vs(zEeU)5;tAW+Sb-q<6kZO8Z$G7 z=_`fVcwKH7<-hBEN*n&`Hzty@2j_xHW*W|$Qn0zksf&Q4XiN_96T*<~2!tHa>{rzR&S2Wf6@ ze%{m5BbsK-&}1^b(rUHn;RpYR<2Voq1g2=3_U!NN)lxKlL#4N}rx3{;PN@iQV0WXUO5bt?Ax z`Ny6~jUI+*60o5~z-*Dg`0&9CTB3*nuugy@LRpse=gMJm5QezMdoBIAR76XVa~#7p zppm_lG_aXa5lU3VFbV%r0PJ@E94plbs=bvE&S3~Ek)!cEbyh^ClErzclx6&zxn&wY zZ*FdG>?i`&g|uun}+d>YQfxD`I=U0HR19Upx5YAGC86@KIcz%#1367mk zr-M2>JNx_k`grFzm*8|dpIR&yc>f3gkD@3*)AS@k5S!7ht!p?zG?+}L{LIq_1RS$i zECzf&-*07*qoM6N<$f>N$(i2wiq literal 0 HcmV?d00001 diff --git a/resources/resources.qrc b/resources/resources.qrc index a2c844ce6..5318712bf 100644 --- a/resources/resources.qrc +++ b/resources/resources.qrc @@ -11,17 +11,26 @@ 16x16/dialog-ok-apply.png 16x16/document-new.png 16x16/document-open.png + 16x16/document-print.png 16x16/document-save.png 16x16/document-save-as.png 16x16/edit-delete.png 16x16/edit-rename.png 16x16/list-add.png 16x16/list-remove.png + 16x16/media-playback-pause.png 16x16/media-playback-start.png 16x16/media-playback-stop.png + 16x16/media-seek-backward.png + 16x16/media-seek-forward.png 16x16/network-connect.png 16x16/view-refresh.png + 16x16/view-sort-ascending.png 16x16/window-close.png + 16x16/zoom-fit-best.png + 16x16/zoom-in.png + 16x16/zoom-original.png + 16x16/zoom-out.png 48x48/carla.png 48x48/carla-control.png diff --git a/resources/ui/carla.ui b/resources/ui/carla.ui index 68c7c8b0e..b1bf26d7b 100644 --- a/resources/ui/carla.ui +++ b/resources/ui/carla.ui @@ -95,6 +95,10 @@ + + + :/16x16/media-seek-backward.png:/16x16/media-seek-backward.png + @@ -108,6 +112,10 @@ + + + :/16x16/media-seek-forward.png:/16x16/media-seek-forward.png + @@ -211,7 +219,7 @@ - + @@ -332,9 +340,31 @@ + + + &Canvas + + + + Zoom + + + + + + + + + + + + + + + @@ -377,6 +407,9 @@ &Save + + Ctrl+S + @@ -386,6 +419,9 @@ Save &As... + + Ctrl+Shift+S + @@ -395,6 +431,9 @@ &New + + Ctrl+N + @@ -404,6 +443,9 @@ &Open... + + Ctrl+O + @@ -413,6 +455,9 @@ &Quit + + Ctrl+Q + @@ -422,6 +467,9 @@ &Remove All + + Ctrl+Shift+R + @@ -441,6 +489,9 @@ &Add New... + + Ctrl+A + @@ -467,6 +518,9 @@ &Start + + F5 + @@ -476,6 +530,9 @@ St&op + + F6 + @@ -488,6 +545,9 @@ Configure Driver + + F7 + @@ -503,6 +563,92 @@ Show Transport bar + + + + :/16x16/view-sort-ascending.png:/16x16/view-sort-ascending.png + + + &Arrange + + + Ctrl+G + + + + + + :/16x16/view-refresh.png:/16x16/view-refresh.png + + + &Refresh + + + Ctrl+R + + + + + + :/16x16/document-print.png:/16x16/document-print.png + + + &Print... + + + + + Save &Image... + + + + + + :/16x16/zoom-fit-best.png:/16x16/zoom-fit-best.png + + + Auto-Fit + + + Home + + + + + + :/16x16/zoom-in.png:/16x16/zoom-in.png + + + Zoom In + + + Ctrl++ + + + + + + :/16x16/zoom-out.png:/16x16/zoom-out.png + + + Zoom Out + + + Ctrl+- + + + + + + :/16x16/zoom-original.png:/16x16/zoom-original.png + + + Zoom 100% + + + Ctrl+1 + + diff --git a/source/carla.py b/source/carla.py index 9b720b29d..0beb12343 100755 --- a/source/carla.py +++ b/source/carla.py @@ -22,6 +22,7 @@ from time import sleep from PyQt4.QtCore import Qt, QModelIndex, QPointF, QSize from PyQt4.QtGui import QApplication, QDialogButtonBox, QFileSystemModel, QMainWindow, QResizeEvent +from PyQt4.QtGui import QImage, QPrinter, QPrintDialog # ------------------------------------------------------------------------------------------------------------ # Imports (Custom Stuff) @@ -641,6 +642,16 @@ class CarlaMainW(QMainWindow): self.connect(self.ui.act_plugin_add, SIGNAL("triggered()"), SLOT("slot_pluginAdd()")) self.connect(self.ui.act_plugin_remove_all, SIGNAL("triggered()"), SLOT("slot_pluginRemoveAll()")) + self.ui.act_canvas_arrange.setEnabled(False) # TODO, later + self.connect(self.ui.act_canvas_arrange, SIGNAL("triggered()"), SLOT("slot_canvasArrange()")) + self.connect(self.ui.act_canvas_refresh, SIGNAL("triggered()"), SLOT("slot_canvasRefresh()")) + self.connect(self.ui.act_canvas_zoom_fit, SIGNAL("triggered()"), SLOT("slot_canvasZoomFit()")) + self.connect(self.ui.act_canvas_zoom_in, SIGNAL("triggered()"), SLOT("slot_canvasZoomIn()")) + self.connect(self.ui.act_canvas_zoom_out, SIGNAL("triggered()"), SLOT("slot_canvasZoomOut()")) + self.connect(self.ui.act_canvas_zoom_100, SIGNAL("triggered()"), SLOT("slot_canvasZoomReset()")) + self.connect(self.ui.act_canvas_print, SIGNAL("triggered()"), SLOT("slot_canvasPrint()")) + self.connect(self.ui.act_canvas_save_image, SIGNAL("triggered()"), SLOT("slot_canvasSaveImage()")) + self.connect(self.ui.act_settings_configure, SIGNAL("triggered()"), SLOT("slot_configureCarla()")) self.connect(self.ui.act_help_about, SIGNAL("triggered()"), SLOT("slot_aboutCarla()")) self.connect(self.ui.act_help_about_qt, SIGNAL("triggered()"), app, SLOT("aboutQt()")) @@ -701,6 +712,67 @@ class CarlaMainW(QMainWindow): #else: QTimer.singleShot(0, self, SLOT("slot_engineStart()")) + @pyqtSlot() + def slot_canvasArrange(self): + patchcanvas.arrange() + + @pyqtSlot() + def slot_canvasRefresh(self): + patchcanvas.clear() + Carla.host.patchbay_refresh() + + @pyqtSlot() + def slot_canvasZoomFit(self): + self.scene.zoom_fit() + + @pyqtSlot() + def slot_canvasZoomIn(self): + self.scene.zoom_in() + + @pyqtSlot() + def slot_canvasZoomOut(self): + self.scene.zoom_out() + + @pyqtSlot() + def slot_canvasZoomReset(self): + self.scene.zoom_reset() + + @pyqtSlot() + def slot_canvasPrint(self): + self.scene.clearSelection() + self.fExportPrinter = QPrinter() + dialog = QPrintDialog(self.fExportPrinter, self) + + if dialog.exec_(): + painter = QPainter(self.fExportPrinter) + painter.setRenderHint(QPainter.Antialiasing) + painter.setRenderHint(QPainter.TextAntialiasing) + self.scene.render(painter) + + @pyqtSlot() + def slot_canvasSaveImage(self): + newPath = QFileDialog.getSaveFileName(self, self.tr("Save Image"), filter=self.tr("PNG Image (*.png);;JPEG Image (*.jpg)")) + + if newPath: + self.scene.clearSelection() + + # FIXME - must be a better way... + if newPath.endswith((".jpg", ".jpG", ".jPG", ".JPG", ".JPg", ".Jpg")): + imgFormat = "JPG" + elif newPath.endswith((".png", ".pnG", ".pNG", ".PNG", ".PNg", ".Png")): + imgFormat = "PNG" + else: + # File-dialog may not auto-add the extension + imgFormat = "PNG" + newPath += ".png" + + self.fExportImage = QImage(self.scene.sceneRect().width(), self.scene.sceneRect().height(), QImage.Format_RGB32) + painter = QPainter(self.fExportImage) + painter.setRenderHint(QPainter.Antialiasing) # TODO - set true, cleanup this + painter.setRenderHint(QPainter.TextAntialiasing) + self.scene.render(painter) + self.fExportImage.save(newPath, imgFormat, 100) + @pyqtSlot(QModelIndex) def slot_fileTreeDoubleClicked(self, modelIndex): filename = self.fDirModel.filePath(modelIndex)