1 /** 2 Label that displays rich text. 3 4 Copyright: 5 Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. 6 Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) 7 Copyright (c) 2017-2018 Godot-D contributors 8 9 License: $(LINK2 https://opensource.org/licenses/MIT, MIT License) 10 11 12 */ 13 module godot.richtextlabel; 14 import std.meta : AliasSeq, staticIndexOf; 15 import std.traits : Unqual; 16 import godot.d.meta; 17 import godot.core; 18 import godot.c; 19 import godot.d.bind; 20 import godot.d.reference; 21 import godot.object; 22 import godot.classdb; 23 import godot.control; 24 import godot.inputevent; 25 import godot.texture; 26 import godot.font; 27 import godot.vscrollbar; 28 import godot.canvasitem; 29 import godot.node; 30 /** 31 Label that displays rich text. 32 33 Rich text can contain custom text, fonts, images and some basic formatting. The label manages these as an internal tag stack. It also adapts itself to given width/heights. 34 Note that assignments to $(D bbcodeText) clear the tag stack and reconstruct it from the property's contents. Any edits made to $(D bbcodeText) will erase previous edits made from other manual sources such as $(D appendBbcode) and the `push_*` / $(D pop) methods. 35 */ 36 @GodotBaseClass struct RichTextLabel 37 { 38 enum string _GODOT_internal_name = "RichTextLabel"; 39 public: 40 @nogc nothrow: 41 union { godot_object _godot_object; Control _GODOT_base; } 42 alias _GODOT_base this; 43 alias BaseClasses = AliasSeq!(typeof(_GODOT_base), typeof(_GODOT_base).BaseClasses); 44 package(godot) __gshared bool _classBindingInitialized = false; 45 package(godot) static struct _classBinding 46 { 47 __gshared: 48 @GodotName("_gui_input") GodotMethod!(void, InputEvent) _guiInput; 49 @GodotName("_scroll_changed") GodotMethod!(void, double) _scrollChanged; 50 @GodotName("get_text") GodotMethod!(String) getText; 51 @GodotName("add_text") GodotMethod!(void, String) addText; 52 @GodotName("set_text") GodotMethod!(void, String) setText; 53 @GodotName("add_image") GodotMethod!(void, Texture) addImage; 54 @GodotName("newline") GodotMethod!(void) newline; 55 @GodotName("remove_line") GodotMethod!(bool, long) removeLine; 56 @GodotName("push_font") GodotMethod!(void, Font) pushFont; 57 @GodotName("push_color") GodotMethod!(void, Color) pushColor; 58 @GodotName("push_align") GodotMethod!(void, long) pushAlign; 59 @GodotName("push_indent") GodotMethod!(void, long) pushIndent; 60 @GodotName("push_list") GodotMethod!(void, long) pushList; 61 @GodotName("push_meta") GodotMethod!(void, Variant) pushMeta; 62 @GodotName("push_underline") GodotMethod!(void) pushUnderline; 63 @GodotName("push_strikethrough") GodotMethod!(void) pushStrikethrough; 64 @GodotName("push_table") GodotMethod!(void, long) pushTable; 65 @GodotName("set_table_column_expand") GodotMethod!(void, long, bool, long) setTableColumnExpand; 66 @GodotName("push_cell") GodotMethod!(void) pushCell; 67 @GodotName("pop") GodotMethod!(void) pop; 68 @GodotName("clear") GodotMethod!(void) clear; 69 @GodotName("set_meta_underline") GodotMethod!(void, bool) setMetaUnderline; 70 @GodotName("is_meta_underlined") GodotMethod!(bool) isMetaUnderlined; 71 @GodotName("set_override_selected_font_color") GodotMethod!(void, bool) setOverrideSelectedFontColor; 72 @GodotName("is_overriding_selected_font_color") GodotMethod!(bool) isOverridingSelectedFontColor; 73 @GodotName("set_scroll_active") GodotMethod!(void, bool) setScrollActive; 74 @GodotName("is_scroll_active") GodotMethod!(bool) isScrollActive; 75 @GodotName("set_scroll_follow") GodotMethod!(void, bool) setScrollFollow; 76 @GodotName("is_scroll_following") GodotMethod!(bool) isScrollFollowing; 77 @GodotName("get_v_scroll") GodotMethod!(VScrollBar) getVScroll; 78 @GodotName("scroll_to_line") GodotMethod!(void, long) scrollToLine; 79 @GodotName("set_tab_size") GodotMethod!(void, long) setTabSize; 80 @GodotName("get_tab_size") GodotMethod!(long) getTabSize; 81 @GodotName("set_selection_enabled") GodotMethod!(void, bool) setSelectionEnabled; 82 @GodotName("is_selection_enabled") GodotMethod!(bool) isSelectionEnabled; 83 @GodotName("parse_bbcode") GodotMethod!(GodotError, String) parseBbcode; 84 @GodotName("append_bbcode") GodotMethod!(GodotError, String) appendBbcode; 85 @GodotName("set_bbcode") GodotMethod!(void, String) setBbcode; 86 @GodotName("get_bbcode") GodotMethod!(String) getBbcode; 87 @GodotName("set_visible_characters") GodotMethod!(void, long) setVisibleCharacters; 88 @GodotName("get_visible_characters") GodotMethod!(long) getVisibleCharacters; 89 @GodotName("set_percent_visible") GodotMethod!(void, double) setPercentVisible; 90 @GodotName("get_percent_visible") GodotMethod!(double) getPercentVisible; 91 @GodotName("get_total_character_count") GodotMethod!(long) getTotalCharacterCount; 92 @GodotName("set_use_bbcode") GodotMethod!(void, bool) setUseBbcode; 93 @GodotName("is_using_bbcode") GodotMethod!(bool) isUsingBbcode; 94 @GodotName("get_line_count") GodotMethod!(long) getLineCount; 95 @GodotName("get_visible_line_count") GodotMethod!(long) getVisibleLineCount; 96 @GodotName("get_content_height") GodotMethod!(long) getContentHeight; 97 } 98 bool opEquals(in RichTextLabel other) const { return _godot_object.ptr is other._godot_object.ptr; } 99 RichTextLabel opAssign(T : typeof(null))(T n) { _godot_object.ptr = null; } 100 bool opEquals(typeof(null) n) const { return _godot_object.ptr is null; } 101 mixin baseCasts; 102 static RichTextLabel _new() 103 { 104 static godot_class_constructor constructor; 105 if(constructor is null) constructor = _godot_api.godot_get_class_constructor("RichTextLabel"); 106 if(constructor is null) return typeof(this).init; 107 return cast(RichTextLabel)(constructor()); 108 } 109 @disable new(size_t s); 110 /// 111 enum Align : int 112 { 113 /** 114 115 */ 116 alignLeft = 0, 117 /** 118 119 */ 120 alignCenter = 1, 121 /** 122 123 */ 124 alignRight = 2, 125 /** 126 127 */ 128 alignFill = 3, 129 } 130 /// 131 enum ListType : int 132 { 133 /** 134 135 */ 136 listNumbers = 0, 137 /** 138 139 */ 140 listLetters = 1, 141 /** 142 143 */ 144 listDots = 2, 145 } 146 /// 147 enum ItemType : int 148 { 149 /** 150 151 */ 152 itemFrame = 0, 153 /** 154 155 */ 156 itemText = 1, 157 /** 158 159 */ 160 itemImage = 2, 161 /** 162 163 */ 164 itemNewline = 3, 165 /** 166 167 */ 168 itemFont = 4, 169 /** 170 171 */ 172 itemColor = 5, 173 /** 174 175 */ 176 itemUnderline = 6, 177 /** 178 179 */ 180 itemStrikethrough = 7, 181 /** 182 183 */ 184 itemAlign = 8, 185 /** 186 187 */ 188 itemIndent = 9, 189 /** 190 191 */ 192 itemList = 10, 193 /** 194 195 */ 196 itemTable = 11, 197 /** 198 199 */ 200 itemMeta = 12, 201 } 202 /// 203 enum Constants : int 204 { 205 listNumbers = 0, 206 alignLeft = 0, 207 itemFrame = 0, 208 itemText = 1, 209 alignCenter = 1, 210 listLetters = 1, 211 alignRight = 2, 212 listDots = 2, 213 itemImage = 2, 214 alignFill = 3, 215 itemNewline = 3, 216 itemFont = 4, 217 itemColor = 5, 218 itemUnderline = 6, 219 itemStrikethrough = 7, 220 itemAlign = 8, 221 itemIndent = 9, 222 itemList = 10, 223 itemTable = 11, 224 itemMeta = 12, 225 } 226 /** 227 228 */ 229 void _guiInput(InputEvent arg0) 230 { 231 Array _GODOT_args = Array.empty_array; 232 _GODOT_args.append(arg0); 233 String _GODOT_method_name = String("_gui_input"); 234 this.callv(_GODOT_method_name, _GODOT_args); 235 } 236 /** 237 238 */ 239 void _scrollChanged(in double arg0) 240 { 241 Array _GODOT_args = Array.empty_array; 242 _GODOT_args.append(arg0); 243 String _GODOT_method_name = String("_scroll_changed"); 244 this.callv(_GODOT_method_name, _GODOT_args); 245 } 246 /** 247 248 */ 249 String getText() 250 { 251 checkClassBinding!(typeof(this))(); 252 return ptrcall!(String)(_classBinding.getText, _godot_object); 253 } 254 /** 255 Adds raw non-bbcode-parsed text to the tag stack. 256 */ 257 void addText(StringArg0)(in StringArg0 text) 258 { 259 checkClassBinding!(typeof(this))(); 260 ptrcall!(void)(_classBinding.addText, _godot_object, text); 261 } 262 /** 263 264 */ 265 void setText(StringArg0)(in StringArg0 text) 266 { 267 checkClassBinding!(typeof(this))(); 268 ptrcall!(void)(_classBinding.setText, _godot_object, text); 269 } 270 /** 271 Adds an image's opening and closing tags to the tag stack. 272 */ 273 void addImage(Texture image) 274 { 275 checkClassBinding!(typeof(this))(); 276 ptrcall!(void)(_classBinding.addImage, _godot_object, image); 277 } 278 /** 279 Adds a newline tag to the tag stack. 280 */ 281 void newline() 282 { 283 checkClassBinding!(typeof(this))(); 284 ptrcall!(void)(_classBinding.newline, _godot_object); 285 } 286 /** 287 Removes a line of content from the label. Returns `true` if the line exists. 288 */ 289 bool removeLine(in long line) 290 { 291 checkClassBinding!(typeof(this))(); 292 return ptrcall!(bool)(_classBinding.removeLine, _godot_object, line); 293 } 294 /** 295 Adds a `$(D font)` tag to the tag stack. Overrides default fonts for its duration. 296 */ 297 void pushFont(Font font) 298 { 299 checkClassBinding!(typeof(this))(); 300 ptrcall!(void)(_classBinding.pushFont, _godot_object, font); 301 } 302 /** 303 Adds a `$(D color)` tag to the tag stack. 304 */ 305 void pushColor(in Color color) 306 { 307 checkClassBinding!(typeof(this))(); 308 ptrcall!(void)(_classBinding.pushColor, _godot_object, color); 309 } 310 /** 311 Adds an alignment tag based on the given `align` value. See $(D _align) for possible values. 312 */ 313 void pushAlign(in long _align) 314 { 315 checkClassBinding!(typeof(this))(); 316 ptrcall!(void)(_classBinding.pushAlign, _godot_object, _align); 317 } 318 /** 319 Adds an `$(D indent)` tag to the tag stack. Multiplies "level" by current tab_size to determine new margin length. 320 */ 321 void pushIndent(in long level) 322 { 323 checkClassBinding!(typeof(this))(); 324 ptrcall!(void)(_classBinding.pushIndent, _godot_object, level); 325 } 326 /** 327 Adds a list tag to the tag stack. Similar to the bbcodes `$(D ol)` or `$(D ul)`, but supports more list types. Not fully implemented! 328 */ 329 void pushList(in long type) 330 { 331 checkClassBinding!(typeof(this))(); 332 ptrcall!(void)(_classBinding.pushList, _godot_object, type); 333 } 334 /** 335 Adds a meta tag to the tag stack. Similar to the bbcode `$(D url=something){text}$(D /url)`, but supports non-$(D String) metadata types. 336 */ 337 void pushMeta(VariantArg0)(in VariantArg0 data) 338 { 339 checkClassBinding!(typeof(this))(); 340 ptrcall!(void)(_classBinding.pushMeta, _godot_object, data); 341 } 342 /** 343 Adds a `$(D u)` tag to the tag stack. 344 */ 345 void pushUnderline() 346 { 347 checkClassBinding!(typeof(this))(); 348 ptrcall!(void)(_classBinding.pushUnderline, _godot_object); 349 } 350 /** 351 Adds a `$(D s)` tag to the tag stack. 352 */ 353 void pushStrikethrough() 354 { 355 checkClassBinding!(typeof(this))(); 356 ptrcall!(void)(_classBinding.pushStrikethrough, _godot_object); 357 } 358 /** 359 Adds a `$(D table=columns)` tag to the tag stack. 360 */ 361 void pushTable(in long columns) 362 { 363 checkClassBinding!(typeof(this))(); 364 ptrcall!(void)(_classBinding.pushTable, _godot_object, columns); 365 } 366 /** 367 Edits the selected columns expansion options. If `expand` is `true`, the column expands in proportion to its expansion ratio versus the other columns' ratios. 368 For example, 2 columns with ratios 3 and 4 plus 70 pixels in available width would expand 30 and 40 pixels, respectively. 369 Columns with a `false` expand will not contribute to the total ratio. 370 */ 371 void setTableColumnExpand(in long column, in bool expand, in long ratio) 372 { 373 checkClassBinding!(typeof(this))(); 374 ptrcall!(void)(_classBinding.setTableColumnExpand, _godot_object, column, expand, ratio); 375 } 376 /** 377 Adds a `$(D cell)` tag to the tag stack. Must be inside a $(D table) tag. See $(D pushTable) for details. 378 */ 379 void pushCell() 380 { 381 checkClassBinding!(typeof(this))(); 382 ptrcall!(void)(_classBinding.pushCell, _godot_object); 383 } 384 /** 385 Terminates the current tag. Use after `push_*` methods to close bbcodes manually. Does not need to follow `add_*` methods. 386 */ 387 void pop() 388 { 389 checkClassBinding!(typeof(this))(); 390 ptrcall!(void)(_classBinding.pop, _godot_object); 391 } 392 /** 393 Clears the tag stack and sets $(D bbcodeText) to an empty string. 394 */ 395 void clear() 396 { 397 checkClassBinding!(typeof(this))(); 398 ptrcall!(void)(_classBinding.clear, _godot_object); 399 } 400 /** 401 402 */ 403 void setMetaUnderline(in bool enable) 404 { 405 checkClassBinding!(typeof(this))(); 406 ptrcall!(void)(_classBinding.setMetaUnderline, _godot_object, enable); 407 } 408 /** 409 410 */ 411 bool isMetaUnderlined() const 412 { 413 checkClassBinding!(typeof(this))(); 414 return ptrcall!(bool)(_classBinding.isMetaUnderlined, _godot_object); 415 } 416 /** 417 418 */ 419 void setOverrideSelectedFontColor(in bool _override) 420 { 421 checkClassBinding!(typeof(this))(); 422 ptrcall!(void)(_classBinding.setOverrideSelectedFontColor, _godot_object, _override); 423 } 424 /** 425 426 */ 427 bool isOverridingSelectedFontColor() const 428 { 429 checkClassBinding!(typeof(this))(); 430 return ptrcall!(bool)(_classBinding.isOverridingSelectedFontColor, _godot_object); 431 } 432 /** 433 434 */ 435 void setScrollActive(in bool active) 436 { 437 checkClassBinding!(typeof(this))(); 438 ptrcall!(void)(_classBinding.setScrollActive, _godot_object, active); 439 } 440 /** 441 442 */ 443 bool isScrollActive() const 444 { 445 checkClassBinding!(typeof(this))(); 446 return ptrcall!(bool)(_classBinding.isScrollActive, _godot_object); 447 } 448 /** 449 450 */ 451 void setScrollFollow(in bool follow) 452 { 453 checkClassBinding!(typeof(this))(); 454 ptrcall!(void)(_classBinding.setScrollFollow, _godot_object, follow); 455 } 456 /** 457 458 */ 459 bool isScrollFollowing() const 460 { 461 checkClassBinding!(typeof(this))(); 462 return ptrcall!(bool)(_classBinding.isScrollFollowing, _godot_object); 463 } 464 /** 465 Returns the vertical scrollbar. 466 */ 467 VScrollBar getVScroll() 468 { 469 checkClassBinding!(typeof(this))(); 470 return ptrcall!(VScrollBar)(_classBinding.getVScroll, _godot_object); 471 } 472 /** 473 Scrolls the window's top line to match `line`. 474 */ 475 void scrollToLine(in long line) 476 { 477 checkClassBinding!(typeof(this))(); 478 ptrcall!(void)(_classBinding.scrollToLine, _godot_object, line); 479 } 480 /** 481 482 */ 483 void setTabSize(in long spaces) 484 { 485 checkClassBinding!(typeof(this))(); 486 ptrcall!(void)(_classBinding.setTabSize, _godot_object, spaces); 487 } 488 /** 489 490 */ 491 long getTabSize() const 492 { 493 checkClassBinding!(typeof(this))(); 494 return ptrcall!(long)(_classBinding.getTabSize, _godot_object); 495 } 496 /** 497 498 */ 499 void setSelectionEnabled(in bool enabled) 500 { 501 checkClassBinding!(typeof(this))(); 502 ptrcall!(void)(_classBinding.setSelectionEnabled, _godot_object, enabled); 503 } 504 /** 505 506 */ 507 bool isSelectionEnabled() const 508 { 509 checkClassBinding!(typeof(this))(); 510 return ptrcall!(bool)(_classBinding.isSelectionEnabled, _godot_object); 511 } 512 /** 513 The assignment version of $(D appendBbcode). Clears the tag stack and inserts the new content. Returns `OK` if parses `bbcode` successfully. 514 */ 515 GodotError parseBbcode(StringArg0)(in StringArg0 bbcode) 516 { 517 checkClassBinding!(typeof(this))(); 518 return ptrcall!(GodotError)(_classBinding.parseBbcode, _godot_object, bbcode); 519 } 520 /** 521 Parses `bbcode` and adds tags to the tag stack as needed. Returns the result of the parsing, `OK` if successful. 522 */ 523 GodotError appendBbcode(StringArg0)(in StringArg0 bbcode) 524 { 525 checkClassBinding!(typeof(this))(); 526 return ptrcall!(GodotError)(_classBinding.appendBbcode, _godot_object, bbcode); 527 } 528 /** 529 530 */ 531 void setBbcode(StringArg0)(in StringArg0 text) 532 { 533 checkClassBinding!(typeof(this))(); 534 ptrcall!(void)(_classBinding.setBbcode, _godot_object, text); 535 } 536 /** 537 538 */ 539 String getBbcode() const 540 { 541 checkClassBinding!(typeof(this))(); 542 return ptrcall!(String)(_classBinding.getBbcode, _godot_object); 543 } 544 /** 545 546 */ 547 void setVisibleCharacters(in long amount) 548 { 549 checkClassBinding!(typeof(this))(); 550 ptrcall!(void)(_classBinding.setVisibleCharacters, _godot_object, amount); 551 } 552 /** 553 554 */ 555 long getVisibleCharacters() const 556 { 557 checkClassBinding!(typeof(this))(); 558 return ptrcall!(long)(_classBinding.getVisibleCharacters, _godot_object); 559 } 560 /** 561 562 */ 563 void setPercentVisible(in double percent_visible) 564 { 565 checkClassBinding!(typeof(this))(); 566 ptrcall!(void)(_classBinding.setPercentVisible, _godot_object, percent_visible); 567 } 568 /** 569 570 */ 571 double getPercentVisible() const 572 { 573 checkClassBinding!(typeof(this))(); 574 return ptrcall!(double)(_classBinding.getPercentVisible, _godot_object); 575 } 576 /** 577 Returns the total number of characters from text tags. Does not include bbcodes. 578 */ 579 long getTotalCharacterCount() const 580 { 581 checkClassBinding!(typeof(this))(); 582 return ptrcall!(long)(_classBinding.getTotalCharacterCount, _godot_object); 583 } 584 /** 585 586 */ 587 void setUseBbcode(in bool enable) 588 { 589 checkClassBinding!(typeof(this))(); 590 ptrcall!(void)(_classBinding.setUseBbcode, _godot_object, enable); 591 } 592 /** 593 594 */ 595 bool isUsingBbcode() const 596 { 597 checkClassBinding!(typeof(this))(); 598 return ptrcall!(bool)(_classBinding.isUsingBbcode, _godot_object); 599 } 600 /** 601 Returns the total number of newlines in the tag stack's text tags. Considers wrapped text as one line. 602 */ 603 long getLineCount() const 604 { 605 checkClassBinding!(typeof(this))(); 606 return ptrcall!(long)(_classBinding.getLineCount, _godot_object); 607 } 608 /** 609 Returns the number of visible lines. 610 */ 611 long getVisibleLineCount() const 612 { 613 checkClassBinding!(typeof(this))(); 614 return ptrcall!(long)(_classBinding.getVisibleLineCount, _godot_object); 615 } 616 /** 617 Returns the height of the content. 618 */ 619 long getContentHeight() 620 { 621 checkClassBinding!(typeof(this))(); 622 return ptrcall!(long)(_classBinding.getContentHeight, _godot_object); 623 } 624 /** 625 If `true` the label uses BBCode formatting. Default value: `false`. 626 */ 627 @property bool bbcodeEnabled() 628 { 629 return isUsingBbcode(); 630 } 631 /// ditto 632 @property void bbcodeEnabled(bool v) 633 { 634 setUseBbcode(v); 635 } 636 /** 637 The label's text in BBCode format. Is not representative of manual modifications to the internal tag stack. Erases changes made by other methods when edited. 638 */ 639 @property String bbcodeText() 640 { 641 return getBbcode(); 642 } 643 /// ditto 644 @property void bbcodeText(String v) 645 { 646 setBbcode(v); 647 } 648 /** 649 The restricted number of characters to display in the label. 650 */ 651 @property long visibleCharacters() 652 { 653 return getVisibleCharacters(); 654 } 655 /// ditto 656 @property void visibleCharacters(long v) 657 { 658 setVisibleCharacters(v); 659 } 660 /** 661 The text's visibility, as a $(D double) between 0.0 and 1.0. 662 */ 663 @property double percentVisible() 664 { 665 return getPercentVisible(); 666 } 667 /// ditto 668 @property void percentVisible(double v) 669 { 670 setPercentVisible(v); 671 } 672 /** 673 If `true`, the label underlines meta tags such as $(D url){text}$(D /url). Default value: `true`. 674 */ 675 @property bool metaUnderlined() 676 { 677 return isMetaUnderlined(); 678 } 679 /// ditto 680 @property void metaUnderlined(bool v) 681 { 682 setMetaUnderline(v); 683 } 684 /** 685 The number of spaces associated with a single tab length. Does not affect "\t" in text tags, only indent tags. 686 */ 687 @property long tabSize() 688 { 689 return getTabSize(); 690 } 691 /// ditto 692 @property void tabSize(long v) 693 { 694 setTabSize(v); 695 } 696 /** 697 The raw text of the label. 698 When set, clears the tag stack and adds a raw text tag to the top of it. Does not parse bbcodes. Does not modify $(D bbcodeText). 699 */ 700 @property String text() 701 { 702 return getText(); 703 } 704 /// ditto 705 @property void text(String v) 706 { 707 setText(v); 708 } 709 /** 710 If `true`, the scrollbar is visible. Does not block scrolling completely. See $(D scrollToLine). Default value: `true`. 711 */ 712 @property bool scrollActive() 713 { 714 return isScrollActive(); 715 } 716 /// ditto 717 @property void scrollActive(bool v) 718 { 719 setScrollActive(v); 720 } 721 /** 722 If `true`, the window scrolls down to display new content automatically. Default value: `false`. 723 */ 724 @property bool scrollFollowing() 725 { 726 return isScrollFollowing(); 727 } 728 /// ditto 729 @property void scrollFollowing(bool v) 730 { 731 setScrollFollow(v); 732 } 733 /** 734 If `true`, the label allows text selection. 735 */ 736 @property bool selectionEnabled() 737 { 738 return isSelectionEnabled(); 739 } 740 /// ditto 741 @property void selectionEnabled(bool v) 742 { 743 setSelectionEnabled(v); 744 } 745 /** 746 If `true` the label uses the custom font color. Default value: `false`. 747 */ 748 @property bool overrideSelectedFontColor() 749 { 750 return isOverridingSelectedFontColor(); 751 } 752 /// ditto 753 @property void overrideSelectedFontColor(bool v) 754 { 755 setOverrideSelectedFontColor(v); 756 } 757 }