After three months of hard work and a lot of coding the Google Summer of Code is over. I learned a lot and had a lot fun. GSoC was an amazing experience and I encourage everybody to participate in future editions. At this point I’ve been a contributor to GNOME for nearly a year, and I plan on sticking around for a long time. I really hope that other GSoC students also found it so enjoyable, and keep contributing to GNOME or other Free Software Projects.
This will be my final GSoC post, so I will summarize what I did for Fractal in the last couple of months, and what I didn’t finish before the deadline. I completed some of the tasks I proposed for GSoC already before the Coding Phase. It was really nice that we had a meeting with Daniel (my mentor) and Eisha (my co-GSoC student) every week, and also some other core members working for Fractal joined sometimes. During these meetings I could get feedback from Daniel and discuss tasks for the next week. We had a really good workflow. I guess that was also a reason that I started working on some imported tasks and not only on things I initially proposed.
Main Tasks
These are my main Tasks I completed during the GSoC. They are all already merged, and included in the current release:
- Generate rust gspell bindings: Create bindings for gspell, to be able to use gspell in rust applications.
- User Settings: Add the user settings panel and all backend functionality to handle the configuration of a user profile.
- Create Rust bindings for libhandy: First step to integrate libhandy into Fractal. Libhandy is a library to easily develop GTK applications for desktop and mobile.
- Create room settings: Improve the old room settings dialog, move to a panel and implement the new UI design.
- Refactor avatar loading and caching: Fractal used different ways to download and cache avatars. Code clean up and restructuring. Also move the code to generate the fallback avatar based on a the username to a separate library so it can be used by other projects.
These are the task I could not finish in time:
- Spell Check: Add spellcheck to Fractal, based on gspell. I implemented this (though not with the UI we’ll eventually want) and it was merged, but since then we made some big changes to the message input widget and therefore it doesn’t work anymore at the moment. We also decided that other tasks were more important. I will work on this in the next couple of months.
- refactor room history: A big change to how the message history is displayed, loaded, and stored. This will lay the groundwork for a lot of new features we want, and the backend refactor we need to split the app. This is one of the biggest tasks I worked on during the summer, and I will try to finish it as soon as possible. Since we started restructuring the code base I had a lot of stuff to figure out and therefore it was delayed.
- Use libhandy to have adaptive columns: We want Fractal to work on big screens as well as on small screens and therefore we use a widget in libhandy to center columns and limit the width of, mostly, gtkListboxes.
During the Summer I made also some other contributions, which were tangentially related to Fractal and my GSoC tasks, e.g. I fixed the GTK emoji picker layout and styling (this has been merged now, so look forward to a much nicer emoji picker in GTK 3.24).
My Code
Most of my work is upstream and already integrated into Fractal. This is a list of all commits merged into Master:
* b9d7a5a - message_menu: remove appOP dependecy from message_menu * 6897ad0 - roomsettings: update .po file and add i18n * f96eeef - roomsettings: fix member list disappearing when closing * c772d9f - roomsettings: hide confirm button when the topic/name didn"t change * cf7dffd - roomsettings: clean up code from old memberslist * 44b2d28 - roomsettings: reload room settings when members are avaible * 089b001 - headerbar: remove avatar form the headerbar * 20c9ebd - roomsettings: move room settings panel to a custom widget * 692045f - roomsettings: make room description label a dim-label * 78c5be1 - roomsettings: set max with for centerd column * 0c99e0e - roomheaderbar: move room menu to new settings button * a2de6ac - roomsettings: hide not implemented widgets * 5097931 - roomsettings: request avatar when entering the room settings * 0244a23 - roomsettings: hide settings not needed for a room type * dc83201 - roomsettings: add invite button * 544fc52 - roomsettings: show members in the room settings * 4e6b802 - room: add room settings panel * 8993f5f - avatar: refactor avatar loading and caching * b81f1ec - accountsettings: add closures to address button callback * 200440d - accountsettings: remove seperator in user settings menu * e88663e - accountsettings: make animation for destruction revealer slower * 0068fde - accountsettings: fix valignment of label name/email/phone * 140da51 - accountsettings: scroll to advanced/destruction section when open * f1e86bd - accountsettings: add placeholder text * c4d608b - accountsettings: show spinner will updating the avatar * 41a07a8 - accountsettings: generate client secret for each request * 7c459d3 - accountsettings: use stored identity server * 708c5c0 - accountsettings: add button to submit new display name * e019e48 - accountsettings: move account settings to the main window * 6ee5c99 - accountsettings: show confirm dialog when deleting account * 9a2dada - accountsettings: remove loading spinner once password is set * 835ab15 - accountsettings: password change and account destruction * ba74610 - accountsettings: managment for phone and email threePIDs * 345cb8e - accountsettings: add buttons to address entries * 04ed27f - accountsettings: load threePIDs (email and phone addresses) * a214504 - accountsettings: password validation * 8711c01 - accountsettings: add password change dialog * 1d31eab - accountsettings: add api for changing account avatar * de83098 - accountsettings: add api for changing account name * 96bcb94 - accountsettings: add UI for account settings * 1fec2e5 - login: use global constant for homeserver and identity server * ee1ad9c - login: store identity server * 206035c - gspell: add basic spell check * f92387c - mention: highlight own username in mentions using pango attributes * 3d3a873 - fix: add joining members to the there own room instate to the active room * d6145e8 - message-history: set space after last message to 18px * 972d44a - mention: blue highlight for messages with mentions and cleanup css file * 0571245 - autoscroll: add ease-out when scrolling to last message * b35dec6 - autoscroll: add button to scroll down to last message * 789048f - autoscroll: move to new message when the user send a message * 55dcaf1 - autoscroll: no delay before autoscroll * 77051f6 - center inapp notification * 5c1cd22 - fix autoscroll, disable autoscroll when not at the end of message history, fix #137 * f59c3d2 - autocomplete: fix change usernames font color to white when selection ends at the same position as the username * f6a3088 - move autocomplete popover to a seperate file * 0f2d8a8 - messages-history: add spacing after last message * b548fc9 - messages-history: remove blue selection and add more space inside each row * dc0f1e1 - add Julian Sparber to the author list * 20beb87 -add spacing bethween avatar and msg body * b721c96 - add padding to the message history * 533a736 - implement redesin of the autocomplete popover, fix #146 * 9a9f215 - remove " (IRC)" from the end of suggested username for mentions, fix #126 * 101c7cd - use only @ with tab-compleation * 798c6d3 - match also uid for mentions * 3caf5a0 - limit user name suggests to 5 and allow usage of @ for mention * b2c5a17 - fix spacing in user menu popover and in room settings popover * 8fa9b39 - reoder options in add room menu, add separator and change some lables * 5f15909 - fix title of dialog for joining a room by ID * b475b98 - center all dialog title on dialog width and refactor glade file * d9059f0 - fix the text of some lables * e5827c5 - spawn popover from room name and remove room-menu-button * 7b72f59 - add image to no room view and add new style #132 * e92b20a - fix alignment of no room selected message by splitting the text to two label * 6f2fa3b - fix alignment for the text when no room is selected * fcb8b41 - set focus for each stack view, fix #118 * c2a2816 - increase avatar size in the sidebar to 24px * d7dc175 - make user menu button avatar 24px * f94c558 - make room avatar in header 24px if no description * 7b4fe55 - show user info in popover * 9a0d36b - split user menu in two menus and remove the title in the left headerbar * 3c80382 - add spinner to initial sync notification * 1db7847 - [refactor] use headerbars in the titlebar instate of boxes * 2538993 - adjust spacing on first message in group * 6db14b6 - set timestamp fontsize to small * 3a92de6 - fix spacing around messages * f355fdc - add spacing to load more button and center it
Some of my work went into libraries so it can be used by other applications, and one big merge request is still work in progress. I will continue to work on these git repositories, therefore I added the last commit for each repo done during GSoC:
The Gspell rust bindings:
https://gitlab.gnome.org/jsparber/gspell-rs
(last commit: 1501c997e2450378ea7e8291c94fa8189bb360df)
https://gitlab.gnome.org/jsparber/gspell-sys-rs
(last commit: 158e8ebbe5aeafc96663e3e76fc9a25715198264)
The libhandy rust bindings:
https://gitlab.gnome.org/jsparber/libhandy-rs
(last commit: f174e76882896c32959d0d16fe11eaadfce1c674)
https://gitlab.gnome.org/jsparber/libhandy-sys-rs
(last commit: 2caa9f6e0b68d391a6cdb45123f85c73b9852553)
I also created a libhandy test branch in Fractal, but I got never around merging it, because of a bug in libhandy (though it is fixed now, so it could be merged soon)
https://gitlab.gnome.org/jsparber/fractal/tree/handy
(last commit: b28da9a7443c34989dc8703402e6bc154a962f57)
The code to generate an avatar based on usernames:
https://gitlab.gnome.org/jsparber/letter-avatar
(last commit: 083e65e6ae8f63dc4071d3fac47adaa81e99d607)
There’s already a work in progress MR for the room history refactor:
https://gitlab.gnome.org/World/fractal/merge_requests/184
(last commit: 38abd3ceb3eb6d0ef1e70f66c7b0139ad65413b4)