← Back to team overview

syncany-team team mailing list archive

GUI Feedback


Hello Vincent,

First of all: *Merry Christmas!!*

I'm answering here so everyone can take part in this discussion. I'll give
a lot of feedback and I'm hoping that this will help you/us for the GUI.
It's not a criticism, it's a way to make a good product :-) You're doing a
great job and I love what you've done so far. Also, I think the
websocket+SWT stuff really was a good decision!

@Everyone else: I'm referring to Vincent's work on the GUI here:

I actually fiddled a bit with the code and put some of my suggestions into
code changes. You don't have to take all of these changes, but its always
easier (for me) to have a little code to express yourself :-) -- Here's my
branch: https://github.com/binwiederhier/syncany/tree/gui - To give you an
impression what this looks like on Linux right now, here are some
screenshots: imgur.com/fUH6h1g,AcSuezQ,V2cJxHV,wEbdnT7,hzxqRYt  -- I made
the window a little bigger, that's why it looks a bit weird right now...

Now to my feedback!

*1. Executing 1.1.Executing with Gradle*: Running gradle runGui fails with
the following message. Any ideas? Running the printed command from
("--info") from the command line works perfectly, just running it from
gradle doesnt work ...

    :syncany-plugins:syncany-plugin-rest:processResources UP-TO-DATE
    Error: Could not find or load main class
    :syncany-gui:runGui FAILED

    FAILURE: Build failed with an exception.

    * What went wrong:
    Execution failed for task ':syncany-gui:runGui'.
    > Process 'command '/usr/lib/jvm/java-7-openjdk-amd64/bin/java''
finished with non-zero exit value 1

*1.2. Eclipse execution*: It works from Eclipse, but I sometimes get the
following error in the "new Shell()" line: "Exception in thread "main"
org.eclipse.swt.SWTException: Invalid thread access"

*3. GUI + Daemon*
*3.1. **GUI<->daemon interaction:* When the GUI is started, do you think it
should try to start the daemon if it is not running? What if the GUI is
exited -- the daemon shouldn't stop then, right? Spitballing: Maybe, if the
GUI has started the daemon (it was not running), it should also stop it;
but if the daemon was running before, it should leave it running. Does that
make sense?
*3.3. Storing settings: *"properties.txt": You're storing the watched
folders in ~/.syncany/properties.txt; it's probably easier to do it like
the the lib is storing the config (ConfigTO, RepoTO, etc.)
*3.4. SWT dialogs: *You always do a shell.dispose(); when switching to a
new dialog. Is this best practice? Because it creates a flickering on Linux
when showing the new dialog. Also, if the old dialog was moved, the new one
always appears in the middle of the screen. I know that's kind of a big
change, but is it possible to switch the panels inside a dialog instead of
the dialog itself? Or is that not best practice with SWT?
*3.5. PluginGui -> Plugin panels:* I don't quite understand the rationale
behind the PluginGui class? It's never used, right? If you want to fill the
drop down for the available plugins, you could do that with "Reflections"
class and the method getSubTypesOf(PluginPanel) or something like that.
*3.6. Gradle module "syncany-plugins-gui"*: Is there a reason for this
module? Couldn't you just move it to the main gui package? Anything I'm not
*3.7. E-mail dialog and e-mail in general: *The mockup I sent you included
the e-mail dialog and you implemented it like that. However, I don't see
that this should be part of the "default" selection. In fact, I don't think
there is a good default storage selection right now. Any ideas? I'd say the
only option right now is to simply show the drop down list of options.
That's why I think the mockups are helpful, because we can discuss before
*3.8. "NewLocalFolders" dialog:* Right now we only support one folder per
repository (much like Dropbox), so there is no need for this dialog, right?
*3.9. Panel graphic (wizard left side):* If you want, you can use the panel
graphic I used back in 2011:
*3.10. Connect panel: *The "connect" panel should/must also allow users to
enter the full connection details, because you don't always have the same
conneciton details and want to share them with others, e.g. an FTP
syncany://-link includes the username and password of a user; if two users
have different usernames/passwords, it'd be stupid if they couldn't connect
to a repo.

*4. Tray Icon*
*4.1. Tray on Linux Mint: *The tray icon (yes, I'm obsessed!) on Linux
looks good only if it's not resized, so getImage() not getResizedImage()
*4.2. Tray menu updates: *I can see that there is a method updateTray(),
but its never used. I tried to call updateTray(update.getData()); and it
worked. I fixed it in my branch.

*5. Packages and Files*
*5.1. Package dependencies: *There are many packages with just 1-2 classes;
As I am not a fan of package dependencies, I think you should minimize them
by putting things together that belong together.
*5.2. syncany-util*: The syncany-util gradle sub project was a good idea.
However, I think it should only contain stuff that's actually needed by
more than just one module. An example would be the e-mail validation.
That's clearly just a GUI thing. As soon as it's needed in more than one
module, we can put it in syncany-util. Or is there a particular reason you
were putting it there?
*5.3. OS.java: *we both have operating system detection classes. We should
consolidate them. Mine is called EnvironmentUtil
*5.4. Leftover resources, classes and methods: * You have a lot of files
checked in that are referenced nowhere. Images, classes, methods. These
should be cleaned up.
*5.5. Code style: *Our coding styles are quite different. You'll see that I
moved stuff around a lot without changing the actual code. If possible,
it'd be great if you could try to adjust your style a bit to the rest of
the project. I know that's probably the hardest part, but it makes the
project look cleaner if the code looks similar in all classes. For some
things, you can use Ctrl+F.

I have more comments, but I think that's already a lot :)
And I should be getting to my parents' house anyway -- it's Christmas Eve
after all ... :-D

All the best,


Follow ups