นี่คืออะไรกันแน่?

  • เป็นไลบรารีที่จำลองส่วนสำคัญจำนวนมากของ API "Toolbox" ของ Macintosh Classic แม้จะยังไม่ใช่การติดตั้งใช้งานแบบสมบูรณ์ แต่ก็เพียงพอสำหรับการสร้างแอปพลิเคชันง่าย ๆ บางประเภท
  • เป็นฟีเจอร์ที่เพิ่มเข้าไปในอีมูเลเตอร์ MII Apple //e และเป็นหนึ่งในโปรเจ็กต์ที่เหมือนกำลังท้าทายสถิติโลกด้านการเพิ่มฟีเจอร์

ทำไม?

  • ผู้พัฒนาต้องการไลบรารี UI สำหรับ MII ที่มี dependency ไม่มาก และไม่ต้องการสไตล์แบบ "คล้ายเกม"
  • เริ่มต้นด้วย Nuklear ซึ่งเป็น UI แบบ immediate mode แต่รู้สึกว่ามันมีข้อจำกัดมาก และใช้งานลำบากเมื่อต้องการปรับแต่ง
  • ไม่พอใจกับเอนจินจัดเลย์เอาต์ UI และแม้จะอ้างว่าเก็บสถานะไว้ แต่ในทางปฏิบัติจริงกลับอิงสถานะจากค่าแฮช
  • ในอดีต UI ถูกสร้างขึ้นอย่างประณีตแบบงานช่างฝีมือ แต่ปัจจุบันหลายอย่างมักถูกตัดสินใจโดยไม่มีความรู้สึกด้านดีไซน์หรือการใช้งาน
  • จึงเริ่มสร้างไลบรารีของตัวเองขึ้นมาโดยนำชิ้นส่วนต่าง ๆ ที่มีอยู่แล้วมาใช้

ไลบรารีนี้ทำอะไรได้บ้าง?

  • มี "manager" บางส่วนของ Macintosh Toolbox และทำงานในลักษณะที่เข้ากับระบบสมัยใหม่
  • ออกแบบมาให้วาดลงบน "หน้าจอ" ที่เป็น ARGB buffer และสามารถคัดลอกไปยังตำแหน่งที่ต้องการได้
  • ไลบรารีจะติดตามพื้นที่ "invalid" และวาดใหม่เฉพาะส่วนที่จำเป็นเพื่อลด overdraw ให้น้อยที่สุด

มันต่างจากต้นฉบับอย่างไร?

  • ในแง่รูปลักษณ์เริ่มต้นจาก MacOS 8/9 แต่ตัดเฉดสีเทาทั้งหมดออก
  • ในแง่ API เป็นแบบ asynchronous ทั้งหมด และไม่สามารถวาดลงในหน้าต่างหรือ GrafPort ได้ทุกเมื่อเหมือนต้นฉบับ
  • ทุกอย่างประกอบขึ้นจาก mui_window หรือ mui_control

ตัวจัดการหน้าต่าง

  • สามารถสร้างและวาดหน้าต่างได้
  • มี "layer" ได้สูงสุด 15 ชั้น และสามารถทำ clipping เป็นต้น

ตัวจัดการเมนู

  • มีแถบเมนู เมนู เครื่องหมายถูก คีย์ลัดคีย์บอร์ด ฯลฯ ที่ดูเหมือน System 7/8 หรือ GS/OS

ตัวจัดการคอนโทรล

  • มีปุ่ม ช่องทำเครื่องหมาย ปุ่มวิทยุ แถบเลื่อน (แนวตั้ง) กล่องข้อความ เป็นต้น

ตัวจัดการรายการ

  • ออกแบบมาเพื่อแสดงชื่อไฟล์ และรองรับปุ่มลูกศร Page Up/Down ล้อเลื่อนเมาส์ เป็นต้น

การแจ้งเตือน

  • มีหน้าต่างแจ้งเตือนทั่วไปพร้อมปุ่ม "ยกเลิก" และ "ตกลง"

Standard File

  • มีไดอะล็อกสำหรับเปิดไฟล์

ตัวจัดการทรัพยากร

  • ไม่มี resource manager

dependency มีอะไรบ้าง?

  • dependency ภายนอกมีเพียง libpixman เท่านั้น
  • ใช้ libpixman, libcg, stb_truetype.h, stb_ttc.h เป็นต้น

วิธี build?

  • ใช้ Makefile แบบเรียบง่าย โดยสามารถสั่ง make จากไดเรกทอรีรากเพื่อ build ไลบรารีและ test/demo/sample ได้

วิธีใช้งาน?

  • วิธีที่ดีที่สุดคือแก้ไข mui_shell.c และ mui_widgets_demo.c เพื่อใช้งาน
  • โหลด mui_widgets_demo.so เป็นปลั๊กอิน และเมื่อระบบตรวจพบการเปลี่ยนแปลงก็จะ reload ให้อัตโนมัติ

FAQ!

  • ไม่มี dark mode, ธีม, หน้าต่างโปร่งใส, เอฟเฟกต์ลูกบาศก์, เมนูแบบ sticky, เครื่องมือหรือเฟรมเวิร์กสายเทรนดี้รุ่นใหม่, language binding ใหม่, การรองรับ Wayland ฯลฯ

ความเห็นของ GN⁺

  • ไลบรารีนี้เป็นโปรเจ็กต์ที่น่าสนใจซึ่งนำ UI ของ Macintosh แบบคลาสสิกมาสร้างใหม่ให้เข้ากับระบบสมัยใหม่ และอาจปลุกความคิดถึงเรื่องการออกแบบ UI ยุคเก่าให้กับนักพัฒนาได้
  • ไลบรารี UI แบบ asynchronous เหมาะกับการพัฒนาแอปพลิเคชันสมัยใหม่มากกว่า และไลบรารีนี้ก็ใช้แนวทางสมัยใหม่นั้น
  • ไลบรารีนี้อาจมีประโยชน์เป็นพิเศษสำหรับนักพัฒนาที่ให้ความสำคัญกับประสิทธิภาพของทรัพยากร เพราะการลด overdraw และวาดใหม่เฉพาะส่วนที่จำเป็นสามารถช่วยเรื่องการปรับแต่งประสิทธิภาพได้
  • อย่างไรก็ตาม ไลบรารีนี้ไม่มีฟีเจอร์สมัยใหม่อย่าง dark mode หรือการรองรับธีม จึงอาจไม่ตอบโจทย์นักพัฒนาทุกคน
  • ไลบรารี UI สมัยใหม่ที่มีความสามารถคล้ายกันได้แก่เฟรมเวิร์กอย่าง Qt, GTK หรือ Electron ซึ่งมีฟีเจอร์และการรองรับที่กว้างกว่า

ยังไม่มีความคิดเห็น

ยังไม่มีความคิดเห็น