Home » Developing U++ » UppHub » Docking package (plus examples)
| Docking package (plus examples) [message #13581] |
Tue, 15 January 2008 14:24  |
mrjt
Messages: 705 Registered: March 2007 Location: London
|
Contributor |
|
|
This is a window docking framework designed to give the end-user and developer complete control over their workspace by floating/docking/hiding windows. The aim is to emulate and improve upon the a combination feature set offered by Qt and Visual Studio, while retaining Upp style and ease-or-use for the developer.
Currently the package is stable, almost feature complete and quite polished. There have been no major bugs for a while now and I use it myself in a large and complex application.
Source code and examples can be found in this thread (work back from the end until you find it) or the bazaar section of the SVN. It is also now distributed in Upp releases, under bazaar, but that may not be up-to-date. An example win32 exe is attached.
Full feature list:
- API documentaion included
- X11 support with native windows
- Animated Autohide
- Animated Docking/Undocking
- Full Serialization support
- Tabbed windows with nesting (one tabbed window inside another)
- Support for popup docking hints (sort of like Visual Studio). Inherit from PopUpDockWindow.
- Fully themed tabs (includes grouping/tab arrangemen with CTRL key)
- Vertical or Horizontal docking handles, chameleonized
- Transparent docking hints (when dragging over tabs)
- The ability for the user (or API) to create/save/load layouts)
- Window grouping support (organise windows by user or developer designated group)
- A window manager that allows the user to manage (including create/delete) groups and layouts (see screenshot)
- Predefined menus that can be added directly to an application
- Many configurable options
last update SVN Revision 268.
James
[Updated on: Fri, 23 May 2008 18:24] Report message to a moderator
|
|
|
|
|
|
| Re: Docking / DockTest packages [message #13587 is a reply to message #13585] |
Tue, 15 January 2008 20:10   |
cbpporter
Messages: 1428 Registered: September 2007
|
Ultimate Contributor |
|
|
Hi!
Very nice indeed. And really useful.
I tested it a little under Vista, and I managed to break it a little. While moving around the tabs, I docked one on the top, near another one on the top, and it disappeared. Further tries to dock something on top behaved as if there where tree panels, one of them invisible.
Apart from this little bug which I couldn't reproduce yet, it all works great. There are some aesthetic problems, like those counter intuitive tab placements (but AFAIK you said you are going to use QuickTabs in the future), and the text is way to small and not really centered.
But these details are quite trivial and I hope in no time we'll have full docking support, both as you implemented it and for menus and toolbars also.
|
|
|
|
| Re: Docking / DockTest packages [message #13595 is a reply to message #13585] |
Wed, 16 January 2008 11:50   |
mrjt
Messages: 705 Registered: March 2007 Location: London
|
Contributor |
|
|
| forlano | I wonder if it is possible to align the tabs vertically? I mean the text is horizontal but the tabs are on the left o right side of the ctrl.
|
| cbpporter | There are some aesthetic problems, like those counter intuitive tab placements (but AFAIK you said you are going to use QuickTabs in the future), and the text is way to small and not really centered.
|
Tabs will indeed be improved, I haven't spent any development time on them recently since I've been waiting for an official tab-bar implementation. I'll hopefully add various tab alignment options once this is done. All the other visual elements are thoughly chameleonized and can be tinkered with very easily.
| cbpporter | Apart from this little bug which I couldn't reproduce yet, it all works great.
|
It doesn't sound like a Vista bug, but is very similar to a bug I'm aware of with the animation system. As you say it's difficult to reproduce so I've had problems fixing it even though I know what the root cause is.
Thanks for your comments, I'm glad you like it. I've already started thinking about the toolbars, the principles are the same but the implementation if quite different. The trick is finding a clever and cohesive way of tying it all together, I believe Qt just adds it all to every main window by default and you have to disable it with compiler flags - a very ugly solution.
Cheers,
James
[Updated on: Wed, 16 January 2008 11:55] Report message to a moderator
|
|
|
|
|
|
| Re: Docking / DockTest packages [message #13598 is a reply to message #13596] |
Wed, 16 January 2008 12:44   |
mrjt
Messages: 705 Registered: March 2007 Location: London
|
Contributor |
|
|
My best idea so far is something like this:
1- A ToolBar is linked to a ctrl (the only one that it can be attached to), and then added as a frame normally.
2- Dragging the handle on the ToolBar tears it off and it is displayed as some sort of draggable popup (oddly, even Microsoft uses popups for this and I've already got all the necessary code).
3- When being dragged you have two options:
- if dragged to an edge of the owning ctrl you can add it as a new frame ( this does stacking)
- if dragged over another toolbar it can be added to it as a child
This seems to solve most of the obvious problems, although I'm sure it won't be as easy as it sounds (frame ordering could be a problem, as will containing toolbars in other toolbars).
I've never (knowingly) seen ToolKit Pro, can you give me a rough idea what you mean?
[Updated on: Wed, 16 January 2008 12:48] Report message to a moderator
|
|
|
|
| Re: Docking / DockTest packages [message #13600 is a reply to message #13598] |
Wed, 16 January 2008 14:51   |
cbpporter
Messages: 1428 Registered: September 2007
|
Ultimate Contributor |
|
|
| Quote: | I've never (knowingly) seen ToolKit Pro, can you give me a rough idea what you mean?
|
For some strange reason, Print Screen doesn't work when dragging those windows, so I can't paste a screenshot. But basically, when dragging a window over a component, over every border where a dock is possible, a little icon appears. When you move the cursor close to the icon, the animation kicks in and shows where the new position will be. This solves the problem of trying to position something somewhere and getting a lot of jumpy animations and stuff, but is a little more work for the user, because he has to bring the window near the icon, not near his desired position.
[Updated on: Wed, 16 January 2008 14:54] Report message to a moderator
|
|
|
|
|
|
| Re: Docking / DockTest packages [message #13602 is a reply to message #13601] |
Wed, 16 January 2008 16:25   |
chickenk
Messages: 171 Registered: May 2007 Location: Grenoble, France
|
Experienced Member |
|
|
Here are screenshots from an app developed in my company, using ToolKitPro:
1. Start dragging the "Build log" window. We can see the hints appearing on the center of the docked window (the mouse cursor is in the docked window area so it is active) and on the borders of all its containers (in this case, the main container only).
Lionel
[Updated on: Wed, 16 January 2008 16:33] Report message to a moderator
|
|
|
|
|
|
|
|
| Re: Docking / DockTest packages [message #13607 is a reply to message #13605] |
Wed, 16 January 2008 18:51   |
mrjt
Messages: 705 Registered: March 2007 Location: London
|
Contributor |
|
|
Thanks. The problem with reproducing that look is that AFAIK the irregularly shaped and partially transparent popups/overlays are not possible with Upp at the moment. You can get close on Windows, but it causes all sorts of drawing problems, and IMO in V. Studio it doesn't work very well either. I believe it may not be possible at all on Linux, but I haven't verified this myself.
Having said that, it is possible to get something aproximating this. I've attached a quick demo, its got bugs and you'll have to excuse my icons as I'm shit at drawing . Note that this is implemented purely as inheritance, so both options (DnD/Popups) are available.
[Updated on: Wed, 09 April 2008 16:30] Report message to a moderator
|
|
|
|
|
|
|
|
| Re: Docking / DockTest packages [message #13612 is a reply to message #13609] |
Thu, 17 January 2008 11:04   |
mrjt
Messages: 705 Registered: March 2007 Location: London
|
Contributor |
|
|
| forlano wrote on Wed, 16 January 2008 19:36 | I've seen that feature in your code in the past, then disappeared in the next releases. Is there some reason?
|
I ended up focusing mainly on the drag-drop approach since nobody said they wanted it done this way, and when I had to rewrite it to add X11 support (that was a complete bitch!) I didn't bother with it. It was quick to add it back and I'd always planned on having different interfaces - in fact I've got a couple of less orthodox ones I'll try out once I've fixed some other things.
| Quote: | I hope it makes it into CtrlLib or some other "official" package. But I laso like Oblivion's docker. He's looks a little better (even though the tabs could be smaller), but your's behaves a little bit nicer.
|
The code comes in the bazaar section of the SVN, and I hope that once it's more polished it will be added the the officially numbered distributions (probably as a seperate package like GridCrl), but that's up to the U++ team.
Appearance-wise you could make it look identical to Oblivion's version (appart from the Tabs) just by changing the fontsize and handle images in the DockableCtrl Cham. style, and eventually I'll have to have more styles available. I personally quite like it with the much smaller handles.
James
[Updated on: Thu, 17 January 2008 11:52] Report message to a moderator
|
|
|
|
| Re: Docking / DockTest packages [message #13617 is a reply to message #13612] |
Thu, 17 January 2008 16:36   |
 |
mirek
Messages: 14290 Registered: November 2005
|
Ultimate Member |
|
|
| mrjt wrote on Thu, 17 January 2008 05:04 |
The code comes in the bazaar section of the SVN, and I hope that once it's more polished it will be added the the officially numbered distributions (probably as a seperate package like GridCrl), but that's up to the U++ team.
|
Actually, Bazaar was already shipped with last "dev", also somewhat hidden (no assemblies).
It is actually interesting question about integrating it:
- first, should it be placed as another nest in the MyApps assembly ("c:\MyApps;c:\upp\bazaar;c:\upp\uppsrc")?
- then, perhaps it should be divided into Bazaar and BazaarExamples, and BazaarExamples assembly precreated.
- also, I think it would be a good idea to write some description of package that would clearly designated it as Bazaar part, and with info about author(s). "Bazaar: Docking, by James Thomas"
Mirek
|
|
|
|
|
|
|
|
| Re: Docking / DockTest packages [message #13694 is a reply to message #13690] |
Tue, 22 January 2008 21:06   |
Oblivion
Messages: 1266 Registered: August 2007
|
Senior Contributor |
|
|
James, I'm going to upload the new version of DockCtrl to the SVN repository this week end. In case you need it, I Hope you'll find the "ripped" TabInterface (from Quicktabs) class useful for your version. It now draws left/right tabs (of course, with your hint for chameleon, thank you for it . I'm currently working on scrollbar of left/right tabs). As far as I know your code, it should be very easy to convert into it (probably only 4 or 5 lines of declaration, e.g. should change...)
Regards.
Github page: https://github.com/ismail-yilmaz
Bobcat the terminal emulator: https://github.com/ismail-yilmaz/Bobcat
[Updated on: Tue, 22 January 2008 21:12] Report message to a moderator
|
|
|
|
| Re: Docking / DockTest packages [message #13746 is a reply to message #13694] |
Fri, 25 January 2008 16:46   |
Oblivion
Messages: 1266 Registered: August 2007
|
Senior Contributor |
|
|
James, I'm uploading the TabInterface Class source code with a basic example. It is now able to draw all four positions (left/right/top/bottom) and has scrollbar on all sides...
Also, as in the original Quicktabs, it supports icons, closebuttons, event handling, etc... I ripped out the unneeded part (file load/save and grouping) from the code, but it is quite easy if you want to put them back in (actually, If Daniel permits, I can add these changes to the current Quicktabs in the SVN too). It draws using chameleon so it is easy to skinnize...
I Hope You'll find it useful if you are going to use it in your Docking.
Regards...
Github page: https://github.com/ismail-yilmaz
Bobcat the terminal emulator: https://github.com/ismail-yilmaz/Bobcat
[Updated on: Fri, 25 January 2008 16:47] Report message to a moderator
|
|
|
|
| Re: Docking / DockTest packages [message #13775 is a reply to message #13746] |
Sat, 26 January 2008 13:56   |
|
|
| Oblivion wrote on Fri, 25 January 2008 10:46 | James, I'm uploading the TabInterface Class source code with a basic example. It is now able to draw all four positions (left/right/top/bottom) and has scrollbar on all sides...
Also, as in the original Quicktabs, it supports icons, closebuttons, event handling, etc... I ripped out the unneeded part (file load/save and grouping) from the code, but it is quite easy if you want to put them back in (actually, If Daniel permits, I can add these changes to the current Quicktabs in the SVN too). It draws using chameleon so it is easy to skinnize...
I Hope You'll find it useful if you are going to use it in your Docking.
|
I started to implement similar functionality in QuickTabs. You can see it in SVN bazaar from some time. However I think we could stay with your version as it seems to be completed. I only wonder if you could avoid somehow using IsVert() everywhere. I tried to "fix" Size an Point by swaping cx with cy and x with y where necessary. But it's up to you. IsVert() is not bad, but you must write a little bit more of code here and there. I also
wonder if TabInterface is a correct name. Couldn't we stay with QuickTabs?
My vision is to have one tabs system. So you'd have to integrate your code with current quicktabs code and restore grouping (frankly it can be a derived class if you want base tabs code to be clean).
Remember also that tabs in theide is a frame for editor. I mean editor is inside a frame (FieldFrame exactely) which belogns to QuickTabs. That's why you could see r.xxx += 2. I saw you commented this. That's ok. But don't forget to solve this problem. Of course proper solution may be modifing theide code.
To finish this post: Please update quicktabs code. I'll be glad to see all this changes you've done in the main tree. Of course I'll keep my eye on this and help you if necessary.
PS: Default theming for tabs should be system theming like in TabCtrl.
|
|
|
|
| Re: Docking / DockTest packages [message #13782 is a reply to message #13775] |
Sat, 26 January 2008 15:25   |
Oblivion
Messages: 1266 Registered: August 2007
|
Senior Contributor |
|
|
| Quote: |
I only wonder if you could avoid somehow using IsVert() everywhere.
|
Well, actually, as I stated before somewhere else, I first code then plan. It is hastily coded. I know It's not the best way of coding, but it gives some idea as to what not to do The "TabInterface" is a nested sub-class which is a part of DockCtrl (which uses only bottom tabbing -- so it has no IsVert() and neither it has std. tabctrl theming), so it is not intended to be a generic tab class or a Quicktabs replacement in the first place (it was just a sort of experiment); that's why I commented out those lines. And of course it is possible to remove all the silly IsVert(). I will find a better solution. Hopefully, this week.
| Quote: |
I also
wonder if TabInterface is a correct name. Couldn't we stay with QuickTabs?
|
Well, the coder of Quicktabs is you, so It's up to you to decide. Imo, Quicktabs is better too (since TabInterface is a DockCtrl sub-class )
And Thank you for your permission.
Regards.
Github page: https://github.com/ismail-yilmaz
Bobcat the terminal emulator: https://github.com/ismail-yilmaz/Bobcat
[Updated on: Sat, 26 January 2008 15:47] Report message to a moderator
|
|
|
|
|
|
| Re: Docking / DockTest packages [message #13806 is a reply to message #13799] |
Mon, 28 January 2008 17:22   |
|
|
[quote title=mrjt wrote on Mon, 28 January 2008 04:44]| Quote: |
I have actually already solved all of these problems, but my code was horrible. I think the best control will actually be a merge between all three code bases, and I'm going to have a quick go at it this morning.
|
That's great, but how to merge it? Oblivion is probably trying to modify quicktabs now as I gave him permission. I think we should wait for oblivion first then you could "fix" things you think you have better implemented/designed (after some discuss of course). Having this done we could finally have one codebase in svn repo.
| Quote: |
Wouldn't the correct solution to this be to add the inner frame seperately? As you can see from the SVN example, when you have multiple TabFrames it looks horrible to have the frame drawn by the TabBar control.
|
I know that. Separate frame seems to be the best solution.
|
|
|
|
| Re: Docking / DockTest packages [message #13808 is a reply to message #13806] |
Mon, 28 January 2008 18:52   |
mrjt
Messages: 705 Registered: March 2007 Location: London
|
Contributor |
|
|
Fair enough. I've attached my latest version, please use any of the code if it helps (the rotated style stuff may be useful). File icons don't work properly, and there is a bug in the jump scrolling (in SetCursor), but otherwise it works quite well.
Edir: Fixed both of the above now. I hate leaving buggy code
[Updated on: Tue, 29 January 2008 11:22] Report message to a moderator
|
|
|
|
|
|
| Re: Docking / DockTest packages [message #14468 is a reply to message #14137] |
Wed, 27 February 2008 01:03   |
Oblivion
Messages: 1266 Registered: August 2007
|
Senior Contributor |
|
|
hi James,
Last night I've compiled your Docking package on Linux (Kubuntu and Pardus). It seems that your current code does not posit the window correctly when it is dragged (so was mine). But I've managed to fix that issue very easily, so I would like to share my findings with you (for we are "unofficially" supporting each other ). the trick lies in two places:
1. Add DockWindow::NoCenter() to the constructor of your dockable window's base class.
2. Open() the dockable window (or was it a container?) with no-owner.
This second one may not be valid for your code or brake something, I'm not sure about that. But I saw that you open the window by passing the "this" pointer to the methods(e.g, Open(this)). In case the second step fails, try to find a way to use it as such, I can confirm that It works perfectly
And another bug in you code (the latest one with transparent tab) I've encountered is regarding to your autohide code. Autohide a dock and try the autohide button or menu item when it is shown (in autohide mode). The framework will crash.
Hope these will help you.
Github page: https://github.com/ismail-yilmaz
Bobcat the terminal emulator: https://github.com/ismail-yilmaz/Bobcat
[Updated on: Wed, 27 February 2008 03:18] Report message to a moderator
|
|
|
|
| Re: Docking / DockTest packages [message #14480 is a reply to message #14468] |
Wed, 27 February 2008 10:25   |
mrjt
Messages: 705 Registered: March 2007 Location: London
|
Contributor |
|
|
Hmm. It used to work, but then I foolishly didn't test the current SVN version on Linux before uploading it.
| Oblivion wrote on Wed, 27 February 2008 00:03 | 1. Add DockWindow::NoCenter() to the constructor of your dockable window's base class.
2. Open() the dockable window (or was it a container?) with no-owner.
|
Thanks! I've been trying to avoid the Window auto-centering for ages, I can't believed I missed NoCenter!
| Quote: | And another bug in you code (the latest one with transparent tab) I've encountered is regarding to your autohide code. Autohide a dock and try the autohide button or menu item when it is shown (in autohide mode). The framework will crash.
|
Fixed.
Cheers!
[Updated on: Wed, 27 February 2008 10:27] Report message to a moderator
|
|
|
|
|
|
|
|
| Re: Docking / DockTest packages [message #14543 is a reply to message #14541] |
Sat, 01 March 2008 02:15   |
mrjt
Messages: 705 Registered: March 2007 Location: London
|
Contributor |
|
|
Thanks. I found the same one myself after uploading it.
I know exactly what the problem is, it's caused by trying to remove the nested windows in the wrong order (before re-layout). Might take me a little while to fix, it's a bit of a tricky one.
I knew I'd jinxed it
[Updated on: Sat, 01 March 2008 02:16] Report message to a moderator
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Goto Forum:
Current Time: Tue Apr 28 13:21:21 GMT+2 2026
Total time taken to generate the page: 0.01843 seconds
|