mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-17 20:23:47 -04:00
pgui refinements
This commit is contained in:
parent
51ef307c21
commit
b247c9d913
@ -58,6 +58,7 @@ PGEntry(const string &name) :
|
||||
_accept_enabled = true;
|
||||
_last_text_def = (TextNode *)NULL;
|
||||
_text_geom_stale = true;
|
||||
_text_geom_flattened = true;
|
||||
_blink_start = 0.0f;
|
||||
_blink_rate = 1.0f;
|
||||
|
||||
@ -110,6 +111,7 @@ PGEntry(const PGEntry ©) :
|
||||
_cursor_stale = true;
|
||||
_last_text_def = (TextNode *)NULL;
|
||||
_text_geom_stale = true;
|
||||
_text_geom_flattened = true;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
@ -684,17 +686,26 @@ update_text() {
|
||||
TextProperties inactive = tp_mgr->get_properties(_candidate_inactive);
|
||||
TextProperties active = tp_mgr->get_properties(_candidate_active);
|
||||
|
||||
// Create a special TextAssembler to insert the candidate string
|
||||
// in its own special colors.
|
||||
// Insert the complex sequence of characters required to show
|
||||
// the candidate string in a different color. This gets
|
||||
// inserted at the current cursor position.
|
||||
wstring cseq;
|
||||
cseq += wstring(1, (wchar_t)text_push_properties_key);
|
||||
cseq += node->decode_text(_candidate_inactive);
|
||||
cseq += wstring(1, (wchar_t)text_push_properties_key);
|
||||
cseq += _candidate_wtext.substr(0, _candidate_highlight_start);
|
||||
cseq += wstring(1, (wchar_t)text_push_properties_key);
|
||||
cseq += node->decode_text(_candidate_active);
|
||||
cseq += wstring(1, (wchar_t)text_push_properties_key);
|
||||
cseq += _candidate_wtext.substr(_candidate_highlight_start,
|
||||
_candidate_highlight_end - _candidate_highlight_start);
|
||||
cseq += wstring(1, (wchar_t)text_pop_properties_key);
|
||||
cseq += _candidate_wtext.substr(_candidate_highlight_end);
|
||||
cseq += wstring(1, (wchar_t)text_pop_properties_key);
|
||||
|
||||
// Create a special TextAssembler to insert the candidate string.
|
||||
TextAssembler ctext(_text);
|
||||
ctext.set_wsubstr(_candidate_wtext.substr(_candidate_highlight_end),
|
||||
_cursor_position, 0, inactive);
|
||||
ctext.set_wsubstr(_candidate_wtext.substr(_candidate_highlight_start,
|
||||
_candidate_highlight_end - _candidate_highlight_start),
|
||||
_cursor_position, 0, active);
|
||||
ctext.set_wsubstr(_candidate_wtext.substr(0, _candidate_highlight_start),
|
||||
_cursor_position, 0, inactive);
|
||||
ctext.set_wsubstr(cseq, _cursor_position, 0);
|
||||
assembled = ctext.assemble_text();
|
||||
}
|
||||
|
||||
@ -705,8 +716,16 @@ update_text() {
|
||||
_current_text =
|
||||
_text_render_root.attach_new_node(assembled);
|
||||
_text_geom_stale = false;
|
||||
_text_geom_flattened = false;
|
||||
_cursor_stale = true;
|
||||
}
|
||||
|
||||
// We'll flatten the text geometry only if we don't have focus.
|
||||
// Otherwise, we assume the user may be changing it frequently.
|
||||
if (!get_focus() && !_text_geom_flattened) {
|
||||
_current_text.flatten_strong();
|
||||
_text_geom_flattened = true;
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
@ -172,6 +172,7 @@ private:
|
||||
NodePath _current_text;
|
||||
TextNode *_last_text_def;
|
||||
bool _text_geom_stale;
|
||||
bool _text_geom_flattened;
|
||||
|
||||
// This is the node that represents the cursor geometry. It is also
|
||||
// attached to the above node, and is transformed around and/or
|
||||
|
@ -193,38 +193,27 @@ set_wtext(const wstring &wtext) {
|
||||
//
|
||||
// The substring may include nested formatting
|
||||
// characters, but they must be self-contained and
|
||||
// self-closed. The indicated TextProperties specifies
|
||||
// the default TextProperties to apply to the substring;
|
||||
// it layers on top of the default TextProperties for
|
||||
// the overall string specified via set_properties().
|
||||
// self-closed. The formatting characters are not
|
||||
// literally saved in the internal string; they are
|
||||
// parsed at the time of the set_wsubstr() call.
|
||||
//
|
||||
// The return value is true if all the text is accepted,
|
||||
// or false if some was truncated (see set_max_rows()).
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool TextAssembler::
|
||||
set_wsubstr(const wstring &wtext, int start, int count,
|
||||
const TextProperties &properties) {
|
||||
set_wsubstr(const wstring &wtext, int start, int count) {
|
||||
nassertr(start >= 0 && start <= (int)_text_string.size(), false);
|
||||
nassertr(count >= 0 && start + count <= (int)_text_string.size(), false);
|
||||
|
||||
PT(ComputedProperties) substr_cprops = _initial_cprops;
|
||||
if (properties.is_any_specified()) {
|
||||
TextProperties new_properties = get_properties();
|
||||
new_properties.add_properties(properties);
|
||||
if (substr_cprops->_properties != new_properties) {
|
||||
substr_cprops = new ComputedProperties(new_properties);
|
||||
}
|
||||
}
|
||||
|
||||
// Use scan_wtext to unroll the substring we wish to insert, as in
|
||||
// set_wtext(), above.
|
||||
TextString substr;
|
||||
wstring::const_iterator si = wtext.begin();
|
||||
scan_wtext(substr, si, wtext.end(), substr_cprops);
|
||||
scan_wtext(substr, si, wtext.end(), _initial_cprops);
|
||||
while (si != wtext.end()) {
|
||||
text_cat.warning()
|
||||
<< "pop_properties encountered without preceding push_properties.\n";
|
||||
scan_wtext(substr, si, wtext.end(), substr_cprops);
|
||||
scan_wtext(substr, si, wtext.end(), _initial_cprops);
|
||||
}
|
||||
|
||||
_text_string.erase(_text_string.begin() + start, _text_string.begin() + start + count);
|
||||
|
@ -62,8 +62,7 @@ PUBLISHED:
|
||||
INLINE const TextProperties &get_properties() const;
|
||||
|
||||
bool set_wtext(const wstring &wtext);
|
||||
bool set_wsubstr(const wstring &wtext, int start, int count,
|
||||
const TextProperties &properties = TextProperties());
|
||||
bool set_wsubstr(const wstring &wtext, int start, int count);
|
||||
|
||||
wstring get_plain_wtext() const;
|
||||
wstring get_wordwrapped_plain_wtext() const;
|
||||
|
Loading…
x
Reference in New Issue
Block a user