Good day (or night)!
I got an impression that during long time no matter what kind of forces are
made we are swimming in the same swamp: UDIG core functionality is buggy,
unpredictable, unstable.
Here are just my minds about what breaks the "user-friendly" motto. I try to
think from the point of view not the developer but the user.
1) Rendering.
A lot of time was spent to learn, debug and understand rendering
multi-threaded architecture. Significant improvements were changed by bugs
and back for the time being.
Does the user really need progress of each layer rendering? Especially when
dozen of layers is on the map and rendering itself is time consuming task.
Updating status message, etc takes UI thread time.. There is a one composite
rendering thread that can be a "user" job and report whether rendering is
going on.
The same situation with layer status decorations. I would like to have an
option to switch off rendering progress decoration. stupid endless blinking
effects in Layers view. Lets make a rendering itself stable with good
architecture, then decoration. Question of priorities and concentrating on
really important and critical things.
Composite rendering thread that merges buffered images from usual layers
rendering threads - when the layer is rendered - updating is performed, no
updating during progress (again - the question of priorities - what is more
important: performance and clear logical behavior like "rendered->updated"
or UI tricks like "let's the user see our cool rendering progress at
run-time").
Some job is needed to refactor RendererCreator. Clean up the handling of
events when project model is changed: I mean I add layer - renderer context
must be created on the fly and the layer has to be rendered; I add multiple
layers - the same behavior but by one time - handling of multiple events by
one time. Such kind of improvements are desired.
2) Commands executing.
The use case: I have 10 layers. I press quickly press Zoom In, Zoom Out,
Zoom In, Zoom Out. 4 commands. Rendering is crazy! Each command forces
refreshing 4 times. I suppose composite renderer must somehow on the fly to
force current running rendering to be restarted if bounding box is changed.
This kind of optimizations are not that trivial, agree.. but I am a stupid
user working with "user-friendly"..
Commands merging, composing, whatever. It is for future thinking..
3) UI
UI standards: If I select project item, map item, layer item and press
"Delete" button. Let's assume that deleting works properly:) If I delete
prohect, popup window asks me about acknowledgement of deleting. If I delete
map, it disappears forever. what if I accidentally pressed "Delete" button
when the map was selected...
The unified behavior is strongly expected by stupid users..
4)"Selection" policy
There are various selection tools like box selection or feature selection.
Again, the user expects the similar behavior of all "selection" tools.
Selection is done in context of layer and map. I am a "stupid" user, I
expect a kind of "substitution" policy. I select features by "Box selection"
tool - the selection is highlighted. I select one feature by "Feature
selection" tool, the previous selection is cleared, or "substituted" by the
new one how I call it. Selection is performed by Filter API in Layer object.
One layer is always selected, or active. Selection tools perform selection
in current layer, while all previous selections in other layers in context
of current Map must be cleared. Only one map, one selected active layer
always, selection being performed by selection tools substituting any other
selections in any layer of the current map.
That what the users expect.. from experience.
As a developer I would like to have a kind of special GeoSelectionService
that is a singleton object in Map instance. All selections are made through
GeoSelectionService and wrapped into IGeoSelection interface. Tools create
selections through GeoSelectionService by passing selected objects wrapped
into IGeoSelection , like ISelection works.
=====================================
IGeoSelection extends IAdaptable{
//selection always in context of layer
Layer getLayer();
//if selection is made by filterm this is not null, but it can be in
//specific selection implementations
Filter getFilter();
//depends on implementation
getAdapeter(Class);
//Just iterates through set of objects like in IStructuredSelection
Iterator iterator();
}.
===========================
Why would I like that improvement? Something that is selected on the map is
a kind of persistent selection during switching over workbench parts.
Eclipse workbench selection service is a general solution and not
appropriate here because depending on part, tool, viewers we have different
selection providers but what I wrap into IGeoSelection is something
persistent and present on the map (Filter-based selection, or other
approaches).
Imagine we have good SelectionEditor of the UDIG of the future :) that can
edit one feature, or set of attribute values from multiple features defined
selected by Filter (we are working with that kind of editor now). It can
listen GeoSelectionService and always get IGeoSelection with necessary
information when selection is changed by any selection tool (that are going
to work through singleton GeoSelectionService to perform selections).
The tool made a new selection, SelectionEditor got changes, MapEditor is
changed -> SelectionService listens MapEditor activation and gets current
selection and sends as an event to update listeners like SelectionEditor.
We solve lots of problems. Substitution policy and unified behavior for
tools. Updating selection graphics and clearing the old ones is easy because
everything goes through one point - GeoSelectionService (now
ContextModel.select(..) is a kind of such point, but not extendable..
standalone service is preferable). Only one IPartListener in
GeoSelectionService to update selection from activated MapEditor in its
listeners - more clear architecture, less chances to create a listeners
hell.
IGeoSelection - something that is created on the map with "selection"
semantics.
5)Feature editor.
We are implementing feature editor based on new TabbedPropertySheetPage and
its framework. IGeoSelection can wrap just one feature and editor can create
UI for attibutes editing like it is now. Also IGeoSelection can wrap just a
filter of the layer and the editor will create UI to set values for
appropriate attribute types and then perform batch updating through
FetaureStore.modifyFeatures(AttributeType[], Object[], Filter).
We have selection tools that provide IGeoSelection to GeoSelectionService.
We have editor that listens GeoSelectionService and creates necessary UI for
the particular contents of IGeoSelection.
6) Editing tools
We know the situation. bunch of work is needed. There should be capability
to switch off all animations. Seems a lot of work was devoted to create and
fix animation when the core functionality of editing tools is so raw. The
question of priorities for users: what is more important - animation or how
to create a line with good UI response time.
7)Catalog
Catalog is not friendly at lot. It is simple and brutal. But is a core thing
like ArcCatalog.. all resources are coming into application through catalog
- a kind of central geographical resources repository. Resources must be
lazily activated. Is IService interface good enough to be a kind of
lightweight descriptor for the data source? Seems, yes, but if to switch on
all logs, when UDIG is opening, a lot of warnings appear like
WARNING: projection (.prj) for shapefile:
file:/D:/eclipse/kuviogis-workspace/db2shp/2006_09_13/18_03_58/MHGIS_GISA1_K
UVIO.shp is not available
for shapefiles contained in Catalog. Seems something tries to load data
source to create label, whatever, not lazy now.. (debugging has shown that
CatalogPlugin.title() methods causes loading resources in Catalog during
opening the application when there is no opened editors..
8) Copy/paste
If this is not ready and buggy, I would like to hide that functionality
until it starts to work properly. I copied layer in Layers view and pasted
to another map. The application starts to be crazy, rendering has broken,
etc.
Refactor all places where copying/pasting is available, test, fix or hide
for the time being.
9) what else... Friends! it is not a complain but an attempt to clear Augean
stables, make a Plan.
That is a critical for the following development. I am glad to discuss
problems and collaborate to repair them, concentrate on really important
thing and the day will come when we will be able to implement custom
functionality in our projects, not endless fighting with basics..
Regards,
Vitali Diatchkov.
Arbonaut Oy,
Finland
_______________________________________________
User-friendly Desktop Internet GIS (uDig)
http://udig.refractions.net
http://lists.refractions.net/mailman/listinfo/udig-devel