docs: Strengthen docs for Copy&Paste and Drag&Drop
Including Eina.Content And a typo/bugfix in ecore_evas_x. Reviewed-by: Mike Blumenkrantz <michael.blumenkrantz@gmail.com> Differential Revision: https://phab.enlightenment.org/D11204
This commit is contained in:
parent
7dd92a2d98
commit
645c3d41eb
|
@ -3695,8 +3695,6 @@ typedef void (*Ecore_Evas_Selection_Changed_Cb)(Ecore_Evas *ee, unsigned int sea
|
|||
* Only one such callback can exist for each Ecore_Evas. Calling this method multiple
|
||||
* times overwrites previous functions. Use a NULL @p func to stop being notified.
|
||||
*
|
||||
* You will not be notified about selection changes caused by yourself. (TODO: bu5hm4n?)
|
||||
*
|
||||
* @warning If and when this function is called depends on the underlying
|
||||
* windowing system.
|
||||
*/
|
||||
|
|
|
@ -4,22 +4,22 @@
|
|||
|
||||
/**
|
||||
* @typedef Eina_Content
|
||||
* Defines a abstract content segment
|
||||
* Container for any type of content.
|
||||
*
|
||||
* Each Abstract content contains out of a Eina_Slice of memory. And a type.
|
||||
* The type are IANA meme types.
|
||||
* Each Eina_Content is made of an Eina_Slice of memory and an IANA MIME type:
|
||||
* https://www.iana.org/assignments/media-types/media-types.xhtml
|
||||
*
|
||||
* @note if the type is a text-style type, the last byte of the slice must be \0
|
||||
* @note If the type is any kind of text the last byte of the slice must be \0.
|
||||
*
|
||||
* @since 1.24
|
||||
*/
|
||||
typedef struct _Eina_Content Eina_Content;
|
||||
|
||||
/**
|
||||
* @typedef Eina_Content_Convertion_Callback
|
||||
* @typedef Eina_Content_Conversion_Callback
|
||||
*
|
||||
* Callback called when convertion from one type to another type is requested.
|
||||
* The from and to type is specified when the callback is registered.
|
||||
* Method called when conversion from one type to another is requested.
|
||||
* The from and to types are specified when the callback is registered.
|
||||
* The to type is also passed in the callback here.
|
||||
* The type of the from pointer does not need to be checked.
|
||||
*/
|
||||
|
@ -38,7 +38,7 @@ EAPI const char* eina_content_as_file(Eina_Content *content);
|
|||
/**
|
||||
* Convert the content of the object to another type.
|
||||
*
|
||||
* In case the convertion cannot be performaned, NULL is returned.
|
||||
* In case the conversion cannot be performed, NULL is returned.
|
||||
*
|
||||
* @param[in] content The content to convert.
|
||||
* @param[in] new_type The new type the returned content will have.
|
||||
|
@ -57,19 +57,19 @@ EAPI Eina_Content* eina_content_convert(Eina_Content *content, const char *new_t
|
|||
EAPI const char* eina_content_type_get(Eina_Content *content);
|
||||
|
||||
/**
|
||||
* Get the type of the passed content.
|
||||
* Get the Eina_Slice of the passed content.
|
||||
*
|
||||
* @param[in] content The content to fetch the type from.
|
||||
* @param[in] content The content to fetch the data from.
|
||||
*
|
||||
* @return The path to the file. Do not free this.
|
||||
* @return An Eina_Slice containing the data. Do not free.
|
||||
*/
|
||||
EAPI const Eina_Slice eina_content_data_get(Eina_Content *content);
|
||||
|
||||
/**
|
||||
* Create a new content object, with the slice of data with a specific type.
|
||||
* Create a new content object, with the provided data and type.
|
||||
*
|
||||
* @param[in] data A slice of memory, the memory is duplicated.
|
||||
* @param[in] type The type of memory.
|
||||
* @param[in] data A slice of memory. The memory is copied.
|
||||
* @param[in] type The type this data represents.
|
||||
*
|
||||
* @return The new content object. The caller owns this object.
|
||||
*/
|
||||
|
@ -85,62 +85,62 @@ EAPI void eina_content_free(Eina_Content *content);
|
|||
/**
|
||||
* Register a new conversion callback.
|
||||
*
|
||||
* @param[in] from The tyoe you convert from.
|
||||
* @param[in] in The type you convert to.
|
||||
* @param[in] from The type to convert from.
|
||||
* @param[in] to The type to convert to.
|
||||
*
|
||||
* @return True on success false otherwise.
|
||||
* @return True if the callback was successfully registered.
|
||||
*/
|
||||
EAPI Eina_Bool eina_content_converter_conversion_register(const char *from, const char *to, Eina_Content_Conversion_Callback convertion);
|
||||
|
||||
/**
|
||||
* Check if a specific convertion can be performanced.
|
||||
* Check if a specific conversion can be performed.
|
||||
*
|
||||
* A convertion can only be performed if a callback is registered.
|
||||
* A conversion can only be performed if a callback is registered.
|
||||
*
|
||||
* @param[in] from The type you convert from.
|
||||
* @param[in] in The type you convert to.
|
||||
* @param[in] from The type to convert from.
|
||||
* @param[in] to The type to convert to.
|
||||
*
|
||||
* @return True if it can be performed, false if not.
|
||||
* @return True if the conversion can be performed.
|
||||
*/
|
||||
EAPI Eina_Bool eina_content_converter_convert_can(const char *from, const char *to);
|
||||
|
||||
/**
|
||||
* Returns a iterator that can be used to find all the possible types that can be converted to.
|
||||
* Returns an iterator containing all the target types that the provided source type can be converted to.
|
||||
*
|
||||
* @param[in] form The type you convert from
|
||||
* @param[in] from The type to convert from.
|
||||
*
|
||||
* @return A Iterator, containing strings, free this via eina_iterator_free.
|
||||
* @return An Iterator containing MIME type strings. Free this via eina_iterator_free.
|
||||
*/
|
||||
EAPI Eina_Iterator* eina_content_converter_possible_conversions(const char *from);
|
||||
|
||||
EAPI extern const Eina_Value_Type *EINA_VALUE_TYPE_CONTENT;
|
||||
|
||||
/**
|
||||
* Convert the Eina_Content object to a Eina_Value.
|
||||
* Convert the Eina_Content object to an Eina_Value.
|
||||
*
|
||||
* @param[in] content The Eina_Content struct that will be converted to a Eina_Value
|
||||
* @param[in] content The Eina_Content struct that will be converted to an Eina_Value.
|
||||
*
|
||||
* @return A Eina_Value that is allocated, you need to free it.
|
||||
* @return An newly-allocated Eina_Value. Caller owns it.
|
||||
*/
|
||||
EAPI Eina_Value* eina_value_content_new(Eina_Content *content);
|
||||
|
||||
/**
|
||||
* Convert the Eina_Content object to a Eina_Value.
|
||||
* Creates an Eina_Value from an Eina_Content.
|
||||
*
|
||||
* @param[in] content The Eina_Content struct that will be converted to a Eina_Value
|
||||
* @param[in] content The Eina_Content struct that will be converted to an Eina_Value.
|
||||
*
|
||||
* @return A Eina_Value with type EINA_VALUE_TYPE_CONTENT
|
||||
* @return An Eina_Value with type EINA_VALUE_TYPE_CONTENT.
|
||||
*/
|
||||
EAPI Eina_Value eina_value_content_init(Eina_Content *content);
|
||||
|
||||
/**
|
||||
* Get the content from the Eina_Value
|
||||
* Gets the content from the Eina_Value.
|
||||
*
|
||||
* If the value is not of the type EINA_VALUE_TYPE_CONTENT, NULL will be returned and a error will be printed.
|
||||
* If the value is not of the type EINA_VALUE_TYPE_CONTENT, NULL will be returned and an error will be printed.
|
||||
*
|
||||
* @param[in] value The value to get the content from
|
||||
*
|
||||
* @return A allocated Eina_Content, you need to free it.
|
||||
* @return A newly-allocated Eina_Content. Caller owns it.
|
||||
*/
|
||||
EAPI Eina_Content* eina_value_to_content(const Eina_Value *value);
|
||||
|
||||
|
|
|
@ -1,63 +1,89 @@
|
|||
import eina_types;
|
||||
|
||||
struct @beta Efl.Ui.Drop_Event {
|
||||
[[Event struct that contains information about what is avaiable at which position, in which seat]]
|
||||
position : Eina.Position2D; [[The position of the Drop event]]
|
||||
seat : uint; [[In which seat it is happening]]
|
||||
available_types : accessor<string>; [[which types are avaiable, you should use one of these for a call to @Efl.Ui.Dnd.drop_data_get ]]
|
||||
[[Information sent along with Drag & Drop events.]]
|
||||
position : Eina.Position2D; [[The position where the drop event occurred, in window coordinates.]]
|
||||
seat : uint; [[Which seat triggered the event.]]
|
||||
available_types : accessor<string>; [[Types with automatic conversion available. Use one of them in the call to
|
||||
@Efl.Ui.Dnd.drop_data_get.
|
||||
|
||||
Types are IANA MIME types:
|
||||
https://www.iana.org/assignments/media-types/media-types.xhtml
|
||||
]]
|
||||
}
|
||||
|
||||
struct @beta Efl.Ui.Drop_Dropped_Event {
|
||||
dnd : Efl.Ui.Drop_Event; [[The overall information]]
|
||||
action : string; [[The action the client should take]]
|
||||
[[Information sent along with Drop events.]]
|
||||
dnd : Efl.Ui.Drop_Event; [[Common information.]]
|
||||
action : string; [[Requested action to perform upon reception of this data.]]
|
||||
}
|
||||
|
||||
struct @beta Efl.Ui.Drag_Started_Event {
|
||||
seat : uint;
|
||||
[[Information sent along with @Efl.Ui.Drag_Started_Event events.]]
|
||||
seat : uint; [[Which seat triggered the event.]]
|
||||
}
|
||||
|
||||
struct @beta Efl.Ui.Drag_Finished_Event {
|
||||
seat : uint;
|
||||
accepted : bool;
|
||||
[[Information sent along with @Efl.Ui.Drag_Finished_Event events.]]
|
||||
seat : uint; [[Which seat triggered the event.]]
|
||||
accepted : bool; [[$true if the operation completed with a Drop, or $false if it was cancelled.]]
|
||||
}
|
||||
|
||||
mixin @beta Efl.Ui.Dnd requires Efl.Object {
|
||||
[[This mixin provides the ability to interact with the system's Drag & Drop facilities.
|
||||
|
||||
Applications starting a Drag & Drop operation operation are said to perform a "Drag" and use
|
||||
the methods prefixed "drag_".
|
||||
On the other hand, applications receiving dragged content are said to perform a "Drop" operation and use
|
||||
the methods prefixed "drop_".
|
||||
]]
|
||||
methods {
|
||||
drag_start {
|
||||
[[Start a drag from this client.
|
||||
[[Starts a drag from this client.
|
||||
|
||||
@[Efl.Ui.Dnd.drag,started] will be emitted each time a successfull drag will be started.
|
||||
@[Efl.Ui.Dnd.drag,finished] will be emitted every time a drag is finished.
|
||||
@[Efl.Ui.Dnd.drag,started] is emitted each time a successful drag is started.
|
||||
@[Efl.Ui.Dnd.drag,finished] is emitted every time a drag is finished.
|
||||
]]
|
||||
params {
|
||||
content : Eina.Content @by_ref; [[The content you want to provide via dnd]]
|
||||
@in action: string; [[Action when data is transferred]]
|
||||
@in seat: uint; [[Specified seat for multiple seats case.]]
|
||||
content : Eina.Content @by_ref; [[The content being dragged.]]
|
||||
@in action: string; [[Requested action to perform by the receiver once content is transferred.]]
|
||||
@in seat: uint; [[Seat starting the drag operation. When in doubt use 0.]]
|
||||
}
|
||||
return : Efl.Content; [[A UI element where you can just set your visual representation into]]
|
||||
return : Efl.Content; [[An Efl.Ui element which you can use to render a visual representation
|
||||
of the content being dragged (like a thumbnail, for example).
|
||||
Use @Efl.Content.content.set on it to do so.]]
|
||||
}
|
||||
drag_cancel {
|
||||
[[Cancel the on-going drag]]
|
||||
[[Cancels an on-going drag operation.]]
|
||||
params {
|
||||
@in seat: uint; [[Specified seat for multiple seats case.]]
|
||||
@in seat: uint; [[Seat that started the drag operation. When in doubt use 0.]]
|
||||
}
|
||||
}
|
||||
drop_data_get {
|
||||
[[Get the data from the object that has selection]]
|
||||
[[Retrieves the dropped data.]]
|
||||
params {
|
||||
seat : uint; [[Specified seat for multiple seats case.]]
|
||||
acceptable_types : iterator<string>; [[The types that are acceptable for you]]
|
||||
@in seat: uint; [[Seat that started the drag operation. When in doubt use 0.]]
|
||||
@in acceptable_types : iterator<string>; [[List of strings describing the type of content the application
|
||||
can accept. Types are IANA MIME types:
|
||||
https://www.iana.org/assignments/media-types/media-types.xhtml.]]
|
||||
}
|
||||
return : future<Eina.Content> @move; [[fullfilled when the content is transmitted, and ready to use]]
|
||||
return : future<Eina.Content> @move; [[This future is fulfilled when the content is received (asynchronously)
|
||||
and ready to use.
|
||||
The Eina.Content specifies the type of the data.
|
||||
If no matching type was found it returns an error.
|
||||
]]
|
||||
}
|
||||
}
|
||||
events {
|
||||
drop,entered : Efl.Ui.Drop_Event;
|
||||
drop,left : Efl.Ui.Drop_Event;
|
||||
drop,position,changed : Efl.Ui.Drop_Event;
|
||||
drop,dropped : Efl.Ui.Drop_Dropped_Event;
|
||||
drag,started : Efl.Ui.Drag_Started_Event;
|
||||
drag,finished : Efl.Ui.Drag_Finished_Event;
|
||||
drop,entered : Efl.Ui.Drop_Event; [[Dragged content entered the window. Its type can already be checked with
|
||||
@.drop_data_get to react before it is dropped, for example.]]
|
||||
drop,left : Efl.Ui.Drop_Event; [[Dragged content left the window.]]
|
||||
drop,position,changed : Efl.Ui.Drop_Event; [[Dragged content moved over the window. Its type can already be
|
||||
checked with @.drop_data_get to react before it is dropped,
|
||||
for example.]]
|
||||
drop,dropped : Efl.Ui.Drop_Dropped_Event; [[Dragged content was dropped over the window.]]
|
||||
drag,started : Efl.Ui.Drag_Started_Event; [[A Drag operation started.]]
|
||||
drag,finished : Efl.Ui.Drag_Finished_Event;[[A Drag operation finished.]]
|
||||
}
|
||||
implements {
|
||||
Efl.Object.constructor;
|
||||
|
|
|
@ -1,49 +1,76 @@
|
|||
import eina_types;
|
||||
|
||||
enum @beta Efl.Ui.Cnp_Buffer{
|
||||
selection = 0,
|
||||
copy_and_paste = 1,
|
||||
enum @beta Efl.Ui.Cnp_Buffer {
|
||||
[[System buffer to use in Copy & Paste operations.]]
|
||||
selection = 0, [[Buffer typically used when the user selects (highlights) some text without explicitly
|
||||
requesting to copy it.]]
|
||||
copy_and_paste = 1, [[Buffer used when the user requests that the current selection is copied (using
|
||||
Ctrl+C, for example).]]
|
||||
}
|
||||
|
||||
struct @beta Efl.Ui.Wm_Selection_Changed {
|
||||
buffer : Efl.Ui.Cnp_Buffer;
|
||||
caused_by : Efl.Ui.Selection;
|
||||
seat : uint;
|
||||
[[Information sent along the @[Efl.Ui.Selection.wm_selection,changed] event.]]
|
||||
buffer : Efl.Ui.Cnp_Buffer; [[The system buffer that has changed.]]
|
||||
caused_by : Efl.Ui.Selection; [[The EFL widget that triggered the change. $NULL if it is not an EFL widget.]]
|
||||
seat : uint; [[The seat that triggered the change.]]
|
||||
}
|
||||
|
||||
mixin @beta Efl.Ui.Selection requires Efl.Object {
|
||||
[[This mixin provides the ability to interact with the system's Copy & Paste facilities.
|
||||
]]
|
||||
methods {
|
||||
selection_set {
|
||||
[[Set the selection data to the object]]
|
||||
[[Sets the current selection.
|
||||
|
||||
This sends the selected data to the system's specified buffer, making it available to other
|
||||
applications for "pasting" it.
|
||||
|
||||
This is typically used when the user requests a "copy" operation.
|
||||
]]
|
||||
params {
|
||||
buffer : Efl.Ui.Cnp_Buffer;
|
||||
content : Eina.Content @by_ref;
|
||||
seat : uint;
|
||||
buffer : Efl.Ui.Cnp_Buffer; [[System buffer to use.]]
|
||||
content : Eina.Content @by_ref; [[Data to copy.]]
|
||||
seat : uint; [[Seat the data comes from. Use 0 when in doubt.]]
|
||||
}
|
||||
}
|
||||
selection_clear {
|
||||
[[Clear the selection data from the object]]
|
||||
[[Clears the current selection.
|
||||
|
||||
No data will be available to other applications to paste (until something else is selected).
|
||||
]]
|
||||
params {
|
||||
buffer : Efl.Ui.Cnp_Buffer;
|
||||
seat : uint;
|
||||
buffer : Efl.Ui.Cnp_Buffer; [[System buffer to clear.]]
|
||||
seat : uint; [[Seat to clear. Use 0 when in doubt.]]
|
||||
}
|
||||
}
|
||||
selection_get {
|
||||
[[Get the data from the object that has selection]]
|
||||
[[Retrieves the data currently held in the specified buffer.
|
||||
|
||||
This is typically used when the user requests a "paste" operation.
|
||||
|
||||
This method is time consuming (since data can potentially be provided by another application), therefore,
|
||||
it is recommended to verify the existence of a selection using @.has_selection before calling it.
|
||||
]]
|
||||
params {
|
||||
buffer : Efl.Ui.Cnp_Buffer;
|
||||
seat : uint;
|
||||
acceptable_types : iterator<string>;
|
||||
buffer : Efl.Ui.Cnp_Buffer; [[System buffer to use.]]
|
||||
seat : uint; [[Seat where the data should be pasted. Use 0 when in doubt.]]
|
||||
acceptable_types : iterator<string>; [[List of accepted IANA MIME types:
|
||||
https://www.iana.org/assignments/media-types/media-types.xhtml
|
||||
If automatic conversion cannot be provided to any of the accepted
|
||||
types, an error will be returned.
|
||||
]]
|
||||
}
|
||||
return : future<Eina.Content> @move;
|
||||
return : future<Eina.Content> @move; [[A future that will be resolved to the requested content, or to an
|
||||
error if type conversion is not available or the requested buffer
|
||||
is empty.]]
|
||||
}
|
||||
has_selection {
|
||||
[[Determine whether the selection data has owner]]
|
||||
[[Checks if the specified system buffer has content.]]
|
||||
params {
|
||||
buffer : Efl.Ui.Cnp_Buffer;
|
||||
seat : uint;
|
||||
buffer : Efl.Ui.Cnp_Buffer; [[System buffer to query.]]
|
||||
seat : uint; [[Seat to query. Use 0 when in doubt.]]
|
||||
}
|
||||
return : bool; [[$true if there is a available selection, $false if not]]
|
||||
return : bool; [[$true if there is data available in the requested buffer.]]
|
||||
}
|
||||
}
|
||||
implements {
|
||||
|
@ -52,6 +79,7 @@ mixin @beta Efl.Ui.Selection requires Efl.Object {
|
|||
Efl.Object.finalize;
|
||||
}
|
||||
events {
|
||||
wm_selection,changed : Efl.Ui.Wm_Selection_Changed;
|
||||
wm_selection,changed : Efl.Ui.Wm_Selection_Changed; [[Event emitted when the content of one of the system's
|
||||
buffers changes.]]
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,8 +1,13 @@
|
|||
enum Efl.Ui.Textbox_Cnp_Content {
|
||||
Nothing = 0, [[You can paste or drop nothing]]
|
||||
Text = 1, [[You can paste normal Text]]
|
||||
Markup = 3, [[You can paste Markup (Normal text is also just markup)]]
|
||||
Image = 4, [[You can paste Images]]
|
||||
enum @beta Efl.Ui.Textbox_Cnp_Content {
|
||||
[[What kind of content can be pasted into this widget using Copy & Paste or Drag & Drop functionality.
|
||||
|
||||
Multiple options can be OR-ed together.
|
||||
]]
|
||||
Nothing = 0, [[Nothing can be pasted or dropped into this widget.]]
|
||||
Text = 1, [[Plain text can be pasted or dropped into this widget.]]
|
||||
Markup = 3, [[Markup text can be pasted or dropped into this widget
|
||||
(This includes Plain text).]]
|
||||
Image = 4, [[Images can be pasted or dropped into this widget.]]
|
||||
}
|
||||
|
||||
class @beta Efl.Ui.Textbox extends Efl.Ui.Layout_Base implements Efl.Input.Clickable,
|
||||
|
@ -39,18 +44,16 @@ class @beta Efl.Ui.Textbox extends Efl.Ui.Layout_Base implements Efl.Input.Click
|
|||
}
|
||||
}
|
||||
@property cnp_dnd_mode @beta {
|
||||
[[Control pasting of text and images for the widget.
|
||||
[[Controls the type of content which can be pasted into the widget.
|
||||
|
||||
Normally the entry allows both text and images to be pasted.
|
||||
|
||||
Note: This only changes the behaviour of text.
|
||||
By default, both text and images are allowed..
|
||||
]]
|
||||
set {
|
||||
}
|
||||
get {
|
||||
}
|
||||
values {
|
||||
allowed_formats : Efl.Ui.Textbox_Cnp_Content; [[Format for cnp]]
|
||||
allowed_formats : Efl.Ui.Textbox_Cnp_Content; [[Allowed content types.]]
|
||||
}
|
||||
}
|
||||
@property selection_handles_enabled {
|
||||
|
|
|
@ -60,7 +60,16 @@ struct @extern Eina.Matrix3 {
|
|||
zz: double; [[ZZ value.]]
|
||||
}
|
||||
|
||||
struct @extern Eina.Content;
|
||||
struct @extern Eina.Content; [[
|
||||
Container for any type of content.
|
||||
|
||||
Each @Eina.Content is made of an @Eina.Slice of memory and an IANA MIME type:
|
||||
https://www.iana.org/assignments/media-types/media-types.xhtml
|
||||
|
||||
If the type is a text-style type, the last byte of the slice must be \0.
|
||||
|
||||
@since 1.24
|
||||
]]
|
||||
|
||||
struct @extern Eina.Matrix4 {
|
||||
[[A bidimensional array of floating point values with 4 rows and 4 columns.
|
||||
|
|
|
@ -3794,7 +3794,7 @@ _search_fitting_type(Ecore_Evas *ee, Ecore_Evas_Engine_Data_X11 *edata, Ecore_Ev
|
|||
if (mime_type == acceptable_type)
|
||||
HANDLE_TYPE()
|
||||
|
||||
//if there is no available type yet, check if we can convert to the desiared type via this type
|
||||
//if there is no available type yet, check if we can convert to the desired type via this type
|
||||
if (!found_conversion)
|
||||
{
|
||||
const char *convertion_type = NULL;
|
||||
|
|
Loading…
Reference in New Issue