lazpaintmainform.pas 161 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693
  1. // SPDX-License-Identifier: GPL-3.0-only
  2. unit LazpaintMainForm;
  3. {$mode objfpc}{$H+}
  4. interface
  5. {$IFDEF DARWIN}
  6. {$DEFINE USEPAINTBOXPICTURE}
  7. {$ENDIF}
  8. uses
  9. Classes, LMessages, SysUtils, LazFileUtils, LResources, Forms, Controls,
  10. Graphics, Dialogs, Menus, ExtDlgs, ComCtrls, ActnList, StdCtrls, ExtCtrls,
  11. Buttons, types, LCLType, BGRAImageList, BCTrackbarUpdown, BCComboBox, BCButton,
  12. BGRABitmap, BGRABitmapTypes, BGRALayers, BGRASVGOriginal, BGRAGradientScanner, BGRAGradientOriginal,
  13. LazPaintType, UMainFormLayout, UTool, UImage, UImageAction, UZoom, UImageView,
  14. UImageObservation, UConfig, LCScaleDPI, UResourceStrings, UMenu, uscripting,
  15. ubrowseimages, UToolPolygon, UToolVectorial, LCVectorRectShapes,
  16. LCVectorialFillControl, LCVectorialFill,
  17. laztablet, udarktheme, UScriptType;
  18. type
  19. { TFMain }
  20. TFMain = class(TForm)
  21. FileExport: TAction;
  22. ExportPictureDialog: TSaveDialog;
  23. MenuScript: TMenuItem;
  24. Panel_OutlineFill: TPanel;
  25. Panel_Donate: TPanel;
  26. ToolButton_Donate: TToolButton;
  27. ToolBar25: TToolBar;
  28. ToolOpenedCurve: TAction;
  29. ToolPolyline: TAction;
  30. FileRunScript: TAction;
  31. EditShapeToCurve: TAction;
  32. EditShapeAlignBottom: TAction;
  33. EditShapeCenterVertically: TAction;
  34. EditShapeAlignTop: TAction;
  35. EditShapeAlignRight: TAction;
  36. EditShapeCenterHorizontally: TAction;
  37. EditShapeAlignLeft: TAction;
  38. ComboBox_PenStyle: TBCComboBox;
  39. EditMoveToBack: TAction;
  40. EditMoveDown: TAction;
  41. EditMoveToFront: TAction;
  42. EditMoveUp: TAction;
  43. Image_SwapColors: TImage;
  44. Label_Pen: TLabel;
  45. Label_Back: TLabel;
  46. Label_ShadowOffset: TLabel;
  47. Label_TextBlur: TLabel;
  48. TimerHideFill: TTimer;
  49. TimerArrange: TTimer;
  50. Perspective_Repeat: TToolButton;
  51. Tool_EraseSharpen: TToolButton;
  52. Tool_EraseLighten: TToolButton;
  53. Tool_EraseDarken: TToolButton;
  54. VectorialFill_Outline: TLCVectorialFillControl;
  55. VectorialFill_Pen: TLCVectorialFillControl;
  56. VectorialFill_Back: TLCVectorialFillControl;
  57. Panel_BackFill: TPanel;
  58. Panel_SwapColor: TPanel;
  59. Panel_PenFill: TPanel;
  60. Panel_TextShadow: TPanel;
  61. Panel_CloseShape: TPanel;
  62. SpinEdit_TextBlur: TBCTrackbarUpdown;
  63. SpinEdit_TextShadowX: TBCTrackbarUpdown;
  64. SpinEdit_TextShadowY: TBCTrackbarUpdown;
  65. ToolBar23: TToolBar;
  66. ToolBar24: TToolBar;
  67. ToolEditShape: TAction;
  68. ComboBox_ArrowStart: TBCComboBox;
  69. ComboBox_ArrowEnd: TBCComboBox;
  70. ComboBox_BrushSelect: TBCComboBox;
  71. Combo_SplineStyle: TBCComboBox;
  72. FilterWaveDisplacement: TAction;
  73. SpinEdit_Eraser: TBCTrackbarUpdown;
  74. SpinEdit_GridNbX: TBCTrackbarUpdown;
  75. SpinEdit_GridNbY: TBCTrackbarUpdown;
  76. SpinEdit_PenWidth: TBCTrackbarUpdown;
  77. SpinEdit_ArrowSizeX: TBCTrackbarUpdown;
  78. SpinEdit_ArrowSizeY: TBCTrackbarUpdown;
  79. SpinEdit_Tolerance: TBCTrackbarUpdown;
  80. SpinEdit_BrushSpacing: TBCTrackbarUpdown;
  81. SpinEdit_ShapeAltitude: TBCTrackbarUpdown;
  82. SpinEdit_TextOutlineWidth: TBCTrackbarUpdown;
  83. SpinEdit_PhongBorderSize: TBCTrackbarUpdown;
  84. SpinEdit_TextSize: TBCTrackbarUpdown;
  85. Tool_CloseShape: TToolButton;
  86. Tool_TextShadow: TToolButton;
  87. ViewDarkTheme: TAction;
  88. MenuFileToolbar: TMenuItem;
  89. ViewWorkspaceColor: TAction;
  90. LayerRasterize: TAction;
  91. FileRememberSaveFormat: TAction;
  92. SelectionVerticalFlip: TAction;
  93. SelectionHorizontalFlip: TAction;
  94. LayerZoom: TAction;
  95. ImageSwapRedBlue: TAction;
  96. ImageLinearNegative: TAction;
  97. ImageNegative: TAction;
  98. ForgetDialogAnswers: TAction;
  99. FileChooseEntry: TAction;
  100. Panel_Aliasing: TPanel;
  101. ToolBar22: TToolBar;
  102. ToolButton8: TToolButton;
  103. ToolHotSpot: TAction;
  104. Combo_Ratio: TComboBox;
  105. FileUseImageBrowser: TAction;
  106. ItemUseImageBrowser: TMenuItem;
  107. Label_Ratio: TLabel;
  108. Panel_Ratio: TPanel;
  109. Tool_Aliasing: TToolButton;
  110. ViewPalette: TAction;
  111. ViewStatusBar: TAction;
  112. ImageList48: TBGRAImageList;
  113. MenuShowPalette: TMenuItem;
  114. ToolClone: TAction;
  115. FilterRain: TAction;
  116. BrushRemoveCurrent: TAction;
  117. BrushLoadFromFile: TAction;
  118. BrushCreateGeometric: TAction;
  119. Label_Brush: TLabel;
  120. Label_Spacing: TLabel;
  121. MenuDockToolboxLeft: TMenuItem;
  122. MenuDockToolboxRight: TMenuItem;
  123. MenuUndockToolbox: TMenuItem;
  124. MenuZoomToolbar: TMenuItem;
  125. MenuCopyPasteToolbar: TMenuItem;
  126. MenuCoordinatesToolbar: TMenuItem;
  127. MenuUndoRedoToolbar: TMenuItem;
  128. OpenBrushDialog: TOpenDialog;
  129. Panel_Brush: TPanel;
  130. PopupToolbox: TPopupMenu;
  131. PopupToolbar: TPopupMenu;
  132. ToolBar21: TToolBar;
  133. ToolBrush: TAction;
  134. ToolButton21: TToolButton;
  135. ToolButton22: TToolButton;
  136. ToolButton4: TToolButton;
  137. ToolButton7: TToolButton;
  138. ToolChangeDocking: TAction;
  139. FilterBlurBox: TAction;
  140. EditPasteAsNewLayer: TAction;
  141. ItemDockLayersAndColors: TMenuItem;
  142. ItemFullscreen: TMenuItem;
  143. ItemViewDockToolbox: TMenuItem;
  144. SaveSelectionDialog: TSaveDialog;
  145. SavePictureDialog1: TSaveDialog;
  146. TimerLoadToolWin: TTimer;
  147. FileSaveAsInSameFolder: TAction;
  148. FilePrint: TAction;
  149. FilterNoise: TAction;
  150. ColorPosterize: TAction;
  151. ColorCurves: TAction;
  152. FilterComplementaryColor: TAction;
  153. FilterFunction: TAction;
  154. FilterPhong: TAction;
  155. FileReload: TAction;
  156. MainMenu1: TMainMenu;
  157. MenuFile: TMenuItem;
  158. ViewImageList: TAction;
  159. MenuRecentFiles: TMenuItem;
  160. ItemDonate: TMenuItem;
  161. MenuLanguage: TMenuItem;
  162. ItemQuitSeparator: TMenuItem;
  163. ItemQuit: TMenuItem;
  164. MenuEdit: TMenuItem;
  165. MenuSelect: TMenuItem;
  166. MenuView: TMenuItem;
  167. MenuImage: TMenuItem;
  168. MenuRemoveTransparency: TMenuItem;
  169. MenuColors: TMenuItem;
  170. MenuTool: TMenuItem;
  171. MenuFilter: TMenuItem;
  172. MenuRadialBlur: TMenuItem;
  173. MenuRender: TMenuItem;
  174. MenuHelp: TMenuItem;
  175. Open3DObjectDialog: TOpenDialog;
  176. Panel_PerspectiveOption: TPanel;
  177. Perspective_TwoPlanes: TToolButton;
  178. ToolBar18: TToolBar;
  179. ToolBar19: TToolBar;
  180. ToolBar20: TToolBar;
  181. Tool_CurveMovePoint: TToolButton;
  182. Tool_CurveModeAuto: TToolButton;
  183. ToolLayerMapping: TAction;
  184. ImageFlatten: TAction;
  185. LayerRotate: TAction;
  186. LayerMove: TAction;
  187. LayerFromFile: TAction;
  188. LayerMergeOver: TAction;
  189. LayerDuplicate: TAction;
  190. LayerRemoveCurrent: TAction;
  191. LayerAddNew: TAction;
  192. LayerVerticalFlip: TAction;
  193. LayerHorizontalFlip: TAction;
  194. ImageCropLayer: TAction;
  195. Tool_CurveModeAngle: TToolButton;
  196. Tool_EraseAlpha: TToolButton;
  197. Tool_EraseBlur: TToolButton;
  198. Tool_CurveModeCurve: TToolButton;
  199. ViewLayerStackButton: TAction;
  200. ViewLayerStack: TAction;
  201. FileImport3D: TAction;
  202. ToolTextureMapping: TAction;
  203. EditSelection: TAction;
  204. FilterClearTypeInverse: TAction;
  205. FilterClearType: TAction;
  206. ToolPhong: TAction;
  207. FileLoadSelection: TAction;
  208. FileSaveSelectionAs: TAction;
  209. ToolText: TAction;
  210. FilterPixelate: TAction;
  211. EditPasteAsNew: TAction;
  212. ViewGrid: TAction;
  213. EmbeddedCancel: TAction;
  214. EmbeddedValidate: TAction;
  215. RenderWoodVertical: TAction;
  216. FilterTwirl: TAction;
  217. ToolDeformation: TAction;
  218. RenderWater: TAction;
  219. RenderMarble: TAction;
  220. RenderRoundStone: TAction;
  221. RenderStone: TAction;
  222. RenderSnowPrint: TAction;
  223. RenderCamouflage: TAction;
  224. RenderMetalFloor: TAction;
  225. RenderCyclicPerlinNoise: TAction;
  226. RenderWood: TAction;
  227. RenderPlastik: TAction;
  228. RenderPerlinNoise: TAction;
  229. FilterBlurFast: TAction;
  230. FilterPlane: TAction;
  231. ToolMagicWand: TAction;
  232. ImageRepeat: TAction;
  233. RenderCustomWater: TAction;
  234. HelpAbout: TAction;
  235. HelpIndex: TAction;
  236. ColorColorize: TAction;
  237. ColorShiftColors: TAction;
  238. FilterLinearNegative: TAction;
  239. ColorLightness: TAction;
  240. ColorIntensity: TAction;
  241. RenderClouds: TAction;
  242. ImageRotateCCW: TAction;
  243. ImageRotateCW: TAction;
  244. ImageChangeCanvasSize: TAction;
  245. ImageFillBackground: TAction;
  246. ImageClearAlpha: TAction;
  247. EditSelectionFit: TAction;
  248. ImageCrop: TAction;
  249. FilterCylinder: TAction;
  250. FilterSphere: TAction;
  251. ViewColors: TAction;
  252. ViewToolbox: TAction;
  253. EditSelectAll: TAction;
  254. FilterContour: TAction;
  255. FilterBlurCustom: TAction;
  256. FilterGrayscale: TAction;
  257. ToolRotateSelection: TAction;
  258. EditDeleteSelection: TAction;
  259. EditCut: TAction;
  260. EditPaste: TAction;
  261. EditCopy: TAction;
  262. ToolMoveSelection: TAction;
  263. ToolSelectPen: TAction;
  264. EditInvertSelection: TAction;
  265. EditDeselect: TAction;
  266. ToolSelectSpline: TAction;
  267. ToolSelectPoly: TAction;
  268. ToolSelectEllipse: TAction;
  269. ToolSelectRect: TAction;
  270. FilterNegative: TAction;
  271. FilterNormalize: TAction;
  272. FilterEmboss: TAction;
  273. FilterBlurMotion: TAction;
  274. FilterBlurPrecise: TAction;
  275. FilterBlurDisk: TAction;
  276. FilterBlurCorona: TAction;
  277. FilterBlurRadial: TAction;
  278. ViewZoomFit: TAction;
  279. ViewZoomOriginal: TAction;
  280. FilterSharpen: TAction;
  281. FilterSmooth: TAction;
  282. ImageSmartZoom3: TAction;
  283. FilterMedian: TAction;
  284. ImageResample: TAction;
  285. EditRedo: TAction;
  286. EditUndo: TAction;
  287. ImageHorizontalFlip: TAction;
  288. ImageVerticalFlip: TAction;
  289. ToolGradient: TAction;
  290. ToolFloodfill: TAction;
  291. ToolSpline: TAction;
  292. ToolEraser: TAction;
  293. ToolPolygon: TAction;
  294. ToolColorPicker: TAction;
  295. ToolEllipse: TAction;
  296. ToolRect: TAction;
  297. ToolPen: TAction;
  298. ToolHand: TAction;
  299. ViewZoomOut: TAction;
  300. ViewZoomIn: TAction;
  301. FileQuit: TAction;
  302. FileSaveAs: TAction;
  303. FileSave: TAction;
  304. FileOpen: TAction;
  305. FileNew: TAction;
  306. Edit_Zoom: TEdit;
  307. OpenTextureDialog: TOpenDialog;
  308. OpenPictureDialog1: TOpenDialog;
  309. Panel_TextOutline: TPanel;
  310. TimerUpdate: TTimer;
  311. Label_OutlineWidth: TLabel;
  312. ToolBar17: TToolBar;
  313. Tool_TextAlignLeft: TToolButton;
  314. Tool_TextAlignCenter: TToolButton;
  315. Tool_TextAlignRight: TToolButton;
  316. Tool_TextOutline: TToolButton;
  317. ToolButton_ViewLayerStack: TToolButton;
  318. Label_Altitude: TLabel;
  319. Label_PhongBorder: TLabel;
  320. Label_CurrentDiff: TLabel;
  321. Label_Shape: TLabel;
  322. Panel_PhongShape: TPanel;
  323. Panel_Altitude: TPanel;
  324. ToolBar16: TToolBar;
  325. Tool_PhongShapeVerticalCone: TToolButton;
  326. Tool_PhongShapeHorizontalCylinder: TToolButton;
  327. Tool_PhongShapeVerticalCylinder: TToolButton;
  328. Tool_TextPhong: TToolButton;
  329. Tool_PhongShapeSphere: TToolButton;
  330. Tool_PhongShapeRectangle: TToolButton;
  331. Tool_PhongShapeCone: TToolButton;
  332. Tool_PhongShapeRoundRect: TToolButton;
  333. FontDialog1: TFontDialog;
  334. LoadSelectionDialog: TOpenPictureDialog;
  335. Label_Text: TLabel;
  336. Panel_Text: TPanel;
  337. ToolBar15: TToolBar;
  338. Tool_TextFont: TToolButton;
  339. PaintBox_Picture: TPaintBox;
  340. PaintBox_PenPreview: TPaintBox;
  341. Panel_Embedded: TPanel;
  342. Panel_PenWidthPreview: TPanel;
  343. Panel_SplineStyle: TPanel;
  344. Label_Curve: TLabel;
  345. Panel_Grid: TPanel;
  346. Label_Grid: TLabel;
  347. Label_GridX: TLabel;
  348. TimerHidePenPreview: TTimer;
  349. ToolBar13: TToolBar;
  350. ToolBar14: TToolBar;
  351. ToolButton19: TToolButton;
  352. ToolButton20: TToolButton;
  353. ToolButton3: TToolButton;
  354. Tool_GridMoveWithoutDeformation: TToolButton;
  355. Panel_PenStyle: TPanel;
  356. Panel_LineCap: TPanel;
  357. Panel_JoinStyle: TPanel;
  358. ToolBar11: TToolBar;
  359. Tool_JoinBevel: TToolButton;
  360. Tool_JoinRound: TToolButton;
  361. Tool_CapSquare: TToolButton;
  362. Tool_CapFlat: TToolButton;
  363. Tool_CapRound: TToolButton;
  364. ToolBar10: TToolBar;
  365. Tool_JoinMiter: TToolButton;
  366. Label_Coordinates: TLabel;
  367. Panel_Coordinates: TPanel;
  368. Label_Eraser: TLabel;
  369. Image_CurrentTool: TImage;
  370. Label_CurrentZoom: TLabel;
  371. Panel_Undo: TPanel;
  372. Panel_CopyPaste: TPanel;
  373. Panel_ToolbarBackground: TPanel;
  374. Panel_File: TPanel;
  375. Panel_Tool: TPanel;
  376. Panel_Zoom: TPanel;
  377. Panel_ColorDiff: TPanel;
  378. Panel_PenWidth: TPanel;
  379. Panel_Eraser: TPanel;
  380. Panel_Tolerance: TPanel;
  381. Panel_ShapeOption: TPanel;
  382. Label_PenWidth: TLabel;
  383. Tool_DrawShapeBorder: TToolButton;
  384. Tool_FillShape: TToolButton;
  385. Label_Tolerance: TLabel;
  386. ToolBar2: TToolBar;
  387. ToolBar3: TToolBar;
  388. ToolBar5: TToolBar;
  389. ToolBar6: TToolBar;
  390. ToolBar8: TToolBar;
  391. ToolBar9: TToolBar;
  392. ToolButton14: TToolButton;
  393. ToolButton15: TToolButton;
  394. ToolButton16: TToolButton;
  395. ToolButton17: TToolButton;
  396. ToolButton18: TToolButton;
  397. ToolButton23: TToolButton;
  398. ToolButton24: TToolButton;
  399. ToolButton29: TToolButton;
  400. ToolButton30: TToolButton;
  401. ToolButton5: TToolButton;
  402. ToolButton6: TToolButton;
  403. Tool_ProgressiveFloodfill: TToolButton;
  404. ToolButton_ZoomOriginal: TToolButton;
  405. ColorDialog1: TColorDialog;
  406. ActionList1: TActionList;
  407. ImageList16: TBGRAImageList;
  408. procedure BrushCreateGeometricExecute(Sender: TObject);
  409. procedure BrushCreateGeometricUpdate(Sender: TObject);
  410. procedure BrushLoadFromFileExecute(Sender: TObject);
  411. procedure BrushLoadFromFileUpdate(Sender: TObject);
  412. procedure BrushRemoveCurrentExecute(Sender: TObject);
  413. procedure BrushRemoveCurrentUpdate(Sender: TObject);
  414. procedure ComboBox_ArrowEndChange(Sender: TObject);
  415. procedure ComboBox_ArrowEndDrawItem({%H-}Control: TWinControl; Index: Integer;
  416. ARect: TRect; State: TOwnerDrawState);
  417. procedure ComboBox_ArrowEndDrawSelectedItem(Sender: TObject; const ABGRA: TBGRABitmap;
  418. AState: TBCButtonState; ARect: TRect);
  419. procedure ComboBox_ArrowStartChange(Sender: TObject);
  420. procedure ComboBox_ArrowStartDrawItem({%H-}Control: TWinControl; Index: Integer;
  421. ARect: TRect; State: TOwnerDrawState);
  422. procedure ComboBox_ArrowStartDrawSelectedItem(Sender: TObject; const ABGRA: TBGRABitmap;
  423. AState: TBCButtonState; ARect: TRect);
  424. procedure ComboBox_BrushSelectChange(Sender: TObject);
  425. procedure ComboBox_BrushSelectDrawItem({%H-}Control: TWinControl;
  426. Index: Integer; ARect: TRect; State: TOwnerDrawState);
  427. procedure ComboBox_BrushSelectDrawSelectedItem(Sender: TObject; const ABGRA: TBGRABitmap;
  428. AState: TBCButtonState; ARect: TRect);
  429. procedure Combo_RatioChange(Sender: TObject);
  430. procedure EditCopyExecute(Sender: TObject);
  431. procedure EditCopyUpdate(Sender: TObject);
  432. procedure EditCutExecute(Sender: TObject);
  433. procedure EditCutUpdate(Sender: TObject);
  434. procedure EditDeleteSelectionExecute(Sender: TObject);
  435. procedure EditDeleteSelectionUpdate(Sender: TObject);
  436. procedure EditMoveDownExecute(Sender: TObject);
  437. procedure EditMoveDownUpdate(Sender: TObject);
  438. procedure EditMoveToBackExecute(Sender: TObject);
  439. procedure EditMoveToBackUpdate(Sender: TObject);
  440. procedure EditMoveToFrontExecute(Sender: TObject);
  441. procedure EditMoveToFrontUpdate(Sender: TObject);
  442. procedure EditMoveUpExecute(Sender: TObject);
  443. procedure EditMoveUpUpdate(Sender: TObject);
  444. procedure EditPasteExecute(Sender: TObject);
  445. procedure EditSelectionFitUpdate(Sender: TObject);
  446. procedure EditSelectionUpdate(Sender: TObject);
  447. procedure EditShapeAlignBottomExecute(Sender: TObject);
  448. procedure EditShapeAlignBottomUpdate(Sender: TObject);
  449. procedure EditShapeAlignLeftExecute(Sender: TObject);
  450. procedure EditShapeAlignLeftUpdate(Sender: TObject);
  451. procedure EditShapeAlignRightExecute(Sender: TObject);
  452. procedure EditShapeAlignRightUpdate(Sender: TObject);
  453. procedure EditShapeAlignTopExecute(Sender: TObject);
  454. procedure EditShapeAlignTopUpdate(Sender: TObject);
  455. procedure EditShapeCenterHorizontallyExecute(Sender: TObject);
  456. procedure EditShapeCenterHorizontallyUpdate(Sender: TObject);
  457. procedure EditShapeCenterVerticallyExecute(Sender: TObject);
  458. procedure EditShapeCenterVerticallyUpdate(Sender: TObject);
  459. procedure EditShapeToCurveExecute(Sender: TObject);
  460. procedure EditShapeToCurveUpdate(Sender: TObject);
  461. procedure FileChooseEntryExecute(Sender: TObject);
  462. procedure FileChooseEntryUpdate(Sender: TObject);
  463. procedure FileExportExecute(Sender: TObject);
  464. procedure FileImport3DUpdate(Sender: TObject);
  465. procedure FilePrintExecute(Sender: TObject);
  466. procedure FileRememberSaveFormatExecute(Sender: TObject);
  467. procedure FileRunScriptExecute(Sender: TObject);
  468. procedure FileSaveAsInSameFolderExecute(Sender: TObject);
  469. procedure FileSaveAsInSameFolderUpdate(Sender: TObject);
  470. procedure FileUseImageBrowserExecute(Sender: TObject);
  471. procedure FileUseImageBrowserUpdate(Sender: TObject);
  472. procedure ForgetDialogAnswersExecute(Sender: TObject);
  473. procedure FormClose(Sender: TObject; var {%H-}CloseAction: TCloseAction);
  474. procedure FormMouseLeave(Sender: TObject);
  475. procedure FormWindowStateChange(Sender: TObject);
  476. procedure ItemDockLayersAndColorsClick(Sender: TObject);
  477. procedure ItemFullscreenClick(Sender: TObject);
  478. procedure ItemViewDockToolboxClick(Sender: TObject);
  479. procedure LayerRasterizeUpdate(Sender: TObject);
  480. procedure LayerZoomExecute(Sender: TObject);
  481. procedure LayerZoomUpdate(Sender: TObject);
  482. procedure MenuCoordinatesToolbarClick(Sender: TObject);
  483. procedure MenuCopyPasteToolbarClick(Sender: TObject);
  484. procedure MenuDockToolboxLeftClick(Sender: TObject);
  485. procedure MenuDockToolboxRightClick(Sender: TObject);
  486. procedure MenuFileToolbarClick(Sender: TObject);
  487. procedure MenuShowPaletteClick(Sender: TObject);
  488. procedure MenuUndockToolboxClick(Sender: TObject);
  489. procedure MenuUndoRedoToolbarClick(Sender: TObject);
  490. procedure MenuViewClick(Sender: TObject);
  491. procedure MenuZoomToolbarClick(Sender: TObject);
  492. procedure PaintBox_PenPreviewMouseDown(Sender: TObject;
  493. {%H-}Button: TMouseButton; {%H-}Shift: TShiftState; X, Y: Integer);
  494. procedure PopupToolbarPopup(Sender: TObject);
  495. procedure PopupToolboxPopup(Sender: TObject);
  496. procedure SelectionHorizontalFlipUpdate(Sender: TObject);
  497. procedure SelectionVerticalFlipUpdate(Sender: TObject);
  498. procedure SpinEdit_PhongBorderSizeChange(Sender: TObject; AByUser: boolean);
  499. procedure Combo_SplineStyleChange(Sender: TObject);
  500. procedure EditDeselectUpdate(Sender: TObject);
  501. procedure EditPasteUpdate(Sender: TObject);
  502. procedure EditRedoUpdate(Sender: TObject);
  503. procedure EditSelectionExecute(Sender: TObject);
  504. procedure EditUndoUpdate(Sender: TObject);
  505. procedure EmbeddedCancelExecute(Sender: TObject);
  506. procedure EmbeddedValidateExecute(Sender: TObject);
  507. procedure FileImport3DExecute(Sender: TObject);
  508. procedure FileReloadUpdate(Sender: TObject);
  509. procedure FileSaveSelectionAsUpdate(Sender: TObject);
  510. procedure FormDropFiles(Sender: TObject; const FileNames: array of String);
  511. procedure FormKeyUp(Sender: TObject; var Key: Word; {%H-}Shift: TShiftState);
  512. procedure FormMouseEnter(Sender: TObject);
  513. procedure FormUTF8KeyPress(Sender: TObject; var UTF8Key: TUTF8Char);
  514. procedure ImageCropLayerUpdate(Sender: TObject);
  515. procedure ImageFlattenExecute(Sender: TObject);
  516. procedure ImageFlattenUpdate(Sender: TObject);
  517. procedure LayerAddNewUpdate(Sender: TObject);
  518. procedure LayerDuplicateUpdate(Sender: TObject);
  519. procedure LayerFromFileExecute(Sender: TObject);
  520. procedure LayerMergeOverUpdate(Sender: TObject);
  521. procedure LayerMoveExecute(Sender: TObject);
  522. procedure LayerMoveUpdate(Sender: TObject);
  523. procedure LayerRemoveCurrentUpdate(Sender: TObject);
  524. procedure LayerRotateExecute(Sender: TObject);
  525. procedure LayerRotateUpdate(Sender: TObject);
  526. procedure ItemDonateClick(Sender: TObject);
  527. procedure PaintBox_PictureMouseEnter(Sender: TObject);
  528. procedure Perspective_TwoPlanesClick(Sender: TObject);
  529. procedure SpinEdit_ShapeAltitudeChange(Sender: TObject; AByUser: boolean);
  530. procedure SpinEdit_BrushSpacingChange(Sender: TObject; AByUser: boolean);
  531. procedure SpinEdit_TextSizeChange(Sender: TObject; AByUser: boolean);
  532. procedure SpinEdit_TextBlurChange(Sender: TObject; AByUser: boolean);
  533. procedure GridNb_SpinEditChange(Sender: TObject; AByUser: boolean);
  534. procedure TimerArrangeTimer(Sender: TObject);
  535. procedure TimerHideFillTimer(Sender: TObject);
  536. procedure ToolButton_DonateClick(Sender: TObject);
  537. procedure VectorialFill_TextureClick(Sender: TObject);
  538. procedure PaintBox_PenPreviewPaint(Sender: TObject);
  539. procedure PaintBox_PictureMouseDown(Sender: TObject; Button: TMouseButton;
  540. Shift: TShiftState; X, Y: Integer);
  541. procedure PaintBox_PictureMouseMove(Sender: TObject; Shift: TShiftState; X,
  542. Y: Integer);
  543. procedure PaintBox_PictureMouseUp(Sender: TObject; Button: TMouseButton;
  544. Shift: TShiftState; X, Y: Integer);
  545. procedure PaintBox_PictureMouseWheel(Sender: TObject; Shift: TShiftState;
  546. WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  547. procedure PaintBox_PicturePaint(Sender: TObject);
  548. procedure Panel_PenWidthMouseMove(Sender: TObject; {%H-}Shift: TShiftState; {%H-}X,
  549. {%H-}Y: Integer);
  550. procedure Panel_ToolbarBackgroundMouseMove(Sender: TObject;
  551. {%H-}Shift: TShiftState; {%H-}X, {%H-}Y: Integer);
  552. procedure SpinEdit_PenWidthMouseMove(Sender: TObject; {%H-}Shift: TShiftState;
  553. {%H-}X, {%H-}Y: Integer);
  554. procedure RenderAnyExecute(Sender: TObject);
  555. procedure FilterAnyExecute(Sender: TObject);
  556. procedure TimerLoadToolWinTimer(Sender: TObject);
  557. procedure ToolAnyExecute(Sender: TObject);
  558. procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
  559. procedure FormHide(Sender: TObject);
  560. procedure FormMouseWheel(Sender: TObject; {%H-}Shift: TShiftState;
  561. WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  562. procedure HelpAboutExecute(Sender: TObject);
  563. procedure HelpIndexExecute(Sender: TObject);
  564. procedure ImageChangeCanvasSizeExecute(Sender: TObject);
  565. procedure ImageCropUpdate(Sender: TObject);
  566. procedure ImageRepeatExecute(Sender: TObject);
  567. procedure MenuFileClick(Sender: TObject);
  568. procedure RecentFileClick(Sender: TObject);
  569. procedure LanguageClick(Sender: TObject);
  570. procedure SpinEdit_TextOutlineWidthChange(Sender: TObject; AByUser: boolean);
  571. procedure SpinEdit_TextShadowXChange(Sender: TObject; AByUser: boolean);
  572. procedure SpinEdit_TextShadowYChange(Sender: TObject; AByUser: boolean);
  573. procedure TimerUpdateTimer(Sender: TObject);
  574. procedure TimerHidePenPreviewTimer(Sender: TObject);
  575. procedure ToolChangeDockingExecute(Sender: TObject);
  576. procedure ToolHotSpotUpdate(Sender: TObject);
  577. procedure ToolRotateSelectionUpdate(Sender: TObject);
  578. procedure Tool_CurveModeAngleClick(Sender: TObject);
  579. procedure Tool_CurveModeAutoClick(Sender: TObject);
  580. procedure Tool_CurveModeCurveClick(Sender: TObject);
  581. procedure Tool_CurveMovePointClick(Sender: TObject);
  582. procedure Tool_EraseOptionClick(Sender: TObject);
  583. procedure Tool_PhongShapeHorizontalCylinderClick(Sender: TObject);
  584. procedure Tool_PhongShapeVerticalConeClick(Sender: TObject);
  585. procedure Tool_PhongShapeVerticalCylinderClick(Sender: TObject);
  586. procedure ToolLayerMappingUpdate(Sender: TObject);
  587. procedure Tool_TextAlignClick(Sender: TObject);
  588. procedure Tool_TextPhongClick(Sender: TObject);
  589. procedure Tool_GridMoveWithoutDeformationClick(Sender: TObject);
  590. procedure Tool_PhongShapeConeClick(Sender: TObject);
  591. procedure Tool_PhongShapeRectangleClick(Sender: TObject);
  592. procedure Tool_PhongShapeRoundRectClick(Sender: TObject);
  593. procedure Tool_PhongShapeSphereClick(Sender: TObject);
  594. procedure Tool_CapFlatClick(Sender: TObject);
  595. procedure Tool_CapRoundClick(Sender: TObject);
  596. procedure Tool_CapSquareClick(Sender: TObject);
  597. procedure Tool_JoinBevelClick(Sender: TObject);
  598. procedure Tool_JoinRoundClick(Sender: TObject);
  599. procedure Tool_JoinMiterClick(Sender: TObject);
  600. procedure Tool_TextFontClick(Sender: TObject);
  601. procedure Tool_TextOutlineClick(Sender: TObject);
  602. procedure Tool_TextShadowClick(Sender: TObject);
  603. procedure ViewColorsExecute(Sender: TObject);
  604. procedure ViewColorsUpdate(Sender: TObject);
  605. procedure ViewDarkThemeExecute(Sender: TObject);
  606. procedure ViewDarkThemeUpdate(Sender: TObject);
  607. procedure ViewGridUpdate(Sender: TObject);
  608. procedure ViewImageListExecute(Sender: TObject);
  609. procedure ViewLayerStackButtonUpdate(Sender: TObject);
  610. procedure ViewLayerStackExecute(Sender: TObject);
  611. procedure ViewLayerStackUpdate(Sender: TObject);
  612. procedure ViewPaletteExecute(Sender: TObject);
  613. procedure ViewPaletteUpdate(Sender: TObject);
  614. procedure ViewStatusBarExecute(Sender: TObject);
  615. procedure ViewStatusBarUpdate(Sender: TObject);
  616. procedure ViewToolboxUpdate(Sender: TObject);
  617. procedure ViewImagelistUpdate(Sender: TObject);
  618. procedure SpinEdit_EraserChange(Sender: TObject; AByUser: boolean);
  619. procedure ScriptExecute(Sender: TObject);
  620. procedure FileQuitExecute(Sender: TObject);
  621. procedure FileSaveUpdate(Sender: TObject);
  622. procedure FormDestroy(Sender: TObject);
  623. procedure FormKeyDown(Sender: TObject; var Key: Word; {%H-}Shift: TShiftState);
  624. procedure FormResize(Sender: TObject);
  625. procedure ImageActionExecute(Sender: TObject);
  626. procedure FormCreate(Sender: TObject);
  627. procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
  628. Shift: TShiftState; X, Y: Integer);
  629. procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  630. procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
  631. Shift: TShiftState; X, Y: Integer);
  632. procedure FormPaint(Sender: TObject);
  633. procedure FormShow(Sender: TObject);
  634. procedure Image_SwapColorsMouseDown(Sender: TObject; {%H-}Button: TMouseButton;
  635. {%H-}Shift: TShiftState; {%H-}X, {%H-}Y: Integer);
  636. procedure SpinEdit_PenWidthChange(Sender: TObject; AByUser: boolean);
  637. procedure Tool_CloseShapeClick(Sender: TObject);
  638. procedure VectorialFill_ChooseColor({%H-}ASender: TObject; AButton: TMouseButton;
  639. AColorIndex: integer; var {%H-}AColorValue: TBGRAPixel; out AHandled: boolean);
  640. procedure SpinEdit_ArrowSizeChange(Sender: TObject; AByUser: boolean);
  641. procedure SpinEdit_ToleranceChange(Sender: TObject; AByUser: boolean);
  642. procedure Tool_ProgressiveFloodfillClick(Sender: TObject);
  643. procedure Tool_AliasingClick(Sender: TObject);
  644. procedure Tool_DrawShapeBorderClick(Sender: TObject);
  645. procedure Tool_FillShapeClick(Sender: TObject);
  646. procedure ToolMoveSelectionUpdate(Sender: TObject);
  647. procedure ViewToolboxExecute(Sender: TObject);
  648. procedure SpinEdit_PenWidthExit(Sender: TObject);
  649. procedure SpinEdit_GridNbExit(Sender: TObject);
  650. procedure ViewWorkspaceColorExecute(Sender: TObject);
  651. procedure WMEraseBkgnd(var {%H-}Message: TLMEraseBkgnd); message LM_ERASEBKGND;
  652. private
  653. procedure ComboBox_PenStyleChange(Sender: TObject);
  654. procedure ComboBox_PenStyleDrawItem({%H-}Control: TWinControl; Index: Integer;
  655. ARect: TRect; State: TOwnerDrawState);
  656. procedure ComboBox_PenStyleDrawSelectedItem(Sender: TObject;
  657. const ABGRA: TBGRABitmap; AState: TBCButtonState; ARect: TRect);
  658. function GetImage: TLazPaintImage;
  659. procedure ManagerBrushChanged(Sender: TObject);
  660. procedure ManagerBrushListChanged(Sender: TObject);
  661. procedure ManagerDeformationGridSizeChanged(Sender: TObject);
  662. procedure ManagerEraserChanged(Sender: TObject);
  663. procedure ManagerFloodFillOptionChanged(Sender: TObject);
  664. procedure ManagerJoinStyleChanged(Sender: TObject);
  665. procedure ManagerLineCapChanged(Sender: TObject);
  666. procedure ManagerPerspectiveOptionChanged(Sender: TObject);
  667. procedure ManagerPhongShapeChanged(Sender: TObject);
  668. procedure ManagerPenStyleChanged(Sender: TObject);
  669. procedure ManagerPenWidthChanged(Sender: TObject);
  670. procedure ManagerShapeRatioChanged(Sender: TObject);
  671. procedure ManagerSplineStyleChanged(Sender: TObject);
  672. procedure ManagerTextAlignChanged(Sender: TObject);
  673. procedure ManagerTextFontChanged(Sender: TObject);
  674. procedure ManagerTextOutlineChanged(Sender: TObject);
  675. procedure ManagerTextPhongChanged(Sender: TObject);
  676. procedure ManagerTextShadowChanged(Sender: TObject);
  677. procedure ManagerShapeOptionChanged(Sender: TObject);
  678. procedure ManagerToleranceChanged(Sender: TObject);
  679. procedure ManagerToolbarChanged(Sender: TObject);
  680. procedure Perspective_RepeatClick(Sender: TObject);
  681. function ScriptShowColorDialog(AVars: TVariableSet): TScriptResult;
  682. procedure VectorialFill_Change(Sender: TObject);
  683. procedure VectorialFill_TypeChange(Sender: TObject);
  684. procedure VectorialFill_Resize(Sender: TObject);
  685. procedure VectorialFill_EditGradTexPoints(Sender: TObject);
  686. procedure VectorialFill_AdjustToShape(Sender: TObject);
  687. procedure VectorialFill_ShowBackFill(Sender: TObject; {%H-}Shift: TShiftState; {%H-}X, {%H-}Y: Integer);
  688. procedure VectorialFill_ShowPenFill(Sender: TObject; {%H-}Shift: TShiftState; {%H-}X, {%H-}Y: Integer);
  689. procedure VectorialFill_ShowOutlineFill(Sender: TObject; {%H-}Shift: TShiftState; {%H-}X, {%H-}Y: Integer);
  690. private
  691. { private declarations }
  692. FLayout: TMainFormLayout;
  693. FLastWidth,FLastHeight,FLastBPP,FLastFrameIndex: integer;
  694. {$IFDEF LINUX}
  695. FTopMostHiddenMinimised: TTopMostInfo;
  696. {$ENDIF}
  697. FBrowseImages: TFBrowseImages;
  698. FBrowseSelections: TFBrowseImages;
  699. FBrowseTextures: TFBrowseImages;
  700. FBrowseBrushes: TFBrowseImages;
  701. FSaveImage: TFBrowseImages;
  702. FSaveSelection: TFBrowseImages;
  703. FTablet: TLazTablet;
  704. FLoadInitialDir, FSaveInitialDir, FExportInitialDir: string;
  705. FSaveSelectionInitialFilename: string;
  706. FInFillChange, FInPenWidthChange, FInBrush, FInShapeRatio, FInEraserOption,
  707. FInSplineStyleChange, FInFloodfillOption, FInTolerance,
  708. FInTextFont, FInTextAlign, FInTextShadow,
  709. FInPerspective, FInGridNb: Boolean;
  710. FOnlineUpdater: TLazPaintCustomOnlineUpdater;
  711. FInitialized: boolean;
  712. FShouldArrange: boolean;
  713. btnLeftDown, btnRightDown, btnMiddleDown: boolean;
  714. spacePressed, altPressed, snapPressed, shiftPressed: boolean;
  715. FormMouseMovePos: TPoint;
  716. InFormMouseMove: boolean;
  717. InFormPaint: boolean;
  718. FirstPaint, LoadToolWindow: boolean;
  719. CanCompressOrUpdateStack: boolean;
  720. FShowSelectionNormal: boolean;
  721. FLazPaintInstance: TLazPaintCustomInstance;
  722. Config: TLazPaintConfig;
  723. StartDirectory: string;
  724. previousToolImg: integer;
  725. currentToolLabel: string;
  726. InShowNoPicture: boolean;
  727. FTopMostInfo: TTopMostInfo;
  728. DelayedPaintPicture: boolean;
  729. Panel_LineCap_FullSize: integer;
  730. FCoordinatesCaption: string;
  731. FCoordinatesCaptionCount: NativeInt;
  732. FImageView: TImageView;
  733. FLastPaintDate: TDateTime;
  734. FUpdateStackWhenIdle: boolean;
  735. FToolbarElementsInitDone: boolean;
  736. function GetCurrentPressure: single;
  737. function GetDarkTheme: boolean;
  738. function GetImageAction: TImageActions;
  739. function GetUpdatingPopup: boolean;
  740. function GetUseImageBrowser: boolean;
  741. procedure SetDarkTheme(AValue: boolean);
  742. procedure SetUpdatingPopup(AValue: boolean);
  743. procedure UpdateStatusText;
  744. procedure CreateToolbarElements;
  745. function GetCurrentToolAction: TAction;
  746. procedure RegisterToolbarElements;
  747. procedure InitToolbarElements;
  748. procedure UpdateChooseColors;
  749. procedure UpdateAllowedFillTypes;
  750. procedure UpdateToolOptions;
  751. procedure UpdateEraserToolbar;
  752. procedure UpdatePenStyleToolbar;
  753. procedure UpdateJoinStyleToolbar;
  754. procedure UpdateShapeRatio;
  755. procedure UpdateTextFontToolbar(AForce: boolean);
  756. procedure UpdateTextAlign;
  757. procedure UpdateTextOutlineToolbar;
  758. procedure UpdateTextPhongToolbar;
  759. procedure UpdateTextShadowToolbar;
  760. procedure UpdateLineCapToolbar;
  761. procedure UpdateSplineStyleToolbar;
  762. procedure UpdatePenWidthToolbar;
  763. procedure UpdatePhongToolbar;
  764. procedure UpdateToleranceToolbar;
  765. procedure UpdateDeformationGridToolbar;
  766. procedure UpdateFloodfillToolbar;
  767. procedure UpdatePerspectiveToolbar;
  768. function ShowOpenBrushDialog: boolean;
  769. function TextSpinEditFocused: boolean;
  770. procedure UpdateBrush;
  771. procedure UpdateBrushList;
  772. procedure CreateMenuAndToolbar;
  773. function GetToolManager: TToolManager;
  774. procedure LayoutPictureAreaChange({%H-}ASender: TObject; {%H-}ANewArea: TRect);
  775. function GetCurrentTool: TPaintToolType;
  776. procedure SwitchColors;
  777. function EditingColors: boolean;
  778. procedure Init;
  779. procedure OnLatestVersionUpdate(ANewVersion: string);
  780. procedure ManagerToolChanged({%H-}sender: TToolManager; {%H-}ANewTool: TPaintToolType);
  781. procedure OnQueryExitToolHandler({%H-}sender: TLazPaintImage);
  782. procedure OnZoomChanged({%H-}sender: TZoom; {%H-}ANewZoom: single);
  783. procedure SetLazPaintInstance(const AValue: TLazPaintCustomInstance);
  784. procedure SetShowSelectionNormal(const AValue: boolean);
  785. procedure ToggleToolwindowsVisible;
  786. procedure UpdateTextSizeIncrement;
  787. procedure UpdateToolImage(AForceUpdate: boolean = false);
  788. procedure ToggleGridVisible;
  789. procedure ToggleToolboxVisible;
  790. procedure ToggleImageListVisible;
  791. procedure ToggleColorsVisible;
  792. procedure ToggleLayersVisible;
  793. function ShowColorDialogFor(ATarget: TColorTarget): boolean;
  794. procedure ShowPenPreview(ShouldRepaint: boolean= False);
  795. procedure HidePenPreview(ATimeMs: Integer = 300; AClearTime: boolean = false);
  796. procedure ShowFill(AFillControl: TLCVectorialFillControl; APanel: TPanel);
  797. procedure HideFill(ATimeMs: Integer = 300; AClearTime: boolean = false);
  798. procedure OnPaintHandler;
  799. procedure OnImageChangedHandler({%H-}AEvent: TLazPaintImageObservationEvent);
  800. procedure OnImageRenderChanged({%H-}Sender: TObject);
  801. procedure LabelAutosize(ALabel: TLabel);
  802. procedure AskMergeSelection(ACaption: string);
  803. procedure ReleaseMouseButtons(Shift: TShiftState);
  804. procedure UpdateSpecialKeys({%H-}Shift: TShiftState);
  805. procedure UpdateCurveModeToolbar;
  806. function ShowOpenTextureDialog(ATargetFill: TVectorialFill): boolean;
  807. procedure ShowNoPicture;
  808. procedure SetCurveMode(AMode: TToolSplineMode);
  809. procedure IncreasePenSize;
  810. procedure DecreasePenSize;
  811. function PenSizeDelta(direction: integer): integer;
  812. procedure UpdatePenWidthFromSpinEdit;
  813. procedure UpdateWindowCaption;
  814. procedure ImageCurrentFilenameChanged({%H-}sender: TLazPaintImage);
  815. procedure RegisterScripts(ARegister: Boolean);
  816. function ScriptFileOpen(AVars: TVariableSet): TScriptResult;
  817. function ScriptFileSaveAs(AVars: TVariableSet): TScriptResult;
  818. function ScriptFileSave({%H-}AVars: TVariableSet): TScriptResult;
  819. function ScriptFileNewEntry(AVars: TVariableSet): TScriptResult;
  820. function ScriptFileChooseEntry(AVars: TVariableSet): TScriptResult;
  821. function ScriptFileGetFilename(AVars: TVariableSet): TScriptResult;
  822. function ScriptFileReload({%H-}AVars: TVariableSet): TScriptResult;
  823. function ScriptFileLoadSelection(AVars: TVariableSet): TScriptResult;
  824. function ScriptFileSaveSelectionAs(AVars: TVariableSet): TScriptResult;
  825. function ScriptEditPasteAsNew({%H-}AVars: TVariableSet): TScriptResult;
  826. function ScriptFilter(AVars: TVariableSet): TScriptResult;
  827. function ScriptChooseTool(AVars: TVariableSet): TScriptResult;
  828. function ScriptToolMouse(AVars: TVariableSet): TScriptResult;
  829. function ScriptToolKeys(AVars: TVariableSet): TScriptResult;
  830. function ScriptToolWrite(AVars: TVariableSet): TScriptResult;
  831. function ScriptViewZoomIn({%H-}AVars: TVariableSet): TScriptResult;
  832. function ScriptViewZoomOut({%H-}AVars: TVariableSet): TScriptResult;
  833. function ScriptViewZoomGet({%H-}AVars: TVariableSet): TScriptResult;
  834. function ScriptViewZoomSet({%H-}AVars: TVariableSet): TScriptResult;
  835. function ScriptViewZoomOriginal({%H-}AVars: TVariableSet): TScriptResult;
  836. function ScriptViewZoomFit({%H-}AVars: TVariableSet): TScriptResult;
  837. function ScriptViewGrid(AVars: TVariableSet): TScriptResult;
  838. function ScriptViewGridGet(AVars: TVariableSet): TScriptResult;
  839. function GetScriptContext: TScriptContext;
  840. procedure CallScriptFunction(AName:string); overload;
  841. procedure CallScriptFunction(AParams:TVariableSet); overload;
  842. procedure ZoomFitIfTooBig;
  843. property Scripting: TScriptContext read GetScriptContext;
  844. property Image: TLazPaintImage read GetImage;
  845. public
  846. { public declarations }
  847. UpdateStackOnTimer: boolean;
  848. Zoom: TZoom;
  849. procedure PaintPictureNow;
  850. procedure InvalidatePicture(AInvalidateAll: boolean = true);
  851. function TryOpenFileUTF8(filenameUTF8: string; AddToRecent: Boolean=True;
  852. ALoadedImage: PImageEntry = nil; ASkipDialogIfSingleImage: boolean = false;
  853. AAllowDuplicate: boolean = false; AEntryToLoad: integer = -1): Boolean;
  854. function PictureCanvasOfs: TPoint;
  855. procedure UpdateLineCapBar;
  856. procedure UpdateFillToolbar(AUpdateColorDiff: boolean);
  857. procedure UpdateToolbar;
  858. procedure AddDockedControl(AControl: TControl);
  859. procedure RemoveDockedControl(AControl: TControl);
  860. procedure QueryArrange;
  861. function ChooseTool(Tool : TPaintToolType): boolean;
  862. procedure PictureSelectedLayerIndexChanged({%H-}sender: TLazPaintImage);
  863. procedure PictureSelectedLayerIndexChanging({%H-}sender: TLazPaintImage);
  864. property LazPaintInstance: TLazPaintCustomInstance read FLazPaintInstance write SetLazPaintInstance;
  865. procedure UpdateEditPicture(ADelayed: boolean = false);
  866. property CurrentTool: TPaintToolType read GetCurrentTool;
  867. property CurrentToolAction: TAction read GetCurrentToolAction;
  868. property ShowSelectionNormal: boolean read FShowSelectionNormal write SetShowSelectionNormal;
  869. property ToolManager: TToolManager read GetToolManager;
  870. property Layout: TMainFormLayout read FLayout;
  871. property UseImageBrowser: boolean read GetUseImageBrowser;
  872. property CurrentPressure: single read GetCurrentPressure;
  873. property DarkTheme: boolean read GetDarkTheme write SetDarkTheme;
  874. property Initialized: boolean read FInitialized;
  875. property UpdatingPopup: boolean read GetUpdatingPopup write SetUpdatingPopup;
  876. property ImageAction: TImageActions read GetImageAction;
  877. end;
  878. implementation
  879. uses LCLIntf, BGRAUTF8, ugraph, math, umac, uclipboard, ucursors,
  880. ufilters, ULoadImage, ULoading, UFileExtensions, UBrushType,
  881. ugeometricbrush, UPreviewDialog, UQuestion, BGRALayerOriginal,
  882. BGRATransform, LCVectorPolyShapes, URaw, UFileSystem;
  883. const PenWidthFactor = 10;
  884. { TFMain }
  885. {$i maintoolbar.inc}
  886. procedure TFMain.FormCreate(Sender: TObject);
  887. begin
  888. FInitialized := false;
  889. FLayout := TMainFormLayout.Create(self);
  890. FImageView := nil;
  891. ScaleControl(Self,OriginalDPI);
  892. self.Color := clBtnFace; //toolbar color inherited on mac
  893. {$IFDEF USEPAINTBOXPICTURE}
  894. PaintBox_Picture.SetBounds(0,0,ClientWidth,ClientHeight);
  895. PaintBox_Picture.Visible := True;
  896. {$ENDIF}
  897. //mac interface
  898. CheckActions(ActionList1);
  899. CheckQuitMenu(ItemQuit,ItemQuitSeparator);
  900. {$IFDEF WINDOWS}
  901. StartDirectory := SysToUTF8(ExtractFilePath(Application.ExeName));
  902. {$ELSE}
  903. StartDirectory := GetCurrentDirUTF8;
  904. {$ENDIF}
  905. OpenPictureDialog1.Filter := GetExtensionFilter([eoReadable]);
  906. OpenTextureDialog.Filter := OpenPictureDialog1.Filter;
  907. LoadSelectionDialog.Filter := OpenPictureDialog1.Filter;
  908. OpenBrushDialog.Filter := OpenPictureDialog1.Filter;
  909. SavePictureDialog1.Filter := GetExtensionFilter([eoWritable]);
  910. ExportPictureDialog.Filter := SavePictureDialog1.Filter;
  911. SaveSelectionDialog.Filter := SavePictureDialog1.Filter;
  912. Zoom := TZoom.Create(Label_CurrentZoom,Edit_Zoom,FLayout);
  913. Zoom.OnZoomChanged:= @OnZoomChanged;
  914. previousToolImg:= -1;
  915. //mouse status
  916. btnLeftDown := false;
  917. btnRightDown := false;
  918. btnMiddleDown:= false;
  919. try
  920. FTablet := TLazTablet.Create(self);
  921. except
  922. on ex: exception do
  923. FTablet := nil;
  924. end;
  925. spacePressed:= false;
  926. altPressed:= false;
  927. snapPressed:= false;
  928. shiftPressed:= false;
  929. //recursive calls
  930. InFormMouseMove:= false;
  931. InFormPaint := false;
  932. {$IFDEF LINUX}
  933. ComboBox_BrushSelect.Top := ComboBox_BrushSelect.Top - 2;
  934. ComboBox_BrushSelect.Font.Height := -10;
  935. ComboBox_BrushSelect.Font.Height := -( 10 + ((Panel_Brush.ClientHeight-2)-ComboBox_BrushSelect.Height) );
  936. ComboBox_ArrowStart.Top := ComboBox_ArrowStart.Top - 2;
  937. ComboBox_ArrowStart.Font.Height := ComboBox_BrushSelect.Font.Height;
  938. ComboBox_ArrowEnd.Top := ComboBox_ArrowEnd.Top - 2;
  939. ComboBox_ArrowEnd.Font.Height := ComboBox_BrushSelect.Font.Height;
  940. {$ENDIF}
  941. FLayout.OnPictureAreaChange := @LayoutPictureAreaChange;
  942. FInitialized := true;
  943. FirstPaint := true;
  944. end;
  945. procedure TFMain.CreateMenuAndToolbar;
  946. begin
  947. CreateToolbarElements;
  948. FLayout.DarkTheme := Config.GetDarkTheme;
  949. DarkThemeInstance.Apply(Panel_PenWidthPreview, Config.GetDarkTheme);
  950. end;
  951. function TFMain.GetToolManager: TToolManager;
  952. begin
  953. result := FLazPaintInstance.ToolManager;
  954. end;
  955. procedure TFMain.FormDestroy(Sender: TObject);
  956. begin
  957. if Assigned(Image) then
  958. begin
  959. Image.OnSelectionChanged := nil;
  960. Image.OnSelectedLayerIndexChanged:= nil;
  961. Image.OnSelectedLayerIndexChanging:= nil;
  962. end;
  963. FLayout.ToolBoxPopup := nil;
  964. RegisterScripts(False);
  965. If Assigned(ToolManager) then
  966. begin
  967. if ToolManager.OnToolChanged = @ManagerToolChanged then ToolManager.OnToolChanged := nil;
  968. if ToolManager.OnToolbarChanged = @ManagerToolbarChanged then ToolManager.OnToolbarChanged := nil;
  969. if ToolManager.OnEraserChanged = @ManagerEraserChanged then ToolManager.OnEraserChanged := nil;
  970. if ToolManager.OnPenWidthChanged = @ManagerPenWidthChanged then ToolManager.OnPenWidthChanged := nil;
  971. if ToolManager.OnBrushChanged = @ManagerBrushChanged then ToolManager.OnBrushChanged := nil;
  972. if ToolManager.OnBrushListChanged = @ManagerBrushListChanged then ToolManager.OnBrushListChanged := nil;
  973. if ToolManager.OnPenStyleChanged = @ManagerPenStyleChanged then ToolManager.OnPenStyleChanged := nil;
  974. if ToolManager.OnJoinStyleChanged = @ManagerJoinStyleChanged then ToolManager.OnJoinStyleChanged := nil;
  975. if ToolManager.OnShapeOptionChanged = @ManagerShapeOptionChanged then ToolManager.OnShapeOptionChanged := nil;
  976. if ToolManager.OnShapeRatioChanged = @ManagerShapeRatioChanged then ToolManager.OnShapeRatioChanged := nil;
  977. if ToolManager.OnTextFontChanged = @ManagerTextFontChanged then ToolManager.OnTextFontChanged := nil;
  978. if ToolManager.OnTextAlignChanged = @ManagerTextAlignChanged then ToolManager.OnTextAlignChanged := nil;
  979. if ToolManager.OnTextOutlineChanged = @ManagerTextOutlineChanged then ToolManager.OnTextOutlineChanged := nil;
  980. if ToolManager.OnTextPhongChanged = @ManagerTextPhongChanged then ToolManager.OnTextPhongChanged := nil;
  981. if ToolManager.OnTextShadowChanged = @ManagerTextShadowChanged then ToolManager.OnTextShadowChanged := nil;
  982. if ToolManager.OnLineCapChanged = @ManagerLineCapChanged then ToolManager.OnLineCapChanged := nil;
  983. if ToolManager.OnSplineStyleChanged = @ManagerSplineStyleChanged then ToolManager.OnSplineStyleChanged := nil;
  984. if ToolManager.OnPhongShapeChanged = @ManagerPhongShapeChanged then ToolManager.OnPhongShapeChanged := nil;
  985. if ToolManager.OnToleranceChanged = @ManagerToleranceChanged then ToolManager.OnToleranceChanged := nil;
  986. if ToolManager.OnDeformationGridChanged = @ManagerDeformationGridSizeChanged then ToolManager.OnDeformationGridChanged := nil;
  987. if ToolManager.OnFloodFillOptionChanged = @ManagerFloodFillOptionChanged then ToolManager.OnFloodFillOptionChanged := nil;
  988. if ToolManager.OnPerspectiveOptionChanged = @ManagerPerspectiveOptionChanged then ToolManager.OnPerspectiveOptionChanged := nil;
  989. end;
  990. FreeAndNil(Zoom);
  991. FreeAndNil(FOnlineUpdater);
  992. FreeAndNil(FTablet);
  993. FreeAndNil(FBrowseSelections);
  994. FreeAndNil(FBrowseImages);
  995. FreeAndNil(FBrowseTextures);
  996. FreeAndNil(FBrowseBrushes);
  997. if Config.DefaultRememberSaveFormat then
  998. begin
  999. if Assigned(FSaveImage) and Config.DefaultRememberSaveFormat and Config.DefaultUseImageBrowser then
  1000. Config.SetSaveExtensions(FSaveImage.DefaultExtensions)
  1001. else
  1002. Config.SetSaveExtensions(GetExtensionFilterByIndex([eoWritable], SavePictureDialog1.FilterIndex));
  1003. end;
  1004. FreeAndNil(FSaveImage);
  1005. FreeAndNil(FSaveSelection);
  1006. FreeAndNil(FImageView);
  1007. FreeAndNil(FLayout);
  1008. end;
  1009. procedure TFMain.SetLazPaintInstance(const AValue: TLazPaintCustomInstance);
  1010. begin
  1011. if (FLazPaintInstance = nil) and (AValue <> nil) then
  1012. begin
  1013. FLazPaintInstance := AValue;
  1014. FLayout.LazPaintInstance := AValue;
  1015. Init;
  1016. end;
  1017. end;
  1018. procedure TFMain.Init;
  1019. begin
  1020. FInitialized := false;
  1021. Config := LazPaintInstance.Config;
  1022. CreateMenuAndToolbar;
  1023. if Config.Default3dObjectDirectory = '' then
  1024. Config.SetDefault3dObjectDirectory(StartDirectory);
  1025. MainMenu1.Images := LazPaintInstance.Icons[DoScaleX(20,OriginalDPI)];
  1026. if Config.DefaultRememberStartupTargetDirectory then
  1027. FSaveInitialDir := Config.DefaultStartupTargetDirectory;
  1028. if Config.DefaultRememberStartupExportDirectory then
  1029. FExportInitialDir := Config.DefaultStartupExportDirectory;
  1030. if Config.DefaultRememberStartupSourceDirectory then
  1031. FLoadInitialDir := Config.DefaultStartupSourceDirectory;
  1032. FileRememberSaveFormat.Checked:= Config.DefaultRememberSaveFormat;
  1033. if Config.DefaultRememberSaveFormat then
  1034. begin
  1035. SavePictureDialog1.FilterIndex := GetExtensionFilterIndex([eoWritable], Config.DefaultSaveExtensions);
  1036. ExportPictureDialog.FilterIndex:= SavePictureDialog1.FilterIndex;
  1037. end else
  1038. begin
  1039. SavePictureDialog1.FilterIndex := 1;
  1040. ExportPictureDialog.FilterIndex:= 1;
  1041. end;
  1042. FImageView := TImageView.Create(LazPaintInstance, Zoom,
  1043. {$IFDEF USEPAINTBOXPICTURE}PaintBox_Picture.Canvas{$ELSE}self.Canvas{$ENDIF});
  1044. LazPaintInstance.EmbeddedResult := mrNone;
  1045. Image.OnSelectedLayerIndexChanged:= @PictureSelectedLayerIndexChanged;
  1046. Image.OnSelectedLayerIndexChanging:= @PictureSelectedLayerIndexChanging;
  1047. RegisterToolbarElements;
  1048. ToolManager.SetCurrentToolType(ptHand);
  1049. ToolManager.OnToolChanged := @ManagerToolChanged;
  1050. ToolManager.OnToolbarChanged:=@ManagerToolbarChanged;
  1051. ToolManager.OnEraserChanged:=@ManagerEraserChanged;
  1052. ToolManager.OnPenWidthChanged:= @ManagerPenWidthChanged;
  1053. ToolManager.OnBrushChanged:=@ManagerBrushChanged;
  1054. ToolManager.OnBrushListChanged:=@ManagerBrushListChanged;
  1055. ToolManager.OnPenStyleChanged:= @ManagerPenStyleChanged;
  1056. ToolManager.OnJoinStyleChanged:= @ManagerJoinStyleChanged;
  1057. ToolManager.OnShapeOptionChanged:=@ManagerShapeOptionChanged;
  1058. ToolManager.OnShapeRatioChanged:=@ManagerShapeRatioChanged;
  1059. ToolManager.OnTextFontChanged := @ManagerTextFontChanged;
  1060. ToolManager.OnTextAlignChanged:=@ManagerTextAlignChanged;
  1061. ToolManager.OnTextOutlineChanged:=@ManagerTextOutlineChanged;
  1062. ToolManager.OnTextPhongChanged:=@ManagerTextPhongChanged;
  1063. ToolManager.OnTextShadowChanged:=@ManagerTextShadowChanged;
  1064. ToolManager.OnLineCapChanged := @ManagerLineCapChanged;
  1065. ToolManager.OnSplineStyleChanged:=@ManagerSplineStyleChanged;
  1066. ToolManager.OnPhongShapeChanged:=@ManagerPhongShapeChanged;
  1067. ToolManager.OnToleranceChanged:=@ManagerToleranceChanged;
  1068. ToolManager.OnDeformationGridChanged:=@ManagerDeformationGridSizeChanged;
  1069. ToolManager.OnFloodFillOptionChanged:=@ManagerFloodFillOptionChanged;
  1070. ToolManager.OnPerspectiveOptionChanged:=@ManagerPerspectiveOptionChanged;
  1071. InitToolbarElements;
  1072. Image.CurrentFilenameUTF8 := '';
  1073. ImageAction.SetCurrentBitmap(TBGRABitmap.Create(Config.DefaultImageWidth,Config.DefaultImageHeight,Config.DefaultImageBackgroundColor), false);
  1074. image.ClearUndo;
  1075. image.SetSavedFlag(0, -1, 0);
  1076. ViewGrid.Checked := LazPaintInstance.GridVisible;
  1077. ColorCurves.Visible := not LazPaintInstance.BlackAndWhite;
  1078. ColorColorize.Visible := not LazPaintInstance.BlackAndWhite;
  1079. ColorShiftColors.Visible := not LazPaintInstance.BlackAndWhite;
  1080. FilterComplementaryColor.Visible := not LazPaintInstance.BlackAndWhite;
  1081. ColorIntensity.Visible := not LazPaintInstance.BlackAndWhite;
  1082. FilterGrayscale.Visible := not LazPaintInstance.BlackAndWhite;
  1083. FilterClearType.Visible := not LazPaintInstance.BlackAndWhite;
  1084. FilterClearTypeInverse.Visible := not LazPaintInstance.BlackAndWhite;
  1085. Panel_Embedded.Visible := LazPaintInstance.Embedded;
  1086. Panel_File.Visible := Config.DefaultFileToolbarVisible and not LazPaintInstance.Embedded;
  1087. MenuFileToolbar.Visible:= not LazPaintInstance.Embedded;
  1088. Panel_Zoom.Visible := Config.DefaultZoomToolbarVisible;
  1089. Panel_Undo.Visible := Config.DefaultUndoRedoToolbarVisible;
  1090. Panel_CopyPaste.Visible := Config.DefaultCopyPasteToolbarVisible;
  1091. Panel_Coordinates.Visible := Config.DefaultCoordinatesToolbarVisible;
  1092. FLayout.ToolBoxPopup := PopupToolbox;
  1093. if not LazPaintInstance.Embedded then
  1094. begin
  1095. FOnlineUpdater := LazPaintInstance.GetOnlineUpdater;
  1096. If Assigned(FOnlineUpdater) then
  1097. FOnlineUpdater.OnLatestVersionUpdate := @OnLatestVersionUpdate;
  1098. end;
  1099. if Config.DefaultToolboxWindowVisible and (FLayout.DefaultToolboxDocking <> twWindow) then
  1100. FLayout.ToolBoxVisible := true;
  1101. RegisterScripts(True);
  1102. Image.OnImageChanged.AddObserver(@OnImageChangedHandler);
  1103. Image.OnImageRenderChanged := @OnImageRenderChanged;
  1104. Image.OnQueryExitToolHandler := @OnQueryExitToolHandler;
  1105. Image.Zoom := Zoom;
  1106. UpdateWindowCaption;
  1107. Image.OnCurrentFilenameChanged := @ImageCurrentFilenameChanged;
  1108. FInitialized := true;
  1109. end;
  1110. procedure TFMain.FormShow(Sender: TObject);
  1111. var
  1112. m: TMainFormMenu;
  1113. begin
  1114. if FLayout.Menu = nil then
  1115. begin
  1116. m := TMainFormMenu.Create(LazPaintInstance, ActionList1);
  1117. m.DarkTheme := Config.GetDarkTheme;
  1118. m.PredefinedMainMenus([MenuFile,MenuEdit,MenuSelect,MenuView, MenuImage,MenuRemoveTransparency,
  1119. MenuColors,MenuTool, MenuFilter,MenuRadialBlur, MenuRender,MenuScript,MenuHelp]);
  1120. m.Toolbars([Panel_Embedded,Panel_File,Panel_Zoom,Panel_Undo,Panel_CopyPaste,Panel_Coordinates,
  1121. Panel_Tool,Panel_PenFill,Panel_SwapColor,Panel_BackFill,Panel_ColorDiff,Panel_Grid,
  1122. Panel_ShapeOption,Panel_PenWidth,Panel_PenStyle,Panel_JoinStyle,
  1123. Panel_CloseShape,Panel_LineCap,Panel_Aliasing,
  1124. Panel_SplineStyle,Panel_Eraser,Panel_Tolerance,Panel_Text,Panel_Altitude,Panel_TextShadow,Panel_TextOutline,
  1125. Panel_OutlineFill,Panel_PhongShape,Panel_PerspectiveOption,Panel_Brush,Panel_Ratio,Panel_Donate],Panel_ToolbarBackground);
  1126. m.ImageList := LazPaintInstance.Icons[ScaleY(16, 96)];
  1127. m.Apply;
  1128. FLayout.Menu := m;
  1129. Layout.DockedToolBoxAddButton(ToolChangeDocking);
  1130. Layout.DockedToolBoxAddButton(ToolHand);
  1131. Layout.DockedToolBoxAddButton(ToolColorPicker);
  1132. Layout.DockedToolBoxAddButton(ToolPen);
  1133. Layout.DockedToolBoxAddGroup([ToolBrush, ToolClone]);
  1134. Layout.DockedToolBoxAddButton(ToolEraser);
  1135. Layout.DockedToolBoxAddGroup([ToolFloodfill, ToolGradient]);
  1136. Layout.DockedToolBoxAddButton(ToolEditShape);
  1137. Layout.DockedToolBoxAddGroup([ToolRect, ToolEllipse, ToolPhong]);
  1138. Layout.DockedToolBoxAddGroup([ToolPolyline, ToolOpenedCurve]);
  1139. Layout.DockedToolBoxAddGroup([ToolPolygon, ToolSpline]);
  1140. Layout.DockedToolBoxAddButton(ToolText);
  1141. Layout.DockedToolBoxAddButton(ToolDeformation);
  1142. Layout.DockedToolBoxAddButton(ToolTextureMapping);
  1143. Layout.DockedToolBoxAddGroup([ToolSelectRect, ToolSelectEllipse]);
  1144. Layout.DockedToolBoxAddGroup([ToolSelectPoly, ToolSelectSpline]);
  1145. Layout.DockedToolBoxAddButton(ToolSelectPen);
  1146. Layout.DockedToolBoxAddButton(ToolMagicWand);
  1147. Layout.DockedToolBoxAddGroup([ToolMoveSelection, ToolRotateSelection]);
  1148. Layout.DockedToolBoxAddButton(EditDeselect);
  1149. Layout.DockedToolBoxSetImages(LazPaintInstance.Icons[Config.DefaultIconSize(DoScaleX(20,OriginalDPI))]);
  1150. end;
  1151. LazPaintInstance.ColorToFChooseColor;
  1152. LazPaintInstance.ShowTopmost(FTopMostInfo);
  1153. if Position = poDefault then LazPaintInstance.RestoreMainWindowPosition;
  1154. VectorialFill_Pen.Width := VectorialFill_Pen.PreferredSize.Width;
  1155. VectorialFill_Back.Width := VectorialFill_Back.PreferredSize.Width;
  1156. ToolManager.UpdateContextualToolbars;
  1157. UpdateToolImage;
  1158. UpdateToolBar;
  1159. FShouldArrange := true;
  1160. QueryArrange;
  1161. end;
  1162. procedure TFMain.OnLatestVersionUpdate(ANewVersion: string);
  1163. begin
  1164. if ANewVersion <> LazPaintVersionStr then
  1165. LazPaintInstance.ShowMessage(rsLazPaint, rsLatestVersion + ' ' + ANewVersion);
  1166. end;
  1167. procedure TFMain.RegisterScripts(ARegister: Boolean);
  1168. begin
  1169. Scripting.RegisterScriptFunction('FileOpen',@ScriptFileOpen,ARegister);
  1170. Scripting.RegisterScriptFunction('FileSaveAs',@ScriptFileSaveAs,ARegister);
  1171. Scripting.RegisterScriptFunction('FileSave',@ScriptFileSave,ARegister);
  1172. Scripting.RegisterScriptFunction('GetFileName',@ScriptFileGetFilename,ARegister);
  1173. Scripting.RegisterScriptFunction('FileReload',@ScriptFileReload,ARegister);
  1174. Scripting.RegisterScriptFunction('FileChooseEntry',@ScriptFileChooseEntry,ARegister);
  1175. Scripting.RegisterScriptFunction('FileNewEntry',@ScriptFileNewEntry,ARegister);
  1176. Scripting.RegisterScriptFunction('FileLoadSelection',@ScriptFileLoadSelection,ARegister);
  1177. Scripting.RegisterScriptFunction('FileSaveSelectionAs',@ScriptFileSaveSelectionAs,ARegister);
  1178. Scripting.RegisterScriptFunction('EditPasteAsNew',@ScriptEditPasteAsNew,ARegister);
  1179. Scripting.RegisterScriptFunction('Filter',@ScriptFilter,ARegister);
  1180. Scripting.RegisterScriptFunction('ChooseTool',@ScriptChooseTool,ARegister);
  1181. Scripting.RegisterScriptFunction('ToolMouse',@ScriptToolMouse,ARegister);
  1182. Scripting.RegisterScriptFunction('ToolKeys',@ScriptToolKeys,ARegister);
  1183. Scripting.RegisterScriptFunction('ToolWrite',@ScriptToolWrite,ARegister);
  1184. Scripting.RegisterScriptFunction('ViewZoomIn',@ScriptViewZoomIn,ARegister);
  1185. Scripting.RegisterScriptFunction('ViewZoomOut',@ScriptViewZoomOut,ARegister);
  1186. Scripting.RegisterScriptFunction('ViewZoomGet',@ScriptViewZoomGet,ARegister);
  1187. Scripting.RegisterScriptFunction('ViewZoomSet',@ScriptViewZoomSet,ARegister);
  1188. Scripting.RegisterScriptFunction('ViewZoomOriginal',@ScriptViewZoomOriginal,ARegister);
  1189. Scripting.RegisterScriptFunction('ViewZoomFit',@ScriptViewZoomFit,ARegister);
  1190. Scripting.RegisterScriptFunction('ViewGrid',@ScriptViewGrid,ARegister);
  1191. Scripting.RegisterScriptFunction('ViewGridGet',@ScriptViewGridGet,ARegister);
  1192. Scripting.RegisterScriptFunction('ShowColorDialog',@ScriptShowColorDialog,ARegister);
  1193. end;
  1194. procedure TFMain.FormMouseDown(Sender: TObject; Button: TMouseButton;
  1195. Shift: TShiftState; X, Y: Integer);
  1196. begin
  1197. if not Assigned(FImageView) then exit;
  1198. ReleaseMouseButtons(Shift);
  1199. if not (Button in[mbLeft,mbRight,mbMiddle]) or not FImageView.PictureCoordsDefined then exit;
  1200. CanCompressOrUpdateStack := false;
  1201. if Assigned(LazPaintInstance) then LazPaintInstance.ExitColorEditor;
  1202. Image.OnImageChanged.DelayedStackUpdate := True;
  1203. if btnLeftDown or btnRightDown or btnMiddleDown then exit;
  1204. if Button = mbMiddle then
  1205. begin
  1206. btnMiddleDown:= true;
  1207. if not ToolManager.ToolSleeping and not (ssAlt in Shift) then ToolManager.ToolSleep;
  1208. end;
  1209. if FImageView.PictureCoordsDefined then
  1210. begin
  1211. if Button = mbLeft then
  1212. btnLeftDown := true else
  1213. if Button = mbRight then
  1214. btnRightDown := true;
  1215. if ToolManager.ToolDown(FImageView.FormToBitmap(X,Y),
  1216. btnRightDown{$IFDEF DARWIN} or (ssCtrl in Shift){$ENDIF},
  1217. CurrentPressure) then
  1218. PaintPictureNow;
  1219. UpdateToolbar;
  1220. end;
  1221. end;
  1222. procedure TFMain.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  1223. Y: Integer);
  1224. var BmpPos: TPointF;
  1225. updateForVSCursor: boolean;
  1226. //var tickstart:DWord;
  1227. begin
  1228. //tickstart := GetTickCount;
  1229. if not Assigned(FImageView) then exit;
  1230. ReleaseMouseButtons(Shift);
  1231. UpdateSpecialKeys(Shift);
  1232. HidePenPreview;
  1233. HideFill;
  1234. if LazPaintInstance.TopMostHasFocus then
  1235. begin
  1236. if LazPaintInstance.TopMostOkToUnfocus then
  1237. SafeSetFocus(self)
  1238. else
  1239. exit;
  1240. end;
  1241. if (CurrentTool in[ptText,ptEditShape]) and TextSpinEditFocused then VectorialFill_Pen.SetFocus;
  1242. Image.CurrentState.LayeredBitmap.EditorFocused := true;
  1243. FormMouseMovePos := Point(X,Y);
  1244. if InFormMouseMove then exit;
  1245. InFormMouseMove := True;
  1246. if not FImageView.PictureCoordsDefined then
  1247. Application.ProcessMessages; //empty message stack
  1248. if not FImageView.PictureCoordsDefined then
  1249. begin
  1250. InFormMouseMove:= false;
  1251. exit;
  1252. end;
  1253. BmpPos := FImageView.FormToBitmap(FormMouseMovePos);
  1254. FCoordinatesCaption := IntToStr(round(BmpPos.X))+','+IntToStr(round(BmpPos.Y));
  1255. Inc(FCoordinatesCaptionCount);
  1256. if FCoordinatesCaptionCount > 8 then
  1257. begin
  1258. FCoordinatesCaptionCount := 0;
  1259. Label_Coordinates.caption := FCoordinatesCaption;
  1260. Label_Coordinates.Update;
  1261. UpdateStatusText;
  1262. end;
  1263. updateForVSCursor:= false;
  1264. if ToolManager.ToolMove(BmpPos,CurrentPressure) then
  1265. begin
  1266. FImageView.UpdatePicture(PictureCanvasOfs, FLayout.WorkArea, self);
  1267. end else
  1268. updateForVSCursor := true;
  1269. UpdateToolbar;
  1270. if updateForVSCursor then
  1271. FImageView.UpdateCursor(X,Y, PictureCanvasOfs, FLayout.WorkArea,
  1272. {$IFDEF USEPAINTBOXPICTURE}PaintBox_Picture{$ELSE}self{$ENDIF},
  1273. Point(0,0), self);
  1274. if ToolManager.ToolSleeping and not spacePressed and not btnLeftDown and not btnRightDown
  1275. and not btnMiddleDown then
  1276. ToolManager.ToolWakeUp;
  1277. InFormMouseMove := False;
  1278. //Canvas.TextOut(FLayout.WorkArea.Left,FLayout.WorkArea.Top,inttostr(GetTickCount-tickstart)+' ');
  1279. end;
  1280. procedure TFMain.FormMouseUp(Sender: TObject; Button: TMouseButton;
  1281. Shift: TShiftState; X, Y: Integer);
  1282. var redraw: boolean;
  1283. begin
  1284. if not Assigned(FImageView) then exit;
  1285. redraw := false;
  1286. if (btnLeftDown and (Button = mbLeft)) or (btnRightDown and (Button=mbRight))
  1287. or (btnMiddleDown and (Button = mbMiddle)) then
  1288. begin
  1289. if FImageView.PictureCoordsDefined then
  1290. redraw := ToolManager.ToolMove(FImageView.FormToBitmap(X,Y),CurrentPressure)
  1291. else redraw := false;
  1292. if ToolManager.ToolUp then redraw := true;
  1293. btnLeftDown := false;
  1294. btnRightDown := false;
  1295. btnMiddleDown:= false;
  1296. end;
  1297. if redraw then PaintPictureNow;
  1298. if FUpdateStackWhenIdle then
  1299. begin
  1300. UpdateStackOnTimer:= true;
  1301. FUpdateStackWhenIdle:= false;
  1302. end;
  1303. UpdateToolbar;
  1304. ReleaseMouseButtons(Shift);
  1305. if ToolManager.ToolSleeping and not spacePressed and not btnLeftDown and not btnRightDown
  1306. and not btnMiddleDown then
  1307. ToolManager.ToolWakeUp;
  1308. end;
  1309. function TFMain.ScriptFileOpen(AVars: TVariableSet): TScriptResult;
  1310. var vFilename: TScriptVariableReference;
  1311. topInfo: TTopMostInfo;
  1312. i: integer;
  1313. mr: TModalResult;
  1314. cancelled: boolean;
  1315. chosenFiles: array of string;
  1316. loadedImage: TImageEntry;
  1317. begin
  1318. loadedImage := TImageEntry.Empty;
  1319. try
  1320. topInfo.defined:= false;
  1321. if Image.IsFileModified and not AVars.Booleans['IgnoreModified'] then
  1322. begin
  1323. topInfo := FLazPaintInstance.HideTopmost;
  1324. case LazPaintInstance.SaveQuestion(rsOpen) of
  1325. IDYES: begin
  1326. result := Scripting.CallScriptFunction('FileSave');
  1327. if result <> srOk then
  1328. begin
  1329. FLazPaintInstance.ShowTopmost(topInfo);
  1330. exit;
  1331. end;
  1332. end;
  1333. IDCANCEL: begin
  1334. FLazPaintInstance.ShowTopmost(topInfo);
  1335. result := srCancelledByUser;
  1336. exit;
  1337. end;
  1338. end;
  1339. end;
  1340. vFileName := AVars.GetVariable('FileName');
  1341. if AVars.IsReferenceDefined(vFileName) then
  1342. begin
  1343. FLazPaintInstance.ShowTopmost(topInfo);
  1344. if TryOpenFileUTF8(AVars.GetString(vFilename), true, nil,
  1345. false, false) then
  1346. result := srOk
  1347. else
  1348. result := srException;
  1349. end
  1350. else
  1351. begin
  1352. if UseImageBrowser then
  1353. begin
  1354. if not assigned(FBrowseImages) then
  1355. begin
  1356. FBrowseImages := TFBrowseImages.Create(self);
  1357. FBrowseImages.LazPaintInstance := LazPaintInstance;
  1358. FBrowseImages.Filter:= OpenPictureDialog1.Filter;
  1359. FBrowseImages.ShowRememberStartupDirectory := true;
  1360. end;
  1361. end;
  1362. try
  1363. if not topInfo.defined then topInfo := FLazPaintInstance.HideTopmost;
  1364. if UseImageBrowser then
  1365. begin
  1366. self.Hide;
  1367. FBrowseImages.InitialDirectory:= FLoadInitialDir;
  1368. FBrowseImages.RememberStartDirectory:= FLazPaintInstance.Config.DefaultRememberStartupSourceDirectory;
  1369. FBrowseImages.AllowMultiSelect:= true;
  1370. FBrowseImages.FilterIndex := OpenPictureDialog1.FilterIndex;
  1371. mr := FBrowseImages.ShowModal;
  1372. LazPaintInstance.Config.SetRememberStartupSourceDirectory(FBrowseImages.RememberStartDirectory);
  1373. if mr = mrOK then
  1374. begin
  1375. OpenPictureDialog1.FilterIndex := FBrowseImages.FilterIndex;
  1376. setlength(chosenFiles, FBrowseImages.SelectedFileCount);
  1377. for i := 0 to high(chosenFiles) do
  1378. chosenFiles[i] := FBrowseImages.SelectedFile[i];
  1379. loadedImage := FBrowseImages.GetChosenImage;
  1380. cancelled := false
  1381. end
  1382. else
  1383. begin
  1384. chosenFiles := nil;
  1385. cancelled := true;
  1386. end;
  1387. FBrowseImages.AllowMultiSelect:= false;
  1388. end else
  1389. begin
  1390. OpenPictureDialog1.InitialDir:= FLoadInitialDir;
  1391. OpenPictureDialog1.Options := OpenPictureDialog1.Options + [ofAllowMultiSelect];
  1392. if OpenPictureDialog1.Execute then
  1393. begin
  1394. setlength(chosenFiles,1);
  1395. chosenFiles[0]:= OpenPictureDialog1.FileName;
  1396. cancelled := false;
  1397. end
  1398. else
  1399. begin
  1400. chosenFiles:= nil;
  1401. cancelled:= true;
  1402. end;
  1403. OpenPictureDialog1.Options := OpenPictureDialog1.Options - [ofAllowMultiSelect];
  1404. end;
  1405. if not cancelled then
  1406. begin
  1407. if length(chosenFiles) = 1 then
  1408. begin
  1409. if TryOpenFileUTF8(chosenFiles[0],true,@loadedImage,true) then
  1410. begin
  1411. result := srOk;
  1412. if Assigned(Scripting.RecordingFunctionParameters) then
  1413. Scripting.RecordingFunctionParameters.AddString('FileName',chosenFiles[0]);
  1414. end
  1415. else
  1416. result := srException;
  1417. end else
  1418. begin
  1419. result := srOk;
  1420. FormDropFiles(self, chosenFiles);
  1421. end;
  1422. FLoadInitialDir:= ExtractFilePath(chosenFiles[0]);
  1423. if Config.DefaultRememberStartupSourceDirectory then
  1424. Config.SetStartupSourceDirectory(FLoadInitialDir);
  1425. end
  1426. else
  1427. result := srCancelledByUser;
  1428. finally
  1429. self.Show;
  1430. FLazPaintInstance.ShowTopmost(topInfo);
  1431. end;
  1432. end;
  1433. except
  1434. on ex: Exception do
  1435. begin
  1436. LazPaintInstance.ShowError(RemoveTrail(FileOpen.Caption),ex.Message);
  1437. result := srException;
  1438. end;
  1439. end;
  1440. loadedImage.FreeAndNil;
  1441. end;
  1442. procedure TFMain.FileQuitExecute(Sender: TObject);
  1443. begin
  1444. Close;
  1445. end;
  1446. function TFMain.ScriptFileSaveAs(AVars: TVariableSet): TScriptResult;
  1447. var
  1448. dialogTitle: string;
  1449. function DoSaveAs(filename: string; AExport: boolean): TScriptResult;
  1450. var saved: boolean;
  1451. begin
  1452. if not Image.AbleToSaveAsUTF8(filename) then
  1453. begin
  1454. LazPaintInstance.ShowError(dialogTitle, rsFileExtensionNotSupported);
  1455. result := srException;
  1456. end else
  1457. begin
  1458. try
  1459. saved := false;
  1460. if (Image.currentFilenameUTF8 <> '') and
  1461. ( ((SuggestImageFormat(Image.currentFilenameUTF8) in [ifIco,ifCur])
  1462. and (SuggestImageFormat(filename) in [ifIco,ifCur])) or
  1463. ((SuggestImageFormat(Image.currentFilenameUTF8) = ifTiff)
  1464. and (SuggestImageFormat(filename) = ifTiff)) ) then
  1465. begin
  1466. Image.UpdateMultiImage(filename, AExport);
  1467. saved := true;
  1468. end
  1469. else
  1470. begin
  1471. if not LazPaintInstance.ShowSaveOptionDlg(nil, filename,
  1472. AVars.Booleans['SkipOptions'], AExport) then
  1473. result := srCancelledByUser
  1474. else
  1475. saved := true;
  1476. end;
  1477. if saved then
  1478. begin
  1479. if AExport then
  1480. begin
  1481. FExportInitialDir := extractFilePath(filename);
  1482. if Config.DefaultRememberStartupExportDirectory then
  1483. Config.SetStartupExportDirectory(FExportInitialDir);
  1484. end else
  1485. begin
  1486. Config.AddRecentFile(filename);
  1487. Config.AddRecentDirectory(ExtractFilePath(filename));
  1488. FSaveInitialDir := extractFilePath(filename);
  1489. if Config.DefaultRememberStartupTargetDirectory then
  1490. Config.SetStartupTargetDirectory(FSaveInitialDir);
  1491. Image.CurrentFilenameUTF8 := filename;
  1492. end;
  1493. AVars.Strings['Result'] := filename;
  1494. result := srOk;
  1495. if Assigned(Scripting.RecordingFunctionParameters) then
  1496. begin
  1497. Scripting.RecordingFunctionParameters.AddString('FileName',filename);
  1498. Scripting.RecordingFunctionParameters.AddBoolean('Validate',True);
  1499. end;
  1500. end;
  1501. except
  1502. on ex: Exception do
  1503. begin
  1504. LazPaintInstance.ShowError(dialogTitle, ex.Message);
  1505. result := srException;
  1506. end;
  1507. end;
  1508. end;
  1509. end;
  1510. var filename: string;
  1511. vFileName: TScriptVariableReference;
  1512. topMost: TTopMostInfo;
  1513. defaultExt: string;
  1514. initialDir: string;
  1515. saveDlg: TSaveDialog;
  1516. mr: TModalResult;
  1517. begin
  1518. if AVars.Booleans['Export'] then
  1519. saveDlg := ExportPictureDialog
  1520. else
  1521. saveDlg := SavePictureDialog1;
  1522. dialogTitle := RemoveTrail(saveDlg.Title);
  1523. AskMergeSelection(dialogTitle);
  1524. filename := ExtractFileName(Image.CurrentFilenameUTF8);
  1525. vFileName := AVars.GetVariable('FileName');
  1526. if AVars.IsReferenceDefined(vFileName) then
  1527. begin
  1528. filename := AVars.GetString(vFileName);
  1529. initialDir := ExtractFilePath(filename);
  1530. {$WARNINGS OFF}
  1531. if PathDelim <> '\' then initialDir := StringReplace(initialDir, '\', PathDelim, [rfReplaceAll]);
  1532. if PathDelim <> '/' then initialDir := StringReplace(initialDir, '/', PathDelim, [rfReplaceAll]);
  1533. {$WARNINGS ON}
  1534. filename := ExtractFileName(filename);
  1535. end else initialDir:= '';
  1536. if filename = '' then filename := rsNoName;
  1537. if initialDir = '' then
  1538. begin
  1539. if AVars.Booleans['Export'] then
  1540. initialDir := FExportInitialDir
  1541. else
  1542. initialDir:= FSaveInitialDir;
  1543. end;
  1544. if saveDlg.FilterIndex > 1 then
  1545. filename := ApplySelectedFilterExtension(filename,saveDlg.Filter,saveDlg.FilterIndex);
  1546. if not Image.AbleToSaveAsUTF8(filename) then
  1547. begin
  1548. saveDlg.FilterIndex := 1;
  1549. filename := ChangeFileExt(Filename,'');
  1550. end;
  1551. case SuggestImageFormat(Image.CurrentFilenameUTF8) of
  1552. ifCur: defaultExt := '.cur';
  1553. ifIco: defaultExt := '.ico';
  1554. else
  1555. begin
  1556. if Image.NbLayers > 1 then defaultExt := '.lzp' else
  1557. defaultExt := '.png';
  1558. end;
  1559. end;
  1560. if AVars.Booleans['Validate'] and (initialDir <> '') then
  1561. begin
  1562. if not AVars.Booleans['Overwrite'] and (FileManager.FileExists(initialDir+filename)) then
  1563. begin
  1564. if QuestionDlg(rsSave, rsOverwriteFile, mtConfirmation,
  1565. [mrOk, rsOkay, mrCancel, rsCancel],0) <> mrOk then
  1566. exit(srCancelledByUser);
  1567. end;
  1568. result := DoSaveAs(initialDir+filename, AVars.Booleans['Export']);
  1569. end else
  1570. begin
  1571. topMost := LazPaintInstance.HideTopmost;
  1572. if UseImageBrowser then
  1573. begin
  1574. if not assigned(FSaveImage) then
  1575. begin
  1576. FSaveImage := TFBrowseImages.Create(self);
  1577. FSaveImage.LazPaintInstance := LazPaintInstance;
  1578. FSaveImage.IsSaveDialog := true;
  1579. FSaveImage.ShowRememberStartupDirectory:= true;
  1580. if Config.DefaultRememberSaveFormat then
  1581. FSaveImage.DefaultExtensions:= Config.DefaultSaveExtensions;
  1582. end;
  1583. FSaveImage.Filter := saveDlg.Filter;
  1584. FSaveImage.Caption := saveDlg.Title;
  1585. FSaveImage.InitialFilename := filename;
  1586. FSaveImage.DefaultExtension := defaultExt;
  1587. FSaveImage.InitialDirectory:= initialDir;
  1588. if AVars.Booleans['Export'] then
  1589. FSaveImage.RememberStartDirectory:= FLazPaintInstance.Config.DefaultRememberStartupExportDirectory
  1590. else FSaveImage.RememberStartDirectory:= FLazPaintInstance.Config.DefaultRememberStartupTargetDirectory;
  1591. FSaveImage.FilterIndex := saveDlg.FilterIndex;
  1592. mr := FSaveImage.ShowModal;
  1593. if AVars.Booleans['Export'] then
  1594. LazPaintInstance.Config.SetRememberStartupExportDirectory(FSaveImage.RememberStartDirectory)
  1595. else LazPaintInstance.Config.SetRememberStartupTargetDirectory(FSaveImage.RememberStartDirectory);
  1596. if mr = mrOK then
  1597. begin
  1598. saveDlg.FilterIndex := FSaveImage.FilterIndex;
  1599. result := DoSaveAs(FSaveImage.FileName, AVars.Booleans['Export']);
  1600. end
  1601. else
  1602. result := srCancelledByUser;
  1603. end else
  1604. begin
  1605. saveDlg.FileName := filename;
  1606. saveDlg.DefaultExt := defaultExt;
  1607. saveDlg.InitialDir:= initialDir;
  1608. if saveDlg.Execute then
  1609. begin
  1610. result := DoSaveAs(saveDlg.FileName, AVars.Booleans['Export']);
  1611. end else
  1612. result := srCancelledByUser;
  1613. end;
  1614. LazPaintInstance.ShowTopmost(topMost);
  1615. end;
  1616. end;
  1617. function TFMain.ScriptFileSave(AVars: TVariableSet): TScriptResult;
  1618. begin
  1619. if (Image.CurrentFilenameUTF8 = '') or not Image.AbleToSaveAsUTF8(Image.CurrentFilenameUTF8) then
  1620. result := Scripting.CallScriptFunction('FileSaveAs', True) else
  1621. begin
  1622. AskMergeSelection(rsSave);
  1623. try
  1624. if SuggestImageFormat(Image.currentFilenameUTF8) in [ifIco,ifCur,ifTiff,ifGif] then
  1625. begin
  1626. LazPaintInstance.StartSavingImage(Image.currentFilenameUTF8);
  1627. Image.UpdateMultiImage;
  1628. LazPaintInstance.EndSavingImage;
  1629. AVars.Strings['Result'] := Image.currentFilenameUTF8;
  1630. result := srOk;
  1631. end
  1632. else
  1633. begin
  1634. if LazPaintInstance.ShowSaveOptionDlg(nil, Image.currentFilenameUTF8, AVars.Booleans['SkipOptions'], False) then
  1635. begin
  1636. AVars.Strings['Result'] := Image.currentFilenameUTF8;
  1637. result := srOk;
  1638. end
  1639. else
  1640. result := srCancelledByUser;
  1641. end;
  1642. except
  1643. on ex: Exception do
  1644. begin
  1645. LazPaintInstance.ShowError(rsSave,ex.Message);
  1646. result := srException;
  1647. end;
  1648. end;
  1649. end;
  1650. end;
  1651. function TFMain.ScriptFileNewEntry(AVars: TVariableSet): TScriptResult;
  1652. var w,h: integer;
  1653. topInfo: TTopMostInfo;
  1654. backColor: TBGRAPixel;
  1655. begin
  1656. if (Image.currentFilenameUTF8='') or not Image.CanHaveFrames then exit(srException);
  1657. topInfo.defined:= false;
  1658. if Image.IsFileModified and not AVars.Booleans['IgnoreModified'] then
  1659. begin
  1660. topInfo := FLazPaintInstance.HideTopmost;
  1661. case LazPaintInstance.SaveQuestion(rsOpen) of
  1662. IDYES: begin
  1663. result := Scripting.CallScriptFunction('FileSave');
  1664. if result <> srOk then
  1665. begin
  1666. FLazPaintInstance.ShowTopmost(topInfo);
  1667. exit;
  1668. end;
  1669. end;
  1670. IDCANCEL: begin
  1671. FLazPaintInstance.ShowTopmost(topInfo);
  1672. result := srCancelledByUser;
  1673. exit;
  1674. end;
  1675. end;
  1676. end;
  1677. FLazPaintInstance.ShowTopmost(topInfo);
  1678. if Image.CanDuplicateFrame then
  1679. begin
  1680. w := Image.Width;
  1681. h := Image.Height;
  1682. end else
  1683. begin
  1684. w := 0;
  1685. h := 0;
  1686. end;
  1687. if AVars.IsDefined('Width') then w := AVars.Integers['Width'];
  1688. if AVars.IsDefined('Height') then h := AVars.Integers['Height'];
  1689. if (h <= 0) or (w <= 0) then exit(srInvalidParameters);
  1690. if Image.IsGif and ((w <> Image.Width) or (h <> Image.Height)) then exit(srInvalidParameters);
  1691. backColor := AVars.Pixels['BackColor'];
  1692. Image.BPP:= 0;
  1693. Image.FrameIndex:= -1;
  1694. Image.Assign(TBGRABitmap.Create(w,h,backColor), true, false);
  1695. result := srOk;
  1696. end;
  1697. function TFMain.ScriptFileChooseEntry(AVars: TVariableSet): TScriptResult;
  1698. var
  1699. topInfo: TTopMostInfo;
  1700. entryToLoad: integer;
  1701. vEntryIndex: TScriptVariableReference;
  1702. begin
  1703. if (Image.currentFilenameUTF8='') or not Image.CanHaveFrames then exit(srException);
  1704. topInfo.defined:= false;
  1705. if Image.IsFileModified and not AVars.Booleans['IgnoreModified'] then
  1706. begin
  1707. topInfo := FLazPaintInstance.HideTopmost;
  1708. case LazPaintInstance.SaveQuestion(rsOpen) of
  1709. IDYES: begin
  1710. result := Scripting.CallScriptFunction('FileSave');
  1711. if result <> srOk then
  1712. begin
  1713. FLazPaintInstance.ShowTopmost(topInfo);
  1714. exit;
  1715. end;
  1716. end;
  1717. IDCANCEL: begin
  1718. FLazPaintInstance.ShowTopmost(topInfo);
  1719. result := srCancelledByUser;
  1720. exit;
  1721. end;
  1722. end;
  1723. end;
  1724. FLazPaintInstance.ShowTopmost(topInfo);
  1725. vEntryIndex := AVars.GetVariable('EntryIndex');
  1726. if AVars.IsReferenceDefined(vEntryIndex) then
  1727. begin
  1728. entryToLoad := AVars.GetInteger(vEntryIndex)-1;
  1729. if entryToLoad < 0 then entryToLoad := -1;
  1730. end
  1731. else entryToLoad := -1;
  1732. if TryOpenFileUTF8(Image.currentFilenameUTF8, false, nil,
  1733. true, Image.CanDuplicateFrame, entryToLoad) then
  1734. begin
  1735. AVars.Integers['Result'] := Image.FrameIndex;
  1736. result := srOk;
  1737. end
  1738. else
  1739. result := srException;
  1740. end;
  1741. function TFMain.ScriptFileGetFilename(AVars: TVariableSet): TScriptResult;
  1742. begin
  1743. if Image.currentFilenameUTF8='' then
  1744. AVars.Remove('Result')
  1745. else
  1746. AVars.Strings['Result'] := Image.currentFilenameUTF8;
  1747. result := srOk;
  1748. end;
  1749. procedure TFMain.FileSaveUpdate(Sender: TObject);
  1750. begin
  1751. FileSave.Enabled := image.IsFileModified;
  1752. end;
  1753. procedure TFMain.FilterAnyExecute(Sender: TObject);
  1754. var filterName: string;
  1755. params: TVariableSet;
  1756. begin
  1757. if Sender is TAction then
  1758. begin
  1759. filterName := (Sender as TAction).Name;
  1760. if (length(filterName) >= 7) and (copy(filterName,1,6) = 'Filter') and
  1761. (filterName[7] = upcase(filterName[7])) then
  1762. delete(filterName,1,6);
  1763. params := TVariableSet.Create('Filter');
  1764. params.AddString('Name', filterName);
  1765. CallScriptFunction(params);
  1766. params.Free;
  1767. end;
  1768. end;
  1769. procedure TFMain.TimerLoadToolWinTimer(Sender: TObject);
  1770. var r: TRect;
  1771. begin
  1772. if LoadToolWindow then
  1773. begin
  1774. LoadToolWindow := false;
  1775. //show in descending order of size
  1776. r := Config.DefaultImageListPosition;
  1777. if (r.right > r.left) and (r.bottom > r.top) then
  1778. begin
  1779. LazPaintInstance.MoveImageListWindowTo(r.left,r.top);
  1780. LazPaintInstance.ImageListWindowWidth:= r.Width;
  1781. LazPaintInstance.ImageListWindowHeight:= r.Height;
  1782. end
  1783. else
  1784. LazPaintInstance.MoveImageListWindowTo(self.Left+self.Width-LazPaintInstance.ImageListWindowWidth,
  1785. self.Top+self.Height-LazPaintInstance.ChooseColorHeight-LazPaintInstance.ImageListWindowHeight);
  1786. LazPaintInstance.ImageListWindowVisible := Config.DefaultImagelistWindowVisible;
  1787. r := Config.DefaultLayerWindowPosition;
  1788. if (r.right > r.left) and (r.bottom > r.top) then
  1789. begin
  1790. LazPaintInstance.MoveLayerWindowTo(r.left,r.top);
  1791. LazPaintInstance.LayerWindowWidth := r.Width;
  1792. LazPaintInstance.LayerWindowHeight := r.Height;
  1793. end
  1794. else
  1795. LazPaintInstance.MoveLayerWindowTo(self.Left+self.Width-LazPaintInstance.LayerWindowWidth,
  1796. self.Top+self.Height-LazPaintInstance.ChooseColorHeight-LazPaintInstance.LayerWindowHeight);
  1797. LazPaintInstance.LayerWindowVisible:= Config.DefaultLayerWindowVisible;
  1798. r := Config.DefaultColorWindowPosition;
  1799. if (r.right > r.left) and (r.bottom > r.top) then
  1800. begin
  1801. LazPaintInstance.MoveChooseColorTo(r.left,r.top);
  1802. LazPaintInstance.ChooseColorWidth := r.Width;
  1803. LazPaintInstance.ChooseColorHeight := r.Height;
  1804. end
  1805. else
  1806. LazPaintInstance.MoveChooseColorTo(self.Left+self.Width-LazPaintInstance.ChooseColorWidth,
  1807. self.Top+self.Height-LazPaintInstance.ChooseColorHeight);
  1808. LazPaintInstance.ChooseColorVisible:= Config.DefaultColorWindowVisible;
  1809. r := Config.DefaultToolboxWindowPosition;
  1810. if (r.right > r.left) and (r.bottom > r.top) then
  1811. LazPaintInstance.MoveToolboxTo(r.left,r.Top)
  1812. else
  1813. LazPaintInstance.MoveToolboxTo(self.Left,self.Top+self.Height-LazPaintInstance.ToolBoxHeight);
  1814. LazPaintInstance.ToolboxVisible := Config.DefaultToolboxWindowVisible;
  1815. end;
  1816. TimerLoadToolWin.Enabled := false;
  1817. end;
  1818. procedure TFMain.RenderAnyExecute(Sender: TObject);
  1819. var filterName: string;
  1820. params: TVariableSet;
  1821. begin
  1822. if Sender is TAction then
  1823. begin
  1824. filterName := (Sender as TAction).Name;
  1825. if (length(filterName) >= 7) and (copy(filterName,1,6) = 'Render') and
  1826. (filterName[7] = upcase(filterName[7])) then
  1827. delete(filterName,1,6);
  1828. params := TVariableSet.Create('Filter');
  1829. params.AddString('Name', filterName);
  1830. CallScriptFunction(params);
  1831. params.Free;
  1832. end;
  1833. end;
  1834. procedure TFMain.ToolAnyExecute(Sender: TObject);
  1835. var toolName: string;
  1836. params: TVariableSet;
  1837. begin
  1838. if Sender is TAction then
  1839. begin
  1840. toolName := (Sender as TAction).Name;
  1841. if (length(toolName) >= 5) and (copy(toolName,1,4) = 'Tool') and
  1842. (toolName[5] = upcase(toolName[5])) then
  1843. delete(toolName,1,4);
  1844. params := TVariableSet.Create('ChooseTool');
  1845. params.AddString('Name', toolName);
  1846. params.AddBoolean('FromGUI', true);
  1847. CallScriptFunction(params);
  1848. params.Free;
  1849. end;
  1850. end;
  1851. procedure TFMain.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState
  1852. );
  1853. begin
  1854. try
  1855. if Key = VK_MENU then altPressed:= true
  1856. else if (Key = VK_SNAP) or (Key = VK_SNAP2) then snapPressed:= true
  1857. else if Key = VK_SHIFT then shiftPressed:= true;
  1858. if Zoom.EditingZoom or EditingColors then exit;
  1859. if not ((CurrentTool = ptText) and TextSpinEditFocused and (Key = VK_BACK)) and ToolManager.ToolKeyDown(Key) then
  1860. begin
  1861. DelayedPaintPicture := True;
  1862. end else
  1863. if Key = VK_F6 then
  1864. begin
  1865. ToggleToolwindowsVisible;
  1866. Key := 0;
  1867. end else
  1868. If (Key = VK_SPACE) and not spacePressed then
  1869. begin
  1870. spacePressed:= true;
  1871. Key := 0;
  1872. if not ToolManager.ToolSleeping and not btnLeftDown and not btnRightDown then ToolManager.ToolSleep;
  1873. end else
  1874. if LazPaintInstance.ImageListWindowVisible then
  1875. LazPaintInstance.ImageListWindowVisibleKeyDown(Key,Shift);
  1876. If Key = 0 then UpdateToolbar;
  1877. except
  1878. on ex:exception do
  1879. LazPaintInstance.ShowError('KeyDown',ex.Message);
  1880. end;
  1881. end;
  1882. procedure TFMain.FormResize(Sender: TObject);
  1883. begin
  1884. QueryArrange;
  1885. end;
  1886. procedure TFMain.ImageActionExecute(Sender: TObject);
  1887. var actionName: string;
  1888. begin
  1889. if Sender is TAction then
  1890. begin
  1891. actionName:= (Sender as TAction).Name;
  1892. CallScriptFunction(actionName);
  1893. end;
  1894. end;
  1895. procedure TFMain.EditUndoUpdate(Sender: TObject);
  1896. begin
  1897. EditUndo.Enabled := image.CanUndo or ToolManager.ToolProvideCommand(tcFinish);
  1898. end;
  1899. procedure TFMain.EmbeddedCancelExecute(Sender: TObject);
  1900. begin
  1901. LazPaintInstance.EmbeddedResult := mrCancel;
  1902. Close;
  1903. end;
  1904. procedure TFMain.EmbeddedValidateExecute(Sender: TObject);
  1905. begin
  1906. LazPaintInstance.EmbeddedResult := mrOK;
  1907. Close;
  1908. end;
  1909. procedure TFMain.FileImport3DExecute(Sender: TObject);
  1910. var topmostInfo: TTopMostInfo;
  1911. dir3d: String;
  1912. begin
  1913. topmostInfo:= LazPaintInstance.HideTopmost;
  1914. Open3DObjectDialog.InitialDir := Config.Default3dObjectDirectory;
  1915. if Open3DObjectDialog.InitialDir = '' then
  1916. begin
  1917. dir3d := {$IFDEF WINDOWS}SysToUTF8({$ENDIF}ExtractFilePath(Application.ExeName){$IFDEF WINDOWS}){$ENDIF}+'models';
  1918. if DirectoryExistsUTF8(dir3d) then
  1919. Open3DObjectDialog.InitialDir := dir3d;
  1920. end;
  1921. if Open3DObjectDialog.Execute then
  1922. begin
  1923. ImageAction.Import3DObject(Open3DObjectDialog.FileName);
  1924. Config.SetDefault3dObjectDirectory(ExtractFilePath(Open3DObjectDialog.FileName));
  1925. end;
  1926. LazPaintInstance.ShowTopmost(topmostInfo);
  1927. end;
  1928. function TFMain.ScriptFileLoadSelection(AVars: TVariableSet): TScriptResult;
  1929. var selectionFileName: string;
  1930. vFileName: TScriptVariableReference;
  1931. topmost: TTopMostInfo;
  1932. loadedImage: TImageEntry;
  1933. begin
  1934. loadedImage := TImageEntry.Empty;
  1935. vFileName := AVars.GetVariable('FileName');
  1936. if AVars.IsReferenceDefined(vFileName) then
  1937. selectionFileName := AVars.GetString(vFileName)
  1938. else
  1939. begin
  1940. topmost := LazPaintInstance.HideTopmost;
  1941. if UseImageBrowser then
  1942. begin
  1943. if not assigned(FBrowseSelections) then
  1944. begin
  1945. FBrowseSelections := TFBrowseImages.Create(self);
  1946. FBrowseSelections.LazPaintInstance := LazPaintInstance;
  1947. FBrowseSelections.Filter := LoadSelectionDialog.Filter;
  1948. FBrowseSelections.AllowMultiSelect := false;
  1949. FBrowseSelections.Caption := LoadSelectionDialog.Title;
  1950. end;
  1951. self.Hide;
  1952. try
  1953. FBrowseSelections.FilterIndex:= LoadSelectionDialog.FilterIndex;
  1954. if FBrowseSelections.ShowModal = mrOK then
  1955. begin
  1956. LoadSelectionDialog.FilterIndex := FBrowseSelections.FilterIndex;
  1957. LazPaintInstance.ShowTopmost(topmost);
  1958. selectionFileName := FBrowseSelections.Filename;
  1959. loadedImage := FBrowseSelections.GetChosenImage;
  1960. Config.AddRecentDirectory(ExtractFilePath(selectionFileName));
  1961. end else
  1962. begin
  1963. result := srCancelledByUser;
  1964. LazPaintInstance.ShowTopmost(topmost);
  1965. exit;
  1966. end;
  1967. finally
  1968. self.Show;
  1969. end;
  1970. end else
  1971. begin
  1972. if LoadSelectionDialog.Execute then
  1973. begin
  1974. LazPaintInstance.ShowTopmost(topmost);
  1975. selectionFileName := LoadSelectionDialog.Filename
  1976. end
  1977. else
  1978. begin
  1979. result := srCancelledByUser;
  1980. LazPaintInstance.ShowTopmost(topmost);
  1981. exit;
  1982. end;
  1983. end;
  1984. end;
  1985. if ImageAction.LoadSelection(selectionFileName, @loadedImage) then
  1986. begin
  1987. FSaveSelectionInitialFilename := selectionFileName;
  1988. if Assigned(Scripting.RecordingFunctionParameters) then
  1989. Scripting.RecordingFunctionParameters.AddString('FileName',selectionFileName);
  1990. result := srOk;
  1991. end
  1992. else result := srException;
  1993. loadedImage.FreeAndNil;
  1994. end;
  1995. function TFMain.ScriptFileReload(AVars: TVariableSet): TScriptResult;
  1996. var topmostInfo: TTopMostInfo; res: integer;
  1997. begin
  1998. if (Image.CurrentFilenameUTF8 = '') then
  1999. begin
  2000. result := srOk;
  2001. exit;
  2002. end;
  2003. if Image.IsFileModified and not AVars.Booleans['IgnoreModified'] then
  2004. begin
  2005. topmostInfo := LazPaintInstance.HideTopmost;
  2006. res := MessageDlg(rsReload,rsReloadChanged,mtWarning,mbYesNo,0);
  2007. LazPaintInstance.ShowTopmost(topmostInfo);
  2008. if res <> IDYES then
  2009. begin
  2010. result := srCancelledByUser;
  2011. exit;
  2012. end;
  2013. end;
  2014. if TryOpenFileUTF8(Image.CurrentFilenameUTF8,false,nil,
  2015. true,false,Image.FrameIndex) then
  2016. result := srOk
  2017. else
  2018. result := srException;
  2019. end;
  2020. procedure TFMain.FileReloadUpdate(Sender: TObject);
  2021. begin
  2022. FileReload.Enabled := (Image.CurrentFilenameUTF8 <> '');
  2023. end;
  2024. function TFMain.ScriptFileSaveSelectionAs(AVars: TVariableSet): TScriptResult;
  2025. var filename, initialDir: string;
  2026. vFileName: TScriptVariableReference;
  2027. begin
  2028. if Image.SelectionMaskEmpty then
  2029. begin
  2030. result := srException;
  2031. exit;
  2032. end;
  2033. filename := '';
  2034. vFileName := AVars.GetVariable('FileName');
  2035. if AVars.IsReferenceDefined(vFileName) then
  2036. begin
  2037. filename:= AVars.GetString(vFileName);
  2038. {$WARNINGS OFF}
  2039. if PathDelim <> '\' then filename := StringReplace(filename, '\', PathDelim, [rfReplaceAll]);
  2040. if PathDelim <> '/' then filename := StringReplace(filename, '/', PathDelim, [rfReplaceAll]);
  2041. {$WARNINGS ON}
  2042. if ExtractFilePath(filename)<>'' then fileName := ExpandFileName(filename);
  2043. end;
  2044. if filename = '' then filename := FSaveSelectionInitialFilename;
  2045. initialDir := ExtractFilePath(filename);
  2046. if AVars.Booleans['Validate'] and (filename <> '') and (initialDir <> '') then
  2047. begin
  2048. //skip
  2049. end else
  2050. if UseImageBrowser then
  2051. begin
  2052. if not assigned(FSaveSelection) then
  2053. begin
  2054. FSaveSelection := TFBrowseImages.Create(self);
  2055. FSaveSelection.LazPaintInstance := LazPaintInstance;
  2056. FSaveSelection.IsSaveDialog := true;
  2057. FSaveSelection.Filter := SaveSelectionDialog.Filter;
  2058. FSaveSelection.Caption := SaveSelectionDialog.Title;
  2059. FSaveSelection.DefaultExtension := SaveSelectionDialog.DefaultExt;
  2060. end;
  2061. if initialDir<>'' then FSaveSelection.InitialDirectory := initialDir;
  2062. FSaveSelection.InitialFilename := ExtractFileName(filename);
  2063. FSaveSelection.FilterIndex := SaveSelectionDialog.FilterIndex;
  2064. if (FSaveSelection.ShowModal = mrOk) and (FSaveSelection.Filename <> '') then
  2065. begin
  2066. SaveSelectionDialog.FilterIndex := FSaveSelection.FilterIndex;
  2067. filename := FSaveSelection.Filename;
  2068. end
  2069. else
  2070. filename := '';
  2071. end else
  2072. begin
  2073. SaveSelectionDialog.FileName:= filename;
  2074. if pos(PathDelim,SaveSelectionDialog.FileName)<>0 then
  2075. begin
  2076. filename := SaveSelectionDialog.FileName;
  2077. SaveSelectionDialog.FileName := ExtractFileName(filename);
  2078. if initialDir<>'' then SaveSelectionDialog.InitialDir := initialDir;
  2079. end;
  2080. if SaveSelectionDialog.Execute then
  2081. filename := SaveSelectionDialog.FileName
  2082. else
  2083. filename := '';
  2084. end;
  2085. if filename <> '' then
  2086. begin
  2087. if not Image.AbleToSaveSelectionAsUTF8(filename) then
  2088. begin
  2089. LazPaintInstance.ShowError(rsSave,rsFileExtensionNotSupported);
  2090. result := srException;
  2091. end else
  2092. begin
  2093. try
  2094. Image.SaveSelectionMaskToFileUTF8(filename);
  2095. FSaveSelectionInitialFilename := filename;
  2096. result := srOk;
  2097. if Assigned(Scripting.RecordingFunctionParameters) then
  2098. begin
  2099. Scripting.RecordingFunctionParameters.AddString('FileName',filename);
  2100. Scripting.RecordingFunctionParameters.AddBoolean('Validate',True);
  2101. end;
  2102. AVars.Strings['Result'] := filename;
  2103. except
  2104. on ex: Exception do
  2105. begin
  2106. LazPaintInstance.ShowError(RemoveTrail(FileSaveSelectionAs.Caption),ex.Message);
  2107. result := srException;
  2108. end;
  2109. end;
  2110. end;
  2111. end else
  2112. result := srCancelledByUser;
  2113. end;
  2114. function TFMain.ScriptFilter(AVars: TVariableSet): TScriptResult;
  2115. var filter: TPictureFilter;
  2116. a: TContainedAction;
  2117. defaultCaption: String;
  2118. begin
  2119. filter := StrToPictureFilter(AVars.Strings['Name']);
  2120. if filter = pfNone then
  2121. result := srInvalidParameters
  2122. else
  2123. begin
  2124. defaultCaption := '';
  2125. a := ActionList1.ActionByName('Filter'+AVars.Strings['Name']);
  2126. if Assigned(a) then
  2127. defaultCaption := RemoveTrail((a as TAction).Caption)
  2128. else
  2129. defaultCaption := AVars.Strings['Name'];
  2130. result := ExecuteFilter(LazPaintInstance, filter, AVars, false, defaultCaption);
  2131. end;
  2132. end;
  2133. procedure TFMain.FileSaveSelectionAsUpdate(Sender: TObject);
  2134. begin
  2135. FileSaveSelectionAs.Enabled := not Image.SelectionMaskEmpty;
  2136. end;
  2137. procedure TFMain.FormDropFiles(Sender: TObject; const FileNames: array of String);
  2138. var
  2139. i,tx,ty: integer;
  2140. Errors: String='';
  2141. loadedLayers: array of record
  2142. bmp: TBGRABitmap;
  2143. orig: TBGRALayerCustomOriginal;
  2144. filename: string;
  2145. end;
  2146. topmost: TTopMostInfo;
  2147. choice: TModalResult;
  2148. svgOrig: TBGRALayerSVGOriginal;
  2149. begin
  2150. if Length(FileNames)<1 then exit;
  2151. if Length(FileNames)= 1
  2152. then TryOpenFileUTF8(FileNames[0])
  2153. else
  2154. begin
  2155. {$IFNDEF LINUX}
  2156. //Button values higher than 10 are used, in order to avoid Delphis icons on the buttons.
  2157. choice := QuestionDlg (rsOpenMultipleImageFiles, rsMoreThanOneFile, mtConfirmation, [mrLast+1,rsOpenFilesAsLayers,mrLast+2,rsAddToImageList,mrLast+3,rsOpenFirstFileOnly,mrCancel,rsCancel ],'');
  2158. {$ELSE}
  2159. choice := mrLast+1;
  2160. {$ENDIF}
  2161. case choice of
  2162. mrLast+1: begin //OpenFilesAsLayers
  2163. if Image.IsFileModified then
  2164. case LazPaintInstance.SaveQuestion(rsOpen) of
  2165. IDYES: Scripting.CallScriptFunction('FileSave');
  2166. IDCANCEL: exit;
  2167. end; //case
  2168. //When files are open this way, they get the name of the first of them.
  2169. //They shall have no name, in order to prevent saving with Save (it then gets redirected to Save As)
  2170. setlength(loadedLayers,length(FileNames));
  2171. tx := 0;
  2172. ty := 0;
  2173. for i := 0 to high(FileNames) do
  2174. begin
  2175. try
  2176. MessagePopupForever(rsLoading + ' ' + inttostr(i+1) + '/' + inttostr(length(FileNames)));
  2177. LazPaintInstance.UpdateWindows;
  2178. loadedLayers[i].filename := Filenames[i];
  2179. case DetectFileFormat(Filenames[i]) of
  2180. ifSvg:
  2181. begin
  2182. svgOrig := LoadSVGOriginalUTF8(Filenames[i]);
  2183. loadedLayers[i].orig := svgOrig;
  2184. if ceil(svgOrig.Width) > tx then tx := ceil(svgOrig.Width);
  2185. if ceil(svgOrig.Height) > ty then ty := ceil(svgOrig.Height);
  2186. end
  2187. else
  2188. begin
  2189. loadedLayers[i].bmp := LoadFlatImageUTF8(Filenames[i]).bmp;
  2190. if loadedLayers[i].bmp.Width > tx then tx := loadedLayers[i].bmp.Width;
  2191. if loadedLayers[i].bmp.Height > ty then ty := loadedLayers[i].bmp.Height;
  2192. end;
  2193. end;
  2194. MessagePopupHide;
  2195. except on ex:exception do
  2196. //begin
  2197. Errors:= Errors + StringReplace(rsErrorOnOpeningFile, '%1', FileNames[i], [])+ ' ('+ ex.Message + ')'+ LineEnding;
  2198. //end;
  2199. end; //try except
  2200. end; //for
  2201. MessagePopupForever(rsOpening+'...');
  2202. LazPaintInstance.UpdateWindows;
  2203. try
  2204. if (tx > 0) and (ty > 0) then
  2205. begin
  2206. Image.CurrentFilenameUTF8 := '';
  2207. Image.Assign(TBGRABitmap.Create(tx,ty),true,false);
  2208. ZoomFitIfTooBig;
  2209. for i := 0 to high(loadedLayers) do
  2210. if Assigned(loadedLayers[i].bmp) then
  2211. begin
  2212. ImageAction.AddLayerFromBitmap(loadedLayers[i].bmp,ExtractFileName(loadedLayers[i].filename));
  2213. loadedLayers[i].bmp := nil;
  2214. end else
  2215. begin
  2216. ImageAction.AddLayerFromOriginal(loadedLayers[i].orig,ExtractFileName(loadedLayers[i].filename));
  2217. loadedLayers[i].orig := nil;
  2218. end;
  2219. end;
  2220. except on ex:exception do
  2221. begin
  2222. MessagePopupHide;
  2223. topmost := LazPaintInstance.HideTopmost;
  2224. LazPaintInstance.ShowError(rsOpenMultipleImageFiles,ex.Message);
  2225. LazPaintInstance.ShowTopmost(topmost);
  2226. end;
  2227. end;
  2228. MessagePopupHide;
  2229. if Length(Errors)>0 then
  2230. begin
  2231. topmost := LazPaintInstance.HideTopmost;
  2232. QuestionDlg (rsError,rsFollowingErrorsOccured+ LineEnding+ Errors, mtError,[11,rsOkay],'');
  2233. LazPaintInstance.ShowTopmost(topmost);
  2234. end;
  2235. for i := 0 to high(loadedLayers) do
  2236. begin
  2237. FreeAndNil(loadedLayers[i].bmp);
  2238. FreeAndNil(loadedLayers[i].orig);
  2239. end;
  2240. end; //OpenFilesAsLayers
  2241. mrLast+2: begin
  2242. if not LazPaintInstance.ImageListWindowVisible then
  2243. LazPaintInstance.ImageListWindowVisible := true;
  2244. LazPaintInstance.UpdateWindows;
  2245. LazPaintInstance.AddToImageList(FileNames);
  2246. end;
  2247. mrLast+3: begin
  2248. if Image.IsFileModified then
  2249. case LazPaintInstance.SaveQuestion(rsOpen) of
  2250. IDYES: Scripting.CallScriptFunction('FileSave');
  2251. IDCANCEL: exit;
  2252. end; //case
  2253. TryOpenFileUTF8(FileNames[0]);
  2254. end;
  2255. end; //case
  2256. end; //else
  2257. end;
  2258. procedure TFMain.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
  2259. begin
  2260. if Key = VK_MENU then altPressed:= false
  2261. else if (Key = VK_SNAP) or (Key = VK_SNAP2) then snapPressed:= false
  2262. else if Key = VK_SHIFT then shiftPressed:= false;
  2263. if ToolManager.ToolKeyUp(Key) then
  2264. begin
  2265. DelayedPaintPicture := True;
  2266. end else
  2267. If Key = VK_SPACE then
  2268. begin
  2269. spacePressed:= false;
  2270. if ToolManager.ToolSleeping and not spacePressed and not btnRightDown and not btnLeftDown then
  2271. ToolManager.ToolWakeUp;
  2272. Key := 0;
  2273. end;
  2274. end;
  2275. procedure TFMain.FormMouseEnter(Sender: TObject);
  2276. begin
  2277. Image.PrepareForRendering;
  2278. end;
  2279. procedure TFMain.FormUTF8KeyPress(Sender: TObject; var UTF8Key: TUTF8Char);
  2280. var selectedTool: TPaintToolType;
  2281. toolProcessKey: boolean;
  2282. begin
  2283. try
  2284. if Zoom.EditingZoom or EditingColors then exit;
  2285. toolProcessKey:= true;
  2286. if (CurrentTool in[ptText,ptEditShape]) and ((UTF8Key = #8) or ((length(UTF8Key)=1) and (UTF8Key[1] in['-','0'..'9']))) then
  2287. begin
  2288. if TextSpinEditFocused then
  2289. toolProcessKey:= false;
  2290. end;
  2291. if toolProcessKey and ToolManager.ToolKeyPress(UTF8Key) then
  2292. begin
  2293. DelayedPaintPicture := true;
  2294. UpdateToolbar;
  2295. end else
  2296. if UTF8Key <> '' then
  2297. begin
  2298. if UTF8UpperCase(UTF8Key) = 'X' then
  2299. begin
  2300. SwitchColors;
  2301. UTF8Key:= '';
  2302. end else
  2303. if toolProcessKey and (UTF8Key = '+') then
  2304. begin
  2305. ViewZoomIn.Execute;
  2306. UTF8Key := '';
  2307. end else
  2308. if toolProcessKey and (UTF8Key = '-') then
  2309. begin
  2310. ViewZoomOut.Execute;
  2311. UTF8Key := '';
  2312. end else
  2313. if toolProcessKey and (UTF8Key = '*') then
  2314. begin
  2315. ViewZoomOriginal.Execute;
  2316. UTF8Key := '';
  2317. end else
  2318. if toolProcessKey and (UTF8Key = '/') then
  2319. begin
  2320. ViewZoomFit.Execute;
  2321. UTF8Key := '';
  2322. end else
  2323. begin
  2324. selectedTool := ToolManager.GetCurrentToolType;
  2325. FLayout.Menu.CycleTool(selectedTool, UTF8Key);
  2326. if selectedTool <> ToolManager.GetCurrentToolType then ChooseTool(selectedTool);
  2327. end;
  2328. end;
  2329. except
  2330. on ex:exception do
  2331. LazPaintInstance.ShowError('KeyPress',ex.Message);
  2332. end;
  2333. end;
  2334. procedure TFMain.FormMouseLeave(Sender: TObject);
  2335. begin
  2336. Cursor := crDefault;
  2337. end;
  2338. procedure TFMain.FormWindowStateChange(Sender: TObject);
  2339. begin
  2340. {$IFDEF LINUX}
  2341. if not FTopMostHiddenMinimised.defined and
  2342. (self.WindowState = wsMinimized) then
  2343. begin
  2344. FTopMostHiddenMinimised := LazPaintInstance.HideTopmost;
  2345. end else
  2346. if FTopMostHiddenMinimised.defined and not (self.WindowState = wsMinimized) then
  2347. begin
  2348. LazPaintInstance.ShowTopmost(FTopMostHiddenMinimised);
  2349. FTopMostHiddenMinimised.defined := false;
  2350. end;
  2351. {$ENDIF}
  2352. end;
  2353. procedure TFMain.ImageCropLayerUpdate(Sender: TObject);
  2354. begin
  2355. ImageCropLayer.Enabled := not image.SelectionMaskEmpty;
  2356. ImageCropLayer.Visible := (image.NbLayers > 1);
  2357. end;
  2358. procedure TFMain.ImageFlattenExecute(Sender: TObject);
  2359. begin
  2360. if ToolManager.ToolSleeping then exit;
  2361. ChooseTool(ptHand);
  2362. image.Flatten;
  2363. end;
  2364. procedure TFMain.ImageFlattenUpdate(Sender: TObject);
  2365. begin
  2366. ImageFlatten.Enabled := Image.NbLayers > 1;
  2367. end;
  2368. procedure TFMain.LayerAddNewUpdate(Sender: TObject);
  2369. begin
  2370. LayerAddNew.Enabled := LazPaintInstance.Image.NbLayers < MaxLayersToAdd;
  2371. end;
  2372. procedure TFMain.LayerDuplicateUpdate(Sender: TObject);
  2373. begin
  2374. LayerDuplicate.Enabled := LazPaintInstance.Image.NbLayers < MaxLayersToAdd;
  2375. end;
  2376. procedure TFMain.LayerFromFileExecute(Sender: TObject);
  2377. var i: integer;
  2378. mr : TModalResult;
  2379. topmostInfo: TTopMostInfo;
  2380. layerLoaded:boolean;
  2381. chosenFiles: array of string;
  2382. loadedImage: TBGRABitmap;
  2383. begin
  2384. if not image.SelectionLayerIsEmpty then
  2385. begin
  2386. LazPaintInstance.ShowMessage(rsLazPaint,rsMustReleaseSelection);
  2387. exit;
  2388. end;
  2389. topmostInfo := LazPaintInstance.HideTopmost;
  2390. chosenFiles := nil;
  2391. loadedImage := nil;
  2392. if UseImageBrowser then
  2393. begin
  2394. if not assigned(FBrowseImages) then
  2395. begin
  2396. FBrowseImages := TFBrowseImages.Create(self);
  2397. FBrowseImages.LazPaintInstance := LazPaintInstance;
  2398. FBrowseImages.Filter := OpenPictureDialog1.Filter;
  2399. FBrowseImages.ShowRememberStartupDirectory := true;
  2400. end;
  2401. self.Hide;
  2402. FBrowseImages.InitialDirectory:= FLoadInitialDir;
  2403. FBrowseImages.RememberStartDirectory:= FLazPaintInstance.Config.DefaultRememberStartupSourceDirectory;
  2404. FBrowseImages.AllowMultiSelect := true;
  2405. FBrowseImages.OpenLayerIcon := true;
  2406. FBrowseImages.FilterIndex:= OpenPictureDialog1.FilterIndex;
  2407. try
  2408. mr := FBrowseImages.ShowModal;
  2409. LazPaintInstance.Config.SetRememberStartupSourceDirectory(FBrowseImages.RememberStartDirectory);
  2410. if mr = mrOK then
  2411. begin
  2412. OpenPictureDialog1.FilterIndex := FBrowseImages.FilterIndex;
  2413. setlength(chosenFiles, FBrowseImages.SelectedFileCount);
  2414. for i := 0 to high(chosenFiles) do
  2415. chosenFiles[i] := FBrowseImages.SelectedFile[i];
  2416. loadedImage := FBrowseImages.GetChosenImage.bmp;
  2417. end;
  2418. except
  2419. on ex: Exception do
  2420. begin
  2421. LazPaintInstance.ShowError(RemoveTrail(LayerFromFile.Hint),ex.Message);
  2422. end;
  2423. end;
  2424. FBrowseImages.OpenLayerIcon := false;
  2425. FBrowseImages.AllowMultiSelect := false;
  2426. self.Show;
  2427. end else
  2428. begin
  2429. OpenPictureDialog1.InitialDir:= FLoadInitialDir;
  2430. OpenPictureDialog1.Options := OpenPictureDialog1.Options + [ofAllowMultiSelect];
  2431. layerLoaded := false;
  2432. if OpenPictureDialog1.Execute then
  2433. begin
  2434. setlength(chosenFiles, OpenPictureDialog1.Files.Count);
  2435. for i := 0 to OpenPictureDialog1.Files.Count-1 do
  2436. chosenFiles[i] := OpenPictureDialog1.Files[i];
  2437. end;
  2438. OpenPictureDialog1.Options := OpenPictureDialog1.Options - [ofAllowMultiSelect];
  2439. end;
  2440. if chosenFiles <> nil then
  2441. begin
  2442. if Assigned(loadedImage) and (length(chosenFiles)=1) then
  2443. begin
  2444. layerLoaded := length(ImageAction.TryAddLayerFromFile(chosenFiles[0], loadedImage)) > 0;
  2445. end else
  2446. begin
  2447. FreeAndNil(loadedImage);
  2448. for i := 0 to high(chosenFiles) do
  2449. begin
  2450. if length(ImageAction.TryAddLayerFromFile(chosenFiles[i])) > 0 then
  2451. layerLoaded := true;
  2452. end;
  2453. end;
  2454. FLoadInitialDir:= ExtractFilePath(chosenFiles[0]);
  2455. if Config.DefaultRememberStartupSourceDirectory then
  2456. Config.SetStartupSourceDirectory(FLoadInitialDir);
  2457. end;
  2458. LazPaintInstance.ShowTopmost(topmostInfo);
  2459. if layerLoaded and not LazPaintInstance.LayerWindowVisible then
  2460. LazPaintInstance.LayerWindowVisible := true;
  2461. end;
  2462. procedure TFMain.LayerMergeOverUpdate(Sender: TObject);
  2463. begin
  2464. LayerMergeOver.Enabled := (image.CurrentLayerIndex > 0) and Image.CurrentLayerVisible;
  2465. end;
  2466. procedure TFMain.LayerMoveExecute(Sender: TObject);
  2467. begin
  2468. ChooseTool(ptMoveLayer);
  2469. end;
  2470. procedure TFMain.LayerMoveUpdate(Sender: TObject);
  2471. begin
  2472. LayerMove.Enabled := Image.CurrentLayerVisible and Image.SelectionMaskEmpty;
  2473. end;
  2474. procedure TFMain.LayerRemoveCurrentUpdate(Sender: TObject);
  2475. begin
  2476. LayerRemoveCurrent.Enabled := LazPaintInstance.Image.NbLayers > 1;
  2477. end;
  2478. procedure TFMain.LayerRotateExecute(Sender: TObject);
  2479. begin
  2480. ChooseTool(ptRotateLayer);
  2481. end;
  2482. procedure TFMain.LayerRotateUpdate(Sender: TObject);
  2483. begin
  2484. LayerRotate.Enabled := Image.CurrentLayerVisible and Image.SelectionMaskEmpty;
  2485. end;
  2486. procedure TFMain.ItemDonateClick(Sender: TObject);
  2487. begin
  2488. LazPaintInstance.Donate;
  2489. end;
  2490. procedure TFMain.PaintBox_PictureMouseEnter(Sender: TObject);
  2491. begin
  2492. FormMouseEnter(Sender);
  2493. end;
  2494. procedure TFMain.PaintBox_PictureMouseDown(Sender: TObject;
  2495. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  2496. begin
  2497. FormMouseDown(Sender,Button,Shift,X+PaintBox_Picture.Left,Y+PaintBox_Picture.Top);
  2498. end;
  2499. procedure TFMain.PaintBox_PictureMouseMove(Sender: TObject; Shift: TShiftState;
  2500. X, Y: Integer);
  2501. begin
  2502. FormMouseMove(Sender,Shift,X+PaintBox_Picture.Left,Y+PaintBox_Picture.Top);
  2503. end;
  2504. procedure TFMain.PaintBox_PictureMouseUp(Sender: TObject; Button: TMouseButton;
  2505. Shift: TShiftState; X, Y: Integer);
  2506. begin
  2507. FormMouseUp(Sender,Button,Shift,X+PaintBox_Picture.Left,Y+PaintBox_Picture.Top);
  2508. end;
  2509. procedure TFMain.PaintBox_PictureMouseWheel(Sender: TObject;
  2510. Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint;
  2511. var Handled: Boolean);
  2512. begin
  2513. FormMouseWheel(Sender,Shift,WheelDelta,Point(MousePos.X+PaintBox_Picture.Left,MousePos.Y+PaintBox_Picture.Top),Handled);
  2514. end;
  2515. procedure TFMain.PaintBox_PicturePaint(Sender: TObject);
  2516. begin
  2517. {$IFDEF USEPAINTBOXPICTURE}
  2518. OnPaintHandler;
  2519. {$ENDIF}
  2520. end;
  2521. procedure TFMain.FormCloseQuery(Sender: TObject; var CanClose: boolean);
  2522. var topmostInfo: TTopMostInfo;
  2523. begin
  2524. if ToolManager.ToolSleeping then
  2525. begin
  2526. CanClose := false;
  2527. exit;
  2528. end;
  2529. if CurrentTool in [ptDeformation,ptLayerMapping] then
  2530. ChooseTool(ptHand)
  2531. else
  2532. if not Image.CheckNoAction then
  2533. begin
  2534. CanClose := false;
  2535. exit;
  2536. end;
  2537. if not LazPaintInstance.Embedded and image.IsFileModified and not image.Empty then
  2538. begin
  2539. topmostInfo:= LazPaintInstance.HideTopmost;
  2540. case LazPaintInstance.SaveQuestion(rsExitRequest) of
  2541. IDYES: FileSave.Execute;
  2542. IDNO: ;
  2543. IDCANCEL: begin
  2544. CanClose := false;
  2545. LazPaintInstance.CancelRestart;
  2546. LazPaintInstance.ShowTopmost(topmostInfo);
  2547. end;
  2548. end;
  2549. end else
  2550. if LazPaintInstance.Embedded and (LazPaintInstance.EmbeddedResult = mrNone) and
  2551. ((LazPaintInstance.EmbeddedImageBackup <> nil) or not image.Empty) and (not image.FlatImageEquals(LazPaintInstance.EmbeddedImageBackup)) then
  2552. begin
  2553. topmostInfo := LazPaintInstance.HideTopmost;
  2554. case MessageDlg(rsCloseRequest,rsKeepChanges,mtConfirmation,mbYesNoCancel,0) of
  2555. IDYES: LazPaintInstance.EmbeddedResult := mrOk;
  2556. IDNO: LazPaintInstance.EmbeddedResult := mrCancel;
  2557. IDCANCEL: begin
  2558. CanClose := false;
  2559. LazPaintInstance.CancelRestart;
  2560. LazPaintInstance.ShowTopmost(topmostInfo);
  2561. end;
  2562. end;
  2563. end;
  2564. end;
  2565. procedure TFMain.FormHide(Sender: TObject);
  2566. begin
  2567. FShouldArrange := false;
  2568. FTopMostInfo := LazPaintInstance.HideTopmost;
  2569. LazPaintInstance.SaveMainWindowPosition;
  2570. end;
  2571. procedure TFMain.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  2572. WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  2573. begin
  2574. if not Assigned(FImageView) or not FImageView.PictureCoordsDefined then exit;
  2575. if ssAlt in Shift then
  2576. begin
  2577. if WheelDelta > 0 then IncreasePenSize
  2578. else if WheelDelta < 0 then DecreasePenSize;
  2579. end else
  2580. begin
  2581. Zoom.SetPosition(FImageView.FormToBitmap(MousePos.X,MousePos.Y), MousePos);
  2582. if WheelDelta > 0 then Zoom.ZoomIn(ssSnap in Shift) else
  2583. if WheelDelta < 0 then Zoom.ZoomOut(ssSnap in Shift);
  2584. Zoom.ClearPosition;
  2585. end;
  2586. Handled := True;
  2587. end;
  2588. procedure TFMain.HelpAboutExecute(Sender: TObject);
  2589. begin
  2590. LazPaintInstance.ShowAboutDlg;
  2591. end;
  2592. procedure TFMain.HelpIndexExecute(Sender: TObject);
  2593. begin
  2594. OpenURL('http://wiki.lazarus.freepascal.org/LazPaint');
  2595. end;
  2596. procedure TFMain.ImageChangeCanvasSizeExecute(Sender: TObject);
  2597. begin
  2598. LazPaintInstance.ShowCanvasSizeDlg;
  2599. end;
  2600. procedure TFMain.ImageCropUpdate(Sender: TObject);
  2601. begin
  2602. ImageCrop.Enabled := not image.SelectionMaskEmpty;
  2603. end;
  2604. procedure TFMain.ImageRepeatExecute(Sender: TObject);
  2605. begin
  2606. LazPaintInstance.ShowRepeatImageDlg;
  2607. end;
  2608. procedure TFMain.MenuFileClick(Sender: TObject);
  2609. procedure EmptyMenu(AMenu: TMenuItem);
  2610. var
  2611. i: integer;
  2612. item: TMenuItem;
  2613. begin
  2614. for i := AMenu.Count-1 downto 0 do
  2615. begin
  2616. item := AMenu.Items[i];
  2617. AMenu.Delete(i);
  2618. item.Free;
  2619. end;
  2620. end;
  2621. var
  2622. i: integer;
  2623. item: TMenuItem;
  2624. currentLanguage: string;
  2625. begin
  2626. EmptyMenu(MenuRecentFiles);
  2627. for i := 0 to Config.RecentFilesCount-1 do
  2628. if Config.RecentFile[i]<>Image.CurrentFilenameUTF8 then
  2629. begin
  2630. item := NewItem(Config.RecentFile[i],0,false,true,@RecentFileClick,0,'');
  2631. MenuRecentFiles.Add(item);
  2632. end;
  2633. MenuRecentFiles.Enabled := MenuRecentFiles.Count <> 0;
  2634. EmptyMenu(MenuLanguage);
  2635. currentLanguage := Config.DefaultLangage;
  2636. for i := 0 to Config.Languages.Count-1 do
  2637. begin
  2638. item := NewItem(Config.Languages[i],0,false,true,@LanguageClick,0,'');
  2639. if currentLanguage = item.Caption then
  2640. item.Checked := true;
  2641. MenuLanguage.Add(item);
  2642. end;
  2643. MenuLanguage.Enabled := MenuLanguage.Count <> 0;
  2644. end;
  2645. procedure TFMain.RecentFileClick(Sender: TObject);
  2646. var openParams: TVariableSet;
  2647. begin
  2648. if Sender is TMenuItem then
  2649. begin
  2650. openParams := TVariableSet.Create('FileOpen');
  2651. openParams.AddString('FileName',(sender as TMenuItem).Caption);
  2652. Scripting.CallScriptFunction(openParams);
  2653. openParams.Free;
  2654. end;
  2655. end;
  2656. procedure TFMain.LanguageClick(Sender: TObject);
  2657. var language: string;
  2658. begin
  2659. if Sender is TMenuItem then
  2660. begin
  2661. language := (Sender as TMenuItem).Caption;
  2662. if Config.DefaultLangage <> language then
  2663. begin
  2664. Config.SetDefaultLangage(language);
  2665. LazPaintInstance.Restart;
  2666. end;
  2667. end;
  2668. end;
  2669. procedure TFMain.TimerUpdateTimer(Sender: TObject);
  2670. const SelectionPaintDelay = 100/(1000*60*60*24);
  2671. begin
  2672. TimerUpdate.Enabled := false;
  2673. EditUndo.Update;
  2674. EditRedo.Update;
  2675. UpdateStatusText;
  2676. if FCoordinatesCaptionCount > 0 then
  2677. begin
  2678. Label_Coordinates.Caption := FCoordinatesCaption;
  2679. Label_Coordinates.Update;
  2680. FCoordinatesCaptionCount := 0;
  2681. end;
  2682. if CanCompressOrUpdateStack and UpdateStackOnTimer then
  2683. begin
  2684. LazPaintInstance.NotifyStackChange;
  2685. UpdateStackOnTimer := false;
  2686. end else
  2687. begin
  2688. if CanCompressOrUpdateStack then image.CompressUndo;
  2689. end;
  2690. if DelayedPaintPicture or ToolManager.ToolUpdateNeeded or
  2691. (Assigned(FImageView) and not FImageView.ShowSelection and
  2692. (Now > FLastPaintDate+SelectionPaintDelay) ) then
  2693. begin
  2694. if ToolManager.ToolUpdateNeeded then ToolManager.ToolUpdate;
  2695. if Assigned(FImageView) then FImageView.ShowSelection := true;
  2696. PaintPictureNow;
  2697. end;
  2698. TimerUpdate.Enabled := true;
  2699. end;
  2700. procedure TFMain.ToolRotateSelectionUpdate(Sender: TObject);
  2701. begin
  2702. ToolRotateSelection.Enabled := not image.SelectionMaskEmpty;
  2703. end;
  2704. procedure TFMain.ToolLayerMappingUpdate(Sender: TObject);
  2705. begin
  2706. ToolLayerMapping.Enabled := Image.CurrentLayerVisible and Image.SelectionMaskEmpty;
  2707. end;
  2708. procedure TFMain.ViewColorsExecute(Sender: TObject);
  2709. begin
  2710. ToggleColorsVisible;
  2711. end;
  2712. procedure TFMain.ViewColorsUpdate(Sender: TObject);
  2713. begin
  2714. ViewColors.Checked := LazPaintInstance.ChooseColorVisible;
  2715. end;
  2716. procedure TFMain.ViewDarkThemeExecute(Sender: TObject);
  2717. begin
  2718. LazPaintInstance.DarkTheme := not LazPaintInstance.DarkTheme;
  2719. end;
  2720. procedure TFMain.ViewDarkThemeUpdate(Sender: TObject);
  2721. begin
  2722. ViewDarkTheme.Checked := LazPaintInstance.DarkTheme;
  2723. end;
  2724. procedure TFMain.ViewGridUpdate(Sender: TObject);
  2725. begin
  2726. ViewGrid.Checked:= LazPaintInstance.GridVisible;
  2727. end;
  2728. procedure TFMain.ViewImageListExecute(Sender: TObject);
  2729. begin
  2730. ToggleImageListVisible;
  2731. end;
  2732. procedure TFMain.ViewToolboxExecute(Sender: TObject);
  2733. begin
  2734. ToggleToolboxVisible;
  2735. end;
  2736. procedure TFMain.ViewLayerStackButtonUpdate(Sender: TObject);
  2737. begin
  2738. ViewLayerStackButton.Checked := LazPaintInstance.LayerWindowVisible;
  2739. end;
  2740. procedure TFMain.ViewLayerStackExecute(Sender: TObject);
  2741. begin
  2742. ToggleLayersVisible;
  2743. end;
  2744. procedure TFMain.ViewLayerStackUpdate(Sender: TObject);
  2745. begin
  2746. ViewLayerStack.Checked := LazPaintInstance.LayerWindowVisible;
  2747. end;
  2748. procedure TFMain.ViewPaletteExecute(Sender: TObject);
  2749. begin
  2750. Layout.PaletteVisible := not Layout.PaletteVisible;
  2751. end;
  2752. procedure TFMain.ViewPaletteUpdate(Sender: TObject);
  2753. begin
  2754. ViewPalette.Checked := Layout.PaletteVisible;
  2755. end;
  2756. procedure TFMain.ViewStatusBarExecute(Sender: TObject);
  2757. begin
  2758. Layout.StatusBarVisible := not Layout.StatusBarVisible;
  2759. end;
  2760. procedure TFMain.ViewStatusBarUpdate(Sender: TObject);
  2761. begin
  2762. ViewStatusBar.Checked := Layout.StatusBarVisible;
  2763. end;
  2764. procedure TFMain.ViewToolboxUpdate(Sender: TObject);
  2765. begin
  2766. ViewToolBox.Checked := LazPaintInstance.ToolboxVisible;
  2767. end;
  2768. procedure TFMain.ViewImagelistUpdate(Sender: TObject);
  2769. begin
  2770. ViewImageList.Checked := LazPaintInstance.ImageListWindowVisible;
  2771. end;
  2772. function TFMain.ScriptEditPasteAsNew(AVars: TVariableSet): TScriptResult;
  2773. var bmp: TBGRABitmap;
  2774. begin
  2775. if ToolManager.ToolSleeping then
  2776. begin
  2777. result := srException;
  2778. exit;
  2779. end;
  2780. Cursor := crHourGlass;
  2781. try
  2782. bmp := GetBitmapFromClipboard;
  2783. Cursor := crDefault;
  2784. if bmp <> nil then
  2785. begin
  2786. if bmp.NbPixels > 0 then
  2787. begin
  2788. ChooseTool(ptHand);
  2789. if Image.IsFileModified then
  2790. begin
  2791. case LazPaintInstance.SaveQuestion(rsNewImage) of
  2792. IDYES: scripting.CallScriptFunction('FileSave');
  2793. IDCANCEL: begin
  2794. bmp.Free;
  2795. result := srCancelledByUser;
  2796. exit;
  2797. end;
  2798. end;
  2799. end;
  2800. image.Assign(bmp,true,false);
  2801. Image.CurrentFilenameUTF8 := '';
  2802. image.SetSavedFlag(0, -1, 0);
  2803. result := srOk;
  2804. end
  2805. else
  2806. begin
  2807. bmp.Free;
  2808. result := srException;
  2809. end;
  2810. end else
  2811. result := srException;
  2812. except on ex:exception do
  2813. begin
  2814. Cursor := crDefault;
  2815. LazPaintInstance.ShowError(RemoveTrail(EditPasteAsNew.Caption), ex.Message);
  2816. result := srException;
  2817. end;
  2818. end;
  2819. end;
  2820. function TFMain.ChooseTool(Tool: TPaintToolType): boolean;
  2821. var params: TVariableSet;
  2822. begin
  2823. params := TVariableSet.Create('ChooseTool');
  2824. params.AddString('Name', PaintToolTypeStr[Tool]);
  2825. params.AddBoolean('FromGUI', true);
  2826. result := Scripting.CallScriptFunction(params) = srOk;
  2827. params.Free;
  2828. end;
  2829. procedure TFMain.LayoutPictureAreaChange(ASender: TObject; ANewArea: TRect);
  2830. begin
  2831. {$IFDEF USEPAINTBOXPICTURE}
  2832. PaintBox_Picture.SetBounds(ANewArea.Left,ANewArea.Top,ANewArea.Right-ANewArea.Left,ANewArea.Bottom-ANewArea.Top);
  2833. {$ENDIF}
  2834. if Assigned(FImageView) then FImageView.InvalidatePicture(True, ANewArea, Point(0,0), self);
  2835. end;
  2836. procedure TFMain.ToggleGridVisible;
  2837. begin
  2838. LazPaintInstance.GridVisible := not LazPaintInstance.GridVisible;
  2839. end;
  2840. procedure TFMain.ToggleToolboxVisible;
  2841. begin
  2842. LazPaintInstance.ToolboxVisible := not LazPaintInstance.ToolboxVisible;
  2843. end;
  2844. procedure TFMain.ToggleImageListVisible;
  2845. begin
  2846. LazPaintInstance.ImageListWindowVisible := not LazPaintInstance.ImageListWindowVisible;
  2847. end;
  2848. procedure TFMain.ToggleColorsVisible;
  2849. begin
  2850. LazPaintInstance.ChooseColorVisible := not LazPaintInstance.ChooseColorVisible;
  2851. end;
  2852. procedure TFMain.ToggleLayersVisible;
  2853. begin
  2854. LazPaintInstance.LayerWindowVisible := not LazPaintInstance.LayerWindowVisible;
  2855. end;
  2856. procedure TFMain.ToggleToolwindowsVisible;
  2857. var wantedState: boolean;
  2858. begin
  2859. if LazPaintInstance.ToolboxVisible or LazPaintInstance.ChooseColorVisible or LazPaintInstance.LayerWindowVisible then
  2860. wantedState := false
  2861. else
  2862. wantedState := true;
  2863. if LazPaintInstance.ToolboxVisible <> wantedState then ToggleToolboxVisible;
  2864. if LazPaintInstance.ChooseColorVisible <> wantedState then ToggleColorsVisible;
  2865. if LazPaintInstance.LayerWindowVisible <> wantedState then ToggleLayersVisible;
  2866. end;
  2867. function TFMain.ScriptChooseTool(AVars: TVariableSet): TScriptResult;
  2868. var toolName: string;
  2869. Tool, prevTool: TPaintToolType;
  2870. topmostInfo: TTopMostInfo;
  2871. useSelection: boolean;
  2872. newTexture: TBGRABitmap;
  2873. res: TQuestionResult;
  2874. texMapBounds: TRect;
  2875. begin
  2876. if ToolManager.ToolSleeping then exit;
  2877. texMapBounds := EmptyRect;
  2878. toolName := AVars.Strings['Name'];
  2879. Tool := StrToPaintToolType(toolName);
  2880. if CompareText(PaintToolTypeStr[Tool],toolName)=0 then
  2881. begin
  2882. result := srOk;
  2883. if Tool = ToolManager.GetCurrentToolType then
  2884. begin
  2885. ToolManager.ToolOpen;
  2886. exit;
  2887. end;
  2888. prevTool := ToolManager.GetCurrentToolType;
  2889. try
  2890. if not ((Tool in [ptMoveSelection,ptRotateSelection]) and
  2891. (CurrentTool in [ptMoveSelection,ptRotateSelection])) then
  2892. ToolManager.ToolCloseDontReopen;
  2893. if self.Visible then
  2894. begin
  2895. case Tool of
  2896. ptTextureMapping:
  2897. begin
  2898. useSelection:= false;
  2899. newTexture := nil;
  2900. if not image.SelectionMaskEmpty and (not image.SelectionLayerIsEmpty
  2901. or not image.CurrentLayerEmpty) then
  2902. begin
  2903. topmostInfo := LazPaintInstance.HideTopmost;
  2904. if Config.DefaultTransformSelectionAnswer <> mrNone then
  2905. res := QuestionResult(Config.DefaultTransformSelectionAnswer)
  2906. else
  2907. begin
  2908. res := ShowQuestionDialog(rsTextureMapping,rsTransformSelectionContent,[mbYes,mbNo],true);
  2909. if res.Remember and (res.ButtonResult in [mrYes,mrNo]) then
  2910. Config.SetDefaultTransformSelectionAnswer(res.ButtonResult);
  2911. end;
  2912. LazPaintInstance.ShowTopmost(topmostInfo);
  2913. case res.ButtonResult of
  2914. mrYes: begin
  2915. useSelection:= true;
  2916. if image.SelectionLayerIsEmpty then
  2917. GetScriptContext.CallScriptFunction('EditSelectionFit', false);
  2918. if image.SelectionLayerReadonly <> nil then
  2919. begin
  2920. newTexture := image.SelectionLayerReadonly.Duplicate as TBGRABitmap;
  2921. newTexture.ApplyMask(image.SelectionMaskReadonly, image.SelectionLayerBounds);
  2922. if newTexture.Empty then
  2923. begin
  2924. newTexture.Free;
  2925. MessagePopup(rsNothingToBeRetrieved,2000);
  2926. end
  2927. else
  2928. begin
  2929. ImageAction.RemoveSelection;
  2930. texMapBounds := newTexture.GetImageBounds;
  2931. BGRAReplace(newTexture, newTexture.GetPart(texMapBounds));
  2932. ToolManager.BackFill.SetTexture(newTexture, AffineMatrixIdentity,
  2933. ToolManager.BackFill.TextureOpacity, ToolManager.BackFill.TextureRepetition);
  2934. newTexture.FreeReference;
  2935. end;
  2936. end;
  2937. end;
  2938. end;
  2939. end;
  2940. if (ToolManager.BackFill.Texture = nil) or
  2941. ToolManager.BackFill.Texture.Empty then
  2942. begin
  2943. if useSelection then
  2944. begin
  2945. Tool := ptHand;
  2946. result := srException;
  2947. end else
  2948. if not ShowOpenTextureDialog(ToolManager.BackFill) then
  2949. begin
  2950. Tool := ptHand;
  2951. result := srCancelledByUser;
  2952. end
  2953. else
  2954. if (ToolManager.BackFill.Texture = nil) or
  2955. ToolManager.BackFill.Texture.Empty then
  2956. begin
  2957. Tool := ptHand;
  2958. result := srException;
  2959. end;
  2960. end;
  2961. end;
  2962. ptLayerMapping:
  2963. begin
  2964. EditDeselect.Execute;
  2965. if image.CurrentLayerEmpty then
  2966. begin
  2967. MessagePopup(rsEmptyLayer,2000);
  2968. Tool := ptHand;
  2969. result := srException;
  2970. end;
  2971. end;
  2972. ptMoveLayer, ptRotateLayer, ptZoomLayer:
  2973. begin
  2974. if image.LayerOriginalDefined[image.CurrentLayerIndex] and
  2975. image.LayerOriginalKnown[image.CurrentLayerIndex] and
  2976. (image.LayerOriginal[image.CurrentLayerIndex]=nil) then
  2977. begin
  2978. Tool := ptHand;
  2979. result := srException;
  2980. end;
  2981. if image.CurrentLayerEquals(BGRAPixelTransparent) and not
  2982. (image.LayerOriginalDefined[image.CurrentLayerIndex] and
  2983. image.LayerOriginalKnown[image.CurrentLayerIndex] and
  2984. not image.LayerOriginal[image.CurrentLayerIndex].GetRenderBounds(
  2985. rect(-maxLongInt div 2,-maxLongInt div 2,maxLongInt div 2,maxLongInt div 2),
  2986. AffineMatrixIdentity).IsEmpty) then
  2987. begin
  2988. MessagePopup(rsEmptyLayer, 4000);
  2989. Tool := ptHand;
  2990. result := srException;
  2991. end;
  2992. end;
  2993. ptDeformation:
  2994. begin
  2995. if (image.SelectionMaskEmpty and image.CurrentLayerEquals(image.CurrentLayerPixel[0,0])) or
  2996. (not image.SelectionMaskEmpty and image.SelectionLayerIsEmpty) then
  2997. begin
  2998. LazPaintInstance.ShowMessage(rsLazPaint, rsNothingToBeDeformed);
  2999. Tool := ptHand;
  3000. result := srException;
  3001. end;
  3002. end;
  3003. ptMoveSelection,ptRotateSelection,ptEditShape:
  3004. begin
  3005. if not ToolManager.SetCurrentToolType(Tool) then
  3006. begin
  3007. result := srException;
  3008. exit;
  3009. end;
  3010. if AVars.Booleans['FromGUI'] and
  3011. not (prevTool in [ptMoveSelection,ptRotateSelection,ptEditShape]) then
  3012. begin
  3013. if image.CurrentLayerVisible and not image.SelectionMaskEmpty and image.SelectionLayerIsEmpty and not image.CurrentLayerEmpty then
  3014. begin
  3015. topmostInfo := LazPaintInstance.HideTopmost;
  3016. if Config.DefaultRetrieveSelectionAnswer <> mrNone then
  3017. res := QuestionResult(Config.DefaultRetrieveSelectionAnswer)
  3018. else
  3019. begin
  3020. res := ShowQuestionDialog(rsMovingOrRotatingSelection,rsRetrieveSelectedArea,[mbYes,mbNo],true);
  3021. if res.Remember and (res.ButtonResult in [mrYes,mrNo]) then
  3022. Config.SetDefaultRetrieveSelectionAnswer(res.ButtonResult);
  3023. end;
  3024. LazPaintInstance.ShowTopmost(topmostInfo);
  3025. case res.ButtonResult of
  3026. mrYes:
  3027. begin
  3028. ToolManager.ToolCloseDontReopen;
  3029. ImageAction.RetrieveSelection;
  3030. ToolManager.ToolOpen;
  3031. end;
  3032. end;
  3033. end;
  3034. end;
  3035. end;
  3036. end;
  3037. end;
  3038. ToolManager.SetCurrentToolType(Tool);
  3039. if not texMapBounds.IsEmpty then
  3040. begin
  3041. ToolManager.PerspectiveOptions:= [];
  3042. ToolManager.ToolDown(texMapBounds.Left-0.5, texMapBounds.Top-0.5, false, 1);
  3043. ToolManager.ToolMove(texMapBounds.Right-0.5, texMapBounds.Bottom-0.5, 1);
  3044. ToolManager.ToolUp;
  3045. end;
  3046. if Assigned(FImageView) then
  3047. FImageView.FillSelectionHighlight := ToolManager.DisplayFilledSelection and not FShowSelectionNormal;
  3048. except
  3049. on ex:Exception do
  3050. begin
  3051. LazPaintInstance.ShowError('ChooseTool',ex.Message);
  3052. result := srException;
  3053. end;
  3054. end;
  3055. end else
  3056. result := srInvalidParameters;
  3057. end;
  3058. function TFMain.ScriptToolMouse(AVars: TVariableSet): TScriptResult;
  3059. var
  3060. state, xy, pressure: TScriptVariableReference;
  3061. nb, i: integer;
  3062. ptF: TPointF;
  3063. shiftState: TShiftState;
  3064. needUpdate: Boolean;
  3065. p: Double;
  3066. keyCode: word;
  3067. begin
  3068. state := AVars.GetVariable('State');
  3069. xy := AVars.GetVariable('Coords');
  3070. pressure := AVars.GetVariable('Pressure');
  3071. if not TVariableSet.IsReferenceDefined(xy) or
  3072. not TVariableSet.IsReferenceDefined(pressure) then
  3073. exit(srInvalidParameters);
  3074. nb := min(AVars.GetListCount(xy), AVars.GetListCount(pressure));
  3075. if nb < 1 then
  3076. exit(srInvalidParameters);
  3077. shiftState := [];
  3078. needUpdate := false;
  3079. if TVariableSet.IsReferenceDefined(state) then
  3080. begin
  3081. for i := 0 to AVars.GetListCount(state)-1 do
  3082. case AVars.GetStringAt(state, i) of
  3083. 'Left': include(shiftState, ssLeft);
  3084. 'Right': include(shiftState, ssRight);
  3085. 'Shift': include(shiftState, ssShift);
  3086. 'Ctrl': include(shiftState, ssSnap);
  3087. 'Alt': include(shiftState, ssAlt);
  3088. end;
  3089. if (ssLeft in shiftState) and (ssRight in ShiftState) then
  3090. exit(srInvalidParameters);
  3091. for i := 0 to AVars.GetListCount(state)-1 do
  3092. case AVars.GetStringAt(state, i) of
  3093. 'Shift': begin keyCode := VK_SHIFT; if ToolManager.ToolKeyDown(keyCode) then needUpdate := true; end;
  3094. 'Ctrl': begin keyCode := VK_SNAP; if ToolManager.ToolKeyDown(keyCode) then needUpdate := true; end;
  3095. 'Alt': begin keyCode := VK_MENU; if ToolManager.ToolKeyDown(keyCode) then needUpdate := true; end;
  3096. end;
  3097. end;
  3098. for i := 0 to nb-1 do
  3099. begin
  3100. ptF := AVars.GetPoint2DAt(xy, i);
  3101. p := AVars.GetFloatAt(pressure, i);
  3102. if ToolManager.ToolMove(ptF,p) then needUpdate := true;
  3103. if (ssLeft in ShiftState) or (ssRight in shiftState) then
  3104. begin
  3105. if i = 0 then
  3106. if ToolManager.ToolDown(ptF, ssRight in shiftState, p) then
  3107. needUpdate := true;
  3108. if i = nb-1 then
  3109. if ToolManager.ToolUp then
  3110. needUpdate := true;
  3111. end;
  3112. end;
  3113. if TVariableSet.IsReferenceDefined(state) then
  3114. for i := 0 to AVars.GetListCount(state)-1 do
  3115. case AVars.GetStringAt(state, i) of
  3116. 'Shift': begin keyCode := VK_SHIFT; if ToolManager.ToolKeyUp(keyCode) then needUpdate := true; end;
  3117. 'Ctrl': begin keyCode := VK_SNAP; if ToolManager.ToolKeyUp(keyCode) then needUpdate := true; end;
  3118. 'Alt': begin keyCode := VK_MENU; if ToolManager.ToolKeyUp(keyCode) then needUpdate := true; end;
  3119. end;
  3120. if needUpdate then
  3121. begin
  3122. FImageView.UpdatePicture(PictureCanvasOfs, FLayout.WorkArea, self);
  3123. PaintPictureNow;
  3124. UpdateToolbar;
  3125. end;
  3126. result := srOk;
  3127. end;
  3128. function TFMain.ScriptToolKeys(AVars: TVariableSet): TScriptResult;
  3129. var
  3130. state, keys: TScriptVariableReference;
  3131. i: Integer;
  3132. needUpdate: Boolean;
  3133. sk, foundSk: TSpecialKey;
  3134. keyStr: String;
  3135. keyCode: Word;
  3136. shiftState: TShiftState;
  3137. utf8Char: TUTF8Char;
  3138. begin
  3139. state := AVars.GetVariable('State');
  3140. keys := AVars.GetVariable('Keys');
  3141. if not TVariableSet.IsReferenceDefined(keys) then
  3142. exit(srInvalidParameters);
  3143. result := srOk;
  3144. needUpdate := false;
  3145. shiftState := [];
  3146. if TVariableSet.IsReferenceDefined(state) then
  3147. for i := 0 to AVars.GetListCount(state)-1 do
  3148. case AVars.GetStringAt(state, i) of
  3149. 'Shift': begin include(shiftState, ssShift); keyCode := VK_SHIFT; if ToolManager.ToolKeyDown(keyCode) then needUpdate := true; end;
  3150. 'Ctrl': begin include(shiftState, ssSnap); keyCode := VK_SNAP; if ToolManager.ToolKeyDown(keyCode) then needUpdate := true; end;
  3151. 'Alt': begin include(shiftState, ssAlt); keyCode := VK_MENU; if ToolManager.ToolKeyDown(keyCode) then needUpdate := true; end;
  3152. end;
  3153. for i := 0 to AVars.GetListCount(keys)-1 do
  3154. begin
  3155. keyStr := AVars.GetStringAt(keys, i);
  3156. foundSk := skUnknown;
  3157. for sk := low(TSpecialKey) to high(TSpecialKey) do
  3158. if SpecialKeyStr[sk] = keyStr then
  3159. begin
  3160. foundSk := sk;
  3161. break;
  3162. end;
  3163. if foundSk in[skUnknown, skShift,skCtrl,skAlt] then
  3164. begin
  3165. result := srInvalidParameters;
  3166. break;
  3167. end;
  3168. keyCode := SpecialKeyToLCL[foundSk];
  3169. if ToolManager.ToolKeyDown(keyCode) then needUpdate := true;
  3170. if (keyCode <> 0) then
  3171. begin
  3172. utf8Char:= #0;
  3173. if foundSk in [skNum0..skNum9] then utf8Char := chr(ord(foundSk)-ord(skNum0)+ord('0'))
  3174. else if foundSk in [sk0..sk9] then utf8Char := chr(ord(foundSk)-ord(sk0)+ord('0'))
  3175. else if foundSk in [skA..skZ] then
  3176. begin
  3177. if [ssShift,ssSnap,ssAlt]*shiftState = [] then utf8Char := chr(ord(foundSk)-ord(skA)+ord('a'))
  3178. else if [ssShift,ssSnap,ssAlt]*shiftState = [sSShift] then utf8Char := chr(ord(foundSk)-ord(skA)+ord('A'));
  3179. end
  3180. else if (foundSk = skTab) and ([ssSnap,ssAlt]*shiftState = []) then utf8Char := #9
  3181. else if (foundSk = skBackspace) and ([ssSnap,ssAlt]*shiftState = []) then utf8Char := #8;
  3182. if (utf8Char <> #0) and ToolManager.ToolKeyPress(utf8Char) then needUpdate := true;
  3183. end;
  3184. keyCode := SpecialKeyToLCL[foundSk];
  3185. if ToolManager.ToolKeyUp(keyCode) then needUpdate := true;
  3186. end;
  3187. if TVariableSet.IsReferenceDefined(state) then
  3188. for i := 0 to AVars.GetListCount(state)-1 do
  3189. case AVars.GetStringAt(state, i) of
  3190. 'Shift': begin keyCode := VK_SHIFT; if ToolManager.ToolKeyUp(keyCode) then needUpdate := true; end;
  3191. 'Ctrl': begin keyCode := VK_SNAP; if ToolManager.ToolKeyUp(keyCode) then needUpdate := true; end;
  3192. 'Alt': begin keyCode := VK_MENU; if ToolManager.ToolKeyUp(keyCode) then needUpdate := true; end;
  3193. end;
  3194. if needUpdate then
  3195. begin
  3196. FImageView.UpdatePicture(PictureCanvasOfs, FLayout.WorkArea, self);
  3197. PaintPictureNow;
  3198. UpdateToolbar;
  3199. end;
  3200. end;
  3201. function TFMain.ScriptToolWrite(AVars: TVariableSet): TScriptResult;
  3202. var
  3203. txt: String;
  3204. utf8char: TUTF8Char;
  3205. p, pEnd: PChar;
  3206. needUpdate: Boolean;
  3207. utf8len: integer;
  3208. keyCode,keyParam: word;
  3209. begin
  3210. result := srOk;
  3211. txt := AVars.Strings['Text'];
  3212. if txt <> '' then
  3213. begin
  3214. needUpdate := false;
  3215. p := @txt[1];
  3216. pEnd := @txt[length(txt)];
  3217. while p <= pEnd do
  3218. begin
  3219. utf8len := min(UTF8CharacterLength(p), (pEnd-p)+1);
  3220. if utf8len = 0 then break;
  3221. setlength(utf8char, utf8len);
  3222. move(p^, utf8char[1], utf8len);
  3223. if utf8char = #10 then keyCode := VK_RETURN
  3224. else if utf8char = #8 then keyCode := VK_BACK
  3225. else if utf8char = #9 then keyCode := VK_TAB
  3226. else keyCode := 0;
  3227. if keyCode<>0 then
  3228. begin
  3229. keyParam := keyCode;
  3230. if ToolManager.ToolKeyDown(keyParam) then needUpdate:= true;
  3231. end else keyParam := VK_UNDEFINED;
  3232. if keyParam <> 0 then if ToolManager.ToolKeyPress(utf8char) then needUpdate:= true;
  3233. if keyCode<>0 then
  3234. begin
  3235. keyParam := keyCode;
  3236. if ToolManager.ToolKeyUp(keyParam) then needUpdate:= true;
  3237. end;
  3238. inc(p, utf8len);
  3239. end;
  3240. if needUpdate then
  3241. begin
  3242. FImageView.UpdatePicture(PictureCanvasOfs, FLayout.WorkArea, self);
  3243. PaintPictureNow;
  3244. UpdateToolbar;
  3245. end;
  3246. end;
  3247. end;
  3248. function TFMain.ScriptViewZoomIn(AVars: TVariableSet): TScriptResult;
  3249. begin
  3250. Zoom.ZoomIn(AVars.Booleans['Fine']);
  3251. result := srOk;
  3252. end;
  3253. function TFMain.ScriptViewZoomOut(AVars: TVariableSet): TScriptResult;
  3254. begin
  3255. Zoom.ZoomOut(AVars.Booleans['Fine']);
  3256. result := srOk;
  3257. end;
  3258. function TFMain.ScriptViewZoomGet(AVars: TVariableSet): TScriptResult;
  3259. begin
  3260. AVars.Floats['Result'] := Zoom.Factor;
  3261. result := srOk;
  3262. end;
  3263. function TFMain.ScriptViewZoomSet(AVars: TVariableSet): TScriptResult;
  3264. begin
  3265. Zoom.Factor := AVars.Floats['Factor'];
  3266. result := srOk;
  3267. end;
  3268. function TFMain.ScriptViewZoomOriginal(AVars: TVariableSet): TScriptResult;
  3269. begin
  3270. AVars.Floats['Factor'] := 1;
  3271. result := GetScriptContext.CallScriptFunction('ViewZoomSet', true, AVars);
  3272. end;
  3273. function TFMain.ScriptViewZoomFit(AVars: TVariableSet): TScriptResult;
  3274. begin
  3275. Image.ZoomFit;
  3276. result := srOk;
  3277. end;
  3278. function TFMain.ScriptViewGrid(AVars: TVariableSet): TScriptResult;
  3279. begin
  3280. if AVars.IsDefined('Visible') then
  3281. begin
  3282. if LazPaintInstance.GridVisible <> AVars.Booleans['Visible'] then
  3283. ToggleGridVisible;
  3284. end else
  3285. ToggleGridVisible;
  3286. result := srOk;
  3287. end;
  3288. function TFMain.ScriptViewGridGet(AVars: TVariableSet): TScriptResult;
  3289. begin
  3290. AVars.Booleans['Result'] := LazPaintInstance.GridVisible;
  3291. result := srOk;
  3292. end;
  3293. function TFMain.ScriptShowColorDialog(AVars: TVariableSet): TScriptResult;
  3294. begin
  3295. if AVars.IsDefined('Color') then
  3296. ColorDialog1.Color := AVars.Pixels['Color'].ToColor;
  3297. if ColorDialog1.Execute then
  3298. AVars.Pixels['Result'] := ColorToBGRA(ColorDialog1.Color)
  3299. else
  3300. AVars.Remove('Result');
  3301. result := srOk;
  3302. end;
  3303. procedure TFMain.BrushCreateGeometricExecute(Sender: TObject);
  3304. var b: TLazPaintBrush;
  3305. begin
  3306. b := ShowGeometricBrushDialog(LazPaintInstance);
  3307. if Assigned(b) then ToolManager.AddBrush(b);
  3308. end;
  3309. procedure TFMain.BrushCreateGeometricUpdate(Sender: TObject);
  3310. begin
  3311. BrushCreateGeometric.Enabled := ToolManager.BrushCount < 9;
  3312. end;
  3313. procedure TFMain.EditSelectionUpdate(Sender: TObject);
  3314. begin
  3315. EditSelection.Enabled := not Scripting.Recording;
  3316. end;
  3317. procedure TFMain.EditShapeAlignBottomExecute(Sender: TObject);
  3318. begin
  3319. ToolManager.ToolCommand(tcAlignBottom);
  3320. end;
  3321. procedure TFMain.EditShapeAlignBottomUpdate(Sender: TObject);
  3322. begin
  3323. EditShapeAlignBottom.Enabled := ToolManager.ToolProvideCommand(tcAlignBottom);
  3324. end;
  3325. procedure TFMain.EditShapeAlignLeftExecute(Sender: TObject);
  3326. begin
  3327. ToolManager.ToolCommand(tcAlignLeft);
  3328. end;
  3329. procedure TFMain.EditShapeAlignLeftUpdate(Sender: TObject);
  3330. begin
  3331. EditShapeAlignLeft.Enabled := ToolManager.ToolProvideCommand(tcAlignLeft);
  3332. end;
  3333. procedure TFMain.EditShapeAlignRightExecute(Sender: TObject);
  3334. begin
  3335. ToolManager.ToolCommand(tcAlignRight);
  3336. end;
  3337. procedure TFMain.EditShapeAlignRightUpdate(Sender: TObject);
  3338. begin
  3339. EditShapeAlignRight.Enabled := ToolManager.ToolProvideCommand(tcAlignRight);
  3340. end;
  3341. procedure TFMain.EditShapeAlignTopExecute(Sender: TObject);
  3342. begin
  3343. ToolManager.ToolCommand(tcAlignTop);
  3344. end;
  3345. procedure TFMain.EditShapeAlignTopUpdate(Sender: TObject);
  3346. begin
  3347. EditShapeAlignTop.Enabled := ToolManager.ToolProvideCommand(tcAlignTop);
  3348. end;
  3349. procedure TFMain.EditShapeCenterHorizontallyExecute(Sender: TObject);
  3350. begin
  3351. ToolManager.ToolCommand(tcCenterHorizontally);
  3352. end;
  3353. procedure TFMain.EditShapeCenterHorizontallyUpdate(Sender: TObject);
  3354. begin
  3355. EditShapeCenterHorizontally.Enabled := ToolManager.ToolProvideCommand(tcCenterHorizontally);
  3356. end;
  3357. procedure TFMain.EditShapeCenterVerticallyExecute(Sender: TObject);
  3358. begin
  3359. ToolManager.ToolCommand(tcCenterVertically);
  3360. end;
  3361. procedure TFMain.EditShapeCenterVerticallyUpdate(Sender: TObject);
  3362. begin
  3363. EditShapeCenterVertically.Enabled := ToolManager.ToolProvideCommand(tcCenterVertically);
  3364. end;
  3365. procedure TFMain.EditShapeToCurveExecute(Sender: TObject);
  3366. begin
  3367. if ToolManager.CurrentTool is TVectorialTool then ChooseTool(ptEditShape);
  3368. ToolManager.ToolCommand(tcShapeToSpline);
  3369. end;
  3370. procedure TFMain.EditShapeToCurveUpdate(Sender: TObject);
  3371. begin
  3372. EditShapeToCurve.Enabled := ToolManager.ToolProvideCommand(tcShapeToSpline);
  3373. end;
  3374. procedure TFMain.FileChooseEntryExecute(Sender: TObject);
  3375. var
  3376. openParams: TVariableSet;
  3377. begin
  3378. openParams := TVariableSet.Create('FileChooseEntry');
  3379. Scripting.CallScriptFunction(openParams);
  3380. openParams.Free;
  3381. end;
  3382. procedure TFMain.FileChooseEntryUpdate(Sender: TObject);
  3383. begin
  3384. FileChooseEntry.Enabled := Image.IsIconCursor or Image.IsTiff or Image.IsGif;
  3385. end;
  3386. procedure TFMain.FileExportExecute(Sender: TObject);
  3387. var
  3388. params: TVariableSet;
  3389. begin
  3390. params := TVariableSet.Create('FileSaveAs');
  3391. params.Booleans['Export'] := true;
  3392. Scripting.CallScriptFunction(params);
  3393. params.Free;
  3394. end;
  3395. procedure TFMain.EditCopyExecute(Sender: TObject);
  3396. begin
  3397. if not ToolManager.ToolCommand(tcCopy) then
  3398. Scripting.CallScriptFunction('EditCopy');
  3399. end;
  3400. procedure TFMain.EditCopyUpdate(Sender: TObject);
  3401. begin
  3402. EditCopy.Enabled := ToolManager.ToolProvideCommand(tcCopy) or not image.SelectionMaskEmpty;
  3403. end;
  3404. procedure TFMain.EditCutExecute(Sender: TObject);
  3405. begin
  3406. if not ToolManager.ToolCommand(tcCut) then
  3407. Scripting.CallScriptFunction('EditCut');
  3408. end;
  3409. procedure TFMain.EditCutUpdate(Sender: TObject);
  3410. begin
  3411. EditCut.Enabled := ToolManager.ToolProvideCommand(tcCut) or
  3412. (not image.SelectionMaskEmpty and
  3413. (not image.SelectionLayerIsEmpty or image.CurrentLayerVisible));
  3414. end;
  3415. procedure TFMain.EditDeleteSelectionExecute(Sender: TObject);
  3416. begin
  3417. if not ToolManager.ToolCommand(tcDelete) then
  3418. Scripting.CallScriptFunction('EditDeleteSelection');
  3419. end;
  3420. procedure TFMain.EditDeleteSelectionUpdate(Sender: TObject);
  3421. begin
  3422. EditDeleteSelection.Enabled := ToolManager.ToolProvideCommand(tcDelete) or not image.SelectionMaskEmpty;
  3423. end;
  3424. procedure TFMain.EditMoveDownExecute(Sender: TObject);
  3425. begin
  3426. if ToolManager.CurrentTool is TVectorialTool then ChooseTool(ptEditShape);
  3427. ToolManager.ToolCommand(tcMoveDown);
  3428. end;
  3429. procedure TFMain.EditMoveDownUpdate(Sender: TObject);
  3430. begin
  3431. EditMoveDown.Enabled := ToolManager.ToolProvideCommand(tcMoveDown);
  3432. end;
  3433. procedure TFMain.EditMoveToBackExecute(Sender: TObject);
  3434. begin
  3435. if ToolManager.CurrentTool is TVectorialTool then ChooseTool(ptEditShape);
  3436. ToolManager.ToolCommand(tcMoveToBack);
  3437. end;
  3438. procedure TFMain.EditMoveToBackUpdate(Sender: TObject);
  3439. begin
  3440. EditMoveToBack.Enabled := ToolManager.ToolProvideCommand(tcMoveToBack);
  3441. end;
  3442. procedure TFMain.EditMoveToFrontExecute(Sender: TObject);
  3443. begin
  3444. ToolManager.ToolCommand(tcMoveToFront);
  3445. end;
  3446. procedure TFMain.EditMoveToFrontUpdate(Sender: TObject);
  3447. begin
  3448. EditMoveToFront.Enabled := ToolManager.ToolProvideCommand(tcMoveToFront);
  3449. end;
  3450. procedure TFMain.EditMoveUpExecute(Sender: TObject);
  3451. begin
  3452. ToolManager.ToolCommand(tcMoveUp);
  3453. end;
  3454. procedure TFMain.EditMoveUpUpdate(Sender: TObject);
  3455. begin
  3456. EditMoveUp.Enabled := ToolManager.ToolProvideCommand(tcMoveUp);
  3457. end;
  3458. procedure TFMain.EditPasteExecute(Sender: TObject);
  3459. begin
  3460. if not ToolManager.ToolCommand(tcPaste) then
  3461. Scripting.CallScriptFunction('EditPaste');
  3462. end;
  3463. procedure TFMain.EditSelectionFitUpdate(Sender: TObject);
  3464. begin
  3465. EditSelectionFit.Enabled:= Image.CurrentLayerVisible;
  3466. end;
  3467. procedure TFMain.FileImport3DUpdate(Sender: TObject);
  3468. begin
  3469. FileImport3d.Enabled := not Scripting.Recording
  3470. end;
  3471. procedure TFMain.FilePrintExecute(Sender: TObject);
  3472. begin
  3473. LazPaintInstance.ShowPrintDlg;
  3474. end;
  3475. procedure TFMain.FileRememberSaveFormatExecute(Sender: TObject);
  3476. begin
  3477. FileRememberSaveFormat.Checked := not FileRememberSaveFormat.Checked;
  3478. Config.SetRememberSaveFormat(FileRememberSaveFormat.Checked);
  3479. end;
  3480. procedure TFMain.FileRunScriptExecute(Sender: TObject);
  3481. var
  3482. dlg: TOpenDialog;
  3483. tmi: TTopMostInfo;
  3484. begin
  3485. tmi := LazPaintInstance.HideTopmost;
  3486. try
  3487. dlg := TOpenDialog.Create(nil);
  3488. try
  3489. dlg.Title := FileRunScript.Caption;
  3490. dlg.InitialDir:= Config.DefaultScriptDirectory;
  3491. dlg.DefaultExt:= 'py';
  3492. dlg.Filter:= 'Python (*.py)|*.py';
  3493. if dlg.Execute then
  3494. begin
  3495. Config.SetDefaultScriptDirectory(ExtractFilePath(dlg.FileName));
  3496. LazPaintInstance.RunScript(dlg.FileName);
  3497. end;
  3498. except
  3499. on ex:exception do
  3500. LazPaintInstance.ShowError(RemoveTrail(FileRunScript.Caption), ex.Message);
  3501. end;
  3502. dlg.Free;
  3503. finally
  3504. LazPaintInstance.ShowTopmost(tmi);
  3505. end;
  3506. end;
  3507. procedure TFMain.FileSaveAsInSameFolderExecute(Sender: TObject);
  3508. var dir: string;
  3509. begin
  3510. dir := ExtractFilePath(Image.CurrentFilenameUTF8);
  3511. if dir <> '' then FSaveInitialDir := dir;
  3512. Scripting.CallScriptFunction('FileSaveAs');
  3513. end;
  3514. procedure TFMain.FileSaveAsInSameFolderUpdate(Sender: TObject);
  3515. begin
  3516. FileSaveAsInSameFolder.Enabled := ExtractFilePath(Image.CurrentFilenameUTF8)<>'';
  3517. end;
  3518. procedure TFMain.FileUseImageBrowserExecute(Sender: TObject);
  3519. begin
  3520. Config.SetDefaultUseImageBrowser(not UseImageBrowser);
  3521. end;
  3522. procedure TFMain.FileUseImageBrowserUpdate(Sender: TObject);
  3523. begin
  3524. FileUseImageBrowser.Checked := UseImageBrowser;
  3525. end;
  3526. procedure TFMain.ForgetDialogAnswersExecute(Sender: TObject);
  3527. var
  3528. m: TToolPopupMessage;
  3529. begin
  3530. Config.SetDefaultTransformSelectionAnswer(0);
  3531. Config.SetDefaultRetrieveSelectionAnswer(0);
  3532. for m := low(TToolPopupMessage) to high(TToolPopupMessage) do
  3533. Config.SetToolPopupMessageShownCount(ord(m), 0);
  3534. end;
  3535. procedure TFMain.FormClose(Sender: TObject; var CloseAction: TCloseAction);
  3536. begin
  3537. Image.OnCurrentFilenameChanged := nil;
  3538. Image.OnImageChanged.RemoveObserver(@OnImageChangedHandler);
  3539. Image.OnQueryExitToolHandler := nil;
  3540. Image.Zoom := nil;
  3541. end;
  3542. procedure TFMain.ItemDockLayersAndColorsClick(Sender: TObject);
  3543. begin
  3544. LazPaintInstance.DockLayersAndColors := not LazPaintInstance.DockLayersAndColors;
  3545. end;
  3546. procedure TFMain.ItemFullscreenClick(Sender: TObject);
  3547. begin
  3548. LazPaintInstance.Fullscreen := not LazPaintInstance.Fullscreen;
  3549. end;
  3550. procedure TFMain.ItemViewDockToolboxClick(Sender: TObject);
  3551. begin
  3552. if Layout.ToolBoxDocking in[twWindow,twNone] then
  3553. Layout.ToolBoxDocking := twLeft
  3554. else
  3555. Layout.ToolBoxDocking := twWindow;
  3556. end;
  3557. procedure TFMain.LayerRasterizeUpdate(Sender: TObject);
  3558. begin
  3559. LayerRasterize.Enabled := Image.LayerOriginalDefined[Image.CurrentLayerIndex];
  3560. end;
  3561. procedure TFMain.LayerZoomExecute(Sender: TObject);
  3562. begin
  3563. ChooseTool(ptZoomLayer);
  3564. end;
  3565. procedure TFMain.LayerZoomUpdate(Sender: TObject);
  3566. begin
  3567. LayerZoom.Enabled := Image.CurrentLayerVisible and Image.SelectionMaskEmpty;
  3568. end;
  3569. procedure TFMain.MenuCoordinatesToolbarClick(Sender: TObject);
  3570. begin
  3571. Panel_Coordinates.Visible := not Panel_Coordinates.Visible;
  3572. Config.SetDefaultCoordinatesToolbarVisible(Panel_Coordinates.Visible);
  3573. QueryArrange;
  3574. end;
  3575. procedure TFMain.MenuCopyPasteToolbarClick(Sender: TObject);
  3576. begin
  3577. Panel_CopyPaste.Visible := not Panel_CopyPaste.Visible;
  3578. Config.SetDefaultCopyPasteToolbarVisible(Panel_CopyPaste.Visible);
  3579. QueryArrange;
  3580. end;
  3581. procedure TFMain.MenuDockToolboxLeftClick(Sender: TObject);
  3582. begin
  3583. Layout.ToolBoxDocking := twLeft;
  3584. end;
  3585. procedure TFMain.MenuDockToolboxRightClick(Sender: TObject);
  3586. begin
  3587. Layout.ToolBoxDocking := twRight;
  3588. end;
  3589. procedure TFMain.MenuFileToolbarClick(Sender: TObject);
  3590. begin
  3591. Config.SetDefaultFileToolbarVisible(not Config.DefaultFileToolbarVisible);
  3592. Panel_File.Visible := Config.DefaultFileToolbarVisible and not LazPaintInstance.Embedded;
  3593. QueryArrange;
  3594. end;
  3595. procedure TFMain.MenuShowPaletteClick(Sender: TObject);
  3596. begin
  3597. Layout.PaletteVisible := not Layout.PaletteVisible;
  3598. end;
  3599. procedure TFMain.MenuUndockToolboxClick(Sender: TObject);
  3600. begin
  3601. Layout.ToolBoxDocking := twWindow;
  3602. end;
  3603. procedure TFMain.MenuUndoRedoToolbarClick(Sender: TObject);
  3604. begin
  3605. Panel_Undo.Visible := not Panel_Undo.Visible;
  3606. Config.SetDefaultUndoRedoToolbarVisible(Panel_Undo.Visible);
  3607. QueryArrange;
  3608. end;
  3609. procedure TFMain.MenuViewClick(Sender: TObject);
  3610. begin
  3611. ItemViewDockToolbox.Checked := (Layout.ToolBoxDocking <> twWindow) and (Layout.ToolBoxDocking <> twNone);
  3612. ItemDockLayersAndColors.Checked := LazPaintInstance.DockLayersAndColors;
  3613. ItemFullscreen.Checked := LazPaintInstance.Fullscreen;
  3614. {$IFDEF LINUX}
  3615. ItemFullscreen.Visible := false;
  3616. {$ENDIF}
  3617. end;
  3618. procedure TFMain.MenuZoomToolbarClick(Sender: TObject);
  3619. begin
  3620. Panel_Zoom.Visible := not Panel_Zoom.Visible;
  3621. Config.SetDefaultZoomToolbarVisible(Panel_Zoom.Visible);
  3622. QueryArrange;
  3623. end;
  3624. procedure TFMain.EditPasteUpdate(Sender: TObject);
  3625. begin
  3626. EditPaste.Enabled := ToolManager.ToolProvideCommand(tcPaste) or Image.CurrentLayerVisible;
  3627. end;
  3628. procedure TFMain.EditDeselectUpdate(Sender: TObject);
  3629. begin
  3630. EditDeselect.Enabled := not image.SelectionMaskEmpty;
  3631. if image.SelectionMaskEmpty then FSaveSelectionInitialFilename := '';
  3632. end;
  3633. procedure TFMain.EditRedoUpdate(Sender: TObject);
  3634. begin
  3635. EditRedo.Enabled := image.CanRedo;
  3636. end;
  3637. procedure TFMain.EditSelectionExecute(Sender: TObject);
  3638. begin
  3639. LazPaintInstance.EditSelection;
  3640. end;
  3641. procedure TFMain.ScriptExecute(Sender: TObject);
  3642. var actionName: string;
  3643. begin
  3644. if Sender is TAction then
  3645. begin
  3646. actionName := (Sender as TAction).Name;
  3647. CallScriptFunction(actionName);
  3648. end;
  3649. end;
  3650. procedure TFMain.AskMergeSelection(ACaption: string);
  3651. var topmostInfo: TTopMostInfo; res: integer;
  3652. begin
  3653. if not image.SelectionMaskEmpty and not image.SelectionLayerIsEmpty then
  3654. begin
  3655. topmostInfo:= LazPaintInstance.HideTopmost;
  3656. res := MessageDlg(ACaption,rsMergeSelection,mtConfirmation,[mbYes,mbNo],0);
  3657. LazPaintInstance.ShowTopmost(topmostInfo);
  3658. case res of
  3659. mrYes: EditDeselect.Execute;
  3660. end;
  3661. end;
  3662. end;
  3663. procedure TFMain.ReleaseMouseButtons(Shift: TShiftState);
  3664. begin
  3665. if not (ssLeft in Shift) and btnLeftDown then
  3666. begin
  3667. btnLeftDown := false;
  3668. if ToolManager.ToolUp then PaintPictureNow;
  3669. end;
  3670. if not (ssRight in Shift) and btnRightDown then
  3671. begin
  3672. btnRightDown := false;
  3673. if ToolManager.ToolUp then PaintPictureNow;
  3674. end;
  3675. if not (ssMiddle in Shift) and btnMiddleDown then
  3676. begin
  3677. btnMiddleDown := false;
  3678. if ToolManager.ToolUp then PaintPictureNow;
  3679. end;
  3680. if not btnLeftDown and not btnRightDown then
  3681. begin
  3682. CanCompressOrUpdateStack := true;
  3683. Image.OnImageChanged.DelayedStackUpdate := False;
  3684. end;
  3685. end;
  3686. procedure TFMain.UpdateSpecialKeys(Shift: TShiftState);
  3687. procedure UpdateKey(AShift: TShiftStateEnum; ACode: Word; var APressed: boolean);
  3688. begin
  3689. if (AShift in Shift) and not APressed then
  3690. begin
  3691. if ToolManager.ToolKeyDown(ACode) then PaintPictureNow;
  3692. APressed:= true;
  3693. end else
  3694. if not (AShift in Shift) and APressed then
  3695. begin
  3696. if ToolManager.ToolKeyUp(ACode) then PaintPictureNow;
  3697. APressed:= false;
  3698. end;
  3699. end;
  3700. begin
  3701. {$IFDEF DARWIN}
  3702. UpdateKey(ssSnap, VK_SNAP, snapPressed);
  3703. UpdateKey(ssAlt, VK_MENU, altPressed);
  3704. UpdateKey(ssShift, VK_SHIFT, shiftPressed);
  3705. {$ENDIF}
  3706. end;
  3707. function TFMain.ShowOpenTextureDialog(ATargetFill: TVectorialFill): boolean;
  3708. var newTex: TBGRABitmap;
  3709. texFilename: string;
  3710. topMostInfo: TTopMostInfo;
  3711. begin
  3712. result := false;
  3713. newTex := nil;
  3714. topMostInfo := LazPaintInstance.HideTopmost;
  3715. try
  3716. texFilename := '';
  3717. if UseImageBrowser then
  3718. begin
  3719. if not assigned(FBrowseTextures) then
  3720. begin
  3721. FBrowseTextures := TFBrowseImages.Create(self);
  3722. FBrowseTextures.LazPaintInstance := LazPaintInstance;
  3723. FBrowseTextures.Filter := OpenTextureDialog.Filter;
  3724. FBrowseTextures.AllowMultiSelect := false;
  3725. FBrowseTextures.Caption := OpenTextureDialog.Title;
  3726. end;
  3727. self.Hide;
  3728. try
  3729. FBrowseTextures.InitialDirectory := Config.DefaultTextureDirectory;
  3730. FBrowseTextures.FilterIndex:= OpenTextureDialog.FilterIndex;
  3731. if FBrowseTextures.ShowModal = mrOK then
  3732. begin
  3733. OpenTextureDialog.FilterIndex := FBrowseTextures.FilterIndex;
  3734. texFilename := FBrowseTextures.Filename;
  3735. newTex := FBrowseTextures.GetChosenImage.bmp;
  3736. end;
  3737. finally
  3738. self.Show;
  3739. end;
  3740. end else
  3741. begin
  3742. OpenTextureDialog.InitialDir := Config.DefaultTextureDirectory;
  3743. if OpenTextureDialog.Execute then
  3744. texFilename:= OpenTextureDialog.FileName;
  3745. end;
  3746. if texFilename <> '' then
  3747. begin
  3748. LazPaintInstance.StartLoadingImage(texFilename);
  3749. try
  3750. if not Assigned(newTex) then
  3751. newTex := LoadFlatImageUTF8(texFilename).bmp;
  3752. if LazPaintInstance.BlackAndWhite then
  3753. newTex.InplaceGrayscale;
  3754. ATargetFill.SetTexture(newTex, AffineMatrixIdentity,
  3755. ATargetFill.TextureOpacity, ATargetFill.TextureRepetition);
  3756. newTex.FreeReference;
  3757. newTex := nil;
  3758. result := true;
  3759. Config.SetDefaultTextureDirectory(ExtractFilePath(texFilename));
  3760. except
  3761. on ex:Exception do
  3762. begin
  3763. LazPaintInstance.EndLoadingImage;
  3764. LazPaintInstance.ShowError(rsOpen,ex.Message);
  3765. end;
  3766. end;
  3767. LazPaintInstance.EndLoadingImage;
  3768. end;
  3769. except
  3770. on ex:Exception do
  3771. LazPaintInstance.ShowError(rsOpen,ex.Message);
  3772. end;
  3773. FreeAndNil(newTex);
  3774. LazPaintInstance.ShowTopmost(topMostInfo);
  3775. end;
  3776. function TFMain.ShowOpenBrushDialog: boolean;
  3777. var newBrushBmp: TBGRABitmap;
  3778. newBrush: TLazPaintBrush;
  3779. brushFilename: string;
  3780. topMostInfo: TTopMostInfo;
  3781. begin
  3782. result := false;
  3783. topMostInfo := LazPaintInstance.HideTopmost;
  3784. newBrushBmp := nil;
  3785. try
  3786. brushFilename := '';
  3787. if UseImageBrowser then
  3788. begin
  3789. if not assigned(FBrowseBrushes) then
  3790. begin
  3791. FBrowseBrushes := TFBrowseImages.Create(self);
  3792. FBrowseBrushes.LazPaintInstance := LazPaintInstance;
  3793. FBrowseBrushes.Filter := OpenBrushDialog.Filter;
  3794. FBrowseBrushes.AllowMultiSelect := false;
  3795. FBrowseBrushes.Caption := OpenBrushDialog.Title;
  3796. end;
  3797. self.Hide;
  3798. try
  3799. FBrowseBrushes.InitialDirectory := Config.DefaultBrushDirectory;
  3800. FBrowseBrushes.FilterIndex:= OpenBrushDialog.FilterIndex;
  3801. if FBrowseBrushes.ShowModal = mrOK then
  3802. begin
  3803. OpenBrushDialog.FilterIndex := FBrowseBrushes.FilterIndex;
  3804. brushFilename := FBrowseBrushes.Filename;
  3805. newBrushBmp := FBrowseBrushes.GetChosenImage.bmp;
  3806. end;
  3807. finally
  3808. self.Show;
  3809. end;
  3810. end else
  3811. begin
  3812. OpenBrushDialog.InitialDir := Config.DefaultTextureDirectory;
  3813. if OpenBrushDialog.Execute then
  3814. brushFilename:= OpenBrushDialog.FileName;
  3815. end;
  3816. if brushFilename <> '' then
  3817. begin
  3818. LazPaintInstance.StartLoadingImage(brushFilename);
  3819. try
  3820. if not assigned(newBrushBmp) then
  3821. newBrushBmp := LoadFlatImageUTF8(brushFilename).bmp;
  3822. newBrush := TLazPaintBrush.Create;
  3823. newBrush.AssignBrushImage(newBrushBmp);
  3824. FreeAndNil(newBrushBmp);
  3825. ToolManager.AddBrush(newBrush);
  3826. result := true;
  3827. Config.SetDefaultBrushDirectory(ExtractFilePath(brushFilename));
  3828. except
  3829. on ex:Exception do
  3830. begin
  3831. LazPaintInstance.EndLoadingImage;
  3832. LazPaintInstance.ShowError(rsOpen,ex.Message);
  3833. end;
  3834. end;
  3835. LazPaintInstance.EndLoadingImage;
  3836. end;
  3837. except
  3838. on ex:Exception do
  3839. LazPaintInstance.ShowError(rsOpen,ex.Message);
  3840. end;
  3841. FreeAndNil(newBrushBmp);
  3842. LazPaintInstance.ShowTopmost(topMostInfo);
  3843. end;
  3844. procedure TFMain.ShowNoPicture;
  3845. begin
  3846. InShowNoPicture := true;
  3847. PaintPictureNow;
  3848. InShowNoPicture:= false;
  3849. end;
  3850. procedure TFMain.UpdateWindowCaption;
  3851. var bppStr: string;
  3852. begin
  3853. if Image.IsTiff or Image.IsGif then
  3854. begin
  3855. if Image.FrameIndex = TImageEntry.NewFrameIndex then
  3856. bppStr := ' '+rsNewImage
  3857. else
  3858. bppStr := ' #'+inttostr(Image.FrameIndex+1);
  3859. end else
  3860. if Image.bpp = 0 then
  3861. bppStr := ''
  3862. else
  3863. bppStr := ' '+inttostr(Image.bpp)+'bit';
  3864. if Image.CurrentFilenameUTF8 = '' then
  3865. self.Caption := inttostr(Image.Width)+'x'+inttostr(Image.Height) + bppStr + ' - ' + LazPaintInstance.Title
  3866. else
  3867. self.Caption := inttostr(Image.Width)+'x'+inttostr(Image.Height) + bppStr + ' - ' + image.CurrentFilenameUTF8;
  3868. end;
  3869. procedure TFMain.ImageCurrentFilenameChanged(sender: TLazPaintImage);
  3870. begin
  3871. UpdateWindowCaption;
  3872. end;
  3873. procedure TFMain.AddDockedControl(AControl: TControl);
  3874. begin
  3875. if Assigned(FLayout) then
  3876. begin
  3877. FLayout.AddDockedControl(AControl);
  3878. QueryArrange;
  3879. end;
  3880. end;
  3881. procedure TFMain.RemoveDockedControl(AControl: TControl);
  3882. begin
  3883. if Assigned(FLayout) then
  3884. begin
  3885. FLayout.RemoveDockedControl(AControl);
  3886. QueryArrange;
  3887. end;
  3888. end;
  3889. function TFMain.GetCurrentTool: TPaintToolType;
  3890. begin
  3891. result := ToolManager.GetCurrentToolType;
  3892. end;
  3893. procedure TFMain.ManagerToolChanged(sender: TToolManager; ANewTool: TPaintToolType);
  3894. begin
  3895. if self.Visible then
  3896. begin
  3897. PaintBox_PenPreview.Invalidate;
  3898. Image.OnImageChanged.NotifyObservers;
  3899. UpdateToolImage;
  3900. UpdatePenWidthToolbar;
  3901. UpdateCurveModeToolbar;
  3902. end;
  3903. end;
  3904. procedure TFMain.OnQueryExitToolHandler(sender: TLazPaintImage);
  3905. begin
  3906. if ToolManager.ToolSleeping then exit;
  3907. ChooseTool(ptHand);
  3908. end;
  3909. procedure TFMain.ZoomFitIfTooBig;
  3910. begin
  3911. if Assigned(Zoom) then
  3912. begin
  3913. with FLayout.WorkArea do
  3914. if (image.Width*Zoom.Factor > right-left) or (image.Height*Zoom.Factor > bottom-top) then
  3915. ViewZoomFit.Execute;
  3916. end;
  3917. end;
  3918. function TFMain.TryOpenFileUTF8(filenameUTF8: string; AddToRecent: Boolean;
  3919. ALoadedImage: PImageEntry; ASkipDialogIfSingleImage: boolean;
  3920. AAllowDuplicate: boolean; AEntryToLoad: integer): Boolean;
  3921. var
  3922. picture: TImageEntry;
  3923. format: TBGRAImageFormat;
  3924. dupIndex: Integer;
  3925. procedure StartImport(AFilename: string);
  3926. begin
  3927. LazPaintInstance.StartLoadingImage(AFilename);
  3928. ToolManager.ToolCloseDontReopen;
  3929. if (CurrentTool in [ptDeformation,ptRotateSelection,ptMoveSelection,ptLayerMapping])
  3930. or ((CurrentTool = ptHotSpot) and (format <> ifCur)) then
  3931. ChooseTool(ptHand);
  3932. ShowNoPicture;
  3933. Image.OnImageChanged.NotifyObservers;
  3934. end;
  3935. procedure EndImport(ABPP: integer = 0; AFrameIndex: integer = 0; AFrameCount: integer = 1; AIsNewFrame: boolean = false);
  3936. begin
  3937. LazPaintInstance.EndLoadingImage;
  3938. if AddToRecent then
  3939. begin
  3940. Config.AddRecentFile(filenameUTF8);
  3941. Config.AddRecentDirectory(ExtractFilePath(filenameUTF8));
  3942. end;
  3943. Image.CurrentFilenameUTF8 := filenameUTF8;
  3944. image.ClearUndo;
  3945. if AIsNewFrame then
  3946. begin
  3947. Image.BPP:= ABPP;
  3948. Image.FrameIndex:= AFrameIndex;
  3949. Image.FrameCount:= AFrameCount;
  3950. end else
  3951. image.SetSavedFlag(ABPP, AFrameIndex, AFrameCount, True);
  3952. ToolManager.ToolOpen;
  3953. ZoomFitIfTooBig;
  3954. ToolHotSpotUpdate(nil);
  3955. result := true;
  3956. end;
  3957. procedure ImportPicture(AIsNewFrame: boolean = false);
  3958. begin
  3959. if (picture.bmp <> nil) and (picture.bmp.Width > 0) and (picture.bmp.Height > 0) then
  3960. begin
  3961. if AIsNewFrame then
  3962. StartImport('<'+rsNewImage+'>')
  3963. else
  3964. StartImport(filenameUTF8);
  3965. with ComputeAcceptableImageSize(picture.bmp.Width,picture.bmp.Height) do
  3966. if (cx < picture.bmp.Width) or (cy < picture.bmp.Height) then
  3967. begin
  3968. MessagePopupForever(rsResamplingImage);
  3969. LazPaintInstance.UpdateWindows;
  3970. BGRAReplace(picture.bmp, picture.bmp.Resample(cx,cy,rmFineResample));
  3971. MessagePopupHide
  3972. end;
  3973. image.Assign(picture.bmp,True, false);
  3974. picture.bmp := nil;
  3975. EndImport(picture.bpp, picture.frameIndex, picture.frameCount, AIsNewFrame);
  3976. end else FreeAndNil(picture.bmp);
  3977. end;
  3978. procedure ImportSvg;
  3979. var
  3980. layered: TBGRALayeredBitmap;
  3981. begin
  3982. StartImport(filenameUTF8);
  3983. layered := LoadSVGImageUTF8(filenameUTF8);
  3984. Image.Assign(layered,true, false);
  3985. EndImport;
  3986. end;
  3987. begin
  3988. result := false;
  3989. if filenameUTF8 = '' then exit;
  3990. if ToolManager.ToolSleeping then exit;
  3991. if not AbleToLoadUTF8(filenameUTF8) then
  3992. begin
  3993. LazPaintInstance.ShowMessage(rsOpen,rsFileFormatNotRecognized);
  3994. exit;
  3995. end;
  3996. picture := TImageEntry.Empty;
  3997. try
  3998. format := Image.DetectImageFormat(filenameUTF8);
  3999. if format = ifSvg then
  4000. begin
  4001. ImportSvg;
  4002. end else
  4003. if Assigned(ALoadedImage) and Assigned(ALoadedImage^.bmp) then
  4004. begin
  4005. picture := ALoadedImage^;
  4006. ALoadedImage^.bmp := nil;
  4007. ImportPicture;
  4008. end
  4009. else
  4010. if IsRawFilename(filenameUTF8) then
  4011. begin
  4012. picture.bmp := GetRawFileImage(filenameUTF8);
  4013. picture.bpp := 0;
  4014. picture.frameIndex:= 0;
  4015. picture.frameCount:= 1;
  4016. ImportPicture;
  4017. end else
  4018. if format in[ifIco,ifCur] then
  4019. begin
  4020. picture := ShowPreviewDialog(LazPaintInstance, FilenameUTF8, rsIconOrCursor, ASkipDialogIfSingleImage);
  4021. ImportPicture;
  4022. end
  4023. else
  4024. if format in[ifIco,ifGif,ifTiff] then
  4025. begin
  4026. if AEntryToLoad <> -1 then
  4027. picture := LoadFlatImageUTF8(FilenameUTF8, AEntryToLoad) else
  4028. begin
  4029. if (format in[ifGif,ifTiff]) and AAllowDuplicate and (Image.FrameIndex <> -1) then
  4030. dupIndex := Image.FrameIndex else dupIndex := -1;
  4031. picture := ShowPreviewDialog(LazPaintInstance, FilenameUTF8,
  4032. GetImageFormatName(format),ASkipDialogIfSingleImage, dupIndex);
  4033. end;
  4034. if picture.isDuplicate then
  4035. begin
  4036. picture.FreeAndNil;
  4037. Image.FrameIndex:= picture.frameIndex;
  4038. Image.FrameCount:= picture.frameCount;
  4039. Image.OnImageChanged.NotifyObservers;
  4040. end
  4041. else
  4042. ImportPicture(picture.frameIndex = picture.NewFrameIndex);
  4043. end
  4044. else
  4045. begin
  4046. StartImport(filenameUTF8);
  4047. image.LoadFromFileUTF8(filenameUTF8);
  4048. EndImport;
  4049. end;
  4050. except
  4051. on ex: Exception do
  4052. begin
  4053. picture.FreeAndNil;
  4054. ToolManager.ToolOpen;
  4055. Image.OnImageChanged.NotifyObservers;
  4056. LazPaintInstance.ShowError(rsOpen,ex.Message);
  4057. end;
  4058. end;
  4059. end;
  4060. procedure TFMain.ToolMoveSelectionUpdate(Sender: TObject);
  4061. begin
  4062. ToolMoveSelection.Enabled := not image.SelectionMaskEmpty;
  4063. end;
  4064. {****************************** Picture ************************}
  4065. procedure TFMain.OnPaintHandler;
  4066. var
  4067. ac: TWinControl;
  4068. begin
  4069. if FirstPaint then
  4070. begin
  4071. LoadToolwindow := True;
  4072. TimerLoadToolWin.Enabled := true;
  4073. FirstPaint := false;
  4074. end;
  4075. if InFormPaint then exit;
  4076. InFormPaint := true;
  4077. if Assigned(FImageView) then FImageView.DoPaint(PictureCanvasOfs, FLayout.WorkArea, InShowNoPicture);
  4078. DelayedPaintPicture:= false;
  4079. ac := ActiveControl;
  4080. if ac is TBCTrackbarUpdown then
  4081. TBCTrackbarUpdown(ac).DelayTimer;
  4082. InFormPaint := false;
  4083. FLastPaintDate := Now;
  4084. end;
  4085. procedure TFMain.OnImageChangedHandler(AEvent: TLazPaintImageObservationEvent);
  4086. begin
  4087. InvalidatePicture(false);
  4088. if (image.Width <> FLastWidth) or (image.Height <> FLastHeight)
  4089. or (image.BPP <> FLastBPP) or (image.FrameIndex <> FLastFrameIndex) then
  4090. begin
  4091. FLastWidth:= image.Width;
  4092. FLastHeight:= image.Height;
  4093. FLastBPP := image.BPP;
  4094. FLastFrameIndex:= image.FrameIndex;
  4095. UpdateWindowCaption;
  4096. end;
  4097. if not image.CurrentLayerVisible and not ToolManager.ToolCanBeUsed then
  4098. begin
  4099. ChooseTool(ptHand);
  4100. MessagePopup(rsToolOnInvisibleLayer,5000);
  4101. end;
  4102. if AEvent.DelayedStackUpdate then FUpdateStackWhenIdle := true;
  4103. end;
  4104. procedure TFMain.OnImageRenderChanged(Sender: TObject);
  4105. begin
  4106. InvalidatePicture(false);
  4107. end;
  4108. procedure TFMain.UpdateEditPicture(ADelayed: boolean = false);
  4109. begin
  4110. if ToolManager.ToolUpdate then
  4111. begin
  4112. if ADelayed then DelayedPaintPicture := True
  4113. else
  4114. PaintPictureNow;
  4115. end;
  4116. end;
  4117. procedure TFMain.OnZoomChanged(sender: TZoom; ANewZoom: single);
  4118. begin
  4119. if Assigned(FImageView) then
  4120. begin
  4121. if not Image.SelectionMaskEmpty then
  4122. FImageView.ShowSelection := false;
  4123. FImageView.OnZoomChanged(sender, ANewZoom, FLayout.WorkArea);
  4124. end;
  4125. UpdateToolbar;
  4126. PaintPictureNow;
  4127. end;
  4128. procedure TFMain.PaintPictureNow;
  4129. begin
  4130. if not visible then exit;
  4131. UpdateStackOnTimer := true;
  4132. Image.OnImageChanged.NotifyObservers;
  4133. {$IFDEF USEPAINTBOXPICTURE}PaintBox_Picture{$ELSE}self{$ENDIF}.Update;
  4134. end;
  4135. procedure TFMain.FormPaint(Sender: TObject);
  4136. begin
  4137. {$IFNDEF USEPAINTBOXPICTURE}
  4138. OnPaintHandler;
  4139. {$ENDIF}
  4140. end;
  4141. procedure TFMain.PictureSelectedLayerIndexChanged(sender: TLazPaintImage);
  4142. begin
  4143. if not image.CurrentLayerVisible and not ToolManager.ToolCanBeUsed then
  4144. ChooseTool(ptHand)
  4145. else
  4146. begin
  4147. ToolManager.ToolOpen;
  4148. ToolManager.UpdateContextualToolbars;
  4149. end;
  4150. end;
  4151. procedure TFMain.PictureSelectedLayerIndexChanging(sender: TLazPaintImage);
  4152. begin
  4153. ToolManager.ToolCloseDontReopen;
  4154. end;
  4155. procedure TFMain.SetShowSelectionNormal(const AValue: boolean);
  4156. begin
  4157. FShowSelectionNormal := AValue;
  4158. if Assigned(FImageView) then
  4159. FImageView.FillSelectionHighlight := ToolManager.DisplayFilledSelection and not FShowSelectionNormal;
  4160. end;
  4161. procedure TFMain.WMEraseBkgnd(var Message: TLMEraseBkgnd);
  4162. begin
  4163. // block Erasing background
  4164. // inherited EraseBackground(DC);
  4165. end;
  4166. function TFMain.GetImage: TLazPaintImage;
  4167. begin
  4168. result := LazPaintInstance.Image;
  4169. end;
  4170. procedure TFMain.ManagerBrushChanged(Sender: TObject);
  4171. begin
  4172. UpdateBrush;
  4173. end;
  4174. procedure TFMain.ManagerBrushListChanged(Sender: TObject);
  4175. begin
  4176. UpdateBrushList;
  4177. end;
  4178. procedure TFMain.ManagerDeformationGridSizeChanged(Sender: TObject);
  4179. begin
  4180. UpdateDeformationGridToolbar;
  4181. end;
  4182. procedure TFMain.ManagerEraserChanged(Sender: TObject);
  4183. begin
  4184. UpdateEraserToolbar;
  4185. end;
  4186. procedure TFMain.ManagerFloodFillOptionChanged(Sender: TObject);
  4187. begin
  4188. UpdateFloodFillToolbar;
  4189. end;
  4190. procedure TFMain.ManagerJoinStyleChanged(Sender: TObject);
  4191. begin
  4192. UpdateJoinStyleToolbar;
  4193. end;
  4194. procedure TFMain.ManagerLineCapChanged(Sender: TObject);
  4195. begin
  4196. UpdateLineCapToolbar;
  4197. end;
  4198. procedure TFMain.ManagerPerspectiveOptionChanged(Sender: TObject);
  4199. begin
  4200. UpdatePerspectiveToolbar;
  4201. end;
  4202. procedure TFMain.ManagerPhongShapeChanged(Sender: TObject);
  4203. begin
  4204. UpdatePhongToolbar;
  4205. end;
  4206. procedure TFMain.ManagerPenStyleChanged(Sender: TObject);
  4207. begin
  4208. UpdatePenStyleToolbar;
  4209. end;
  4210. procedure TFMain.ManagerPenWidthChanged(Sender: TObject);
  4211. begin
  4212. UpdatePenWidthToolbar;
  4213. end;
  4214. procedure TFMain.ManagerShapeRatioChanged(Sender: TObject);
  4215. begin
  4216. UpdateShapeRatio;
  4217. end;
  4218. procedure TFMain.ManagerSplineStyleChanged(Sender: TObject);
  4219. begin
  4220. UpdateSplineStyleToolbar;
  4221. end;
  4222. procedure TFMain.ManagerTextAlignChanged(Sender: TObject);
  4223. begin
  4224. UpdateTextAlign;
  4225. end;
  4226. procedure TFMain.ManagerTextFontChanged(Sender: TObject);
  4227. begin
  4228. UpdateTextFontToolbar(False);
  4229. end;
  4230. procedure TFMain.ManagerTextOutlineChanged(Sender: TObject);
  4231. begin
  4232. UpdateTextOutlineToolbar;
  4233. end;
  4234. procedure TFMain.ManagerTextPhongChanged(Sender: TObject);
  4235. begin
  4236. UpdateTextPhongToolbar;
  4237. end;
  4238. procedure TFMain.ManagerTextShadowChanged(Sender: TObject);
  4239. begin
  4240. UpdateTextShadowToolbar;
  4241. end;
  4242. procedure TFMain.ManagerShapeOptionChanged(Sender: TObject);
  4243. begin
  4244. UpdateToolOptions;
  4245. ToolManager.UpdateContextualToolbars;
  4246. end;
  4247. procedure TFMain.ManagerToleranceChanged(Sender: TObject);
  4248. begin
  4249. UpdateToleranceToolbar;
  4250. end;
  4251. procedure TFMain.ManagerToolbarChanged(Sender: TObject);
  4252. begin
  4253. QueryArrange;
  4254. end;
  4255. procedure TFMain.UpdateStatusText;
  4256. var s: string;
  4257. begin
  4258. if ToolManager.CurrentTool <> nil then
  4259. begin
  4260. s := ToolManager.CurrentTool.StatusText;
  4261. if s = '' then s := currentToolLabel;
  4262. end
  4263. else s := '';
  4264. Layout.StatusText := s;
  4265. end;
  4266. procedure TFMain.InvalidatePicture(AInvalidateAll: boolean = true);
  4267. begin
  4268. if Assigned(FImageView) and Assigned(FLayout) then
  4269. FImageView.InvalidatePicture(AInvalidateAll, FLayout.WorkArea, Point(0,0), self);
  4270. end;
  4271. function TFMain.GetUseImageBrowser: boolean;
  4272. begin
  4273. result := Config.DefaultUseImageBrowser;
  4274. end;
  4275. procedure TFMain.SetDarkTheme(AValue: boolean);
  4276. begin
  4277. if LAyout.DarkTheme<>AValue then
  4278. begin
  4279. Layout.DarkTheme := AValue;
  4280. DarkThemeInstance.Apply(Panel_PenWidthPreview, AValue);
  4281. Invalidate;
  4282. UpdateToolImage(true);
  4283. end;
  4284. end;
  4285. procedure TFMain.SetUpdatingPopup(AValue: boolean);
  4286. begin
  4287. FImageView.UpdatingPopup := AValue;
  4288. end;
  4289. function TFMain.GetCurrentPressure: single;
  4290. begin
  4291. if Assigned(FTablet) and FTablet.Present and FTablet.Entering and (FTablet.Max > 0) then
  4292. result := FTablet.Pressure/FTablet.Max
  4293. else
  4294. result := 1;
  4295. end;
  4296. function TFMain.GetDarkTheme: boolean;
  4297. begin
  4298. if Assigned(FLayout) then result := FLayout.DarkTheme
  4299. else result := false;
  4300. end;
  4301. function TFMain.GetImageAction: TImageActions;
  4302. begin
  4303. result := TImageActions(LazPaintInstance.ImageAction);
  4304. end;
  4305. function TFMain.GetUpdatingPopup: boolean;
  4306. begin
  4307. result := FImageView.UpdatingPopup;
  4308. end;
  4309. function TFMain.GetScriptContext: TScriptContext;
  4310. begin
  4311. result := LazPaintInstance.ScriptContext;
  4312. end;
  4313. procedure TFMain.CallScriptFunction(AName: string);
  4314. begin
  4315. case Scripting.CallScriptFunction(AName) of
  4316. srFunctionNotDefined: LazPaintInstance.ShowMessage(rsScript,StringReplace(rsFunctionNotDefined,'%1',AName,[]));
  4317. end;
  4318. end;
  4319. procedure TFMain.CallScriptFunction(AParams: TVariableSet);
  4320. begin
  4321. case Scripting.CallScriptFunction(AParams) of
  4322. srFunctionNotDefined: LazPaintInstance.ShowMessage(rsScript,StringReplace(rsFunctionNotDefined,'%1',AParams.FunctionName,[]));
  4323. end;
  4324. end;
  4325. function TFMain.PictureCanvasOfs: TPoint;
  4326. begin
  4327. {$IFDEF USEPAINTBOXPICTURE}
  4328. result := Point(-PaintBox_Picture.Left,-PaintBox_Picture.Top);
  4329. {$ELSE}
  4330. result := Point(0,0);
  4331. {$ENDIF}
  4332. end;
  4333. {$R *.lfm}
  4334. end.