ساخت اپلیکیشن گرافیکی (GUI) با زبان Golang قسمت دوم

GUI in Golangاگر دارین اینجا رو می‌خونی لازمه بگم که این مطلب یکی از قسمت هاست و پیشنهاد می‌کنم اگر قسمت قبلی اون رو نخوندی از لینک زیر اول اون رو بخون: https://virgool.io/@mehrdad.dev/golang-gui-1-hj4xzb7z3hka https://virgool.io/p/i0hyq9ruecwy/%D9%88%D9%87%D9%85%DA%86%D9%86%DB%8C%D9%86%D8%B1%DB%8C%D9%BE%D9%88%DB%8C%DB%8C%DA%A9%D9%87%D8%AF%D8%B1%D9%85%D9%88%D8%B1%D8%AF%D8%B4%D8%B5%D8%AD%D8%A8%D8%AA%D9%85%DB%8C%E2%80%8C%DA%A9%D9%86%DB%8C%D9%85. https://github.com/mehrdad-dev/Jami خوب ...اینجا قسمت دوم ماجراجویی هست و قراره که صفحات و پکیج های دیگه پروژه جامی رو با هم بررسی کنیم.نکته: صفحات و قسمت هایی که روند یکسانی دارن و بررسی نمی‌کنیم.ساخت اسکرین Homeاگر یادتون باشه توی قسمت قبلی موقع ساختن تب هامون یکسری اسکرین رو به عنوان آرگومان سوم ساخت اون ها پاس داده بودیم، اینجا اول از همه می‌خوایم در مورد ساخت صفحه home با هم حرف بزنیم ...آخر این مطلب قراره به چنین صفحه ای برسیم.func HomeScreen(win fyne.Window) fyne.CanvasObject { return fyne.NewContainerWithLayout(layout.NewAdaptiveGridLayout(1), makeHome(win), ) }اینجا می‌تونید پیاده سازی تابع HomeScreen که داخل قسمت قبلی ازش استفاده کردیم رو ببینین.این تابع یک fyne.CanvasObject بر‌می‌گردونه، که ما با استفاده از fyne.NewContainerWithLayoutیک کانتینر درست می‌کنیم که بتونیم محتویات صفحه Home رو داخل اون قرار بدیم و به تابع main برگردونیم.توی کد زیر پیاده سازی تابع makeHome رو بررسی می‌کنیم.var soundSTR string // Create sound selector soundSelector := widget.NewSelect([]string{&quotPiano&quot, &quotViolin&quot, &quotSystem&quot}, func(s string) { if s == &quotPiano&quot { soundSTR = &quotVP SA9 SR9\n&quot } else if s == &quotViolin&quot { soundSTR = &quotVV SA9 SR9\n&quot } else { soundSTR = &quotVD SA9 SR9\n&quot } })توجه: تمام کد ها از این به بعد داخل تابع makeHome هست.توی قطعه کد بالا یک ویجت selector ساختیم تا کاربر بتونه ساز مورد نظر خودش رو انتخاب کنه تا از نت های براساس اون ساز به صدا در بیان.با استفاده از متد NewSelect که یه آرایه از انتخاب ها و یک تابع رو به عنوان ورودی می‌گیره این کار رو انجام می‌دیم.داخل بلوک تابع داخلی selector انتخاب کاربر رو چک می‌کنیم و برای هر ساز رشته ای رو داخل متغیر soundSTR قرار می‌دیم تا کتابخونه beep که قبلا معرفی کردیم بتونه متوجه شه ما به صدای چه سازی نیاز داریم.win.Canvas().SetOnTypedRune(func(r rune) { sound.PlayNotes(soundSTR + string(r)) })توی این قطعه کد بالا با استفاده از win که به تابعمون پاس داده شده دکمه های کیبرد کاربر رو می‌خونیم و اون رو به تابع PlayNotes پکیج sound میدیم، که البته این قابلیت الان نت ها رو با یک مقدار تاخیر اجرا می‌کنه!اگر دقت کنین داخل آرگومان تابع PlayNotes از soundSTR استفاده کردیم و اون رو با اول دکمه فشرده شده جمع کردیم، این کار به خاطر اینکه beep متوجه بشه که نت با صدای کدوم ساز پخش بشه.// Create input form notesInput := widget.NewMultiLineEntry() notesInput.SetPlaceHolder(&quotFill with notes&quot) form := &widget.Form{ : func() { sound.PlayNotes(soundSTR + notesInput.Text) }, } form.Append(&quotNotes&quot, notesInput)اینجا فرم ورودی چند خطی نت ها رو با متد NewMultiLineEntry ساختیم و بعد اون رو به یک form اضافه کردیم ، که داخل تعریف form با استفاده از تابع PlayNotes رو از پکیج sound فراخوانی کردیم، این یعنی اینکه کاربر بعد کلیک روی دکمه submit صدای نت هایی که وارد کرده رو میشنوه.buttonSave := widget.NewButtonWithIcon(&quotSave notes sound in .wav file&quot, theme.DocumentSaveIcon(), func() { sound.SaveNotes(soundSTR + notesInput.Text) })با استفاده از متد NewButtonWithIcon یک دکمه برای ذخیره نت ای که کاربر داخل input قراره به صورت فایل صوتی و به فرمت wav می‌سازیم، که با کلیک روی دکمه تابع SaveNotes از پکیج sound رو فراخوانی می‌کینم.return widget.NewGroupWithScroller(&quotHome Page&quot, widget.NewLabelWithStyle(&quotSelect Instrument&quot, fyne.TextAlignLeading, fyne.TextStyle{Bold: true}), soundSelector, buttonSave, form, )و در نهایت با استفاده از NewGroupWithScroller یک ویجت قابل اسکرول درست می‌کنیم به این خاطر که اگر کاربر نت طولانی وارد کرد صفحه به هم نریزه و بشه داخل صفحه بالا پایین رفت!اره به همین سادگی !می‌تونیم از سادگی fyne استفاده کنیم و از قدرت Golang هم بهره مند بشیم :))))قسمت بعدی رو دنبال کن D:اگر مطالب مفید بود اینجا می‌تونید حمایت کنید :))) https://virgool.io/@mehrdad.dev/golang-gui-3-cvl4cf3d3tqo