23 Gtk4 ตอน 3, GtkListBox
การสร้างรายการ หรือ List นั้นใน Gtk จะมี GtkListBox อยู่ แต่รูปแบบการใช้งานนั้นจะแตกต่างจากเวอร์ชันเก่าด้วย Gtk4 ไม่มีคำสั่ง gtk_container_add แล้ว จึงต้องใช้ api ของออบเจกต์นั้นๆ แทน โดยปกติก็ใช้ _set_child () แทน ลองดูจากตัวอย่างในบทความนี้ แล้วค่อยพิจารณาตามไปจะช่วยให้เข้าใจได้ง่ายขึ้น
ในการเขียนโปรแกรมด้วย gtk4 นั้นจะสร้าง GtkApplicationWindow และเอาไปไว้ใน activate ของระบบแทนดังได้อธิบายในตอนที่ 1
ทีนี้ลองดูตัวอย่างโปรแกรมส่วนของ activate จะมีการสร้าง window ผ่าน gtk_application_window_new แล้วกำหนดชื่อและขนาดเริ่มต้น
ในบรรทัดที่ 10 เราจะสร้าง listbox จากคำสั่ง gtk_list_box_new() และกำหนดให้ listbox เป็นออบเจ็กต์ลูกของ window ในบรรทัดที่ 11 โดยในส่วนนี้ถ้าเป็นเวอร์ชันเก่าเราจะใช้ gtk_container_add (GTK_CONTAINER (window), listbox) แต่คำสั่งนี้ได้ถูกยกเลิกไปในเวอร์ชัน 4
บรรทัดที่ 14–21 เป็นการวนรอบเพื่อสร้างรายการใน listbox โดยกำหนดให้ label_text มีข้อความเป็น Item 1 — Item 5
บรรทัดที่ 15 เป็นการสร้างลาเบลเพื่อบรรจุข้อความ Item ตามด้วยลำดับของ i โดยใช้ g_strdup_printf เพื่อรวมเอาข้อความกับตัวเลขเข้าด้วยกัน วิธีการนี้จะมีการจองพื้นที่หน่วยความจำ ดังนั้นต้องคืนหน่วยความจำด้วยคำสั่ง g_free (label_text) ในบรรทัดที่ 18
บรรทัดที่ 16 เป็นการสร้าง row เพื่อเอาไปบรรจุใน gtk_list_box ด้วยฟังค์ชัน gtk_list_box_row_new()
บรรทัดที่ 17 เป็นการสร้างลาเบลโดยกำหนดข้อความจาก label_text ที่สร้างขึ้นในบรรทัด 15
บรรทัดที่ 19 เพิ่มข้อความจาก label ลงไปใน gtk_list_box_row โดยใช้ _set_child () ตรงนี้ต้องแปลง row ให้เป็น GtkListBoxRow เสียก่อนด้วยมาโคร GTK_LIST_BOX_ROW()
โดยมีรูปแบบการใช้งานดังนี้
void
gtk_list_box_row_set_child (
GtkListBoxRow* row,
GtkWidget* child
)
ใช้เพิ่ม child เข้าไปใน row ในที่นี้เพิ่มข้อความ (label) เข้าไปใน row ในที่นี้กำหนดชื่อเป็น row
บรรทัดที่ 20 เพิ่ม row เข้าไปใน listbox ด้วยคำสั่ง gtk_list_box_insert โดยมีรูปแบบดังนี้
void
gtk_list_box_insert (
GtkListBox* box,
GtkWidget* child,
int position
)
ใช้เพื่อเพิ่มข้อความ (child) ลงใน กล่องของ listbox (box) ในตำแหน่งที่กำหนด (position) ถ้าให้ต่อท้ายเสมอ กำหนดเป็น -1
Insert the child
into the box
at position
การใช้งาน gtk_list_box นั้นก็มีตามตัวอย่างและคำอธิบายด้านบน ลองอ่านแล้วดูตัวอย่างตามไปด้วยนะครับ…
ตัวอย่างโปรแกรมสร้าง gtk_list_box