From af02a0aa4e0b80c3c1154e7be095f4a387f81179 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 22 Apr 2009 18:39:44 +0000 Subject: UI * Headers and menus can now be created in python. * Replaced the uiMenuItem functions to create menus with equivalent uiItem functions using a layout, removing duplicated code. * More uiItem functions are now exposed to python. * The text editor header, panels and one of its menus are now created in space_text.py. * Buttons window data context icon new changes depending on active object. Issues * Icons are not wrapped yet, hardcoded ints at the moment. * The ID browse template is unfinished. --- source/blender/editors/space_text/text_header.c | 436 +++++------------------- 1 file changed, 93 insertions(+), 343 deletions(-) (limited to 'source/blender/editors/space_text/text_header.c') diff --git a/source/blender/editors/space_text/text_header.c b/source/blender/editors/space_text/text_header.c index 0ab43cbf455..a3b62adf6c8 100644 --- a/source/blender/editors/space_text/text_header.c +++ b/source/blender/editors/space_text/text_header.c @@ -155,44 +155,46 @@ static uiBlock *text_plugin_scriptsmenu(bContext *C, void *args_unused) } #endif -static void text_editmenu_viewmenu(bContext *C, uiMenuItem *head, void *arg_unused) +static void text_editmenu_viewmenu(bContext *C, uiLayout *layout, void *arg_unused) { - uiMenuItemEnumO(head, "Top of File", 0, "TEXT_OT_move", "type", FILE_TOP); - uiMenuItemEnumO(head, "Bottom of File", 0, "TEXT_OT_move", "type", FILE_BOTTOM); + uiItemEnumO(layout, "Top of File", 0, "TEXT_OT_move", "type", FILE_TOP); + uiItemEnumO(layout, "Bottom of File", 0, "TEXT_OT_move", "type", FILE_BOTTOM); } -static void text_editmenu_selectmenu(bContext *C, uiMenuItem *head, void *arg_unused) +static void text_editmenu_selectmenu(bContext *C, uiLayout *layout, void *arg_unused) { - uiMenuItemO(head, 0, "TEXT_OT_select_all"); - uiMenuItemO(head, 0, "TEXT_OT_select_line"); + uiItemO(layout, NULL, 0, "TEXT_OT_select_all"); + uiItemO(layout, NULL, 0, "TEXT_OT_select_line"); } -static void text_editmenu_markermenu(bContext *C, uiMenuItem *head, void *arg_unused) +static void text_editmenu_markermenu(bContext *C, uiLayout *layout, void *arg_unused) { - uiMenuItemO(head, 0, "TEXT_OT_markers_clear"); - uiMenuItemO(head, 0, "TEXT_OT_next_marker"); - uiMenuItemO(head, 0, "TEXT_OT_previous_marker"); + uiItemO(layout, NULL, 0, "TEXT_OT_markers_clear"); + uiItemO(layout, NULL, 0, "TEXT_OT_next_marker"); + uiItemO(layout, NULL, 0, "TEXT_OT_previous_marker"); } -static void text_formatmenu(bContext *C, uiMenuItem *head, void *arg_unused) +static void text_formatmenu(const bContext *C, Menu *menu) { - uiMenuItemO(head, 0, "TEXT_OT_indent"); - uiMenuItemO(head, 0, "TEXT_OT_unindent"); + uiLayout *layout= menu->layout; - uiMenuSeparator(head); + uiItemO(layout, NULL, 0, "TEXT_OT_indent"); + uiItemO(layout, NULL, 0, "TEXT_OT_unindent"); - uiMenuItemO(head, 0, "TEXT_OT_comment"); - uiMenuItemO(head, 0, "TEXT_OT_uncomment"); + uiItemS(layout); - uiMenuSeparator(head); + uiItemO(layout, NULL, 0, "TEXT_OT_comment"); + uiItemO(layout, NULL, 0, "TEXT_OT_uncomment"); - uiMenuLevelEnumO(head, "TEXT_OT_convert_whitespace", "type"); + uiItemS(layout); + + uiItemLevelEnumO(layout, NULL, 0, "TEXT_OT_convert_whitespace", "type"); } -static void text_editmenu_to3dmenu(bContext *C, uiMenuItem *head, void *arg_unused) +static void text_editmenu_to3dmenu(bContext *C, uiLayout *layout, void *arg_unused) { - uiMenuItemBooleanO(head, "One Object", 0, "TEXT_OT_to_3d_object", "split_lines", 0); - uiMenuItemBooleanO(head, "One Object Per Line", 0, "TEXT_OT_to_3d_object", "split_lines", 1); + uiItemBooleanO(layout, "One Object", 0, "TEXT_OT_to_3d_object", "split_lines", 0); + uiItemBooleanO(layout, "One Object Per Line", 0, "TEXT_OT_to_3d_object", "split_lines", 1); } static int text_menu_edit_poll(bContext *C) @@ -200,308 +202,56 @@ static int text_menu_edit_poll(bContext *C) return (CTX_data_edit_text(C) != NULL); } -static void text_editmenu(bContext *C, uiMenuItem *head, void *arg_unused) +static void text_editmenu(const bContext *C, Menu *menu) { - uiMenuItemO(head, 0, "ED_OT_undo"); - uiMenuItemO(head, 0, "ED_OT_redo"); - - uiMenuSeparator(head); - - uiMenuItemO(head, 0, "TEXT_OT_cut"); - uiMenuItemO(head, 0, "TEXT_OT_copy"); - uiMenuItemO(head, 0, "TEXT_OT_paste"); - - uiMenuSeparator(head); - - uiMenuLevel(head, "View", text_editmenu_viewmenu); - uiMenuLevel(head, "Select", text_editmenu_selectmenu); - uiMenuLevel(head, "Markers", text_editmenu_markermenu); - - uiMenuSeparator(head); - - uiMenuItemO(head, 0, "TEXT_OT_jump"); - uiMenuItemO(head, 0, "TEXT_OT_properties"); - - uiMenuSeparator(head); - - uiMenuLevel(head, "Text to 3D Object", text_editmenu_to3dmenu); -} + uiLayout *layout= menu->layout; -static void text_filemenu(bContext *C, uiMenuItem *head, void *arg_unused) -{ - SpaceText *st= (SpaceText*)CTX_wm_space_data(C); - Text *text= st->text; - - uiMenuItemO(head, 0, "TEXT_OT_new"); - uiMenuItemO(head, 0, "TEXT_OT_open"); - - if(text) { - uiMenuItemO(head, 0, "TEXT_OT_reload"); - - uiMenuSeparator(head); - - uiMenuItemO(head, 0, "TEXT_OT_save"); - uiMenuItemO(head, 0, "TEXT_OT_save_as"); - - if(text->name) - uiMenuItemO(head, 0, "TEXT_OT_make_internal"); - - uiMenuSeparator(head); - - uiMenuItemO(head, 0, "TEXT_OT_run_script"); + uiItemO(layout, NULL, 0, "ED_OT_undo"); + uiItemO(layout, NULL, 0, "ED_OT_redo"); -#ifndef DISABLE_PYTHON - if(BPY_is_pyconstraint(text)) - uiMenuItemO(head, 0, "TEXT_OT_refresh_pyconstraints"); -#endif - } + uiItemS(layout); -#ifndef DISABLE_PYTHON - // XXX uiMenuSeparator(head); + uiItemO(layout, NULL, 0, "TEXT_OT_cut"); + uiItemO(layout, NULL, 0, "TEXT_OT_copy"); + uiItemO(layout, NULL, 0, "TEXT_OT_paste"); - // XXX uiDefIconTextBlockBut(block, text_template_scriptsmenu, NULL, ICON_RIGHTARROW_THIN, "Script Templates", 0, yco-=20, 120, 19, ""); - // XXX uiDefIconTextBlockBut(block, text_plugin_scriptsmenu, NULL, ICON_RIGHTARROW_THIN, "Text Plugins", 0, yco-=20, 120, 19, ""); -#endif -} + uiItemS(layout); -/*********************** datablock browse *************************/ + uiItemLevel(layout, "View", 0, text_editmenu_viewmenu); + uiItemLevel(layout, "Select", 0, text_editmenu_selectmenu); + uiItemLevel(layout, "Markers", 0, text_editmenu_markermenu); -static void text_unlink(Main *bmain, Text *text) -{ - bScreen *scr; - ScrArea *area; - SpaceLink *sl; + uiItemS(layout); - /* XXX this ifdef is in fact dangerous, if python is - * disabled it will leave invalid pointers in files! */ + uiItemO(layout, NULL, 0, "TEXT_OT_jump"); + uiItemO(layout, NULL, 0, "TEXT_OT_properties"); -#ifndef DISABLE_PYTHON - // XXX BPY_clear_bad_scriptlinks(text); - // XXX BPY_free_pyconstraint_links(text); - // XXX free_text_controllers(text); - // XXX free_dome_warp_text(text); - - /* check if this text was used as script link: - * this check function unsets the pointers and returns how many - * script links used this Text */ - if(0) // XXX BPY_text_check_all_scriptlinks (text)) - ; // XXX notifier: allqueue(REDRAWBUTSSCRIPT, 0); - - /* equivalently for pynodes: */ - if(0) // XXX nodeDynamicUnlinkText ((ID*)text)) - ; // XXX notifier: allqueue(REDRAWNODE, 0); -#endif - - for(scr= bmain->screen.first; scr; scr= scr->id.next) { - for(area= scr->areabase.first; area; area= area->next) { - for(sl= area->spacedata.first; sl; sl= sl->next) { - if(sl->spacetype==SPACE_TEXT) { - SpaceText *st= (SpaceText*) sl; - - if(st->text==text) { - st->text= NULL; - st->top= 0; - - if(st==area->spacedata.first) - ED_area_tag_redraw(area); - } - } - } - } - } + uiItemS(layout); - free_libblock(&bmain->text, text); -} - -static void text_idpoin_handle(bContext *C, ID *id, int event) -{ - SpaceText *st= (SpaceText*)CTX_wm_space_data(C); - Text *text; - - switch(event) { - case UI_ID_BROWSE: - st->text= (Text*)id; - st->top= 0; - - text_update_edited(st->text); - WM_event_add_notifier(C, NC_TEXT|ND_CURSOR, st->text); - - ED_undo_push(C, "Browse Text"); - break; - case UI_ID_DELETE: - text= st->text; - - /* make the previous text active, if its not there make the next text active */ - if(text->id.prev) { - st->text = text->id.prev; - WM_event_add_notifier(C, NC_TEXT|ND_CURSOR, st->text); - } - else if(text->id.next) { - st->text = text->id.next; - WM_event_add_notifier(C, NC_TEXT|ND_CURSOR, st->text); - } - - text_unlink(CTX_data_main(C), text); - WM_event_add_notifier(C, NC_TEXT|NA_REMOVED, text); - - ED_undo_push(C, "Delete Text"); - break; - case UI_ID_RENAME: - break; - case UI_ID_ADD_NEW: - WM_operator_name_call(C, "TEXT_OT_new", WM_OP_INVOKE_REGION_WIN, NULL); - break; - case UI_ID_OPEN: - WM_operator_name_call(C, "TEXT_OT_open", WM_OP_INVOKE_REGION_WIN, NULL); - break; - } + uiItemLevel(layout, "Text to 3D Object", 0, text_editmenu_to3dmenu); } /********************** header buttons ***********************/ -static void text_header_draw(const bContext *C, Header *header) -{ - bScreen *sc= CTX_wm_screen(C); - SpaceText *st= (SpaceText*)CTX_wm_space_data(C); - PointerRNA spaceptr; - Text *text= st->text; - uiLayout *layout= header->layout; - - RNA_pointer_create(&sc->id, &RNA_SpaceTextEditor, st, &spaceptr); - - uiTemplateHeaderMenus(layout); - uiItemM(layout, "Text", 0, text_filemenu); - if(text) { - uiItemM(layout, "Edit", 0, text_editmenu); - uiItemM(layout, "Format", 0, text_formatmenu); - } - - /* warning button if text is out of date */ - if(text && text_file_modified(text)) { - uiTemplateHeaderButtons(layout); - uiTemplateSetColor(layout, TH_REDALERT); - uiItemO(layout, "", ICON_HELP, "TEXT_OT_resolve_conflict"); - } - - uiTemplateHeaderButtons(layout); - uiItemR(layout, "", ICON_LINENUMBERS_OFF, &spaceptr, "line_numbers", 0); - uiItemR(layout, "", ICON_WORDWRAP_OFF, &spaceptr, "word_wrap", 0); - uiItemR(layout, "", ICON_SYNTAX_OFF, &spaceptr, "syntax_highlight", 0); - // XXX uiItemR(layout, "", ICON_SCRIPTPLUGINS, &spaceptr, "do_python_plugins", 0); - - uiTemplateHeaderID(layout, &spaceptr, "text", - UI_ID_BROWSE|UI_ID_RENAME|UI_ID_ADD_NEW|UI_ID_OPEN|UI_ID_DELETE, - text_idpoin_handle); - - /* file info */ - if(text) { - char fname[HEADER_PATH_MAX]; - static char headtxt[HEADER_PATH_MAX+17]; - int len; - - if(text->name) { - len = strlen(text->name); - if(len > HEADER_PATH_MAX-1) - len = HEADER_PATH_MAX-1; - strncpy(fname, text->name, len); - fname[len]='\0'; - if(text->flags & TXT_ISDIRTY) - sprintf(headtxt, "File: *%s (unsaved)", fname); - else - sprintf(headtxt, "File: %s", fname); - } - else - sprintf(headtxt, text->id.lib? "Text: External": "Text: Internal"); - - uiTemplateHeaderButtons(layout); - uiItemL(layout, headtxt, 0); - } -} - void text_header_register(ARegionType *art) { - HeaderType *ht; - - /* header */ - ht= MEM_callocN(sizeof(HeaderType), "spacetype text header"); - strcpy(ht->idname, "TEXT_HT_header"); - ht->draw= text_header_draw; - BLI_addhead(&art->headertypes, ht); + MenuType *mt; + + mt= MEM_callocN(sizeof(MenuType), "spacetype text menu edit"); + strcpy(mt->idname, "TEXT_MT_edit"); + strcpy(mt->label, "Edit"); + mt->draw= text_editmenu; + BLI_addhead(&art->menutypes, mt); + + mt= MEM_callocN(sizeof(MenuType), "spacetype text menu format"); + strcpy(mt->idname, "TEXT_MT_format"); + strcpy(mt->label, "Format"); + mt->draw= text_formatmenu; + BLI_addhead(&art->menutypes, mt); } /************************** properties ******************************/ -static void text_properties_panel_draw(const bContext *C, Panel *panel) -{ - bScreen *sc= CTX_wm_screen(C); - SpaceText *st= CTX_wm_space_text(C); - uiLayout *layout= panel->layout; - PointerRNA spaceptr; - - RNA_pointer_create(&sc->id, &RNA_SpaceTextEditor, st, &spaceptr); - - uiLayoutColumn(layout); - uiItemR(layout, NULL, ICON_LINENUMBERS_OFF, &spaceptr, "line_numbers", 0); - uiItemR(layout, NULL, ICON_WORDWRAP_OFF, &spaceptr, "word_wrap", 0); - uiItemR(layout, NULL, ICON_SYNTAX_OFF, &spaceptr, "syntax_highlight", 0); - - uiLayoutColumn(layout); - uiItemR(layout, NULL, 0, &spaceptr, "font_size", 0); - uiItemR(layout, NULL, 0, &spaceptr, "tab_width", 0); -} - -static void text_find_panel_draw(const bContext *C, Panel *panel) -{ - bScreen *sc= CTX_wm_screen(C); - SpaceText *st= CTX_wm_space_text(C); - uiLayout *layout= panel->layout; - PointerRNA spaceptr; - - RNA_pointer_create(&sc->id, &RNA_SpaceTextEditor, st, &spaceptr); - - /* find */ - uiLayoutRow(layout); - uiItemR(layout, "", 0, &spaceptr, "find_text", 0); - uiItemO(layout, "", ICON_TEXT, "TEXT_OT_find_set_selected"); - uiLayoutColumn(layout); - uiItemO(layout, NULL, 0, "TEXT_OT_find"); - - /* replace */ - uiLayoutRow(layout); - uiItemR(layout, "", 0, &spaceptr, "replace_text", 0); - uiItemO(layout, "", ICON_TEXT, "TEXT_OT_replace_set_selected"); - uiLayoutColumn(layout); - uiItemO(layout, NULL, 0, "TEXT_OT_replace"); - - /* mark */ - uiLayoutColumn(layout); - uiItemO(layout, NULL, 0, "TEXT_OT_mark_all"); - - /* settings */ - uiLayoutColumnFlow(layout, 0); - uiItemR(layout, "Wrap", 0, &spaceptr, "find_wrap", 0); - uiItemR(layout, "All", 0, &spaceptr, "find_all", 0); -} - -void text_properties_register(ARegionType *art) -{ - PanelType *pt; - - /* panels: properties */ - pt= MEM_callocN(sizeof(PanelType), "spacetype text panel"); - strcpy(pt->idname, "TEXT_PT_properties"); - strcpy(pt->label, "Properties"); - pt->draw= text_properties_panel_draw; - BLI_addtail(&art->paneltypes, pt); - - /* panels: find */ - pt= MEM_callocN(sizeof(PanelType), "spacetype text panel"); - strcpy(pt->idname, "TEXT_PT_find"); - strcpy(pt->label, "Find"); - pt->draw= text_find_panel_draw; - BLI_addtail(&art->paneltypes, pt); -} - ARegion *text_has_properties_region(ScrArea *sa) { ARegion *ar, *arnew; @@ -570,75 +320,75 @@ void TEXT_OT_properties(wmOperatorType *ot) { // RMB - uiMenuItem *head; + uiPopupMenu *pup; if(text) { - head= uiPupMenuBegin("Text", 0); + pup= uiPupMenuBegin("Text", 0); if(txt_has_sel(text)) { - uiMenuItemO(head, 0, "TEXT_OT_cut"); - uiMenuItemO(head, 0, "TEXT_OT_copy"); + uiItemO(layout, NULL, 0, "TEXT_OT_cut"); + uiItemO(layout, NULL, 0, "TEXT_OT_copy"); } - uiMenuItemO(head, 0, "TEXT_OT_paste"); - uiMenuItemO(head, 0, "TEXT_OT_new"); - uiMenuItemO(head, 0, "TEXT_OT_open"); - uiMenuItemO(head, 0, "TEXT_OT_save"); - uiMenuItemO(head, 0, "TEXT_OT_save_as"); - uiMenuItemO(head, 0, "TEXT_OT_run_script"); - uiPupMenuEnd(C, head); + uiItemO(layout, NULL, 0, "TEXT_OT_paste"); + uiItemO(layout, NULL, 0, "TEXT_OT_new"); + uiItemO(layout, NULL, 0, "TEXT_OT_open"); + uiItemO(layout, NULL, 0, "TEXT_OT_save"); + uiItemO(layout, NULL, 0, "TEXT_OT_save_as"); + uiItemO(layout, NULL, 0, "TEXT_OT_run_script"); + uiPupMenuEnd(C, pup); } else { - head= uiPupMenuBegin("File", 0); - uiMenuItemO(head, 0, "TEXT_OT_new"); - uiMenuItemO(head, 0, "TEXT_OT_open"); - uiPupMenuEnd(C, head); + pup= uiPupMenuBegin("File", 0); + uiItemO(layout, NULL, 0, "TEXT_OT_new"); + uiItemO(layout, NULL, 0, "TEXT_OT_open"); + uiPupMenuEnd(C, pup); } } { // Alt+Shift+E - uiMenuItem *head; + uiPopupMenu *pup; - head= uiPupMenuBegin("Edit", 0); - uiMenuItemO(head, 0, "TEXT_OT_cut"); - uiMenuItemO(head, 0, "TEXT_OT_copy"); - uiMenuItemO(head, 0, "TEXT_OT_paste"); - uiPupMenuEnd(C, head); + pup= uiPupMenuBegin("Edit", 0); + uiItemO(layout, NULL, 0, "TEXT_OT_cut"); + uiItemO(layout, NULL, 0, "TEXT_OT_copy"); + uiItemO(layout, NULL, 0, "TEXT_OT_paste"); + uiPupMenuEnd(C, pup); } { // Alt+Shift+F - uiMenuItem *head; + uiPopupMenu *pup; if(text) { - head= uiPupMenuBegin("Text", 0); - uiMenuItemO(head, 0, "TEXT_OT_new"); - uiMenuItemO(head, 0, "TEXT_OT_open"); - uiMenuItemO(head, 0, "TEXT_OT_save"); - uiMenuItemO(head, 0, "TEXT_OT_save_as"); - uiMenuItemO(head, 0, "TEXT_OT_run_script"); - uiPupMenuEnd(C, head); + pup= uiPupMenuBegin("Text", 0); + uiItemO(layout, NULL, 0, "TEXT_OT_new"); + uiItemO(layout, NULL, 0, "TEXT_OT_open"); + uiItemO(layout, NULL, 0, "TEXT_OT_save"); + uiItemO(layout, NULL, 0, "TEXT_OT_save_as"); + uiItemO(layout, NULL, 0, "TEXT_OT_run_script"); + uiPupMenuEnd(C, pup); } else { - head= uiPupMenuBegin("File", 0); - uiMenuItemO(head, 0, "TEXT_OT_new"); - uiMenuItemO(head, 0, "TEXT_OT_open"); - uiPupMenuEnd(C, head); + pup= uiPupMenuBegin("File", 0); + uiItemO(layout, NULL, 0, "TEXT_OT_new"); + uiItemO(layout, NULL, 0, "TEXT_OT_open"); + uiPupMenuEnd(C, pup); } } { // Alt+Shift+V - uiMenuItem *head; + uiPopupMenu *pup; - head= uiPupMenuBegin("Text", 0); - uiMenuItemEnumO(head, "Top of File", 0, "TEXT_OT_move", "type", FILE_TOP); - uiMenuItemEnumO(head, "Bottom of File", 0, "TEXT_OT_move", "type", FILE_BOTTOM); - uiMenuItemEnumO(head, "Page Up", 0, "TEXT_OT_move", "type", PREV_PAGE); - uiMenuItemEnumO(head, "Page Down", 0, "TEXT_OT_move", "type", NEXT_PAGE); - uiPupMenuEnd(C, head); + pup= uiPupMenuBegin("Text", 0); + uiItemEnumO(layout, "Top of File", 0, "TEXT_OT_move", "type", FILE_TOP); + uiItemEnumO(layout, "Bottom of File", 0, "TEXT_OT_move", "type", FILE_BOTTOM); + uiItemEnumO(layout, "Page Up", 0, "TEXT_OT_move", "type", PREV_PAGE); + uiItemEnumO(layout, "Page Down", 0, "TEXT_OT_move", "type", NEXT_PAGE); + uiPupMenuEnd(C, pup); } #endif -- cgit v1.2.3