diff options
| author | Pietro Gagliardi <[email protected]> | 2018-08-19 12:05:52 -0400 |
|---|---|---|
| committer | Pietro Gagliardi <[email protected]> | 2018-08-19 12:05:52 -0400 |
| commit | e8dd3305ef447cfe62eff35b41dc088acdf3225e (patch) | |
| tree | 6b2e6b142f728487597864952f4d578a8c98a3e6 /drawtext.go | |
| parent | 89353fffd35205e9238b92ac44f08f23d93a5c0d (diff) | |
Converted AttributedString.
Diffstat (limited to 'drawtext.go')
| -rw-r--r-- | drawtext.go | 138 |
1 files changed, 64 insertions, 74 deletions
diff --git a/drawtext.go b/drawtext.go index a51f325..047e83a 100644 --- a/drawtext.go +++ b/drawtext.go @@ -343,10 +343,8 @@ func attributeFromLibui(a *C.uiAttribute) Attribute { panic("unreachable") } -///////// TODOTODO - -// uiAttributedString represents a string of UTF-8 text that can -// optionally be embellished with formatting attributes. libui +// AttributedString represents a string of UTF-8 text that can +// optionally be embellished with formatting attributes. Package ui // provides the list of formatting attributes, which cover common // formatting traits like boldface and color as well as advanced // typographical features provided by OpenType like superscripts @@ -360,97 +358,89 @@ func attributeFromLibui(a *C.uiAttribute) Attribute { // do not split each other apart, but different values of the same // attribute type do. // -// The empty string can also be represented by uiAttributedString, +// The empty string can also be represented by AttributedString, // but because of the no-zero-length-attribute rule, it will not have // attributes. // -// A uiAttributedString takes ownership of all attributes given to -// it, as it may need to duplicate or delete uiAttribute objects at -// any time. By extension, when you free a uiAttributedString, -// all uiAttributes within will also be freed. Each method will -// describe its own rules in more details. +// Unlike Go strings, AttributedStrings are mutable. +// +// AttributedString allocates resources within libui, which package +// ui sits on top of. As such, when you are finished with an +// AttributedString, you must free it with Free. Like other things in +// package ui, AttributedString must only be used from the main +// goroutine. // -// In addition, uiAttributedString provides facilities for moving +// In addition, AttributedString provides facilities for moving // between grapheme clusters, which represent a character // from the point of view of the end user. The cursor of a text editor // is always placed on a grapheme boundary, so you can use these // features to move the cursor left or right by one "character". // TODO does uiAttributedString itself need this // -// uiAttributedString does not provide enough information to be able -// to draw itself onto a uiDrawContext or respond to user actions. -// In order to do that, you'll need to use a uiDrawTextLayout, which -// is built from the combination of a uiAttributedString and a set of +// AttributedString does not provide enough information to be able +// to draw itself onto a DrawContext or respond to user actions. +// In order to do that, you'll need to use a DrawTextLayout, which +// is built from the combination of an AttributedString and a set of // layout-specific properties. -typedef struct uiAttributedString uiAttributedString; - -// uiAttributedStringForEachAttributeFunc is the type of the function -// invoked by uiAttributedStringForEachAttribute() for every -// attribute in s. Refer to that function's documentation for more -// details. -typedef uiForEach (*uiAttributedStringForEachAttributeFunc)(const uiAttributedString *s, const uiAttribute *a, size_t start, size_t end, void *data); +type AttributedString struct { + s *C.uiAttributedString +} -// @role uiAttributedString constructor -// uiNewAttributedString() creates a new uiAttributedString from +// NewAttributedString creates a new AttributedString from // initialString. The string will be entirely unattributed. -_UI_EXTERN uiAttributedString *uiNewAttributedString(const char *initialString); - -// @role uiAttributedString destructor -// uiFreeAttributedString() destroys the uiAttributedString s. -// It will also free all uiAttributes within. -_UI_EXTERN void uiFreeAttributedString(uiAttributedString *s); - -// uiAttributedStringString() returns the textual content of s as a -// '\0'-terminated UTF-8 string. The returned pointer is valid until -// the next change to the textual content of s. -_UI_EXTERN const char *uiAttributedStringString(const uiAttributedString *s); - -// uiAttributedStringLength() returns the number of UTF-8 bytes in -// the textual content of s, excluding the terminating '\0'. -_UI_EXTERN size_t uiAttributedStringLen(const uiAttributedString *s); - -// uiAttributedStringAppendUnattributed() adds the '\0'-terminated -// UTF-8 string str to the end of s. The new substring will be -// unattributed. -_UI_EXTERN void uiAttributedStringAppendUnattributed(uiAttributedString *s, const char *str); - -// uiAttributedStringInsertAtUnattributed() adds the '\0'-terminated -// UTF-8 string str to s at the byte position specified by at. The new -// substring will be unattributed; existing attributes will be moved -// along with their text. -_UI_EXTERN void uiAttributedStringInsertAtUnattributed(uiAttributedString *s, const char *str, size_t at); +func NewAttributedString(initialString string) *AttributedString { + cs := C.CString(initialString) + defer freestr(cs) + return &AttributedString{ + s: C.uiNewAttributedString(cs), + } +} -// TODO add the Append and InsertAtExtendingAttributes functions -// TODO and add functions that take a string + length +// Free destroys s. +func (s *AttributedString) Free() { + C.uiFreeAttributedString(s.s) +} -// uiAttributedStringDelete() deletes the characters and attributes of -// s in the byte range [start, end). -_UI_EXTERN void uiAttributedStringDelete(uiAttributedString *s, size_t start, size_t end); +// String returns the textual content of s. +func (s *AttributedString) String() string { + return C.GoString(C.uiAttributedStringString(s.s)) +} -// TODO add a function to uiAttributedString to get an attribute's value at a specific index or in a specific range, so we can edit +// AppendUnattributed adds str to the end of s. The new substring +// will be unattributed. +func (s *AttributedString) AppendUnattributed(str string) { + cs := C.CString(str) + defer freestr(cs) + C.uiAttributedStringAppendUnattributed(s.s, cs) +} -// uiAttributedStringSetAttribute() sets a in the byte range [start, end) -// of s. Any existing attributes in that byte range of the same type are -// removed. s takes ownership of a; you should not use it after -// uiAttributedStringSetAttribute() returns. -_UI_EXTERN void uiAttributedStringSetAttribute(uiAttributedString *s, uiAttribute *a, size_t start, size_t end); +// InsertAtUnattributed adds str to s at the byte position specified by +// at. The new substring will be unattributed; existing attributes will +// be moved along with their text. +func (s *AttributedString) InsertAtUnattributed(str string, at int) { + cs := C.CString(str) + defer freestr(cs) + C.uiAttributedStringInsertAtUnattributed(s.s, cs, C.size_t(at)) +} -// uiAttributedStringForEachAttribute() enumerates all the -// uiAttributes in s. It is an error to modify s in f. Within f, s still -// owns the attribute; you can neither free it nor save it for later -// use. -// TODO reword the above for consistency (TODO and find out what I meant by that) -// TODO define an enumeration order (or mark it as undefined); also define how consecutive runs of identical attributes are handled here and sync with the definition of uiAttributedString itself -_UI_EXTERN void uiAttributedStringForEachAttribute(const uiAttributedString *s, uiAttributedStringForEachAttributeFunc f, void *data); +// Delete deletes the characters and attributes of s in the byte range +// [start, end). +func (s *AttributedString) Delete(start, end int) { + C.uiAttributedStringDelete(s.s, C.size_t(start), C.size_t(end)) +} -// TODO const correct this somehow (the implementation needs to mutate the structure) -_UI_EXTERN size_t uiAttributedStringNumGraphemes(uiAttributedString *s); +// SetAttribute sets a in the byte range [start, end) of s. Any existing +// attributes in that byte range of the same type are removed. +func (s *AttributedString) SetAttribute(a Attribute, start, end int) { + C.uiAttributedStringSetAttribute(s.s, a.toLibui(), C.size_t(start), C.size_t(end)) +} -// TODO const correct this somehow (the implementation needs to mutate the structure) -_UI_EXTERN size_t uiAttributedStringByteIndexToGrapheme(uiAttributedString *s, size_t pos); +// TODO uiAttributedStringForEachAttribute +// TODO uiAttributedStringNumGraphemes +// TODO uiAttributedStringByteIndexToGrapheme +// TODO uiAttributedStringGraphemeToByteIndex -// TODO const correct this somehow (the implementation needs to mutate the structure) -_UI_EXTERN size_t uiAttributedStringGraphemeToByteIndex(uiAttributedString *s, size_t pos); +//////// TODOTODO // uiFontDescriptor provides a complete description of a font where // one is needed. Currently, this means as the default font of a |
