Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2009-04-22 22:39:44 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2009-04-22 22:39:44 +0400
commitaf02a0aa4e0b80c3c1154e7be095f4a387f81179 (patch)
tree3f714e683c96929cc4e44962570860ab0f635bc9 /source/blender/editors/space_text
parent643d59bb9bf3bdd46f41a0b8c79384146629f9c8 (diff)
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.
Diffstat (limited to 'source/blender/editors/space_text')
-rw-r--r--source/blender/editors/space_text/space_text.c10
-rw-r--r--source/blender/editors/space_text/text_header.c436
-rw-r--r--source/blender/editors/space_text/text_intern.h2
-rw-r--r--source/blender/editors/space_text/text_ops.c119
4 files changed, 204 insertions, 363 deletions
diff --git a/source/blender/editors/space_text/space_text.c b/source/blender/editors/space_text/space_text.c
index 89852955ca3..577dae433c1 100644
--- a/source/blender/editors/space_text/space_text.c
+++ b/source/blender/editors/space_text/space_text.c
@@ -127,13 +127,17 @@ static void text_listener(ScrArea *sa, wmNotifier *wmn)
if(!wmn->reference || wmn->reference == st->text) {
ED_area_tag_redraw(sa);
- if(wmn->data == ND_CURSOR) {
+ if(wmn->data == ND_CURSOR || wmn->action == NA_EDITED) {
ARegion *ar;
for(ar=sa->regionbase.first; ar; ar= ar->next)
if(ar->regiontype==RGN_TYPE_WINDOW)
text_update_cursor_moved(st, ar);
}
+
+ if(wmn->action == NA_EDITED)
+ if(st->text)
+ text_update_edited(st->text);
}
else if(wmn->data == ND_DISPLAY)
ED_area_tag_redraw(sa);
@@ -147,6 +151,7 @@ static void text_operatortypes(void)
WM_operatortype_append(TEXT_OT_new);
WM_operatortype_append(TEXT_OT_open);
WM_operatortype_append(TEXT_OT_reload);
+ WM_operatortype_append(TEXT_OT_unlink);
WM_operatortype_append(TEXT_OT_save);
WM_operatortype_append(TEXT_OT_save_as);
WM_operatortype_append(TEXT_OT_make_internal);
@@ -401,9 +406,6 @@ void ED_spacetype_text(void)
art->init= text_properties_area_init;
art->draw= text_properties_area_draw;
-
- text_properties_register(art);
-
BLI_addhead(&st->regiontypes, art);
/* regions: header */
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
diff --git a/source/blender/editors/space_text/text_intern.h b/source/blender/editors/space_text/text_intern.h
index 7ec75e292ce..50109ba8c42 100644
--- a/source/blender/editors/space_text/text_intern.h
+++ b/source/blender/editors/space_text/text_intern.h
@@ -43,7 +43,6 @@ struct wmOperatorType;
struct wmWindowManager;
/* text_header.c */
-void text_properties_register(struct ARegionType *art);
void text_header_register(struct ARegionType *art);
/* text_draw.c */
@@ -106,6 +105,7 @@ enum { DEL_NEXT_CHAR, DEL_PREV_CHAR, DEL_NEXT_WORD, DEL_PREV_WORD };
void TEXT_OT_new(struct wmOperatorType *ot);
void TEXT_OT_open(struct wmOperatorType *ot);
void TEXT_OT_reload(struct wmOperatorType *ot);
+void TEXT_OT_unlink(struct wmOperatorType *ot);
void TEXT_OT_save(struct wmOperatorType *ot);
void TEXT_OT_save_as(struct wmOperatorType *ot);
void TEXT_OT_make_internal(struct wmOperatorType *ot);
diff --git a/source/blender/editors/space_text/text_ops.c b/source/blender/editors/space_text/text_ops.c
index c7fe02975ef..913bd307ab2 100644
--- a/source/blender/editors/space_text/text_ops.c
+++ b/source/blender/editors/space_text/text_ops.c
@@ -49,6 +49,7 @@
#include "BKE_context.h"
#include "BKE_depsgraph.h"
#include "BKE_global.h"
+#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_report.h"
#include "BKE_suggestions.h"
@@ -269,6 +270,90 @@ void TEXT_OT_reload(wmOperatorType *ot)
ot->poll= text_edit_poll;
}
+/******************* delete operator *********************/
+
+static void text_unlink(Main *bmain, Text *text)
+{
+ bScreen *scr;
+ ScrArea *area;
+ SpaceLink *sl;
+
+ /* XXX this ifdef is in fact dangerous, if python is
+ * disabled it will leave invalid pointers in files! */
+
+#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);
+ }
+ }
+ }
+ }
+ }
+
+ free_libblock(&bmain->text, text);
+}
+
+static int unlink_exec(bContext *C, wmOperator *op)
+{
+ SpaceText *st= CTX_wm_space_text(C);
+ Text *text= CTX_data_edit_text(C);
+
+ /* make the previous text active, if its not there make the next text active */
+ if(st) {
+ 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);
+
+ return OPERATOR_FINISHED;
+}
+
+void TEXT_OT_unlink(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Unlink";
+ ot->idname= "TEXT_OT_unlink";
+
+ /* api callbacks */
+ ot->exec= unlink_exec;
+ ot->invoke= WM_operator_confirm;
+ ot->poll= text_edit_poll;
+}
+
/******************* make internal operator *********************/
static int make_internal_exec(bContext *C, wmOperator *op)
@@ -2448,31 +2533,35 @@ static int resolve_conflict_exec(bContext *C, wmOperator *op)
static int resolve_conflict_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
Text *text= CTX_data_edit_text(C);
- uiMenuItem *head;
+ uiPopupMenu *pup;
+ uiLayout *layout;
switch(text_file_modified(text)) {
case 1:
if(text->flags & TXT_ISDIRTY) {
/* modified locally and externally, ahhh. offer more possibilites. */
- head= uiPupMenuBegin("File Modified Outside and Inside Blender", 0);
- uiMenuItemEnumO(head, "Reload from disk (ignore local changes)", 0, op->type->idname, "resolution", RESOLVE_RELOAD);
- uiMenuItemEnumO(head, "Save to disk (ignore outside changes)", 0, op->type->idname, "resolution", RESOLVE_SAVE);
- uiMenuItemEnumO(head, "Make text internal (separate copy)", 0, op->type->idname, "resolution", RESOLVE_MAKE_INTERNAL);
- uiPupMenuEnd(C, head);
+ pup= uiPupMenuBegin("File Modified Outside and Inside Blender", 0);
+ layout= uiPupMenuLayout(pup);
+ uiItemEnumO(layout, "Reload from disk (ignore local changes)", 0, op->type->idname, "resolution", RESOLVE_RELOAD);
+ uiItemEnumO(layout, "Save to disk (ignore outside changes)", 0, op->type->idname, "resolution", RESOLVE_SAVE);
+ uiItemEnumO(layout, "Make text internal (separate copy)", 0, op->type->idname, "resolution", RESOLVE_MAKE_INTERNAL);
+ uiPupMenuEnd(C, pup);
}
else {
- head= uiPupMenuBegin("File Modified Outside Blender", 0);
- uiMenuItemEnumO(head, "Reload from disk", 0, op->type->idname, "resolution", RESOLVE_RELOAD);
- uiMenuItemEnumO(head, "Make text internal (separate copy)", 0, op->type->idname, "resolution", RESOLVE_MAKE_INTERNAL);
- uiMenuItemEnumO(head, "Ignore", 0, op->type->idname, "resolution", RESOLVE_IGNORE);
- uiPupMenuEnd(C, head);
+ pup= uiPupMenuBegin("File Modified Outside Blender", 0);
+ layout= uiPupMenuLayout(pup);
+ uiItemEnumO(layout, "Reload from disk", 0, op->type->idname, "resolution", RESOLVE_RELOAD);
+ uiItemEnumO(layout, "Make text internal (separate copy)", 0, op->type->idname, "resolution", RESOLVE_MAKE_INTERNAL);
+ uiItemEnumO(layout, "Ignore", 0, op->type->idname, "resolution", RESOLVE_IGNORE);
+ uiPupMenuEnd(C, pup);
}
break;
case 2:
- head= uiPupMenuBegin("File Deleted Outside Blender", 0);
- uiMenuItemEnumO(head, "Make text internal", 0, op->type->idname, "resolution", RESOLVE_MAKE_INTERNAL);
- uiMenuItemEnumO(head, "Recreate file", 0, op->type->idname, "resolution", RESOLVE_SAVE);
- uiPupMenuEnd(C, head);
+ pup= uiPupMenuBegin("File Deleted Outside Blender", 0);
+ layout= uiPupMenuLayout(pup);
+ uiItemEnumO(layout, "Make text internal", 0, op->type->idname, "resolution", RESOLVE_MAKE_INTERNAL);
+ uiItemEnumO(layout, "Recreate file", 0, op->type->idname, "resolution", RESOLVE_SAVE);
+ uiPupMenuEnd(C, pup);
break;
}