From ae59e6641c596093b64a6a9e6371ed2e68091730 Mon Sep 17 00:00:00 2001 From: Kamikaze Date: Tue, 31 Aug 2021 12:25:42 -0400 Subject: [PATCH] [F] multiple fixes Loading the extension makes sure that no other version is running Improved moving objects by keyboard arrows when pressing the Control key The uninstaller makes sure that the extension folder is deleted --- .gitattributes | 14 +- DevGuides Installer.livecode | Bin 92133 -> 91457 bytes DevGuides.livecodescript | 755 +++++++++++++++++------------------ README.md | 2 +- images/devguides.ico | Bin 0 -> 571454 bytes images/devguides.png | Bin 0 -> 14712 bytes 6 files changed, 383 insertions(+), 388 deletions(-) create mode 100644 images/devguides.ico create mode 100644 images/devguides.png diff --git a/.gitattributes b/.gitattributes index 88fa646..a553685 100644 --- a/.gitattributes +++ b/.gitattributes @@ -4,7 +4,7 @@ *.html linguist-detectable=true *.json linguist-detectable=true -# Set default behaviour, in case users don't have core.autocrlf set. +# Set default behaviour, in case users don't have core.autoLF set. * text=auto # Explicitly declare text files we want to always be normalized and converted @@ -15,13 +15,13 @@ *.html text # Declare files that will always have LF line endings on checkout. -*.json text eol=CRLF -*.livecodescript text eol=CRLF -*.livecodescript text eol=CRLF -*.html text eol=CRLF +*.json text eol=LF +*.livecodescript text eol=LF +*.livecodescript text eol=LF +*.html text eol=LF -# These files are processed by cygwin+bash so make sure they don't end with CRLF -prebuilt/versions/* text eol=CRLF +# These files are processed by cygwin+bash so make sure they don't end with LF +prebuilt/versions/* text eol=LF # Denote all files that are truly binary and should not be modified. *.png binary diff --git a/DevGuides Installer.livecode b/DevGuides Installer.livecode index 9c79baf095d7f6fafe90bf2c155d4ff610154a09..b451cf681320400298cd5a1335917634392740cf 100644 GIT binary patch delta 3065 zcma)8du&tJ8OKhXharyhwBsb^#7<&6vEvtcIU(S@6Ox9Igggulj(r1e9NS!9hd3Dw z#;c)Jh5puprm6*PlRB{q=w+khkMU5YwwwCegP}3jNgYGlstt{?mOrNM-0QrmPU<4v z_?+MQ-rsk=@7(`TcJmjqQx#Hm!DVxWg!f3g#oD9U+*LB?N2 z2H80AGeL$6gm#Neli{GBN}TqFVw5EA((NG2+Njbr`jrzOOK>Pvr6M|a$WK^?ieotv z564*2)!L>*R%;&rqqRRw<9l1yJPm*Z{f3m0w1$e^in~M6_K!l5m?h_L6Mxz8-X*oEr`73{-ut*{q zheVr;FN z*a`7cH&^h+1inEuMvTt5mu6re6*Cl(3jh<0GEiz;F{I5J5h(;j5H9%R3x_y19HitV z5GA@;M7JV|GLMT1VOp7)j#$9YL`8{&p(X?-Md68+9IRG9Ca39Ty$RLJ7K$3FGMaJY zl5^kajp-{!ka3*WtMSkE+1OvAPhHfG%UT_NrTsImuCK*pi3-UiBpK&fQYFcu`l4GY z9j&BZCK~nbW}>+0()8;!YmRM*NCKqD1 znoIsQk+fuU@E?Pgda5-Rr*SQb!oX%jK5VlJ>k=SlCUH+0vIL3_i)Fzw5ys2O<+yCn znHDo8oJMFPV5TD+Ewd08Cegt?foO}D^(QO?Dqe!Q(vBQ`G3G0?s1d}V!fW9a@RfSp zsWjq`bLmi-+p)_mn0VT(#_LL@ERnKEMP4e`w=cx7a(rrTqUSf1xo}woIYX8<%Ab$R zmRu?$4Yw`d!a!93Kd-Xl`FS<6ty_7YRVxvgY${y0X>iZhibGlXXs~ag=nM81+_pEM z$YH~H`}I0Jtam`~vSHA*0W)(s zc*Uj14ObQZ;WALUq`{b~Cq2w0Cr5t+4_RX-MjDFYXgrmyCnEw_iq9I4OKCoiZ8W9m z$zV8=K<{omO-ZN;0?ErwFQ9yrQskA@p3F+rFEw&Go082Jab@!elx_}3-F;N|`PKq_ z?lxjiX(p`A1`u~XBF#_XdUGLOZ_UQvo7dxaqnRjg8KxWrueMkhn+NSaa(GMgDVu__ zWT3lw9U8~dVRS3d*t#UbF0$Y0%0p^fg(#xEI}g{~n*SxHu~ig9?fQM&9ERHa>FQE@ zvuNGjP9?HC3SjNngR>nPTy4+AyB*p^>++G;*+8kEYB%9<=htk!+i9YVYLKq2%gpDy z63lnHmKfW+H!Z6oT`L}a*saH-?oMplQbB($IJ2dIs`}ZMdm{CX-W2?}2hjI9vA-t+ z2YYRcIKS$A9p388!FxR}%=cx2=_`|wFuOyJqQ1FBs%-wPzTFbqg?jku{x>8j9MGU< zU>d0&Ep821G32R4@nC9-P;#`!4td-N4QApu{SI6n%*BF70qwRb$cEhLq~CKx7F-)L zrY}{g9BxIu_v)CeCax6@nubsw;O@QOqjl@WE&~Zqa??*kE5MntFm=5wiFO+79nqlEvyO(q ziFXDSIOD0u$DS6t-h`nYb=0gT%4@*m9p-Oz&mp=8-LL^yvIWobmPI@nuArV(u6Sni z6iH2TjE>jg({0)Rj|=>*U2jWpe1b#2pMlrs#7n*!x)0)`(R{w&zf*>bfj9YyXP%az zEmV$!Q!;!um4?StXTeRc-rMmgc#vY%^sEf$LJHiQ-c5Oy_P@l(rV?BVtMOj=1T{Ge zOr$uGkV6r(l$h{Fq(#J~dlwURD5An|BbjNHgzKA}BqqLl?|u4Oin=fr?OW^f()R?{ z8i>*YcqeMb=TQ?%xZ2bSmhn!}*5l<0FwYtB1I~mGxSC}=BUS)I%!sWq6Xs&IcrzBv zFcYp<7?%SaeP}^DQ`II6IAMASuN85UibshtvWiyhS;C`6WM7)m5%v_M5Q=vf9Y#IEsrC6A?;@WJbSXTd@)k71vpet??_lM(ULRbGJuEMRjns#K` z$7FHRlp#;=cb&^Nc{XpHX8!fy}s62ZL6tHTC*nUOE?#%@$Nz{uF&rs{r<4v Z%5d0i4x8OsCs6zgqtBJ{9VcGB_g{b<9Wwv` delta 3256 zcmcgudrVvB6|Ws2U}NwT!qe9n>|nt5b$A#80b+xpgn$!B2#*j4E@1GB>x+S8TLNiI zm$gcoU!y8ow{GpKb(^%bxmzn`iY7Wm(KanY>^xv7yTuJBF{8~mWl%0Eq;KN zQU}UQHRN9aZ>f#^yP?wO;}4})^532=6XXe33n`_;CA|fI(yMXAESFH|r;Nqn5XJfy zdzj_Hh$!lxWO~C3QSyl~Fc`|cugy+ijxL7`hobsXy zj$L3VD$G(;D9lmgOvraQz_^*1XMx~Fw^mZz3=_id%!PcA1b;K>lnW72Rdg*GNkX1KVm=`;$Yc}YV9*zuq$ZgF!);il zBD=z&>F!BMba- z7~)f@uH@>I7Dez7WzeUkP5W4hLaz7UAm-TzU#MA^86U{XI(x%QwA%H=fNE6&CNivrV@ zvuQ%L@xVgkJEZ#`uTm)lhVY2Wq+*3wt}?<{vjrEb)VcAw_?JlFa@B4qs|{zQB^k-~ z(4$1IfWKND2R~Z9BV7bUM5V>mYE{xL8HEq3J5XLzg*`bsjMOaQ-I`hab~FcFR-=lF zBW{S}4V4C~Rxb{8tNGhjg~VJJdxF{-A!%q5Ns6t{ApW5iSGe)}`C)I`c zs=X&mbV~T(mv&ctI-A}utJ+ZOr0G;LMmuCR8?)c1>r%;)#zK5T?-zmiE=QU4%(gUs zwzfi=V(4^z`$jkv-mR}gM#DrZYqp^ouafu80VO_e&?C#KB_#Wn@$>v#yZ?t)MBvFh{Z-5d2?WO6sDTI z+PD>W8*_1`r4)vyQ!>g(?eR~~aKy-ZOF4eubUK5uh7#oS+t)~7Vk4x2lr&dn5~+bO z*|SBpNb_@o+H!)dY&nIuT2#cy55;`MJAxE6aU87fI3F(o-8vK>e7%*!bf*@|w&qkr zy>0DSTT$YcD+lLW6=>_oCjFL$*iIGRZ`%!XdolL3k$~IvXwEIbiT3>o7zOUP+cbh< z;Sn)~X_eM0{jtTG`MOgLZkw`RWIx^9iTTFtbg`WNdVr?RhM_?pfGf77ZJsW9wxvL60x~;h1RU|?cc2^MEBaWZy zzKJ=L61#S(@nVk-=N@Mv>zNmM!Cry)-NgJ$_-Gd=jQL>ivIKW__wsb#k0rR(Uj$4T zQRM9bHIQh z6<*o91FsC5ac)cwIF5zIrhuMqlu*%|R<D5J)R zQ2R&|KJ_-C=RgjI4!H4NUkh}DE$Ha4Aqh~!J8U64faObrt{;g9eR-e~d0Lei?3Tf% zr2g5#D$I;lVJ)am1e^KL^z~6E{>LEsfrH`*2q51qqXBV#&@k4r?3wMRXbNG3n6<-9tL4vX2XTd76E$Hw?&`RiHbcWQp7_8<` zhVDoZifqSgk$!w0(I9KS67;+U!}HE!>M+ar=Hkb-us=-r$jQ#R{ZXM_Kbp7U1`(99 z4OvM+w6O&kVk>c+wcrP=6Cbca3`ecyV#lQ3vxFO{j~pDrEjDpB<2TWKUe3Kn)<9)0 z))y*phrC%aI~rm&ViU2ka-5A>u^y`u>H9Gg^otJkE!sr-nME@$EY{-oV!Y{$OEmT_ zIgmD|1eOe9Q^v;{++I==9mR#^Au0ABts}3BfAQ$1G~7}b@;^P6E{Sis7mr^R7wiiw zy(I6sxVPF2>#7IeBME$Zbt1t#iPy{1GFXONU_N@*ie>>~f7eJh2%c zp16lUKf!LIoeda!(k@La!Ko+zu5i$Hhn?Q$-1OLEn?A#-r-CS7BOCmhRxa>s?E?QU ZY-=tB-Po|L&R$<9aQ?*~TYLNFzX5=07NGzD diff --git a/DevGuides.livecodescript b/DevGuides.livecodescript index 907101e..38fcdae 100644 --- a/DevGuides.livecodescript +++ b/DevGuides.livecodescript @@ -1,19 +1,19 @@ script "community.ferruslogic.plugin.devguides" /* * DevGuides -* (c) FerrusLogic Team +* ( c ) FerrusLogic Team * August 2021 -* version 1.0.2 +* version 1.0.3 * * This code is part of DevGuides extension created by FerrusLogic team to provide design guides to * help LiveCode developers in the process of designing graphic interfaces in an easy and modern way */ local sMessageID, sGridSystem, sThisCard, sControls, sLabels, sPendingMessages -constant kGuideLineColor = "255,0,255" , kGuideLabelColor = "56,56,255" +constant kGuideLineColor = "255,0,255" ,kGuideLabelColor = "56,56,255" on extensionInitialize - if the target is not me then pass extensionInitialize + if the target is not me or the long id of me is among the lines of the backscripts then pass extensionInitialize insert the script of me into back set the _ideoverride of me to true @@ -22,6 +22,7 @@ on extensionInitialize revIDESubscribe "ideMouseMove" revIDESubscribe "ideSelectedObjectChanged" revIDESubscribe "ideOpenStack" + get _enableDevGuides() put empty into sMessageID end extensionInitialize @@ -35,55 +36,70 @@ end extensionFinalize on closeCard - deleteDevGuides + _deleteDevGuides pass closeCard end closeCard on preOpenCard - deleteDevGuides + _deleteDevGuides pass preOpenCard end preOpenCard on closeCard - deleteDevGuides + _deleteDevGuides pass closeCard end closeCard on ideToolChanged - deleteDevGuides + _deleteDevGuides end ideToolChanged on ideSelectedObjectChanged - deleteDevGuides + _deleteDevGuides end ideSelectedObjectChanged -on rawKeyDown - deleteDevGuides +on rawKeyDown pKeyCode + if pKeyCode >= 65361 and pKeyCode <= 65364 then + _arrowKeyUp + + else if the controlKey is down and the shiftKey is down then - _enableDevGuides + _enableDevGuides + + else if the controlKey is "up" then + _deleteDevGuides + end if - pass rawKeyDown + end if + + pass rawKeyDown end rawKeyDown -on rawKeyUp - ideMouseMove + +on rawKeyUp pKeyCode + if not(pKeyCode >= 65361 and pKeyCode <= 65364) then + _deleteDevGuides + if sMessageID is a number then cancel sMessageID + end if + pass rawKeyUp end rawKeyUp + on ideMouseMove pX, pY local tSelectedObjects, tThisStack, tThisCard, tDefaultStack put the selectedObjects into tSelectedObjects if the tool <> "pointer tool" or tSelectedObjects is empty then exit ideMouseMove - put the short name of the topstack into tThisStack + if sMessageID is an integer or word 1 of tSelectedObjects is in "stack card" or _stackNameIsIDEStack( tThisStack ) then - deleteDevGuides empty, sThisCard + _deleteDevGuides empty, sThisCard exit ideMouseMove end if @@ -93,30 +109,36 @@ on ideMouseMove pX, pY set the defaultStack to tDefaultStack if sMessageID is a number then cancel sMessageID - send "updateDevGuides tThisCard" to me in 10 millisec - put the result into sMessageID - + if sPendingMessages is not true then + lock screen + send "updateDevGuides tThisCard" to me in 10 millisec + put the result into sMessageID + end if end ideMouseMove on updateDevGuides pThisCard local tSelectedObjects, tTergetProperty - if sPendingMessages is true or not _enableDevGuides() then exit updateDevGuides - put true into sPendingMessages + if sPendingMessages is true or not _enableDevGuides() + then exit updateDevGuides + + + put true into sPendingMessages put pThisCard into sThisCard put empty into sMessageID put the selectedObjects into tSelectedObjects lock screen; lock messages + _deleteDevGuides + if the tool <> "pointer tool" then - deleteDevGuides put false into sPendingMessages unlock messages; unlock screen exit updateDevGuides - else if mouse( 1 ) is up and controlKey() is up then - deleteDevGuides + + else if mouse(1) is "up" and controlKey() is "up" then put false into sPendingMessages unlock messages; unlock screen exit updateDevGuides @@ -137,262 +159,235 @@ on updateDevGuides pThisCard unlock messages; unlock screen end updateDevGuides +private command _arrowKeyUp + --lock screen + ideMouseMove + --unlock screen +end _arrowKeyUp +private command _deleteDevGuides + if sControls is an array then -command deleteDevGuides pLongId - local tChildControlIDs, tThisCard - - if there is a pLongId then - delete pLongId - exit deleteDevGuides - end if - + repeat for each element tControl in sControls + if there is a tControl then delete tControl + end repeat - if the tool <> "pointer tool" then - repeat for each element e in sControls - if there is a e then - delete e - end if - end repeat - delete variable sControls - exit deleteDevGuides - end if - - if sControls is an array then - repeat for each element e in sControls - if there is a e then - delete e - end if - end repeat - delete variable sControls - end if - - if sThisCard is no empty and there is no sThisCard then exit deleteDevGuides - if sThisCard is empty then put the long id of this card into tThisCard - else put sThisCard into tThisCard - - _childControlIDs tThisCard, tChildControlIDs - - repeat for each line tControl in tChildControlIDs - if the cDevDesigns of tControl is true then - delete tControl - end if - end repeat + delete variable sControls + end if - put empty into sThisCard -end deleteDevGuides + put empty into sThisCard +end _deleteDevGuides private command _childControlIDs @pThisCard, @pChildControlIDs, pSelectedObjects local tNumControl, tLongId, tOwner, tOwners - + if pSelectedObjects is no empty then - put the selectedObjects into pSelectedObjects - - repeat for each line tLine in pSelectedObjects - put _biggestOwner( tLine ) into tOwner - - if tOwner is not empty and tOwner is no pThisCard then - put tOwner & cr after tOwners - - end if - end repeat - end if - + put the selectedObjects into pSelectedObjects + + repeat for each line tLine in pSelectedObjects + put _biggestOwner( tLine ) into tOwner + + if tOwner is not empty and tOwner is no pThisCard then + put tOwner & cr after tOwners + + end if + end repeat + end if + put empty into tOwner - + put the number of controls of pThisCard into tNumControl - + repeat with x = 1 to tNumControl - - put the long id of control x of pThisCard into tLongId - put _biggestOwner( tLongId ) into tOwner - - if tLongId is among the lines of pSelectedObjects or tOwner is among the lines of pSelectedObjects then next repeat - if tOwner is pThisCard or (tOwners is no empty and tOwner is among the lines of tOwners) then - put tLongId & cr after pChildControlIDs - end if - + + put the long id of control x of pThisCard into tLongId + put _biggestOwner( tLongId ) into tOwner + + if tLongId is among the lines of pSelectedObjects or tOwner is among the lines of pSelectedObjects then next repeat + if tOwner is pThisCard or (tOwners is no empty and tOwner is among the lines of tOwners) then + put tLongId & cr after pChildControlIDs + end if + end repeat - + end _childControlIDs -private command _drawGuides pLongIdCd, tSelectedObjects , tTergetProperty, pX, pY +private command _drawGuides pLongIdCd, tSelectedObjects ,tTergetProperty, pX, pY local tChildControlIDs, tLongId, tLoc, tX, tY,tValue, tRect local tVerticalPoint1, tVerticalPoint2, tVerticalPoint3, tHorizontalPoint1, tHorizontalPoint2, tHorizontalPoint3 - local tWidthCard, tHeightCard, tDisMinV, tDisMinH, tDifferenceV, tDifferenceH, tMargins - - put 0 into tMargins + local tWidthCard, tHeightCard, tDisMinV, tDisMinH, tDifferenceV, tDifferenceH + put 1 into tDisMinV put 1 into tDisMinH - + _childControlIDs pLongIdCd, tChildControlIDs, tSelectedObjects - + put the width of pLongIdCd into tWidthCard put the height of pLongIdCd into tHeightCard - - + + # the loc of this card put the loc of pLongIdCd into tLoc - + # the rect of this card - put the left of pLongIdCd + tMargins into tRect["left"] - put the top of pLongIdCd + tMargins into tRect["top"] - put the right of pLongIdCd - tMargins into tRect["right"] - put the bottom of pLongIdCd - tMargins into tRect["bottom"] - + put the left of pLongIdCd into tRect["left"] + put the top of pLongIdCd into tRect["top"] + put the right of pLongIdCd into tRect["right"] + put the bottom of pLongIdCd into tRect["bottom"] + put the item 1 of tLoc into tRect["x"] put the item 2 of tLoc into tRect["y"] - + # Left _calcGuideLineProp pLongIdCd, "left", "left", "right", "top", "bottom", "min", "max","x", tTergetProperty, tRect, tVerticalPoint1, tHeightCard, tDisMinV, tDifferenceV # X _calcGuideLineProp pLongIdCd, "x", "left", "right", "top", "bottom", "min", "max","x", tTergetProperty, tRect, tVerticalPoint2, tHeightCard, tDisMinV, tDifferenceV # Right _calcGuideLineProp pLongIdCd, "right", "left", "right", "top", "bottom", "min", "max","x", tTergetProperty, tRect, tVerticalPoint3, tHeightCard, tDisMinV, tDifferenceV - + # Top _calcGuideLineProp pLongIdCd, "top", "top", "bottom", "left", "right", "min", "max","y", tTergetProperty, tRect, tHorizontalPoint1, tWidthCard, tDisMinH, tDifferenceH # y _calcGuideLineProp pLongIdCd, "y", "top", "bottom", "left", "right", "min", "max","y", tTergetProperty, tRect, tHorizontalPoint2, tWidthCard, tDisMinH, tDifferenceH # bottom _calcGuideLineProp pLongIdCd, "bottom", "top", "bottom", "left", "right", "min", "max","y", tTergetProperty, tRect, tHorizontalPoint3, tWidthCard, tDisMinH, tDifferenceH - - + + # Calc repeat for each line tLongID in tChildControlIDs - - -- Ignora a los objetos seleccionados. - if the visible of tLongID is false or tTergetProperty["ignore"][tLongID] is true then next repeat - - -- Elimina los posibles residuos de DevGuides - if the cTemporaryGraphic of tLongId is true then - try - delete tLongId - end try - next repeat - end if - - - # the loc of this control - put the loc of tLongId into tLoc - - # the rect of this control - put the left of tLongId into tRect["left"] - put the top of tLongId into tRect["top"] - put the right of tLongId into tRect["right"] - put the bottom of tLongId into tRect["bottom"] - put the item 1 of tLoc into tRect["x"] - put the item 2 of tLoc into tRect["y"] - - ---> Vertical guides <--- - # Left - _calcGuideLineProp tLongId, "left", "left", "right", "top", "bottom", "min", "max","x", tTergetProperty, tRect, tVerticalPoint1, tHeightCard, tDisMinV, tDifferenceV - # Right - _calcGuideLineProp tLongId, "right", "left", "right", "top", "bottom", "min", "max","x", tTergetProperty, tRect, tVerticalPoint3, tHeightCard, tDisMinV, tDifferenceV - # X - _calcGuideLineProp tLongId, "x", "left", "right", "top", "bottom", "min", "max","x", tTergetProperty, tRect, tVerticalPoint2, tHeightCard, tDisMinV, tDifferenceV - - - --> Horizontal guides <--- - # Top - _calcGuideLineProp tLongId, "top", "top", "bottom", "left", "right", "min", "max","y", tTergetProperty, tRect, tHorizontalPoint1, tWidthCard, tDisMinH, tDifferenceH - # y - _calcGuideLineProp tLongId, "y", "top", "bottom", "left", "right", "min", "max","y", tTergetProperty, tRect, tHorizontalPoint2, tWidthCard, tDisMinH, tDifferenceH - # bottom - _calcGuideLineProp tLongId, "bottom", "top", "bottom", "left", "right", "min", "max","y", tTergetProperty, tRect, tHorizontalPoint3, tWidthCard, tDisMinH, tDifferenceH - + + -- Ignora a los objetos seleccionados. + if the visible of tLongID is false or tTergetProperty["ignore"][tLongID] is true then next repeat + + -- Elimina los posibles residuos de DevGuides + if the cTemporaryGraphic of tLongId is true then + try + delete tLongId + end try + next repeat + end if + + + # the loc of this control + put the loc of tLongId into tLoc + + # the rect of this control + put the left of tLongId into tRect["left"] + put the top of tLongId into tRect["top"] + put the right of tLongId into tRect["right"] + put the bottom of tLongId into tRect["bottom"] + put the item 1 of tLoc into tRect["x"] + put the item 2 of tLoc into tRect["y"] + + ---> Vertical guides <--- + # Left + _calcGuideLineProp tLongId, "left", "left", "right", "top", "bottom", "min", "max","x", tTergetProperty, tRect, tVerticalPoint1, tHeightCard, tDisMinV, tDifferenceV + # Right + _calcGuideLineProp tLongId, "right", "left", "right", "top", "bottom", "min", "max","x", tTergetProperty, tRect, tVerticalPoint3, tHeightCard, tDisMinV, tDifferenceV + # X + _calcGuideLineProp tLongId, "x", "left", "right", "top", "bottom", "min", "max","x", tTergetProperty, tRect, tVerticalPoint2, tHeightCard, tDisMinV, tDifferenceV + + + --> Horizontal guides <--- + # Top + _calcGuideLineProp tLongId, "top", "top", "bottom", "left", "right", "min", "max","y", tTergetProperty, tRect, tHorizontalPoint1, tWidthCard, tDisMinH, tDifferenceH + # y + _calcGuideLineProp tLongId, "y", "top", "bottom", "left", "right", "min", "max","y", tTergetProperty, tRect, tHorizontalPoint2, tWidthCard, tDisMinH, tDifferenceH + # bottom + _calcGuideLineProp tLongId, "bottom", "top", "bottom", "left", "right", "min", "max","y", tTergetProperty, tRect, tHorizontalPoint3, tWidthCard, tDisMinH, tDifferenceH + end repeat - - + + -- draw limit _drawLimit tVerticalPoint1, tVerticalPoint2, tVerticalPoint3, tDisMinV _drawLimit tHorizontalPoint1, tHorizontalPoint2, tHorizontalPoint3, tDisMinH - + local tNewLeft = true, tNewTop = true, tDrawLimitUp = true, tDrawLimitDown = true - + -- Vertical if tVerticalPoint1[ "create" ] is true and tVerticalPoint1["distance"] is tDisMinV then - _drawingGuideLine tVerticalPoint1, tTergetProperty, "height", "top", "left", 0 - - put tVerticalPoint1["hook"] into tNewLeft + _drawingGuideLine tVerticalPoint1, tTergetProperty, "height", "top", "left", 0 + + put tVerticalPoint1["hook"] into tNewLeft else - put false into tVerticalPoint1[ "create" ] + put false into tVerticalPoint1[ "create" ] end if - + if tVerticalPoint2[ "create" ] is true and tVerticalPoint2["distance"] is tDisMinV then - if tNewLeft then - put tVerticalPoint2["hook"] into tNewLeft - end if - - add (tTergetProperty["x"] - tTergetProperty["left"]) to tVerticalPoint2["hook"] - _drawingGuideLine tVerticalPoint2, tTergetProperty, "height", "top", "left", 0 - + if tNewLeft then + put tVerticalPoint2["hook"] into tNewLeft + end if + + add (tTergetProperty["x"] - tTergetProperty["left"]) to tVerticalPoint2["hook"] + _drawingGuideLine tVerticalPoint2, tTergetProperty, "height", "top", "left", 0 + else - put false into tVerticalPoint2[ "create" ] + put false into tVerticalPoint2[ "create" ] end if - - + + if tVerticalPoint3[ "create" ] is true and tVerticalPoint3["distance"] is tDisMinV then - if tNewLeft then - put tVerticalPoint3["hook"] into tNewLeft - end if - - add tTergetProperty["width"] to tVerticalPoint3["hook"] - _drawingGuideLine tVerticalPoint3, tTergetProperty, "height", "top", "left", 0 - + if tNewLeft then + put tVerticalPoint3["hook"] into tNewLeft + end if + + add tTergetProperty["width"] to tVerticalPoint3["hook"] + _drawingGuideLine tVerticalPoint3, tTergetProperty, "height", "top", "left", 0 + else - put false into tVerticalPoint3[ "create" ] + put false into tVerticalPoint3[ "create" ] end if - - + + -- Horizontal if tHorizontalPoint1[ "create" ] is true and tHorizontalPoint1["distance"] is tDisMinH then - _drawingGuideLine tHorizontalPoint1, tTergetProperty, "width", "left", "top", 10 - - put tHorizontalPoint1["hook"] into tNewTop + _drawingGuideLine tHorizontalPoint1, tTergetProperty, "width", "left", "top", 10 + + put tHorizontalPoint1["hook"] into tNewTop else - put false into tHorizontalPoint1[ "create" ] + put false into tHorizontalPoint1[ "create" ] end if - + if tHorizontalPoint2[ "create" ] is true and tHorizontalPoint2["distance"] is tDisMinH then - if tNewTop then - put tHorizontalPoint2["hook"] into tNewTop - end if - - add (tTergetProperty["y"] - tTergetProperty["top"]) to tHorizontalPoint2["hook"] - - _drawingGuideLine tHorizontalPoint2, tTergetProperty, "width", "left", "top", 10 - + if tNewTop then + put tHorizontalPoint2["hook"] into tNewTop + end if + + add (tTergetProperty["y"] - tTergetProperty["top"]) to tHorizontalPoint2["hook"] + + _drawingGuideLine tHorizontalPoint2, tTergetProperty, "width", "left", "top", 10 + else - put false into tHorizontalPoint2[ "create" ] + put false into tHorizontalPoint2[ "create" ] end if - + if tHorizontalPoint3[ "create" ] is true and tHorizontalPoint3["distance"] is tDisMinH then - if tNewTop then - put tHorizontalPoint3["hook"] into tNewTop - end if - - add tTergetProperty["height"] to tHorizontalPoint3["hook"] - - _drawingGuideLine tHorizontalPoint3, tTergetProperty, "width", "left", "top", 10 + if tNewTop then + put tHorizontalPoint3["hook"] into tNewTop + end if + + add tTergetProperty["height"] to tHorizontalPoint3["hook"] + + _drawingGuideLine tHorizontalPoint3, tTergetProperty, "width", "left", "top", 10 else - put false into tHorizontalPoint3[ "create" ] + put false into tHorizontalPoint3[ "create" ] end if - - + + if tNewLeft is an integer then - _toHook tSelectedObjects , tTergetProperty, "left", tNewLeft + _toHook tSelectedObjects , tTergetProperty, "left", tNewLeft end if - + if tNewTop is an integer then - _toHook tSelectedObjects , tTergetProperty, "top", tNewTop + _toHook tSelectedObjects , tTergetProperty, "top", tNewTop end if - - + + end _drawGuides @@ -400,22 +395,22 @@ private command _drawLimit @pPoint1, @pPoint2, @pPoint3, @pDis # Draw limit up if pPoint1["distance"] is pDis and pPoint1["drawLimitUp"] is true and pPoint2["drawLimitUp"] is true then - put false into pPoint2["drawLimitUp"] + put false into pPoint2["drawLimitUp"] end if if pPoint1["distance"] is pDis and pPoint1["drawLimitUp"] is true and pPoint3["drawLimitUp"] is true or\ - pPoint2["distance"] is pDis and pPoint2["drawLimitUp"] is true and pPoint3["drawLimitUp"] is true then - put false into pPoint3["drawLimitUp"] + pPoint2["distance"] is pDis and pPoint2["drawLimitUp"] is true and pPoint3["drawLimitUp"] is true then + put false into pPoint3["drawLimitUp"] end if # Draw limit down if pPoint1["distance"] is pDis and pPoint1["drawLimitDown"] is true and pPoint2["drawLimitDown"] is true then - put false into pPoint2["drawLimitDown"] + put false into pPoint2["drawLimitDown"] end if if pPoint1["distance"] is pDis and pPoint1["drawLimitDown"] is true and pPoint3["drawLimitDown"] is true or\ - pPoint2["distance"] is pDis and pPoint2["drawLimitDown"] is true and pPoint3["drawLimitDown"] is true then - put false into pPoint3["drawLimitDown"] + pPoint2["distance"] is pDis and pPoint2["drawLimitDown"] is true and pPoint3["drawLimitDown"] is true then + put false into pPoint3["drawLimitDown"] end if end _drawLimit @@ -429,10 +424,10 @@ private command _drawingGuideLine @pVerticalPoint, @pTergetProperty, pMainSize, put _createTemporaryGraphic() into tLongId if pCrossStart is "top" then - put "bottom" into tCrossEnd + put "bottom" into tCrossEnd else if pCrossStart is "left" then - put "right" into tCrossEnd + put "right" into tCrossEnd end if @@ -445,100 +440,100 @@ private command _drawingGuideLine @pVerticalPoint, @pTergetProperty, pMainSize, if pVerticalPoint[ "drawLimitUp" ] is true then - # Back of label 1 - - put pTergetProperty[ pCrossStart ] - pVerticalPoint[ "LimitUp" ] into pVerticalPoint[ "sizeLimitUp" ] - put pVerticalPoint[ "sizeLimitUp" ] into pVerticalPoint[ "label-1" ] - - put _createTemporaryGraphic() into tLongId - try - set the pMainSize of tLongId to pVerticalPoint["sizeLimitUp"] - set the pCrossStart of tLongId to pVerticalPoint["LimitUp"] - set the pMainStart of tLongId to pVerticalPoint["hook"] - set the backColor of tLongId to kGuideLabelColor - set the foregroundColor of tLongId to kGuideLabelColor - set the visible of tLongId to true - put the loc of tLongId into tLoc - end try - - if there is no a tLongId then exit _drawingGuideLine - - if item 2 of tLoc > 25 then - subtract pSpace from item 2 of tLoc - else - add pSpace to item 2 of tLoc - end if - - # Label 1 - put _createTemporaryGraphic() into tLongId - - try - set the height of tLongId to 20 - set the width of tLongId to 50 - set the backColor of tLongId to kGuideLabelColor - set the foregroundColor of tLongId to kGuideLabelColor - set the opaque of tLongId to false - set the showName of tLongId to true - set the label of tLongId to pVerticalPoint[ "label-1" ] - put tLongId into sLabels[1][pCrossStart] - end try - - if pVerticalPoint["hook"] < 50 then - set the textAlign of tLongId to "left" - add 28 to the item 1 of tLoc - else - subtract 28 from the item 1 of tLoc - set the textAlign of tLongId to "right" - end if - - set the loc of tLongId to tLoc - set the visible of tLongId to true + # Back of label 1 + + put pTergetProperty[ pCrossStart ] - pVerticalPoint[ "LimitUp" ] into pVerticalPoint[ "sizeLimitUp" ] + put pVerticalPoint[ "sizeLimitUp" ] into pVerticalPoint[ "label-1" ] + + put _createTemporaryGraphic() into tLongId + try + set the pMainSize of tLongId to pVerticalPoint["sizeLimitUp"] + set the pCrossStart of tLongId to pVerticalPoint["LimitUp"] + set the pMainStart of tLongId to pVerticalPoint["hook"] + set the backColor of tLongId to kGuideLabelColor + set the foregroundColor of tLongId to kGuideLabelColor + set the visible of tLongId to true + put the loc of tLongId into tLoc + end try + + if there is no a tLongId then exit _drawingGuideLine + + if item 2 of tLoc > 25 then + subtract pSpace from item 2 of tLoc + else + add pSpace to item 2 of tLoc + end if + + # Label 1 + put _createTemporaryGraphic() into tLongId + + try + set the height of tLongId to 20 + set the width of tLongId to 50 + set the backColor of tLongId to kGuideLabelColor + set the foregroundColor of tLongId to kGuideLabelColor + set the opaque of tLongId to false + set the showName of tLongId to true + set the label of tLongId to abs(pVerticalPoint[ "label-1" ]) + put tLongId into sLabels[1][pCrossStart] + end try + + if pVerticalPoint["hook"] < 50 then + set the textAlign of tLongId to "left" + add 28 to the item 1 of tLoc + else + subtract 28 from the item 1 of tLoc + set the textAlign of tLongId to "right" + end if + + set the loc of tLongId to tLoc + set the visible of tLongId to true end if if pVerticalPoint[ "drawLimitDown" ] is true then - # Back of label 2 - put pVerticalPoint[ "LimitDown" ] - pTergetProperty[ tCrossEnd ] into pVerticalPoint[ "sizeLimitDown" ] - put pVerticalPoint[ "sizeLimitDown" ]into pVerticalPoint[ "label-2" ] - put _createTemporaryGraphic() into tLongId - - set the pMainSize of tLongId to pVerticalPoint["sizeLimitDown"] - set the tCrossEnd of tLongId to pVerticalPoint["LimitDown"] - set the pMainStart of tLongId to pVerticalPoint["hook"] - set the backColor of tLongId to kGuideLabelColor - set the foregroundColor of tLongId to kGuideLabelColor - set the visible of tLongId to true - put the loc of tLongId into tLoc - - if item 2 of tLoc > 25 then - subtract pSpace from item 2 of tLoc - else - add pSpace to item 2 of tLoc - end if - - # Label 2 - put _createTemporaryGraphic() into tLongId - - set the height of tLongId to 20 - set the width of tLongId to 50 - set the backColor of tLongId to kGuideLabelColor - set the foregroundColor of tLongId to kGuideLabelColor - set the opaque of tLongId to false - set the showName of tLongId to true - set the label of tLongId to pVerticalPoint[ "label-2" ] - put tLongId into sLabels[2][pCrossStart] - - if pVerticalPoint["hook"] < 50 then - set the textAlign of tLongId to "left" - add 28 to the item 1 of tLoc - else - subtract 28 from the item 1 of tLoc - set the textAlign of tLongId to "right" - end if - - set the loc of tLongId to tLoc - set the visible of tLongId to true + # Back of label 2 + put pVerticalPoint[ "LimitDown" ] - pTergetProperty[ tCrossEnd ] into pVerticalPoint[ "sizeLimitDown" ] + put pVerticalPoint[ "sizeLimitDown" ] into pVerticalPoint[ "label-2" ] + put _createTemporaryGraphic() into tLongId + + set the pMainSize of tLongId to pVerticalPoint["sizeLimitDown"] + set the tCrossEnd of tLongId to pVerticalPoint["LimitDown"] + set the pMainStart of tLongId to pVerticalPoint["hook"] + set the backColor of tLongId to kGuideLabelColor + set the foregroundColor of tLongId to kGuideLabelColor + set the visible of tLongId to true + put the loc of tLongId into tLoc + + if item 2 of tLoc > 25 then + subtract pSpace from item 2 of tLoc + else + add pSpace to item 2 of tLoc + end if + + # Label 2 + put _createTemporaryGraphic() into tLongId + + set the height of tLongId to 20 + set the width of tLongId to 50 + set the backColor of tLongId to kGuideLabelColor + set the foregroundColor of tLongId to kGuideLabelColor + set the opaque of tLongId to false + set the showName of tLongId to true + set the label of tLongId to abs( pVerticalPoint[ "label-2" ]) + put tLongId into sLabels[2][pCrossStart] + + if pVerticalPoint["hook"] < 50 then + set the textAlign of tLongId to "left" + add 28 to the item 1 of tLoc + else + subtract 28 from the item 1 of tLoc + set the textAlign of tLongId to "right" + end if + + set the loc of tLongId to tLoc + set the visible of tLongId to true end if end _drawingGuideLine @@ -551,17 +546,17 @@ private command _calcGuideLineProp pLongId, pMain, pMainStart, pMainEnd, pCrossS if tValue["distance"] < pDistance then - _resetLimit pTergetProperty, tValue, pDistance, pPointArray, pMaxLimit, pMainStart, pCrossStart, pCrossEnd + _resetLimit pTergetProperty, tValue, pDistance, pPointArray, pMaxLimit, pMainStart, pCrossStart, pCrossEnd - _updateLimit pLongId, pTergetProperty, pMainStart, pCrossStart, pCrossEnd, tValue, pPointArray + _updateLimit pLongId, pTergetProperty, pMainStart, pCrossStart, pCrossEnd, tValue, pPointArray else if tValue["distance"] = pDistance then - if pPointArray[ "create" ] is not true then - _resetLimit pTergetProperty, tValue, pDistance, pPointArray, pMaxLimit, pMainStart, pCrossStart, pCrossEnd - end if + if pPointArray[ "create" ] is not true then + _resetLimit pTergetProperty, tValue, pDistance, pPointArray, pMaxLimit, pMainStart, pCrossStart, pCrossEnd + end if - _updateLimit pLongId, pTergetProperty, pMainStart, pCrossStart, pCrossEnd, tValue, pPointArray + _updateLimit pLongId, pTergetProperty, pMainStart, pCrossStart, pCrossEnd, tValue, pPointArray end if end _calcGuideLineProp @@ -599,13 +594,13 @@ private command _updateLimit @pLongId, @pTergetProperty, @pMainStart, @pCrossSta put the pCrossStart of pLongId into tCrossStartValue if pPointArray[ "min" ] >= tCrossStartValue then - put tCrossStartValue into pPointArray[ "min" ] + put tCrossStartValue into pPointArray[ "min" ] end if --- put the pCrossEnd of pLongId into tCrossEndValue if pPointArray[ "max" ] <= tCrossEndValue then - put tCrossEndValue into pPointArray[ "max" ] + put tCrossEndValue into pPointArray[ "max" ] end if --------------------------------------------- @@ -614,24 +609,24 @@ private command _updateLimit @pLongId, @pTergetProperty, @pMainStart, @pCrossSta # Limit Up if tLimitMax >= pPointArray[ "limitUp" ] and tLimitMax <= pTergetProperty[pCrossStart] then - put tLimitMax into pPointArray[ "limitUp" ] - put true into pPointArray[ "drawLimitUp" ] + put tLimitMax into pPointArray[ "limitUp" ] + put true into pPointArray[ "drawLimitUp" ] else if tLimitMin >= pPointArray[ "limitUp" ] and tLimitMin <= pTergetProperty[pCrossStart] then - put tLimitMin into pPointArray[ "limitUp" ] - put true into pPointArray[ "drawLimitUp" ] + put tLimitMin into pPointArray[ "limitUp" ] + put true into pPointArray[ "drawLimitUp" ] end if # Limit Down if tLimitMin <= pPointArray[ "limitDown" ] and tLimitMin >= pTergetProperty[pCrossEnd] then - put tLimitMin into pPointArray[ "limitDown" ] - put true into pPointArray[ "drawLimitDown" ] + put tLimitMin into pPointArray[ "limitDown" ] + put true into pPointArray[ "drawLimitDown" ] else if tLimitMax <= pPointArray[ "limitDown" ] and tLimitMax >= pTergetProperty[pCrossEnd] then - put tLimitMax into pPointArray[ "limitDown" ] - put true into pPointArray[ "drawLimitDown" ] + put tLimitMax into pPointArray[ "limitDown" ] + put true into pPointArray[ "drawLimitDown" ] end if end _updateLimit @@ -643,18 +638,16 @@ private command _toHook @pSelectedObjects , @pTergetProperty, pPropName, pNewVal put pNewValue - pTergetProperty[ pPropName ] into tOff - if tOff is 0 then exit _toHook - repeat for each line tControl in pSelectedObjects - set the pPropName of tControl to (the pPropName of tControl + tOff) + set the pPropName of tControl to (the pPropName of tControl + tOff) end repeat if there is a sLabels[ 1 ][pPropName] then - set the label of sLabels[ 1 ][pPropName] to the label of sLabels[ 1 ][pPropName] + tOff + set the label of sLabels[ 1 ][pPropName] to abs( the label of sLabels[ 1 ][pPropName] + tOff ) end if if there is a sLabels[ 2 ][pPropName] then - set the label of sLabels[ 2 ][pPropName] to the label of sLabels[ 1 ][pPropName] + tOff + set the label of sLabels[ 2 ][pPropName] to abs( the label of sLabels[ 2 ][pPropName] + tOff ) end if end _toHook @@ -671,29 +664,29 @@ private function _hook pCurrentValue, pPoint1, pPoint2, pPoint3, pMinOrMax put abs(tDifference3) into tDis3 if pMinOrMax is "max" then - put max( tDis1, tDis2, tDis3) into tValue + put max( tDis1, tDis2, tDis3) into tValue else - put min( tDis1, tDis2, tDis3) into tValue + put min( tDis1, tDis2, tDis3) into tValue end if switch tValue - case tDis1 - put pPoint1 into tValue["value"] - put tDis1 into tValue["distance"] - put tDifference1 * -1 into tValue["difference"] - break - - case tDis2 - put pPoint2 into tValue["value"] - put tDis2 into tValue["distance"] - put tDifference2* -1 into tValue["difference"] - break - - case tDis3 - put pPoint3 into tValue["value"] - put tDis3 into tValue["distance"] - put tDifference3 * -1 into tValue["difference"] - break + case tDis1 + put pPoint1 into tValue["value"] + put tDis1 into tValue["distance"] + put tDifference1 * -1 into tValue["difference"] + break + + case tDis2 + put pPoint2 into tValue["value"] + put tDis2 into tValue["distance"] + put tDifference2* -1 into tValue["difference"] + break + + case tDis3 + put pPoint3 into tValue["value"] + put tDis3 into tValue["distance"] + put tDifference3 * -1 into tValue["difference"] + break end switch @@ -703,12 +696,13 @@ end _hook private function _mouseControl - local tMouseControl + local tMouseControl, tMouseStack put the mouseControl into tMouseControl - - if there is not a tMouseControl then return empty - return _biggestOwner( the long id of tMouseControl ) + put the mouseStack into tMouseStack + if tMouseControl is empty then return empty + set the defaultStack to tMouseStack + return _biggestOwner( the long id of tMouseControl ) end _mouseControl @@ -721,35 +715,35 @@ private function _tergetProperty pThisCard, pControls put the top of pThisCard into tBottom repeat for each line tControl in pControls - if there is a no tControl then exit to top + if there is a no tControl then exit to top - # calc the Left of rectangle - if the left of tControl < tLeft then - put the left of tControl into tLeft - end if + # calc the Left of rectangle + if the left of tControl < tLeft then + put the left of tControl into tLeft + end if - # calc the top of rectangle - if the top of tControl < tTop then - put the top of tControl into tTop - end if + # calc the top of rectangle + if the top of tControl < tTop then + put the top of tControl into tTop + end if - # calc the right of rectangle - if the right of tControl > tRight then - put the right of tControl into tRight - end if + # calc the right of rectangle + if the right of tControl > tRight then + put the right of tControl into tRight + end if - # calc the bottom of rectangle - if the bottom of tControl > tBottom then - put the bottom of tControl into tBottom - end if + # calc the bottom of rectangle + if the bottom of tControl > tBottom then + put the bottom of tControl into tBottom + end if - put _biggestOwner(tControl) into tOwner + put _biggestOwner(tControl) into tOwner - if word 1 of tOwner is not "card" then - put true into tResult["ignore"][tOwner] - else - put true into tResult["ignore"][tControl] - end if + if word 1 of tOwner is not "card" then + put true into tResult["ignore"][tOwner] + else + put true into tResult["ignore"][tControl] + end if end repeat @@ -775,9 +769,9 @@ private function _biggestOwner pLongId put wordOffSet("card", pLongId) into tOffset if tOffset is 5 then - return the word 5 to - 1 of pLongId + return the word 5 to - 1 of pLongId else - return the word tOffset - 4 to - 1 of pLongId + return the word tOffset - 4 to - 1 of pLongId end if end _biggestOwner @@ -815,7 +809,7 @@ private function _createTemporaryGraphic set the cDevDesigns of tGrc to true set the cTemporaryGraphic of tGrc to true - + set the width of tGrc to 1 set the height of tGrc to 1 set the textAlign of tGrc to "center" @@ -824,7 +818,7 @@ private function _createTemporaryGraphic set the cantSelect of tGrc to true set the opaque of tGrc to true set the margins of tGrc to 0 - + put tGrc into sControls[ tGrc] unlock messages @@ -836,10 +830,10 @@ private command _enableDevGuides lock screen; lock messages if _enableDevGuides() then - put false into url ("file:" & revEnvironmentUserCachePath() & "/devguide") + put false into url ("file:" & revEnvironmentUserCachePath() & "/devguide") else - put true into url ("file:" & revEnvironmentUserCachePath() & "/devguide") + put true into url ("file:" & revEnvironmentUserCachePath() & "/devguide") end if @@ -847,13 +841,14 @@ private command _enableDevGuides end _enableDevGuides -private function _enableDevGuides + private function _enableDevGuides if there is no a file(revEnvironmentUserCachePath() & "/devguide") then - put true into url ("file:" & revEnvironmentUserCachePath() & "/devguide") + put true into url ("file:" & revEnvironmentUserCachePath() & "/devguide") end if put false into sPendingMessages put empty into sMessageID + return url ("file:" & revEnvironmentUserCachePath() & "/devguide") end _enableDevGuides diff --git a/README.md b/README.md index 3443e2f..27d9211 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ ### August 2021 -### Version 1.0.2 +### Version 1.0.3 DevGuides extension created by FerrusLogic team to provide design guides to help LiveCode developers in the process of designing graphic interfaces in an easy and modern way diff --git a/images/devguides.ico b/images/devguides.ico new file mode 100644 index 0000000000000000000000000000000000000000..9634d4380bdd34cd6d7cedaba48ca847c31d3b5e GIT binary patch literal 571454 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 literal 0 HcmV?d00001