Branch: refs/heads/master
  Home:   https://github.com/synfig/synfig
  Commit: 011a34cd29a6d506dbb07fdd1f3b8e893265db53
      
https://github.com/synfig/synfig/commit/011a34cd29a6d506dbb07fdd1f3b8e893265db53
  Author: rodolforg <rodolf...@users.noreply.github.com>
  Date:   2023-05-21 (Sun, 21 May 2023)

  Changed paths:
    M synfig-studio/src/gui/instance.cpp
    M synfig-studio/src/gui/pluginmanager.cpp
    M synfig-studio/src/gui/pluginmanager.h

  Log Message:
  -----------
  feat: plugins can  have simple dialog and receive current time and selected 
layer xpath (#2996)

Plugins can now present to user a simple (not dynamic) configuration dialog and 
can also get the current state of the canvas (current time and selected layers).

### Configuration dialog
The dialog, if provided by the plugin, will be shown every time before the 
plugin actually runs.
It is static: it will not enable/disable widget according to user interaction, 
neither validate data unless the widgets themselves perform validation.

#### How to provide the configuration dialog
Synfig Studio will automatically search for a file in the plugin script folder, 
with the same filename, except the extension, that must be ".ui".

- The .ui file must be in Glade format, as it will be constructed via 
Gtk::Builder.
- Synfig Studio runs on Gtk3, not Gtk4, so write a compatible .ui file.
- Currently, we prefer to support Gtk 3.18. For now, avoid widgets provided 
later than this version.
- The root widget of the .ui file will be embedded in a dialog with two 
buttons: OK and Cancel.
- The root widget MUST be have its ID set as "`dialog_contents`".
- The configuration fields MUST be named (set "name", not "ID"). Keep in mind 
that the field name will be used to identify the data to be passed to script; 
so, set a unique name to each one.
- Supported control widgets (i.e. their data will be passed to plugin script):
  - Entry,
  - ComboBox (use item id),
  - ComboBoxText (use item id),
  - SpinButton,
  - FileChooserButton (a single file per button, for now),
  - ColorButtonChooser,
  - FontButtonChooser (the font value will be in 
[PangoDescription](https://docs.gtk.org/Pango/type_func.FontDescription.from_string.html)
 format),
  - CheckButton,
  - Switch,
  - ToggleButton,
  - Scale,
  - ScaleButton,
  - SpinButton,
  - Volume,
  - AppChooserButton
- Currently it doesn't support RadioButton widget.
- You can use visual (e.g. Label) and helper (e.g. Containers) widgets freely.

#### How to get what was set by user on the configuration dialog

If the dialog exists and user presses its OK button, the plugin script will 
receive, as its **second** argument, a filename. 
If using Python, get it via `sys.argv[2]`.

The file contains a [JSON](https://json.org) dictionary. The dict entry named 
"dialog" contains a nested dictionary with the data provided/chosen by user. 
The file may contain extra data, such as the Canvas state, as described in next 
section.

The "dialog" dictionary is a list of key-value pair, being the key the widget 
name (not ID) and the value that one provided by user.
Notes:
- ComboBox(Text) value is the ID of selected item, not the text presented to 
user.
- Boolean values (e.g. CheckButton) are "1" or "0".
- All field values will be passed as strings.
- The data file is temporary: it will deleted as soon as plugins finish running 
(successfully or not)

##### Example of data file contents
```json
{
  "dialog": {
    "my_entry": "what user typed",
    "the_checkbox": "1"
  }
}
```

### Canvas State
Synfig Studio can now pass the current canvas view state, and the plugin script 
can request them selectively.
These info are supported:
- current time (in seconds)
- the selected layers (list of pseudo XPath)

#### How to request
The metafile plugin.xml was extended to let plugin author tells Synfig Studio 
what info it needs.

The `<exec>` element now has two optional attributes:
- To receive current time, add this attribute to "exec" element: 
`current_time="mandatory"`.
- To receive XPath of selected layers, add this attribute to "exec" element: 
`selected_layers="optional"`.

Both attribute accepts one of three possible values:
- "unused": plugin does not need this info, and such data will not be passed to 
it (default)
- "mandatory": plugin depends on this info. If user does not provide it, an 
error message will pop up warning him/her.
- "optional": plugin can run without that info, so if it does not exist, it is 
not a problem.

Example: If `selected_layers="mandatory"` attribute exists, the user MUST 
select at least one layer to run the plugin. Otherwise, Synfig Studio will warn 
user and abort the plugin execution (by not starting it).

#### How to get the data

If any of the canvas state request attribute exists, the plugin script will 
receive, as its **second** argument, a filename. 
If using Python, get it via `sys.argv[2]`.

The file contains a [JSON](https://json.org) dictionary. The dict entry named 
"canvas_state" contains a nested dictionary with the requested data. The file 
may contain extra data, such as the Config Dialog entries, as described in 
previous section.

The possible keys for "canvas_state" dict are:
- "current_time": value will be in seconds.
- "selected_layers": an JSON array of pseudo 
[XPath](https://en.wikipedia.org/wiki/XPath) to selected layers.

Notes:
- Only the requested data will be in the file.
- The XPath for each layer is not 100% compliant.:
  * It may start with a filename, if selected layer comes from an imported 
`sif` file. In this case, it will be followed by `#` character, to mark the 
file path end.
  * It may have a starting ":" and that means the root canvas element of the 
file.
  * If it is an exported canvas (or from an exported value node), it won't have 
the initial path, but its ID. So place properly `defs` path.

#### Examples of file contents
```json
{
  "canvas_state": {
    "current_time": "1.35"
  }
}
```
  Only "time" was requested
```json
{
  "canvas_state": {
    "selected_layers": [
      ":layer[2]"
    ]
  }
}
```
  Only "layers" was requested, and user only selected one layer before calling 
the plugin. That layer is in the root canvas, being the second one from bottom 
to top. 
```json
{
  "canvas_state": {
    "current_time": "1.35",
    "selected_layers": [
      ":layer[2]",
      ":layer[7]"
    ]
  }
}
```

### Metadata
Plugin can now provide its author name, release name and version number.

The file `plugin.xml` now has new elements:
- element `<plugin>` now supports some metadata child elements:
  - "author"  : author name [string]
  - "release" : release name [translatable string]
  - "version" : version number [integer]
  - "url"  : url pointing to the plugin project/website [string]
  - "description" : a description text to guide the user [translatable string]

For now, these information do not appear anywhere in the GUI.
They can be used in the future by a plugin manager dialog in Synfig Studio.




_______________________________________________
Synfig-devl mailing list
Synfig-devl@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/synfig-devl

Reply via email to