اگر دارین اینجا رو میخونی لازمه بگم که این مطلب یکی از قسمت هاست و پیشنهاد میکنم اگر قسمت قبلی اون رو نخوندی از لینک زیر اول اون رو بخون:
خوب ...
اینجا قسمت دوم ماجراجویی هست و قراره که صفحات و پکیج های دیگه پروژه جامی رو با هم بررسی کنیم.
نکته: صفحات و قسمت هایی که روند یکسانی دارن و بررسی نمیکنیم.
اگر یادتون باشه توی قسمت قبلی موقع ساختن تب هامون یکسری اسکرین رو به عنوان آرگومان سوم ساخت اون ها پاس داده بودیم، اینجا اول از همه میخوایم در مورد ساخت صفحه 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{"Piano", "Violin", "System"}, func(s string) { if s == "Piano" { soundSTR = "VP SA9 SR9\n" } else if s == "Violin" { soundSTR = "VV SA9 SR9\n" } else { soundSTR = "VD SA9 SR9\n" } })
توجه: تمام کد ها از این به بعد داخل تابع 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("Fill with notes") form := &widget.Form{ : func() { sound.PlayNotes(soundSTR + notesInput.Text) }, } form.Append("Notes", notesInput)
اینجا فرم ورودی چند خطی نت ها رو با متد NewMultiLineEntry ساختیم و بعد اون رو به یک form اضافه کردیم ، که داخل تعریف form با استفاده از تابع PlayNotes رو از پکیج sound فراخوانی کردیم، این یعنی اینکه کاربر بعد کلیک روی دکمه submit صدای نت هایی که وارد کرده رو میشنوه.
buttonSave := widget.NewButtonWithIcon("Save notes sound in .wav file", theme.DocumentSaveIcon(), func() { sound.SaveNotes(soundSTR + notesInput.Text) })
با استفاده از متد NewButtonWithIcon یک دکمه برای ذخیره نت ای که کاربر داخل input قراره به صورت فایل صوتی و به فرمت wav میسازیم، که با کلیک روی دکمه تابع SaveNotes از پکیج sound رو فراخوانی میکینم.
return widget.NewGroupWithScroller("Home Page", widget.NewLabelWithStyle("Select Instrument", fyne.TextAlignLeading, fyne.TextStyle{Bold: true}), soundSelector, buttonSave, form, )
و در نهایت با استفاده از NewGroupWithScroller یک ویجت قابل اسکرول درست میکنیم به این خاطر که اگر کاربر نت طولانی وارد کرد صفحه به هم نریزه و بشه داخل صفحه بالا پایین رفت!
اره به همین سادگی !
میتونیم از سادگی fyne استفاده کنیم و از قدرت Golang هم بهره مند بشیم :))))
قسمت بعدی رو دنبال کن D:
اگر مطالب مفید بود اینجا میتونید حمایت کنید :)))