Version 75 (modified by 3 years ago) ( diff ) | ,
---|
GSoC 2021: First steps towards a new GRASS GIS Single-Window GUI
Title: | First steps towards a new GRASS GIS Single-Window GUI |
Student Name: | Linda Kladivova |
Organization: | OSGeo - Open Source Geospatial Foundation |
Mentor Name: | Anna Petrasova, Martin Landa, Vaclav Petras, Stefan Blumentrath |
GSoC proposal: | View proposal |
GitHub Repository: | view repository |
Abstract
This project will mainly focus on extensive Graphical User Interface (GUI) refactoring necessary to prepare GRASS GIS for Single-Window GUI. As the result, I will introduce a very simple Single-Window layout and importantly a good programming base allowing further convenient extension and improvement with additional functions.
Goal
The goal is to create a simple Single-Window GUI (the standard solution in most of the software) which ensures all panels in the form of dockable panes to be visible immediately after startup. Of course, especially long-term users can prefer the existing Multi-Window GUI, so the original option will be retained. For more information, please have a look at a separate page where I present a proposal in detail: https://trac.osgeo.org/grass/wiki/wxGUIDevelopment/SingleWindow.
To sum up the schedule: From June 7th to June 20th (2 weeks), I plan to work on the GUI refactoring - separation of main GUI window code, creating a new Workspace Manager as well as a new Layer Manager class. From June 21st to July 11th (3 weeks) I plan to create a new Map Display panel needed for the Single-Window layout and to adapt toolbars in other panels (this would also be the topic for the first evaluation). From July 12th to July 25th (2 weeks) I will work on general factory class allowing me to preserve a Multi-Window layout as well as to create a new Single-Window layout. From July 26th to August 22th (4 weeks) I will work on the integration of all panels (Data, Display, Modules, Console, Python, Map Display notebook) to a basic Single-Window structure.
Timeline
Time Period | Milestones | |
---|---|---|
Tasks | Status | |
May 17 - 6 June |
|
|
June 7 - June 13 | The basic skeleton: arrangement of basic widgets
|
|
June 14 - June 20 | wxGUI refactoring
|
|
June 21 - June 27 | wxGUI refactoring
|
|
June 28 - July 4 | wxGUI refactoring:
|
|
July5 - July 11 | wxGUI refactoring:
|
|
July 12 - July 18 | wxGUI refactoring:
Adapting the code for Single-Window GUI:
|
evaluation
|
July 19 - July 25 | wxGUI refactoring:
Adapting the code for Single-Window GUI:
|
|
July 26 - August 1 | wxGUI refactoring:
Adapting the code for Single-Window GUI:
|
|
August 2 - August 8 | wxGUI refactoring:
Adapting the code for Single-Window GUI:
| |
August 9 - August 15 | Finishing up, testing, documentation | |
August 16 - August22 |
| |
Bonding period report
Introduce myself in dev list, get in contact with my mentors and discuss the design of functions
After being accepted as a student for GSoC 2021, on May 25 I introduced myself and my project to grass dev lists (1). I also set up the video call with my mentors - Anna Petrasova, Vaclav Petras, Martin Landa, and Stefan Blumentrath that I already well know from the previous year, and our other cooperation regarding my master thesis. We met on May 25 and discussed various Single-Window GUI options and their possible shortcomings. We decided to set up a parallel environment determined for the independent Single-Window layout development. Finally, we agreed on our regular video call time (once per two weeks).
Prepare the wiki page about the project
I created my project wiki page (2) and added the link to the GSoC 2021 Accepted proposals page (3). The wiki page includes - General information about the project (title, mentors, links to the proposal and GitHub repository, etc.), a brief description of the project, goal, and timeline of tasks and deliverables.
I will keep my wiki page up to date and will add weekly reports following the instructions in the GSoC Recommendations for Student page (4).
Set up the GitHub repository of the project
I already have GitHub GRASS fork in usage (5) so I only added the link to the GSoC 2021 Accepted proposals page (3), to my wiki page (2) and shared it with my mentors. My repository is licensed under the GNU General Public License v3.0, according to the license of GRASS GIS.
Two PRs regarding Single-Window GUI already merged
The first PR https://github.com/OSGeo/grass/pull/1591 deals with general refactoring. The second one creates the parallel environment where I am gonna further independently develop the Single-Window GUI, see https://github.com/OSGeo/grass/pull/1604. I also created the PR https://github.com/OSGeo/grass/pull/1598 enhancing GRASS for version 8.0. It implements easier switching between mapsets in different locations since we would like GRASS to be as user-friendly as possible. All mentioned PRs are already merged to master. Meantime, I played with wx.aui demo in order to create a prototype of the Single-Window GRASS GUI. However, it is still not decided if we use wx.lib.agw.aui python library or traditional wx.aui C++ library. Therefore, I also compared those approaches. The traditional wx.AUI seems the same in terms of functionality except missing pane minimizing. Next week we need to decide which attitude should be selected.
Plans for next week:
- Start developing Single-Window GUI
- Integrate main parts that do not involve much refactoring
- Have a meeting with mentors on Wednesday
- Decide which library will be used (but could be probably changed even later)
(1) https://lists.osgeo.org/pipermail/grass-dev/2021-May/095168.html
(2) https://trac.osgeo.org/grass/wiki/GSoC/2021/SingleWindowLayout
(3) https://wiki.osgeo.org/wiki/Google_Summer_of_Code_2021_Accepted
(4) https://wiki.osgeo.org/wiki/Google_Summer_of_Code_Recommendations_for_Students
(5) https://github.com/lindakladivova/grass
Weekly reports
Week 1
1) What did I complete this week?
This week I started to develop Single-Window GUI in the prepared parallel environment. I arranged basic widgets (Data Catalog, Display, Modules, Console, Python), you can have a look at this PR: https://github.com/OSGeo/grass/pull/1621. After a discussion with mentors and other members of the GRASS community, it was finally decided to use Map Display as the center content pane. At the same time, we decided to use the python wx.lib.agw.aui library for Single-Window GUI development. This library contains a bunch of interesting functions as e.g. grouping dockable panes into notebooks. The state after the arrangement of the basic widgets looks as follows:
At the same time, I also fixed a bug https://github.com/OSGeo/grass/issues/1636 (https://github.com/OSGeo/grass/pull/1637).
2) What am I going to achieve for next week?
The task for the next week will be to allow to create a new Map Display as a wx.Panel (now it is only in the form of wx.Frame) and integrate this Map Display as a center content pane.
3) Is there any blocking issue?
No, it isn't.
Week 2
1) What did I complete this week?
I focused on the GUI refactoring. In order to add Map Display to the notebook widget, we need to have it in the form of wx.Panel. I divided the work into several steps.
- This week I changed the way of creating Map Display status bar (which is now independent of the parent widget) - https://github.com/OSGeo/grass/pull/1646.
- However, this PR caused the bug related to the workspace saving(https://github.com/OSGeo/grass/issues/1657) which I corrected ASAP (by https://github.com/OSGeo/grass/pull/1665).
- Meantime, I started more complex PR changing the way the Map Display is built (see https://github.com/OSGeo/grass/pull/1656). The core lies in adding the intermediate wx.Panel widget. This PR aims at more general refactoring of Map Display creation, do not change the code in the Single Layout parallel environment - adapting the S-W GUI is planned to be another step forward.
2) What am I going to achieve for next week?
I plan to finish the refactoring of Map Display related stuff (see https://github.com/OSGeo/grass/pull/1656) and utilize it in the Single-Window GUI environment. It will lead to a new Map Display notebook widget (composed of wx.Panel Map Displays). This notebook will be then used as the content pane.
3) Is there any blocking issue?
No, it isn't.
Week 3
1) What did I complete this week?
I focused on the GUI refactoring. In order to add Map Display to the notebook widget, we need to have it in the form of wx.Panel. This week I worked quite hard on the main refactoring PR (see https://github.com/OSGeo/grass/pull/1675). The core lies in adding the intermediate wx.Panel widget. However, this PR influences quite many things much more than we first expected. I am changing the way how Map Display is built which has an impact on single map display stuff as well as double frame stuff. So that, this PR also requires very intense testing since all things then go straight to the master - adapting the independent Single-Window GUI environment is planned to be another step forward.
2) What am I going to achieve for next week?
I plan to finish the refactoring of Map Display related stuff (see https://github.com/OSGeo/grass/pull/1675) and test this PR very intensively.
3) Is there any blocking issue?
No, it is not. However, next week on Saturday I am going on four day holiday to Slovakia. I hope I will be able to merge this big refactoring PR by Friday.
Week 4
1) What did I complete this week?
Similarly as the last week, I focused on the GUI refactoring. I worked on the main refactoring PR (see https://github.com/OSGeo/grass/pull/1675). In terms of the main Map Display I am done here. However, me and my mentors realized that changes influence also other Map Frames - particularly g.gui.rdigit, d.mon, Map Swipe, Ground Control Point and IClass frame.
There were two possible ways how to proceed. First, I started with the statusbars for all the frames that we need newly to be created based on wx.Statubar widget (see https://github.com/OSGeo/grass/pull/1689). Then we came up with another concept, namely delegating methods using metaprogramming. Although this path seemed cheap at first (we talked about it very intensively on videocall on Wednesday), after a few hours of studying, we came to the conclusion that it is inappropriate in our case. And this decision subsequently opened PR https://github.com/OSGeo/grass/pull/1689 again.
Meantime, I also discovered the bug related to hiding statusbar and toolbars. Hiding does not work properly for above-mentioned map frames as e.g. Map Swipe. I set up the issue https://github.com/OSGeo/grass/issues/1691.
To sum it up, this week was not so productive in terms of code, but key in determining what to do next and especially how.
2) What am I going to achieve for next week?
In the next step, the focus will be on the completion of PR https://github.com/OSGeo/grass/pull/1689, which will then allow the completion of the large PR https://github.com/OSGeo/grass/pull/1675.
3) Is there any blocking issue?
No, it is not. However, as I have already mentioned I am on holiday from Saturday to Tuesday.
I am looking forward to new energy coming after the rest.
Week 5
1) What did I complete this week?
I worked mainly on the PR https://github.com/OSGeo/grass/pull/1689 which was again opened after our discussion last week. Anna took care of solving the bug concerning hiding and showing status bar and toolbars https://github.com/OSGeo/grass/issues/1691 and then based on these changes I rebased the https://github.com/OSGeo/grass/pull/1689. This PR is now in the reviewing process and will be early merged.
I am also still working on the main refactoring PR https://github.com/OSGeo/grass/pull/1675. Unfortunately, many things are influenced and need to be changed. These changes are so connected together that it is not possible to divide PR https://github.com/OSGeo/grass/pull/1675 into several different PRs...
Meantime, I also discovered the bug in the Show comp. extent option in the status bar and corrected it (see PR https://github.com/OSGeo/grass/pull/1717 and issue https://github.com/OSGeo/grass/issues/1714).
2) What am I going to achieve for next week?
After merging PR https://github.com/OSGeo/grass/pull/1689, I will again focus on PR https://github.com/OSGeo/grass/pull/1675.
3) Is there any blocking issue?
No, it is not.
Week 6
1) What did I complete this week?
This week was very important. In the first part, I worked on https://github.com/OSGeo/grass/pull/1675 which is already done in terms of the main Map Display panel but needs many other changes related to other widgets. On Wednesday's video call we decided to work on the local merged branch because it will probably take some time to merge https://github.com/OSGeo/grass/pull/1675 (also with regard to the new G8 release).
So, I set up the new PR https://github.com/OSGeo/grass/pull/1732 mining from both refactoring PRs https://github.com/OSGeo/grass/pull/1675, https://github.com/OSGeo/grass/pull/1689. By the time we merge https://github.com/OSGeo/grass/pull/1675, I can solve here many things related to the Single-Window layout. I have already composed the new Map Display panel and started to repair existing events and methods and implement new methods.
There are several basic things I would like to address in this PR:
- repair GRASS GIS exit (generally speaking all closing stuff is broken now)
- adding maps to map display does not work when switching to a different location
- adding and removing 3D View does not work
- remove methods applied on wx.Frame
- implement new events or repair the existing ones:
- when adding a new Display tab automatically focus on the related Map notebook tab
- when switching Display tabs, Map notebook tabs are switched as well
- when moving Map notebook tabs, the index is remembered, so switching between Display tabs switch Map tabs correctly
- when switching Map notebook tabs, Display tabs are switched as well
- Map notebook switching process works from the beginning (not needed to switch Display tabs first)
- closing Map notebook tab closes the related Display tab
- closing Display tab closes the related Map notebook tab
- when renaming the Display tab, the related Map notebook tab is renamed (regardless of the current index)
I have also noticed a small issue concerning GCP toolbars and I set up the issue for it (see https://github.com/OSGeo/grass/issues/1731).
2) What am I going to achieve for next week?
I am gonna work on coding basic functionalities for the Single-Window layout on my locally merged branch. Although, it is not possible for my mentors to test it, I will share changes to the PR https://github.com/OSGeo/grass/pull/1732 so we can at least discuss them.
3) Is there any blocking issue?
No, It is not.
Week 7
1) What did I complete this week?
This week I have been working on the coding of basic functionalities for the Single-Window layout on my locally merged branch. First I set up several Issues for those, however, since I am still working on my local branch, I eventually decided to address more Issues within one PR (so previously created Issues were merged into two larger ones - see https://github.com/OSGeo/grass/issues/1735, https://github.com/OSGeo/grass/issues/1750).
I integrated the Map Display into a new AuiNotebook and fixed the existing events - see PR https://github.com/OSGeo/grass/pull/1732. These changes are ready to merge.
I also created two Issues that will be important after the integration of basic functionalities and the creation of new events for the AuiNotebook center pane. The first one is kind of a discussion Issue. We can share suggestions there for what the startup GUI could look like. I have already added some proposals based on my local branch, see https://github.com/OSGeo/grass/issues/1747. I am aware of the priority of the G8 release, so I feel it is something to be discussed later on.
The second Issue https://github.com/OSGeo/grass/issues/1748 talks about an important enhancement that allows a user to undock the AuiNotebook pane into the wx.Frame widget (will be enabled through a button probably). This enhancement is very crucial as it will allow users who like the Multi-Window layout to continue using it even within this new GUI. It will probably be the last functionality I will complete within GSoC - or it is at least a plan - there might be some shortcomings in the refactoring PRs needed to be repaired, as big changes often cause minor errors.
2) What am I going to achieve for next week?
I am gonna work on the implementation of new events for AuiNotebook (see https://github.com/OSGeo/grass/issues/1750) and I also need to go back to PR https://github.com/OSGeo/grass/pull/1675. It needs more testing and there still remains to integrate wx.Panel into g.gui.photo2image and g.gui.image2target GUI tools. I also have some problems with closing events for independent GUI Map Displays here that need to be sorted out.
3) Is there any blocking issue?
No, It is not.
Week 8
1) What did I complete this week?
The success of this week lies in the merge of 2 PRs - the refactoring https://github.com/OSGeo/grass/pull/1689 and the https://github.com/OSGeo/grass/pull/1732 dealing with the basic map panel integration to Single-Window GUI. Just before that I had to make 2 rebases since my mentor Anna had merged a different refactoring PR https://github.com/OSGeo/grass/pull/1729 which influenced PR https://github.com/OSGeo/grass/pull/1689 as well as https://github.com/OSGeo/grass/pull/1675.
In the second half of the week I went back to the PR https://github.com/OSGeo/grass/pull/1675. I integrated wx.Panel to three remaining tools namely g.gui.photo2image, g.gui.image2target, g.gui.example. I have also started to test this PR and written down shorcomings we will discuss and probably fix with the help of my mentors.
We had the video call on Wednesday where we went through possible options of startup layout I put here: https://github.com/OSGeo/grass/issues/1747 and decided that the third option is the most suitable one and thus will be implemented. We use "Perspectives" for this purpose.
2) What am I going to achieve for next week?
The priorities for the next week are first of all to test PR https://github.com/OSGeo/grass/pull/1675, secondly to create a startup Single-Window GUI perspective and lastly to develop event handlers for map AuiNotebook. For the second point I am going to study the wx.lib.agw.aui concept of so-called perspectives.
3) Is there any blocking issue?
No, It is not.
Week 9
1) What did I complete this week?
First of all, I completed the big refactoring PR https://github.com/OSGeo/grass/pull/1675. It is ready for review and will be merged after GRASS 8 release.
Secondly, I implemented the layout which will be used for startup https://github.com/OSGeo/grass/pull/1775. It looks exactly like the third option presented here: https://github.com/OSGeo/grass/issues/1747. Unfortunately, I am a bit stuck here with size settings for the automatic notebook I made. As for this PR, we had a video call with Anna on Thursday and agreed to not deal with perspectives now because there are still more crucial things that need to be fixed or reorganized. Lastly, I started to work on events. This PR https://github.com/OSGeo/grass/pull/1780 deals with the first of two events in this Issue https://github.com/OSGeo/grass/issues/1750 - AuiNotebook changing event.
2) What am I going to achieve for next week?
The priorities for the next week are first to finish PRs https://github.com/OSGeo/grass/issues/1747 and https://github.com/OSGeo/grass/pull/1780 and to set up a new PR for the AuiNotebook closing event. We also decided to move the New Display button to a different place and to have one independent toolbar for each Display tab. So if some time remains, I would also implement this reorganizing stuff. But generally speaking, the closing event for AuiNotebook is the last thing that is needed to do for the working Single-Window GUI prototype.
3) Is there any blocking issue?
No, It is not.
Week 10
1) What did I complete this week?
First of all, I fixed the size of the automatic notebook which is used for the startup layout. The related PR https://github.com/OSGeo/grass/pull/1775 has still some minor shortcomings with cmd warnings messages but we decided to let it be for now since it would require more intervention in the construction of the map panel status bar widget which is anyway likely to be very simplified or replaced by the settings dialog in the future. Here you can see the suggested startup layout:
Secondly, I implemented the new changing tab event for the center AuiNotebook. You can have a look at PR https://github.com/OSGeo/grass/pull/1780 which is already merged. To provide the fully working GRASS Single-Window GUI prototype, I also opened the PR https://github.com/OSGeo/grass/pull/1789 which addresses several smaller things related to the AuiNotebook closing event. This PR is not merged yet but I plan to have it done by the end of GSoC. Merging this PR will close the Issue https://github.com/OSGeo/grass/issues/1750 with the new AuiNotebook events.
Thirdly, I moved the NewDisplay button to the upper Tools toolbar, see the PR https://github.com/OSGeo/grass/pull/1783 (merged). Lastly, each layer tree is about to have one independent toolbar. I have coded it in the PR https://github.com/OSGeo/grass/pull/1785 which is not in the master branch yet.
2) What am I going to achieve for next week?
The priorities for the next week are mainly to finish PRs https://github.com/OSGeo/grass/pull/1789 and https://github.com/OSGeo/grass/pull/1785. Unfortunately, we still have not merged the main refactoring PR https://github.com/OSGeo/grass/pull/1675 because it waits for the GRASS 8 release. It probably gets into the GRASS dev version after GSoC.
Anyway, I would also like to prepare some startup settings that allow GRASS geeks to try out the GRASS Single-Window prototype. And of course, I am going to finish the final evaluation and sum up my work to the final GSoC report.
3) Is there any blocking issue?
No, It is not. Please, if you would like to know more info, have a look at my Twitter thread https://twitter.com/GRASSGIS/status/1423254298587275264 where I presented some screenshots of the prepared GUI. :-)
Final Report
Title: First steps towards a new GRASS GIS Single-Window GUI
Community: GRASS GIS - OSGeo
Abstract:
This project was focused mainly on the extensive Graphical User Interface refactoring necessary to prepare GRASS for Single-Window GUI. In addition to a good programming base, the simple working Single-Window GUI prototype was built as a different wx.Frame widget in a parallel environment. This frame largely copies the design (mockup) which the author proposed for the GSoC application. All main functionality was put into operation, however, the Single-Window GUI still needs a number of improvements to completely replace the current Multi-Window GUI solution.
The state of the art BEFORE the start of GSoC:
The state of the art AFTER GSoC:
Conclusion:
Next Steps:
Permanent Links:
Pull requests related to the wxGUI refactoring:
Title | Pull Request | Issue | |
wxGUI: Split widget initialization from notebook logic | https://github.com/OSGeo/grass/pull/1591 | - | MERGED |
wxGUI: refactoring: build display status bar based on wx.StatusBar widget | https://github.com/OSGeo/grass/pull/1646 | - | MERGED |
wxGUI: refactoring: Map Display inheriting from wx.Panel | https://github.com/OSGeo/grass/pull/1675 | - | WILL BE MERGED AFTER GRASS 8 RELEASE |
wxGUI: refactoring: build GUI tools' status bars based on wx.StatusBar widget | https://github.com/OSGeo/grass/pull/1689 | - | MERGED |
Pull requests related to the creation of the Single-Window GUI prototype:
Title | Pull Request | Issue | |
wxGUI: create parallel wx.frame for Single Window layout development | https://github.com/OSGeo/grass/pull/1604 | - | MERGED |
wxGUI: Single-Window GUI: arrangement of basic widgets | https://github.com/OSGeo/grass/pull/1621 | - | MERGED |
wxGUI: Single-Window GUI: Integrate new map display wx.Panels into a AuiNotebook center pane | https://github.com/OSGeo/grass/pull/1732 | https://github.com/OSGeo/grass/issues/1735 | MERGED |
wxGUI: create parallel wx.frame for Single Window layout development | https://github.com/OSGeo/grass/pull/1604 | - | MERGED |
wxGUI/Single-Window: arrange a startup GUI | https://github.com/OSGeo/grass/pull/1775 | https://github.com/OSGeo/grass/issues/1747 | NOT MERGED YET |
wxGUI/Single-Window: New change page event for AuiNotebook | https://github.com/OSGeo/grass/pull/1780 | https://github.com/OSGeo/grass/issues/1750 | MERGED |
wxGUI/Single-Window: New close page event for AuiNotebook | https://github.com/OSGeo/grass/pull/1789 | https://github.com/OSGeo/grass/issues/1750 | NOT MERGED YET |
Other related PRs:
Title | Pull Request | Issue | |
wxGUI: Workspace save fails with SbManager has no IsShown | https://github.com/OSGeo/grass/pull/1665 | https://github.com/OSGeo/grass/issues/1657 | MERGED |
wxGUI: MapSwipe window has wrong title | https://github.com/OSGeo/grass/pull/1692 | https://github.com/OSGeo/grass/issues/1690 | MERGED |
wxGUI/MapSwipe: Show comp. extent option in statusbar does not work | https://github.com/OSGeo/grass/pull/1717 | https://github.com/OSGeo/grass/issues/1714 | MERGED |
wxGUI: NewDisplay button moved to !LMToolsToolbar | https://github.com/OSGeo/grass/pull/1783 | - | MERGED |
wxGUI: Each layertree has its own display toolbar | https://github.com/OSGeo/grass/pull/1785 | - | NOT MERGED YET |
wxGUI: new design for GNotebooks | https://github.com/OSGeo/grass/pull/1801 | - | NOT MERGED YET |
The project that includes all PRs (not only mine) related to this problematics:
https://github.com/OSGeo/grass/projects/6
Weekly Reports:
https://trac.osgeo.org/grass/wiki/GSoC/2021/SingleWindowLayout
Presentation of new Single-Window GUI prototype in Beamer (Google Drive public folder):
Twitter thread presenting the new Single-Window GUI prototype:
https://twitter.com/GRASSGIS/status/1423254298587275264
Attachments (8)
-
single_layout_week1.png
(117.5 KB
) - added by 4 years ago.
Arrangement of the widgets except Map Display
-
startuplayout.png
(408.0 KB
) - added by 3 years ago.
Single-Window GUI startup layout
-
startupGUI.jpg
(351.7 KB
) - added by 3 years ago.
Single-Window GUI startup layout after merging PRs #17853 and #1785
-
two_tabs_side_by_side(1).jpg
(281.5 KB
) - added by 3 years ago.
Map displays can be placed side by side
-
another_arrangement.jpg
(205.9 KB
) - added by 3 years ago.
Example of another possible widget arrangement
-
another_possible_arrangement.jpg
(240.8 KB
) - added by 3 years ago.
Example of another possible widget arrangement
-
all_panes_minimized.jpg
(255.1 KB
) - added by 3 years ago.
All panes are minimized
-
multi-window.PNG
(253.2 KB
) - added by 3 years ago.
Multi-Window GUI