When having a symlink between kupfer.py in /usr/local/bin kupfer cannot find the icon file since not available in ./data so get it from __file__.
We change the cache file name (again) so that the name of the source is part of the generation. Then sources are automatically changed when we switch locale. We also bump the cache version number to 4! This means after this change, **Kupfer will erase all** old cache files with version number 3 in their name, to clean up.
Unify KupferObject.get_icon and .get_pixbuf to do the same thing. get_pixbuf is kept as is, since it is used more frequently and avoids disk accesses (by not asking if icons are good/files exist). We make sure that for actions that don't find their icons, we use the default action icon. Other objects unchanged.
As an experiment. Favorites must be boosted, but not too much so they are before items that textually much match better.
Use new imports places for some objects (the mixins). At the same time we convert some plugins to use Source.initialize instead of unpickle_finish if appropriate.
We call the action to perform a stored Kupfer command, a command such as Quit or 'About Kupfer' simply *Run*. To resolve linguistic disambiguities, we now have *Run (Execute)* for executing programs, and simple *Run* for running commands. Translators should may translate the new *Run* differently (Perform/Carry out/ or similar).
Remove stale comments and docstrings, and word some better.
Make Send by Email To.. a three-part action as like: (File) -> Send To -> (Contact) Any (email) contact in Kupfer is used. The user may also type in addresses by hand.
The Source logic is very nicely confined into the SourceController: The only symbol needed from it is GetSourceController (from kupfer.core.data and from kupfer.puid modules).
If we translate a long text, we receive an array of sentences from Google. We join them up into the final text. This bug was reported by @hetdegon.
We mark the _Language class as serilizable; Kupfer will then save a representation of the Language object right in the trigger (since it can't find the language in the catalog). The only important part saved is the _Language.object attribute. If the plugin changes incompatibly in relation to _Language, you can increase the 'serilizable' number: if it doesn't match the saved copy, the serialized trigger won't be active anymore.
The Take Result action allows the user to make triggers where you chain actions: Execute one action dynamically, then apply another action on the result. For example, a two-part trigger that creates a new document, then opens it. (Selected File (folder)) -> Create New Document -> Latex-Template Ctrl+Return Take Result Return Result of .. (..) -> Open With -> Vim Ctrl+Return (Composed object) -> Add Trigger.. -> ..
We start with an action "Select in Kupfer": it only makes sense in Triggers or delayed commands. With it, you can make a trigger to show Kupfer, with a particular object selected. It is much like the "magic keybinding" for current selection, but for any object.
Using __slots__ limits object compatibility (technical Python stuff), while we can't even measure if it saves us any memory. Better avoid this "optimization".