← Back to team overview

syncany-team team mailing list archive

Re: GUI Feedback


On Tue, Dec 24, 2013 at 3:57 PM, Philipp Heckel <philipp.heckel@xxxxxxxxx>wrote:

> Hello Vincent,
> First of all: *Merry Christmas!!*

Merry christmas too !!

> 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!

thx, I also think SWT is a good swing alternative

> @Everyone else: I'm referring to Vincent's work on the GUI here:
> https://github.com/vwiencek/syncany
> 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...

still struggling with SWT layouts .... but no reasons I can't fix it

> 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
>     :syncany-plugins:syncany-plugin-rest:classes
>     :syncany-plugins:syncany-plugin-rest:jar
>     :syncany-gui:runGui
>     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

... might be linked to SWT gui thread. Just like swing, SWT uses a
dedicated ui thread to update UI independently of your business logic. But
this works differently between osx/windows/linux. I've managed to make it
work under mac osx through specific jam arg.
I've installed virtual box with ubuntu to test it under linux.

> *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"

It sometimes happens under windows when an other instance of the
application is still running.
More globally I need to figure out best practices to work with Shell and
Dialog .....
I'm not as familiar with SWT than I am with swing, I still need to discover
best practices.

> *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?

*remarks :*
- isn't it dangerous to run daemon on pure background ? we could imagine an
other tray icon just indicating "sync any daemon running" + menu command to
launch gui.
- but sure if GUI starts dameon, then it should stop it / if daemon is
already launched, gui shouldn't terminate it, or at least ask user to ?

>  *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.)

*remark :*
- aren't gui application parameters linked to the application and not to
the repository ? example : proxy settings if client is behind a proxy ?
- instead of property files, we can imagine dedicated h2 database with
cyphered parameters (in order to hide proxy passwords for example).

>  *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?

Yes, flickering to on windows :) Need to find best practices to do it.
I'll probably be ending replacing "items" in already built dialogs.

> *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.

Ghost class ==> to be deleted

>  *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
> seeing?

Yes sadly, the idea is the following to get clean design :
- syncany-gui doesn't down anything about syncany-plugin-xxx and
- but to be able to query plugin panels, and get dedicated
arguments/parameters, we need to have plugin panels implement a specific
interface, contained in syncany-plugin-qui.
- then syncany-gui and syncany-plugin-xxx-gui only depend on

It produces many projects with few files.... we could rethink this design
of course.

> *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 implementing...


> *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:
> https://github.com/binwiederhier/syncany/tree/d8fa30f57e37355af8f70f0c2eda510ec43cbe74/syncany-assets/artwork/rendered/wizard


> *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.

ok great, should then reuse plugin panels

> *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()

true. Linuw specific item:
- idea would be to have already resized clean png

> *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.

just trying "live update" of tray menu while displayed

> *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.

ok, see above, I will rethink projects organisation

>  *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?

ok great.
Idea : we should have a "passwordStrenghChecker" with all password
constraints in util project no ?

>  *5.3. OS.java: *we both have operating system detection classes. We
> should consolidate them. Mine is called EnvironmentUtil

ok sure,

> *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,
> Philipp
> <http://pgp.mit.edu>
> --
> Mailing list: https://launchpad.net/~syncany-team
> Post to     : syncany-team@xxxxxxxxxxxxxxxxxxx
> Unsubscribe : https://launchpad.net/~syncany-team
> More help   : https://help.launchpad.net/ListHelp

Vincent Wiencek

Follow ups