[Bf-taskforce25] RNA groups proposal, first alpha + patch

vekoon vekoon at gmail.com
Sun Feb 15 00:09:09 CET 2009


Uff, stupid google code has problems updating the file so I uploaded 
another one: 
http://vekoon.googlecode.com/files/rna_groups_complete_0.1a.patch


vekoon wrote, on 15/02/2009 0.04:
> Sorry, there was a mistake in the readfile code that crashed the 
> application. I updated the patch (same link).
>
> vekoon wrote, on 14/02/2009 22.39:
>> Hey guys,
>> The API refactor is more or less finished. This is a first *working* 
>> version of the entire implementation of RNA groups and everything 
>> that was depending on them and followed. This includes almost 
>> everything I suggested in my initial proposal with the exception of 
>> group filters which are only partially implemented and so disabled in 
>> this first release. I really wanted to include them already in this 
>> first patch but couldn't find the time but I decided to release this 
>> first alpha anyway so that there's at least some time span for people 
>> to try out before next sunday meeting (tomorrow) which I'm not sure 
>> I'll be able to attend but it's still relevant so there can be some 
>> discussion about the whole thing.
>>
>> Now, keep in mind this is a _real_ alpha, meaning in the moment I 
>> finished it I created the patch so it could be instable in some 
>> circumstances and crash (for instance I think it could for objects 
>> with material nodes? not quite sure though). Also for the same reason 
>> there could be various glitches and misbehaviors and I already 
>> noticed there are maybe some leaks that I'll hack down later on.
>> The API modules themselves are pretty clean/polished (except some 
>> places where I recycled code from the old implementation that are not 
>> as clean) and although of course they're still in their alpha stage 
>> so they're surely not perfect I tried to make them workable and sane 
>> in term of readability. A part of the code that'll surely need to be 
>> checked is the readfile/writefile one which I'm not sure I did 
>> correctly and maybe I forgot something. Also some places because they 
>> were just demo code in the end I really didn't pay much attention so 
>> the code is not that nice especially in space_buttons where I left 
>> some unused code like buttons_selection, that was the selection 
>> region where it shows the selected objects: I didn't put that in as 
>> it was really irrelevant in terms of my proposal, you can put it in 
>> back if you want. Oh and I also noticed the area should be refreshed 
>> when the window is created but these are all very small tweaks I can 
>> think of later.
>>
>> What we have now:
>> An API divided into 3 levels each of one depends on the levels it's 
>> preceded by. The first level is the group cache, accessible through 
>> editors/include/PG_cache.h and implemented in 
>> editors/interface/pg_cache. This is just a big object where all the 
>> groups are cached in relation to their properties so that groups -> 
>> subgroups -> properties type of access is highly optimized and lowers 
>> down the overhead of having groups as attributes for properties 
>> (which makes RNA api a lot easier to work with). This first level 
>> only depends on RNA which means the cache can be at the application 
>> level (which is the same as RNA's).
>> The second level is called group state. This maintains "state" 
>> information for every group you want it to, like collapsed state etc. 
>> and it's generally at the space level or deeper in the chain (and can 
>> be persisted on file so that this state information is kept). This is 
>> again dependent only on RNA but would probably be advisable to 
>> consider it dependent on group cache for future purposes.
>> The third and last level is group UI. This level is obviously 
>> targeted at generating automatic UI for groups. Various options 
>> include the idea of having also automatic layout where groups are 
>> displaced in an automatic way (this is optional though). As of now 
>> they get broken up in rows or columns at the height or width of the 
>> window (see code below). This level depends on both group cache and 
>> group state.
>> An example of how the API is used (taken from the space_buttons code):
>>
>> ------------------ CODE ----------------------
>>
>>    gui= PG_ui_create(sbuts->gc, sbuts->gs);
>>    block= uiBeginBlock(C, ar, "buttons-block", UI_EMBOSS, UI_HELV);
>>
>>    PG_ui_init(gui, C, ar);
>>    PG_ui_area_set(gui, 0, 0, winw, winh);
>>
>>     if (winw >= winh+PG_ui_max_size_get(gui))
>>        PG_ui_flow_set(gui, PG_UI_FLOW_HOR);
>>    else
>>        PG_ui_flow_set(gui, PG_UI_FLOW_VER);
>>
>>    PG_CACHE_BEGIN_ROOT(sbuts->gc, ritem)
>>    {
>>        group= PG_cache_group(sbuts->gc, ritem);
>>        if (RNA_grouprna_type(group)==GROUP_ROOT) {
>>            state= PG_state_item(sbuts->gs, group, 0);
>>            if (state && state->flag & PG_STATE_USE)
>>                if (buttons_data_for_group(C, group, &ptr))
>>                    PG_ui_draw_children(gui, ritem, &ptr, block);
>>        }
>>    }
>>    PG_CACHE_END
>>
>>    uiEndBlock(C, block);
>>    uiDrawBlock(C, block);
>>
>>    PG_ui_total_area_get(gui, NULL, NULL, &w, &h);
>>
>>    /* update size of tot-rect (extents of data/viewable area) */
>>    if (PG_ui_flow_get(gui)==PG_UI_FLOW_HOR)
>>        UI_view2d_totRect_set(v2d, w?w:winw, winh);
>>    else
>>        UI_view2d_totRect_set(v2d, winw, h?h:winh);
>>
>>    PG_ui_free(gui);
>>
>> ------------------ CODE ----------------------
>>
>>
>> Now to complete this e-mail I'd like to share my "vision" on how a 
>> possible final API could work. Note this is pseudo-code to make it 
>> easier to understand. All of this is actually already possible with 
>> my API although of course there are no py bindings for it.
>>
>> group1 = rna.def_group('ObjectUserinfo', rna.Group_Object, 
>> GROUP_FLAGS, 'User Info')
>> group2 = rna.def_group('ObjectUserinfoData', group1, GROUP_FLAGS, 
>> 'Custom Data')
>>
>> rna.def_prop('some_flag', 'bool', group=group1, ..., 'Some Flag');
>> rna.def_prop('some_name1', 'int', group=group2, ..., 'Some Name 1');
>> rna.def_prop('some_name2', 'int', group=group2, ..., 'Some Name 2');
>> rna.def_prop('some_name3', 'int', group=group2, ..., 'Some Name 3');
>>
>> item = pg.cache_item(group2);
>> item.draw = draw_userinfo_data
>>
>> def draw_userinfo_data( gui, item, stage, block, x, y, w, h):
>>    ...draw...
>>    #return this to skip default drawing for the group
>>    return pg.UI_STAGE_SKIP
>>
>>
>> And this is about it. I was thinking about making smaller patches but 
>> was too much time consuming so instead I made a single big patch. You 
>> can find it here: 
>> http://vekoon.googlecode.com/files/rna_groups_complete_0.1.patch
>> I tried it with scons/minngw and cmake/msvc8 and it worked fine, then 
>> I tried scons/msvc9 and it crashed but as of now I don't have time to 
>> check why this happens so I suggest you use one of the other methods 
>> (scons/mingw I'm pretty sure should work).
>> Try the code out and also have fun exporting some more groups like 
>> for materials etc. in rna_*.c files and see how it works out for you. 
>> In the moment you export some group they should automatically show up 
>> in the buttons window/properties editor (unless you set the group 
>> flag GROUP_INTERNAL) and under the correct context (not all contexts 
>> are handled yet though, like radiosity or sound). As I said there are 
>> probably still various glitches or weird things you'll see but this 
>> is mostly to get a feel on how it works and if it's actually usable 
>> and blend nicely in the workflow. Then of course, after winter camp, 
>> when all the new UI paradigms will be defined I'll rewrite the UI 
>> part of this code accordingly and later we'll think about ways of 
>> beautifying the display and drawing of groups.
>> I think it's all, impressions and comments are welcome.
>>
>>
>>
>


More information about the Bf-taskforce25 mailing list