ספריית ממשק לשולחן עבודה – nana pro

אני די מאסתי ב־Qt. הספרייה פותרת את כל הבעיות של שנת 2003 (ספרית STL חסרה וספריות רשת לא קיימת – למשל). ולא פותרת את הבעיות של שנות 2020 – איך אני משתמש מנהל חבילות כדי לקבל את הספרייה (לא נכון – כבר מתחיל להיפתר – גרסה 6 מתחילה לתמוך ב־cmake/conan). הפסרייה עושה פורק לחלק גדול מהדברים שב־standard c++ library – אני מבין את הצורך ההיסטוריה בפתרונות האלו – אבל כרגע אין בהם צורך. כמו כן – הספרייה מספיק גדולה וכדי להתחיל לחפש אלטרנטיבה. אז אני מחפש וכרגע אני בודק את nana-pro.

זאת ספרייה די וותיקה, והמטרה שלה היא רק לעשות ממשק משתמש – ולא להתעסק בבעיות רשת, או להמציא container חדש או string מחדש. היא משתמשת ב־C++‎17. אז אני בדקתי אותה.

הדברים הטובים:

  • הקוד אין לו תלויות נוספות (למעט libpng/libjpeg והם אופציונאלים).
  • יש דוגמאות באתר.
  • הקוד משתמש ב־cmake כדי להיבנות, אז קל להוסיף אותו בתור תת ספרייה בפרוייקט שלך.
  • אני הצלחתי להשתמש ב־FetchContent_Declare כדי למשוך את הקוד – פחות אידיאלי אבל שמיש (מתקמפל בלינוקס וחלונות). בעזרת conan הצלחתי להשתמש ב־libpng בלינוקס. היה קצת מלחמות בחלונות – אז נטשתי את הרעיון. אבל לפי דעתי פתיר.
  • הצורך להשתמש ב־C++‎ רגיל ללא תוספות … זה מרענן. אם כי ב־std::filesystem יש חוסרים (ביחס למה שאני רגיל מ־Qt). אפשר לכתוב פונצקיות עזר ולקוות שבעתיד זה ייכנס לתקן.
  • הצלחתי לכתוב תוכנית מלאה – ללא מחלקות. הכל כתוב בתוך main file. וזה קונסצפט מעניין. הצורך לבנות מחלקות עבור על פעולה במקום להשתמש ב־std::function הוא … מיושן (כן, אני יודע איך המימוש של lambda הוא בקומפילר).
  • כתיבה אל הממשק עצמו אפשרית מתוך כל thread.
  • יש להם thread manager ממש מגניב. למשל – לשים callback שירוץ ב־thread הוא רק לעטוף את הפונקציה שלך בפונקציה אחרת. ככה ה־callback שלך לא יחסום את הלולאה הראשית. (זה החלק הכי אהוב עליי בספרייה הזאת).

הדברים הרעים:

  • כשאתה מוסיף widget אל טאב למשל – הטאב לא מקבל עליו אחריות. במקרה שלי – אני עשיתי משהו בתוך callback, וכאשר ה־callback הסתיים ה־widget שלי נעלם כי יצא מה־scope. בסוף הפתרון היה לשמור את ה־widget החדש במערך גלובאלי.
  • הפקד של tab control לא ממש חביב עליי. אני לא יכול לבקש “תגיד לי מי מציג את T” (הפקד עצמו הוא מבוסס תבנית, אני השתמשתי ב־std::string בתור הבסיס שלו). בסוף חיפשתי בכל הלשוניות הזמינות. O(n) … אבל n הוא קטן לכן סתם מסריח.
  • הצורה שבה הם מנהלים את ה־layout מאוד ייחודית. לא בטוח שאני מחבב אותה – כי אין אפשרות ליצור משהו ויזואלי (זה מרגיש כמו לכתוב HTML אבל בלי שמות תגיות). יש עורך גראפי – אבל לא ממש “עובד בשבילי”. קשה לתאר.
  • הפקד טקסט הוא… איטי בצורה חסרת שימוש. אם אני גולל עם הגלגלת של העכבר – אני רואה את הפקד מגיב אחרי חצי שנייה ועוד גולל.
  • אין מספיק קוד זמין ברשת ללמוד ממנו, ולכן לעשות דברים מורכבים זה לימוד איטי.
  • הקוד בחלקו הגדול כתוב ב־headers ומשתמש ב־templates בצורה כבדה – וזה מקשה מאוד על הבנה של הקוד, וכשיש לך בעיות קומפילציה… לך תבין מה הבעיה באמת.
  • התיעוד מפוזר. יש את הפרויקט הראשי, ויש עוד חלק מצוות הפיתוח שיש לו תיעוד משלו. אתה צריך לעבור בין השנייה.

לסיכום:

לטעמי אין לספרייה הזאת שימוש, אלא בפרויקט מאוד ספציפי. התצוגה היא מאוד איטית (שימו אובייקט חצי שקוף ברגע ופתאום התוכנה שאתם כותבים היא מאוד איטית). הפקדים בסיסים ואין באמת יכולת לעשות theming ספציפי. אין תמיכה ב־accesability (למשל הקראת טקסט עבור לקויי ראייה). ה־toolkit עצמו מאוד בסיסי (למשל אי אפשר לקבוע שלחלק מהכפתורים יהיו תמונות, או להצמיד לכפתור תפריט, או לשים כפתור בתוך toolbar).

אני שים את הקוד פה שכתבתי. אני כמעט בטוח שהקוד ייזנח. אני ממקבל pr אם מישהו רוצה.
https://github.com/elcuco/nana-ide

Share Button

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *