From 771d15aabc8a708a6dd72f5622b652a6e41d7226 Mon Sep 17 00:00:00 2001 From: Lerking Date: Mon, 12 Dec 2022 00:11:28 +0100 Subject: [PATCH] 0.0.14 Added drawing area. /JL --- canvas.go | 13 ++++ images/README | 4 + images/check.ico | Bin 0 -> 1150 bytes images/document-new.png | Bin 0 -> 1753 bytes images/document-properties.png | Bin 0 -> 1653 bytes images/open.png | Bin 0 -> 1931 bytes images/plus.png | Bin 0 -> 369 bytes images/stop.ico | Bin 0 -> 1150 bytes images/system-shutdown.png | Bin 0 -> 1787 bytes main.go | 134 ++++++++++++++++++++++++++++++++- 10 files changed, 148 insertions(+), 3 deletions(-) create mode 100644 canvas.go create mode 100644 images/README create mode 100644 images/check.ico create mode 100644 images/document-new.png create mode 100644 images/document-properties.png create mode 100644 images/open.png create mode 100644 images/plus.png create mode 100644 images/stop.ico create mode 100644 images/system-shutdown.png diff --git a/canvas.go b/canvas.go new file mode 100644 index 0000000..158d0b1 --- /dev/null +++ b/canvas.go @@ -0,0 +1,13 @@ +package main + +import "github.com/lxn/walk" + +type ( + Canvas struct { + *walk.Canvas + } +) + +func NewCanvas() *Canvas { + return new(Canvas) +} diff --git a/images/README b/images/README new file mode 100644 index 0000000..ccb4622 --- /dev/null +++ b/images/README @@ -0,0 +1,4 @@ +Most image files in this directory are from the base icon theme of the +Tango Desktop Project at http://tango.freedesktop.org. + +Thanks for releasing those to the Public Domain. diff --git a/images/check.ico b/images/check.ico new file mode 100644 index 0000000000000000000000000000000000000000..3f17073f69e4a40be1ab30e6a24cafc741c045bc GIT binary patch literal 1150 zcmZQzU<5(|0R|wcz>vYhz#zuJz@P!dKp~(AL>x#lH~{770{$~VAUT%7^ulOT%z)`Z zrpeI{(nG2lF!eC|V0;iw48W$2STkViu-Su84x4&(F_?Z3O)j9O8RWVFqz~o}YM4Qd z@SwyURMPt&7^^>l_yZ6>0OBY03=C(0_?|rj!+aqAFAv21KztsEp9AqnApQx&{~;Iv D>c4Z` literal 0 HcmV?d00001 diff --git a/images/document-new.png b/images/document-new.png new file mode 100644 index 0000000000000000000000000000000000000000..3d6c13f08380a5c2e3e4c0de97f84725042149a3 GIT binary patch literal 1753 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 Q*ZDETB7Nc6-siUc4e;425&!@I literal 0 HcmV?d00001 diff --git a/images/open.png b/images/open.png new file mode 100644 index 0000000000000000000000000000000000000000..6893d0983f5202998f70941341958dfb361c2a23 GIT binary patch literal 1931 zcmbVN3rrJd96tz5#npif*#pOUKBi)OcYVR#tOQz+id8Jl&_Q&^J=(MFUAep3f}2Z> z#s?T*V{_3Ma8p^bXr?&S;?zaWh>uL2n^R_tMxD`#N*r#JZr>GXba5{)_ucpUeZT+X z`~Uy9qHM-gP0A}N5Cm!LB{nDMQ`I*3Iq=Qy{(}PDkU+^C8G?o#QCmV|&ahV@C^?IF z%~obRrjxYj*HMgE&FaGb06;^~(jupnKLg9yws7No-Dz#IW9>)}i4 zB(}V6hKsKA(gcI#Pk|?gNkHId6$%dfeS%DeEl7-)1Y>m>Mc^1j@mi1qRUkauQ3hK@ ziG@u%vzEq;z>iu+}OnFaAE zN`OSsP$;Ae8FZrLMsb25P)v{N^;&??%C&+*g|&h_dVs;k%Cy7>6kZfym656zgNg+K zn)aFC55#E&x!+B|VQ82NptufGO^N{-I*tnjC0|T9L!+#Z^|OK^11uiL20Wr7${z7= zsN>sD2mr2iIN~y%s*B$r7a=P}3xFB@4tXkCcGU)0)XBtQ1whTwsx<-9DzTIz zN-k0K4O~>&fXcAds$NVUJidY#7%?PIcVtY(}ro3(l!9#hxhAnk&zPy)@`Z59OhN5}IFY0jff z27?LHVn%|~<{FKZmS9-3mZ&zfT(!ZV*K@f8=WQY#RHI%)u zC9wr=;I01>dMMBzRnxZ56!foF#`Ydd@c}rf8|pA#u)ri<@>l`XISCZBHKCRU2ujSb z+X`HH$5)j*yy>%EJYeV^t|^RU6zr<`__EUznN`_&K4rhOR_NT@(&WvICT2SK-zq#> z)H`VDO6_vvwuyTKV}~b>3#O0xbR5TB`tZi3k5=p%f3NWRm+kv{Hp%(L=jNM8--U5C zsYz>lUem3KV9#Hxn%Fp{H|t2|@oQ4s@``iw9}HQ%Gb8ilcQ@#n+4)z;T=^t%N$;`l zRl6%IH+FTLt*v@D6S~ooj)(3G zXRn;wivK=q9x?ZDLNfO9x{xQBYxAzWjHT4FQn;mQ z)VG%Q(9$S(_~E^a&Z|E~FZ?n=cNm9u+Xnyk4cTNLG3xG#j&$h3Tqv9}J@tN)D=+O3 ziH@y4Sv94&{`!Pzd(tza*(;9KO-rS*gSO*K+8fqxKLpKNi1#jEl{EiR)`lz*X*d5c zhkW6KQ*CKoZRIa*T%Y_^{Uvy70+jc#rN(*MK562E)4|q5Ih$`SLMt~^WWRBBwR@dr v*_O-oyC~MZn+VqDh^C&K?`e!pnmf_Nq=Hh|W6vkl-=)21hHXdT+l&7MCCsOd literal 0 HcmV?d00001 diff --git a/images/plus.png b/images/plus.png new file mode 100644 index 0000000000000000000000000000000000000000..32a6dec8774c90dcdae38752466b9e0d6de54b05 GIT binary patch literal 369 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBAX}2Ry9wy$|iKnkC`!z;x0S3V- zE)@%bLJvJ%978PplmGCu@Q5&|aeZmpYV@ecG3Iqy+iU*&jiQ;SxD9nyeLIpR?kC=0 zVxDf*Xm~~;M=jtDYZq@qqb2vv^Ec*X&DtiS*CV6$!GT5d#mVBtAAjH5Gb;zYe7}Fi zM((a00k)G@&)zv+P!(o!!$Cy9=I77p53g<3=P{pGm$-v>Nj}rd&)@Bh=j{C4`S8ix zejfF_+LVf)FU7lzopr E0MZeMIRF3v literal 0 HcmV?d00001 diff --git a/images/stop.ico b/images/stop.ico new file mode 100644 index 0000000000000000000000000000000000000000..a6e75fc630130eb9405c8098078d66c1011e9db3 GIT binary patch literal 1150 zcmbu7K@Nj336=kSa^txxGQxTTJ)RqQwwt_TWC);kU;0Fzwn3c260 zU4ScqhfJ}=QC|d4spUo~z-S)PBWC1{`uJSwMtmRJqp=+pmc9>rC?CQt}XcMg^X(eqU#>S$JMWPJ?0+DmPfuuoRs_3PmGiKV*??Bc}IXJiCPI z#=EMND#s3*6?|HT6Ka4q=o29tL2~ngBE!}L1+4+Kyx)Q?_77nw&snhDdI#YUt-!;V zHcMbQx~5vB0^S*8lf3shujk_yP8CRR{~jRkXTUE2-Qqetr2Of1Qy0#_&mt(AAeNyH zf#cmxYoV0RMUpgZ6tM;hqlRM?=3l`aOS=Wh$3UBTA5#l((O-+95l_-q!7E5mFw`z* z^}5|^bxMMp_reXivZN5T7g-IY*AMc zXp9i9F`0Bm4a4bcGzQL15PH_2GrM&w=WPPpphm&UdG3FnFPC_jg^c&UdDPrg!-p>A zWq7eo;q2K7_Jv1Y9t}kd&9G`FSTI%%0l;D5W&XZBuuL2907&`|aj^`O1-BAlBv4Qb zz4c#04~P2WYT7QFg8$XZ(B7&PUxCBAp$;Pj3r->>5BOo7lVCx6`ex@b1c_?1+X`H! zj;`0s>qeZ(pADTq_0_G1Hpd#jFaGkqO&7-#KF)Z%dVc+tskY?w>P_1MmFWYm4~h$W z_RT$VHu>R{zWp)y=Bf=iqWsiPH&c7BWWUwz z${b$GotMlvCTE=So}T=K*4b^h>-t7Ky261yCG=AjC%Z3gAI(2Awf$X!Klhybn~TT~ z&cW!aqirt?9Ui^f;_l7(EzWWJlj!ag@$sJT>iV48&WiMnwkPL~MBk2U86KOf$Q<`h z7x&K;e>9zvcM#jKF6O}W;_uNXKW~qoJP}PFN*kX{(xoP5e7ft8Hw#kt9@}zl$xL@0 zy4CaS>B-pq>+P42ujl7XM;ES&uUuCSUZ{EL=f*6ldMX837@p5+p-1{>%G|Sewi=Fi zY&arnchx@sV>Wj=szcF&Z%6L7x7-+8xHB-cG=a0pAL>}LH}re57nRxGFWlSuCs815 AuK)l5 literal 0 HcmV?d00001 diff --git a/main.go b/main.go index 0b7f5b2..3ba5335 100644 --- a/main.go +++ b/main.go @@ -2,6 +2,7 @@ package main import ( "log" + "math" "github.com/lxn/walk" . "github.com/lxn/walk/declarative" @@ -10,7 +11,8 @@ import ( type MyMainWindow struct { *walk.MainWindow colors *walk.ScrollView - canvas *walk.ScrollView + canvasscroll *walk.ScrollView + drawWidget *walk.CustomWidget properties *walk.ScrollView pallette Pallette beads []*BeadColor @@ -24,7 +26,7 @@ type MyMainWindow struct { const ( AppName string = "BeadImager" - Version string = "0.0.13" + Version string = "0.0.14" CopyRight string = "©2022 Jan Lerking" STD_MESS string = "Ready" UserPath string = "C:\\Users\\janle\\BeadImager" @@ -163,8 +165,16 @@ func main() { Layout: VBox{}, Children: []Widget{ ScrollView{ - AssignTo: &mw.canvas, + AssignTo: &mw.canvasscroll, Layout: VBox{MarginsZero: true}, + Children: []Widget{ + CustomWidget{ + AssignTo: &mw.drawWidget, + ClearsBackground: true, + InvalidatesOnResize: true, + Paint: mw.drawStuff, + }, + }, }, }, }, @@ -186,3 +196,121 @@ func main() { log.Fatal(err) } } + +func (mw *MyMainWindow) drawStuff(canvas *walk.Canvas, updateBounds walk.Rectangle) error { + bmp, err := createBitmap() + if err != nil { + return err + } + defer bmp.Dispose() + + bounds := mw.drawWidget.ClientBounds() + + rectPen, err := walk.NewCosmeticPen(walk.PenSolid, walk.RGB(255, 0, 0)) + if err != nil { + return err + } + defer rectPen.Dispose() + + if err := canvas.DrawRectangle(rectPen, bounds); err != nil { + return err + } + + ellipseBrush, err := walk.NewHatchBrush(walk.RGB(0, 255, 0), walk.HatchCross) + if err != nil { + return err + } + defer ellipseBrush.Dispose() + + if err := canvas.FillEllipse(ellipseBrush, bounds); err != nil { + return err + } + + linesBrush, err := walk.NewSolidColorBrush(walk.RGB(0, 0, 255)) + if err != nil { + return err + } + defer linesBrush.Dispose() + + linesPen, err := walk.NewGeometricPen(walk.PenDash, 8, linesBrush) + if err != nil { + return err + } + defer linesPen.Dispose() + + if err := canvas.DrawLine(linesPen, walk.Point{bounds.X, bounds.Y}, walk.Point{bounds.Width, bounds.Height}); err != nil { + return err + } + if err := canvas.DrawLine(linesPen, walk.Point{bounds.X, bounds.Height}, walk.Point{bounds.Width, bounds.Y}); err != nil { + return err + } + + points := make([]walk.Point, 10) + dx := bounds.Width / (len(points) - 1) + for i := range points { + points[i].X = i * dx + points[i].Y = int(float64(bounds.Height) / math.Pow(float64(bounds.Width/2), 2) * math.Pow(float64(i*dx-bounds.Width/2), 2)) + } + if err := canvas.DrawPolyline(linesPen, points); err != nil { + return err + } + + bmpSize := bmp.Size() + if err := canvas.DrawImage(bmp, walk.Point{(bounds.Width - bmpSize.Width) / 2, (bounds.Height - bmpSize.Height) / 2}); err != nil { + return err + } + + return nil +} + +func createBitmap() (*walk.Bitmap, error) { + bounds := walk.Rectangle{Width: 200, Height: 200} + + bmp, err := walk.NewBitmap(bounds.Size()) + if err != nil { + return nil, err + } + + succeeded := false + defer func() { + if !succeeded { + bmp.Dispose() + } + }() + + canvas, err := walk.NewCanvasFromImage(bmp) + if err != nil { + return nil, err + } + defer canvas.Dispose() + + brushBmp, err := walk.NewBitmapFromFile("images/plus.png") + if err != nil { + return nil, err + } + defer brushBmp.Dispose() + + brush, err := walk.NewBitmapBrush(brushBmp) + if err != nil { + return nil, err + } + defer brush.Dispose() + + if err := canvas.FillRectangle(brush, bounds); err != nil { + return nil, err + } + + font, err := walk.NewFont("Times New Roman", 40, walk.FontBold|walk.FontItalic) + if err != nil { + return nil, err + } + defer font.Dispose() + + if err := canvas.DrawText("Walk Drawing Example", font, walk.RGB(0, 0, 0), bounds, walk.TextWordbreak); err != nil { + return nil, err + } + + succeeded = true + + return bmp, nil +}