|
|
Home » U++ Library support » Look and Chameleon Technology » Styles and Widgets
Styles and Widgets [message #8495] |
Wed, 14 March 2007 12:15 |
WebChaot
Messages: 53 Registered: September 2006 Location: Austria, Vienna
|
Member |
|
|
Hi all!
I made some new components and changes in a previous version (610 dev 1). This week my collegue downloaded the last release (2007) and I saw, that some changes are done on chameleon technology.
1. I have to paint some widgets by code. Is there any example, how to do this in the new way (Style().Write() ??)? I'm very interested in an easy way to use the standard upp widgets and only draw them myself. Especially combined widgets (for example a dropdown-box, where I have the box AND the dropdown-button - or a listbox, where I also have to draw the scrollbar).
I dont want to reinvent the wheel and make all widgets new with a specific paint-method. I want to use the standard widgets and style them in an easy way.
2. I didn't look in deep of new release. But what I missed in older version is a style for StatusBar and something for "CoolBar" (the docking panel where windows toolbars are placed). I know, there is still no CoolBar and no Docking ability in upp for now. But maybe the style could be included and for example be assigned on a dummy StaticRect or something else.
3. I put also my third question here, but its not really a chameleon topic: I want create widgets at runtime. Creation is not the problem (I think) - but how to iterate over all widgets of a window for example? How to detect its class? Is that possible? The reason is simple: I have to collect input data of all edit fields - but because they are created by code I need a solution to iterate over all fields on a window.
Finally I have a question about HTTP and HTTPS - but this one I append on the right thread ...
PS: We are using upp now for some month - and we are still satisfied. We are able to do all the stuff we need - great work!
Thanks in advance,
WebChaot.
|
|
|
Re: Styles and Widgets [message #8498 is a reply to message #8495] |
Wed, 14 March 2007 14:54 |
|
mirek
Messages: 14039 Registered: November 2005
|
Ultimate Member |
|
|
WebChaot wrote on Wed, 14 March 2007 07:15 | Hi all!
I made some new components and changes in a previous version (610 dev 1). This week my collegue downloaded the last release (2007) and I saw, that some changes are done on chameleon technology.
1. I have to paint some widgets by code. Is there any example, how to do this in the new way (Style().Write() ??)?
|
It is not really too much different.
There were two reason to changes things:
"index based" method of working with style became to be overly complicated, therefore we changed indicies for structures. Usually, those structures are pretty easily understandable.
If you had any code based on indicies, conversion to structures should be pretty straightforward, usually there is one structure data fiels per former index...
While being at it, structures also provide a good way how to allow per-thread customization. So you can either assign a reference to the style for individual widget, or you can use "Write" to change the style for the whole class.
Quote: |
2. I didn't look in deep of new release. But what I missed in older version is a style for StatusBar and something for "CoolBar" (the docking panel where windows toolbars are placed). I know, there is still no CoolBar and no Docking ability in upp for now. But maybe the style could be included and for example be assigned on a dummy StaticRect or something else.
|
OK.
Quote: |
3. I put also my third question here, but its not really a chameleon topic: I want create widgets at runtime. Creation is not the problem (I think) - but how to iterate over all widgets of a window for example?
|
Ctrl::GetFirstChild, Ctrl::GetNext
Quote: |
How to detect its class?
|
RTTI if you really need to.
Quote: |
The reason is simple: I have to collect input data of all edit fields - but because they are created by code I need a solution to iterate over all fields on a window.
|
Ah. Well, there are better solution to this. See DynamicDlg example. In nutshell, you can create widgets in container, e.g. ArrayMap. GUI never owns widgets, therefore you can still use them in the dialog, but use container to access individual editors.
Mirek
|
|
|
Re: Styles and Widgets [message #8519 is a reply to message #8495] |
Thu, 15 March 2007 09:14 |
WebChaot
Messages: 53 Registered: September 2006 Location: Austria, Vienna
|
Member |
|
|
Hi Mirek!
>>> It is not really too much different.
OK. Then I did not realize how styles work. I'm not a very experienced upp-programmer (but have programming background in other languages) - so I have to learn from sources and examples. That worked quite good until now. But I do not understand the styles example
In past I created some classes based on upp standard widgets and do my own paint-methods. Thats boring, because after each update I have to update all these classes.
With styles - I guess - I can use standard widgets and only assign new paint-methods to that widgets on application startup (without writing own classes). Thats the theory. In practice I do not understand, how ChEllipse, EllipseLook(), MyLookFn() and INITBLOCK work together. Maybe there is another piece of code somewhere in this forum or in any other project?
What I need to do is to make an office 2003 or 2007 style to all widgets, if possible. Will I have to create each widget new and place my code in each paint-method or would there be a better way?
Would be happy about every information about this topic,
WebChaot.
PS: I'm not sure, if I can solve this problem. But if I finished my office-like widgets (NavigationBar, movable Toolbars, ...), I would share them here in forum, if someone would need them too.
|
|
|
Re: Styles and Widgets [message #8520 is a reply to message #8519] |
Thu, 15 March 2007 12:11 |
|
mirek
Messages: 14039 Registered: November 2005
|
Ultimate Member |
|
|
WebChaot wrote on Thu, 15 March 2007 04:14 | Hi Mirek!
>>> It is not really too much different.
OK. Then I did not realize how styles work. I'm not a very experienced upp-programmer (but have programming background in other languages) - so I have to learn from sources and examples. That worked quite good until now. But I do not understand the styles example
In past I created some classes based on upp standard widgets and do my own paint-methods. Thats boring, because after each update I have to update all these classes.
With styles - I guess - I can use standard widgets and only assign new paint-methods to that widgets on application startup (without writing own classes). Thats the theory. In practice I do not understand, how ChEllipse, EllipseLook(), MyLookFn() and INITBLOCK work together. Maybe there is another piece of code somewhere in this forum or in any other project?
What I need to do is to make an office 2003 or 2007 style to all widgets, if possible. Will I have to create each widget new and place my code in each paint-method or would there be a better way?
Would be happy about every information about this topic,
WebChaot.
PS: I'm not sure, if I can solve this problem. But if I finished my office-like widgets (NavigationBar, movable Toolbars, ...), I would share them here in forum, if someone would need them too.
|
Ah, now I see the problem. I thought you have been using first chameleon iteration (but you did it by overriding Paint).
Well, the important thing to understand about chameleon is that it is using "Value" to represent visual appearance.
Each widget is usually represented by one or more rectangular areas. Each such area has associated Value, or array of Values to define its appearance (array because area can have more states).
E.g. button has single rectangle that covers it all. It has several Values for normal, pushed etc states. Button::Paint chooses Value based on current state and calls ChPaint to paint the area of button (note that button text (and/or image etc..) is not a part of this process, it is applied later).
Now what gets painted depend on the Value. Value can contain anything and Chameleon allows the client code to register "value painter" based on its Value. Chameleon also supports two basic types - Image and Color - than can be used to paint area.
Now Image - there is important to know, that how Image is applied to area is ruled by positions of two reference points (HotSpot and 2ndSpot) that can be designed in Icon designer. Basically, you use them do designate which areas have to be stretched.
This way appearance of area is parametrized. Of course, more parameters than that are needed to customize widgets; all are stored in those Styles.
Mirek
|
|
|
|
|
Re: Styles and Widgets [message #9121 is a reply to message #8498] |
Wed, 18 April 2007 11:24 |
WebChaot
Messages: 53 Registered: September 2006 Location: Austria, Vienna
|
Member |
|
|
Hi Mirek!
>>> Ah. Well, there are better solution to this. See DynamicDlg example. In nutshell, you can create widgets in container, e.g. ArrayMap. GUI never owns widgets, therefore you can still use them in the dialog, but use container to access individual editors.
Project grows every day - I think, you will have a new demo application for your homepage in about one month. I understand DynamicDlg now and it works fine. But two more questions about this topic:
1. I make "containers" (=ArrayMaps) for each control type (I know, it would be possible to store all ctrls in one arraymap). That works fine. But I need a similar solution for menu items and toolbuttons. At the moment I store all related data in an array and on every change in menu I recreate the whole menu from that array: menu.Clear() and the step through the array and add each item (and this recursive). Is there an easier way - e.g. to store the menu items in an arraymap and delete them via .find() method directly (but what with clients)? Concerning this topic here is the second question:
2. Menus are build in tree structure. I would need that too for my gui-elements. I have to know, which elements are on which parent (e.g. nested staticrects, ...). In ArrayMap I can only store an "Id" and the control. Nice to find and get value or delete. But for my application I need a way to get all child values of the edit fields on an specific parent element.
For exampe: I have 2 Frames, a splitter - on right frame 2 nested staticrects - and in the inner one two edit fields. I would need now a function with the parameter "parent" which reads all edit fields which are on these parent at runtime. Should also work with parent of the second staticrect and with whole window (which reads all edit fields of the window).
I hope, you know what I mean.
How I would do that now:
Make structs for each edit element - with "ParentId" and the type of element.
For each of that structs an arraymap where I can find the elements via "Id" and then step recursive over the array and look for children ("ParentId" = "Id"). But this sounds a little bit exhausting to me, because I have to read the whole array many times recursively to parse the structure. Same when deleting some element and have to do that with all children before.
I'm sure, there is a better solution, but I dont know it yet
Would be nice, if you have some ideas about this topic.
Or in short form: What I need to do is completely create a window dynamically by code (via xml-like file). It must be possible to remove some elements (with all children on this element - also menu item) and then read all values of edit elements on an specific parent (from topwindow down to last level).
All the examples contains add() - but didn'n find any remove or step over all elements example
Thanks in advance,
WebChaot.
|
|
|
|
|
Re: Styles and Widgets [message #9126 is a reply to message #9121] |
Wed, 18 April 2007 12:24 |
mrjt
Messages: 705 Registered: March 2007 Location: London
|
Contributor |
|
|
It sounds to me like you could do this using something as simple as:
Vector<Value> GetAllData(Ctrl *parent) throw (ValidationException)
{
Vector<Value> data;
for (Ctrl *c = parent->GetFirstChild(); c; c->GetNext()) {
if (c->GetFirstChild())
data.Append(GetAllData(c));
else {
Value v = c->GetData();
if (v.IsError())
throw ValidationException(c);
else if (!v.IsVoid) // Prevents empty values
data.Add(v);
}
}
return data;
}
I just typed that in so no guarantees it will actually work (and the use of exceptions is slightly dubious) but I think the principle is correct. AFAIK only input ctrls ever return non-empty Values from GetData(). See TopWindow::Serialize() for another example (though not heirarchical).
[Updated on: Wed, 18 April 2007 12:28] Report message to a moderator
|
|
|
Goto Forum:
Current Time: Fri Sep 20 18:26:07 CEST 2024
Total time taken to generate the page: 0.03566 seconds
|
|
|