summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPietro Gagliardi <[email protected]>2018-08-19 12:05:52 -0400
committerPietro Gagliardi <[email protected]>2018-08-19 12:05:52 -0400
commite8dd3305ef447cfe62eff35b41dc088acdf3225e (patch)
tree6b2e6b142f728487597864952f4d578a8c98a3e6
parent89353fffd35205e9238b92ac44f08f23d93a5c0d (diff)
Converted AttributedString.
-rw-r--r--drawtext.go138
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