LatteDock: Difference between revisions
(Version 0.2 of the page. Included information up to the Indicators Section.) |
(Version 0.3 of the page completed) |
||
Line 1: | Line 1: | ||
== Technical Details == | |||
<p>This is an effort to expose some of the Latte Tricks and APIs that developers can use in order to leverage Latte Dock capabilities. Two major sections are currently provided, Applets and Indicators. In the <strong>Applets</strong> section you will understand how a Plasma QML applet can obtain information from Latte and how it can be implemented properly in order to work just fine with parabolic effect. In Indicators section you will learn how you can create your own Latte Indicators. | <p>This is an effort to expose some of the Latte Tricks and APIs that developers can use in order to leverage Latte Dock capabilities. Two major sections are currently provided, Applets and Indicators. In the <strong>Applets</strong> section you will understand how a Plasma QML applet can obtain information from Latte and how it can be implemented properly in order to work just fine with parabolic effect. In Indicators section you will learn how you can create your own Latte Indicators. | ||
Line 18: | Line 16: | ||
//! Latte Connection | //! Latte Connection | ||
property QtObject | property QtObject LatteBridge: null | ||
//! | //! | ||
} | } | ||
</syntaxhighlight>}} | </syntaxhighlight>}} | ||
The <strong> | The <strong>LatteBridge</strong> object is assigned from Latte when applet is loaded and it is the “ONE to rule them ALL” way to communicate with Latte. Important thing to mention is that if your applet is using both Compact and FullRepresentation(s) then the relevant code should be placed in CompactRepresentation. | ||
{{Input|<syntaxhighlight lang="C" line> | {{Input|<syntaxhighlight lang="C" line> | ||
Line 33: | Line 31: | ||
Plasmoid.compactRepresentation: Item { | Plasmoid.compactRepresentation: Item { | ||
//! Latte Connection | //! Latte Connection | ||
property QtObject | property QtObject LatteBridge: null | ||
//! | //! | ||
} | } | ||
Line 40: | Line 38: | ||
After adding | After adding LatteBridge property it is straightforward to identify when your applet is inside a Latte panel/dock OR in a Plasma panel with: | ||
<code>readonly property bool inLatte: | <code>readonly property bool inLatte: LatteBridge !== null</code> | ||
</p> | </p> | ||
Line 71: | Line 69: | ||
//! Latte Connection | //! Latte Connection | ||
property QtObject | property QtObject LatteBridge: null | ||
readonly property bool inLatte: | readonly property bool inLatte: LatteBridge !== null | ||
//! | //! | ||
} | } | ||
Line 83: | Line 81: | ||
---- | ---- | ||
=== | === LatteBridge === | ||
==== | ==== LatteBridge <properties>==== | ||
After the | After the LatteBridge Object has been set from Latte you can access the following. | ||
<code>latteBrige <properties></code> | <code>latteBrige <properties></code> | ||
<code><strong>version</strong>[int] (readonly)</code>: | <code><strong>version</strong>[int] (readonly)</code>: LatteBridge Version whhich is based on Latte Version. | ||
For example, Latte 0.9.0 produces a unique integer that can be used for numeric comparisons for greater than, lower than etc. If you want to make a version comparison, you can try the following in your code. | For example, Latte 0.9.0 produces a unique integer that can be used for numeric comparisons for greater than, lower than etc. If you want to make a version comparison, you can try the following in your code. | ||
<code> | <code>LatteBridge.version >= LatteBridge.actions.makeVersion(0,9,2)</code> | ||
<code><strong>applyPalette</strong> [bool] (readonly)</code> : <code>true</code> when latte is advising the applet to use the Latte colors palette in order to draw its contents with proper contrast | <code><strong>applyPalette</strong> [bool] (readonly)</code> : <code>true</code> when latte is advising the applet to use the Latte colors palette in order to draw its contents with proper contrast | ||
Line 106: | Line 104: | ||
<pre> | <pre> | ||
1 | 1 = No Scaling | ||
1.2 | 1.2 = Scale to 120% | ||
2 | 2 = Scale to 200% | ||
</pre> | </pre> | ||
<code><strong>actions</strong> [QtObject] (readonly)</code>: you can use it to pass information to Latte concerning your applet requirements. <em>This is explained in detail in the <strong> | <code><strong>actions</strong> [QtObject] (readonly)</code>: you can use it to pass information to Latte concerning your applet requirements. <em>This is explained in detail in the <strong>LatteBridge.actions</strong> section</em> | ||
<code><strong>pallete </strong>[SchemeColors *QtObject] (readonly)</code>: the current Latte color scheme palette used. Properties available for color scheme object are provided through | <code><strong>pallete </strong>[SchemeColors *QtObject] (readonly)</code>: the current Latte color scheme palette used. Properties available for color scheme object are provided through [https://phabricator.kde.org/source/latte-dock/browse/master/app/wm/schemecolors.h https://phabricator.kde.org/source/latte-dock/browse/master/app/wm/schemecolors.h] | ||
<code><strong>windowsTracker</strong> [QtObject] (readonly)</code>: all windows tracking information that can be used from applets to update their contents. It is explained in detail in the <strong> | <code><strong>windowsTracker</strong> [QtObject] (readonly)</code>: all windows tracking information that can be used from applets to update their contents. It is explained in detail in the <strong>LatteBridge.windowsTracker section.</strong> | ||
<strong>Important:</strong>You need to enable <code>windowsTrackingEnabled</code> first though <strong> | <strong>Important:</strong>You need to enable <code>windowsTrackingEnabled</code> first though <strong>LatteBridge.actions</strong> object. | ||
---- | ---- | ||
Line 125: | Line 123: | ||
<code>broadcasted(string action, variant value)</code> | <code>broadcasted(string action, variant value)</code> | ||
Applets in Latte can create their own protocols in order to communicate with other applets. When such signal is received it means that some applet is requesting from you to make “action” with parameter “value” . A good example for this are the Window Title and Window AppMenu applets. These applets need to communicate with each other in order to hide or show themselves in Unity Mode. Window Title is shown when there is no mouse hovering and Window AppMenu when there is one. All this is orchestrated through applets without Latte taking any responsibility except broadcasting the requested actions only to the correct receivers. How applets are sending such actions through | Applets in Latte can create their own protocols in order to communicate with other applets. When such signal is received it means that some applet is requesting from you to make “action” with parameter “value” . A good example for this are the Window Title and Window AppMenu applets. These applets need to communicate with each other in order to hide or show themselves in Unity Mode. Window Title is shown when there is no mouse hovering and Window AppMenu when there is one. All this is orchestrated through applets without Latte taking any responsibility except broadcasting the requested actions only to the correct receivers. How applets are sending such actions through LatteBridge.actions is explained better at the relevant section. If you want to track this signal you can use: | ||
{{Input|<syntaxhighlight lang="C" line> | {{Input|<syntaxhighlight lang="C" line> | ||
Line 134: | Line 132: | ||
//! Latte Connection | //! Latte Connection | ||
property QtObject | property QtObject LatteBridge: null | ||
readonly property bool inLatte: | readonly property bool inLatte: LatteBridge !== null | ||
//! | //! | ||
Connections { | Connections { | ||
target: | target: LatteBridge | ||
onBroadcasted: { | onBroadcasted: { | ||
if (action === "actionname1") { | if (action === "actionname1") { | ||
Line 162: | Line 160: | ||
Applets can set their characteristics and demands through this function. For example when an applet wants to disable the Active Indicator in Latte Side can use: | Applets can set their characteristics and demands through this function. For example when an applet wants to disable the Active Indicator in Latte Side can use: | ||
<code> | <code>LatteBridge.actions.setProperty(plasmoid.id, “activeIndicatorEnabled”, false);</code> | ||
OR when wants to disable the Latte Side Coloring that overlays the applets monochromatic in Smart Coloring mode then it can use: | OR when wants to disable the Latte Side Coloring that overlays the applets monochromatic in Smart Coloring mode then it can use: | ||
<code> | <code>LatteBridge.actions.setProperty(plasmoid.id, “latteSideColoringEnabled”, false);</code> | ||
<code><strong>getProperty(appletId, parameter)</strong></code> | <code><strong>getProperty(appletId, parameter)</strong></code> | ||
Line 172: | Line 170: | ||
Applets can read the current assigned characteristics through this function: | Applets can read the current assigned characteristics through this function: | ||
<code>var indicatorEnabled = | <code>var indicatorEnabled = LatteBridge.actions.readProperty(plasmoid.id, “activeIndicatorEnabled”);</code> | ||
<code><strong>broadcastToApplet(receiverPluginId, action, value)</strong></code> | <code><strong>broadcastToApplet(receiverPluginId, action, value)</strong></code> | ||
Line 178: | Line 176: | ||
Applets can communicate with other neighbour applets. For example when Window Title is informing AppMenu that needs to hide itself it sends: | Applets can communicate with other neighbour applets. For example when Window Title is informing AppMenu that needs to hide itself it sends: | ||
<code> | <code>LatteBridge.actions.broadcastToApplet(“ord.kde.windowappmenu”,”setVisible”, false);</code> | ||
<code><strong>version(major, minor, patch)</strong></code> | <code><strong>version(major, minor, patch)</strong></code> | ||
Line 184: | Line 182: | ||
It is used to produce a unique integer based on major, minor and patch versions in order to compare different versions, for example: | It is used to produce a unique integer based on major, minor and patch versions in order to compare different versions, for example: | ||
<code> | <code>LatteBridge.version >= LatteBridge.actions.makeVersion(0,9,2)</code> | ||
---- | ---- | ||
=== | =====LatteBridge.actions <applet characteristics>===== | ||
Applets can have different demands and characteristics that can be set and accessed through <strong>setProperty</strong> and <strong>getProperty</strong> functions. | Applets can have different demands and characteristics that can be set and accessed through <strong>setProperty</strong> and <strong>getProperty</strong> functions. | ||
Line 204: | Line 202: | ||
<code><strong>parabolicEffectLocked</strong>[bool]: true </code> means Latte must disable parabolic effect for that specific applet. | <code><strong>parabolicEffectLocked</strong>[bool]: true </code> means Latte must disable parabolic effect for that specific applet. | ||
<code><strong>windowsTrackingEnabled</strong>[bool]: true</code> means Latte must provide a, <strong> | <code><strong>windowsTrackingEnabled</strong>[bool]: true</code> means Latte must provide a, <strong>LatteBridge.windowsTracker</strong> object through <strong>LatteBridge</strong> | ||
---- | ---- | ||
=== | ====LatteBridge.windowsTracker==== | ||
WindowTracker provides two major objects <strong>currentScreen</strong> and <strong>allScreens</strong> in order for applets to identify correctly which windows tracking states are useful for them. | WindowTracker provides two major objects <strong>currentScreen</strong> and <strong>allScreens</strong> in order for applets to identify correctly which windows tracking states are useful for them. | ||
<code> | <code>LatteBridge.windowsTracker.currentScreen <properties></code> | ||
<code><strong>activeWindowMaximized</strong>[bool] (readonly): true</code> when there is an active and maximized windows in current session. | <code><strong>activeWindowMaximized</strong>[bool] (readonly): true</code> when there is an active and maximized windows in current session. | ||
Line 224: | Line 222: | ||
<code><strong>existsWindowTouching</strong>[bool] (readonly): true</code> where there is a window in current screen that is touching the Latte dock/panel independent of if this window is active or not | <code><strong>existsWindowTouching</strong>[bool] (readonly): true</code> where there is a window in current screen that is touching the Latte dock/panel independent of if this window is active or not | ||
<code><strong>activeWindowScheme</strong>[SchemeColors *QtObject] (readonly):</code> color scheme object for window that is touching Latte dock/panel in current screen and <code>null</code> if there is not any. Properties availble for color scheme object are provided through | <code><strong>activeWindowScheme</strong>[SchemeColors *QtObject] (readonly):</code> color scheme object for window that is touching Latte dock/panel in current screen and <code>null</code> if there is not any. Properties availble for color scheme object are provided through [https://phabricator.kde.org/source/latte-dock/browse/master/app/wm/schemecolors.h https://phabricator.kde.org/source/latte-dock/browse/master/app/wm/schemecolors.h] | ||
<code><strong>lastActiveWindow</strong>[LastActiveWindow *QtObject] (readonly):</code> last active window that is still present and shown in the current screen. Propertyies available for lastActiveWindow object are provided through | <code><strong>lastActiveWindow</strong>[LastActiveWindow *QtObject] (readonly):</code> last active window that is still present and shown in the current screen. Propertyies available for lastActiveWindow object are provided through [https://phabricator.kde.org/source/latte-dock/browse/master/app/wm/tracker/lastactivewindow.h https://phabricator.kde.org/source/latte-dock/browse/master/app/wm/tracker/lastactivewindow.h] | ||
---- | ---- | ||
==== | =====LatteBridge.windowTracker.allScreens <properties>===== | ||
<code><strong>activeWindowMaximized</strong>[bool] (readonly) : true</code> when there is an active maximized window in any screen. | <code><strong>activeWindowMaximized</strong>[bool] (readonly) : true</code> when there is an active maximized window in any screen. | ||
Line 238: | Line 236: | ||
<code><strong>existsWindowMaximized</strong>[bool] (readonly) : true</code> when there is a maximized window in any screen independent of if this window is active or not. | <code><strong>existsWindowMaximized</strong>[bool] (readonly) : true</code> when there is a maximized window in any screen independent of if this window is active or not. | ||
<code><strong>activeWindowScheme</strong>[SchemeColors *QtObject] (readonly):</code> color scheme object for active window in any screen, and <code>null</code> if there isn't any. Properties available for color scheme object are provided through | <code><strong>activeWindowScheme</strong>[SchemeColors *QtObject] (readonly):</code> color scheme object for active window in any screen, and <code>null</code> if there isn't any. Properties available for color scheme object are provided through [https://phabricator.kde.org/source/latte-dock/browse/master/app/wm/schemecolors.h https://phabricator.kde.org/source/latte-dock/browse/master/app/wm/schemecolors.h] | ||
<code><strong>lastActiveWindow</strong></code> last active window that is still present and shown in any screen. Properties available for LastActiveWindow object are provided through | <code><strong>lastActiveWindow</strong></code> last active window that is still present and shown in any screen. Properties available for LastActiveWindow object are provided through [https://phabricator.kde.org/source/latte-dock/browse/master/app/wm/tracker/lastactivewindow.h https://phabricator.kde.org/source/latte-dock/browse/master/app/wm/tracker/lastactivewindow.h] | ||
=== Applet Examples === | === Applet Examples === | ||
<strong> | |||
[https://github.com/psifidotos/applet-latte-separator Latte Separator]<br> | |||
[https://github.com/psifidotos/applet-latte-spacer Latte Spacer]<br> | |||
[https://github.com/psifidotos/applet-window-title Window Title Applet]<br> | |||
[https://github.com/psifidotos/applet-window-buttons Window Buttons Applet]<br> | |||
[https://github.com/psifidotos/applet-window-appmenu Window AppMenu Applet]<br> | |||
</strong> | |||
---- | ---- | ||
Line 254: | Line 253: | ||
== Indicators == | == Indicators == | ||
==== | === Introduction === | ||
<p>In Latte v0.9 every indicator style has its own standalone qml implementation that can be found in its own package, just like Plasma qml-only applets. In that way every indicator style can support its own specific user settings and also abstract its implementation from the main Latte development. Online Indicators can be found at the kde store(https://store.kde.org/browse/cat/563/) and can be installed through Latte, Effects page without needing from the users any special actions to accomplish the task.</p> | |||
=== Package Structure === | |||
The Indicator package should have the following structure: | |||
<pre> | |||
metadata.desktop [required] | |||
package/ui/main.qml [required] | |||
package/config/main.xml [optional] | |||
package/config/config.qml [optional] | |||
</pre> | |||
=== Metadata.desktop === | |||
Every indicator needs a desktop file in order to tell Latte where to find its implementation and what its author details are. The format is as such: | |||
{{Input|<syntaxhighlight lang="Bash" line> | |||
[Desktop Entry] | |||
Name=Latte | |||
Comment=Latte default indicator | |||
Encoding=UTF-8 | |||
Type=Service [required] | |||
Icon=latte-dock | |||
X-Plasma-API=declarativeappletscript [required] | |||
X-KDE-ServiceTypes=Latte/Indicator [required] | |||
X-Latte-MainScript=ui/main.qml [required] | |||
X-Latte-ConfigUi=config/config.qml [optional] | |||
X-Latte-ConfigXml=config/main.xml [optional] | |||
X-KDE-PluginInfo-Author=KDE Awesome Developer | |||
X-KDE-PluginInfo-Name=org.kde.latte.default | |||
X-KDE-PluginInfo-Version=0.1 | |||
X-KDE-PluginInfo-Category=Latte Indicator | |||
X-KDE-PluginInfo-License=GPL v2+ | |||
X-KDE-PluginInfo-EnabledByDefault=true | |||
</syntaxhighlight>}} | |||
<code><strong>X-Plasma-API</strong></code>: must be present because it defines a qml-only plugin | |||
<code><strong>X-KDE-ServiceTypes</strong></code>: must be present with value <code>Latte/Indicator</code> otherwise the indicator can not be installed and loaded | |||
<strong><code>X-Latte-MainScript</code></strong>: must be present and defines the main qml file for the indicator implementation | |||
<code><strong>X-Latte-ConfigXml</strong></code>: defines the xml settings that are going to be used from indicator implementation and user settings. It is optional and a package may not include it | |||
<code><strong>X-Latte-ConfigUI</strong></code>: defines the qml settings user interface. It is provided only when the indicator has settings that the user can choose from in order to adjust the indicate apprearnace and behaviour | |||
=== QML Implementation === | |||
====package/ui/main.qml==== | |||
Every indicator main qml file must use <code>LatteComponents.IndicatorItem</code> at its root | |||
{{Input|<syntaxhighlight lang="C" line> | |||
import QtQuick 2.0 | |||
import org.kde.latte 0.2 as Latte | |||
import org.kde.latte.components 1.0 as LatteComponents | |||
LatteComponents.IndicatorItem { | |||
id: root | |||
providesFrontLayer: false | |||
providesHoveredAnimation: false | |||
... | |||
} | |||
</syntaxhighlight>}} | |||
The <code><strong>LatteComponents.IndicatorItem</strong></code> provides options to inform Latte what requirements and capabilities this indicator provides in order to appear, function and behave properly. All <strong>IndicatorItem</strong> options are <strong>[optional]</strong>: | |||
====LatteComponents.IndicatorItem [properties]==== | |||
<code><strong>needsIconColors</strong> [bool] : true</code> when current icon main colors are needed. For example the Unity Indicator draws a background and glow that are provided from current icon colors. | |||
<code><strong>needsMouseEventCoordinates</strong> [bool]: true</code> when mouse even coordinates are neded. An example is the click animation in android style that provides the Plasma Indicator. | |||
<code><strong>providerFrontLayer</strong> [bool] : true</code> when a front layer is provided in order to draw contents <strong>above</strong> the current item/icon. | |||
<code><strong>providesHoveredAnimation</strong> [bool]: true</code> if the Latte built-in hovered animation must be disabled | |||
<code><strong>provideClickAnimation</strong> [bool]: true</code> if the Latte built-in clicked animation must be disabled | |||
<code><strong>extraMaskThickness</strong> [int]</code>: How many pixels are needed above the indicator in order to be drawn correctly. Example: The Latte indicator in reverse mode can support glow, but that glow is drawn externally. Latte must be informed for this in order to not visually subtract that glow. | |||
<code><strong>minThicknessPadding</strong> [int]</code>: The minimum thickness padding that is needd for the indicator | |||
{{Input|<syntaxhighlight lang="C" line> | |||
minThicknessPadding: 0.2 //20% of current icon size | |||
</syntaxhighlight>}} | |||
<code><strong>svgImagePaths</strong> [Array (strings)]</code>: Plasma::SVG files must be loaded from Latte in order to avoid high memory consumption | |||
{{Input|<syntaxhighlight lang="C" line> | |||
svgImagePaths: [‘widgets/panel-background’, ‘../icons/separator.svg’] | |||
</syntaxhighlight>}} | |||
The first SVG icon is provided from current plasma theme, and the second is located relevant to the <code>package/ui</code> | |||
====Tasks/Applets Information==== | |||
As long as <strong>IndicatorItem</strong> has been set for the main qml file then the entire indicator qml implementation gains two different objects ( <code>level</code> and <code>indicator</code> ) in order to access tasks/applets and general information | |||
<strong><code><level> object [properties]</code></strong> | |||
=====<level>object [properties]===== | |||
<code><strong>isBackground</strong> [bool] (readonly) : true</code> when the indicator background needs to be painted below the current icon/applet. | |||
<code><strong>isForeground</strong> [bool] (readonly) : true </code> when the indicator foreground needs to be painted above the current icon/applet | |||
=====<level> object [signals]===== | |||
<code><strong>mousePressed(int x, int y, int button)</strong></code>: can be tracked when <code>needMouseEventSignals</code> property has been enabled in IndicatorItem in order to get mouse x,y coordinates and which mouse button was released. | |||
=====< indicator > object [properties]===== | |||
<code><strong>isTask</strong> [bool] (readonly): true</code> when main item is actually a task | |||
<code><strong>isApplet</strong> [bool] : true</code> when main item is actually an applet | |||
<code><strong>isLauncher</strong> [bool] (readonly)</code>: true when main item is a task in launcher state | |||
<code><strong>isStartup</strong> [bool] (readonly)</code>: true when main item is a task in startup state | |||
<code><strong>isWindow [bool]</strong> (readonly)</code>: true when main item is a task in window state | |||
<code><strong>isActive</strong> [bool] (readonly)</code>: true when main item is active | |||
<code><strong>isGroup</strong> [bool] (readonly)</code>: true when main item is a group of tasks | |||
<code><strong>isHovered</strong> [bool] (readonly)</code>: true when main item is hovered | |||
<code><strong>isMinimized</strong> [bool] (readonly)</code>: true when main item is a task in minimized state | |||
<code><strong>isPressed</strong> [bool] (readonly)</code>: true when main item is pressed | |||
<code><strong>inAttention</strong> [bool] (readonly)</code>: true when main item requires attention | |||
<code><strong>inRemoving</strong> [bool] (readonly)</code>: true when main item in remove stage | |||
<code><strong>isSquare</strong> [bool] (readonly)</code>: true when main item is has a squared layout | |||
<code><strong>hasActive</strong> [bool] (readonly)</code>: true when a group of tasks has an active item | |||
<code><strong>hasMinimized</strong> [bool] (readonly)</code>: true when a group of tasks has at least one minimized window | |||
<code><strong>hasShown</strong> [bool] (readonly)</code>: true when a group of tasks has at least one shown (not minimimed) window | |||
<code><strong>windowsCount</strong> [int] (readonly)</code>: how many windows exist in a grouped tasks item | |||
<code><strong>windowsMinimizedCount</strong> [int] (readonly)</code>: how many minimized windows exist in a grouped tasks item | |||
<code><strong>currentIconSize</strong> [int] (readonly)</code>: current icon size used for the entire dock or panel | |||
<code><strong>maxIconSize</strong> [int] (readonly)</code>: maximum icon size that can occur from this dock or panel | |||
<code><strong>scaleFactor</strong> [int] (readonly)</code>: current icon size used for the entire dock or panel | |||
<code><strong>maxIconSize</strong> [int] (readonly)</code>: maximum icon size that can occur from this dock or panel | |||
<code><strong>scaleFactor</strong> [real] (readonly)</code>: current scale factor for this item with values from <strong>1.0 to 2.0</strong> | |||
<pre> | |||
1 = Item is not zoomed | |||
1.2 = Items is zoomed by 20% | |||
2 = Item is zoomed by 100% | |||
</pre> | |||
<code><strong>panelOpacity</strong> [real] (readonly)</code>: current panel background opacity | |||
<code><strong>shadowColor</strong> [color] (readonly)</code>: current shadow color used for all items | |||
<code><strong>animationsEnabled</strong> [bool] (readonly)</code>: true when animations are enabled | |||
<code><strong>durationTime</strong> [real] (readonly)</code>: current duration time for animation. It is a multiplier that can be used for animations in order to respect user preference concerning animations speed | |||
<code><strong>usePlasmaTabsStyle</strong> [bool] (readonly)</code>: true when the user has disabled latte indicator drawing for applets | |||
<code><strong>iconBackgroundColor</strong> [color] (readonly)</code>:main background color produced from the current icon. [requires: needsIconColors:true from IndicatorItem] | |||
<code><strong>iconGlowColor</strong> [color] (readonly)</code>: main glow color produced from the current icon. [requires: needsIconColors:true from IndicatorItem] | |||
<code><strong>palette</strong> [QtObject] (readonly)</code>: current colors palette used. Provides backgroundColor, textColor etc. and [scheme] [string] (readonly) which is the absolutepath for the scheme file used | |||
<code><strong>indicator.palette.backgroundColor //like theme.backgroundColor</strong></code> | |||
<code><strong>configuration</strong> [QtObject] (readonly)</code>: object to access through <code>indicator.configuration</code> the user settings specified through main.xml file | |||
<code><strong>resources</strong> [QtObject] (readonly)</code>: object to access through <code>indicator.resources</code> indicator specified resources. | |||
<code><strong>resources.svgs</strong> [Array] (readonly)</code>: object to access through <code>indicator.resources.svgs</code> specified Plasma/Svgs from <code>IndicatorItem.svgImagePaths</code> | |||
{{Input|<syntaxhighlight lang="C" line> | |||
import QtQuick 2.0 | |||
import org.kde.plasma.core 2.0 as PlasmaCore | |||
import org.kde.latte 0.2 as Latte | |||
import org.kde.latte.components 1.0 as LatteComponents | |||
LatteComponents.IndicatorItem { | |||
id: root | |||
svgImagePaths: [‘widgets/panel-background’, ‘../icons/separator.svg’] | |||
... | |||
PlasmaCore.SvgItem { | |||
id: panelBackgroundSvgItem | |||
svg: indicator.resources.svgs[0] | |||
} | |||
... | |||
} | |||
</syntaxhighlight>}} |
Revision as of 11:03, 13 July 2019
Technical Details
This is an effort to expose some of the Latte Tricks and APIs that developers can use in order to leverage Latte Dock capabilities. Two major sections are currently provided, Applets and Indicators. In the Applets section you will understand how a Plasma QML applet can obtain information from Latte and how it can be implemented properly in order to work just fine with parabolic effect. In Indicators section you will learn how you can create your own Latte Indicators. NOTE: All APIs are provided since Latte [v0.9.0] and if a new property or function is added then in that case there will be a tag mentioning when it was introduced for example [v0.9.4]
Applets
Can a Plasma Applet access Latte Information?
Most definitely! This is very simple. The only thing you need to add in your applet main QML file is:
import QtQuick 2.0 Item { id: root //! Latte Connection property QtObject LatteBridge: null //! }
The LatteBridge object is assigned from Latte when applet is loaded and it is the “ONE to rule them ALL” way to communicate with Latte. Important thing to mention is that if your applet is using both Compact and FullRepresentation(s) then the relevant code should be placed in CompactRepresentation.
import QtQuick 2.0 Item { id: root Plasmoid.compactRepresentation: Item { //! Latte Connection property QtObject LatteBridge: null //! } }
After adding LatteBridge property it is straightforward to identify when your applet is inside a Latte panel/dock OR in a Plasma panel with:
readonly property bool inLatte: LatteBridge !== null
Can a plasma applet behave properly with parabolic effect?
Parabolic effect is not working at present when applets provide different lengths. Applets with large lengths decrease the animations speed and the applets with small lengths increase it. The best way for parabolic effect to work is for all applets to provide a squared layout that does not update its content positioning when zoomed. In order to make things easy for developers Latte can provide you with the best layout to achieve this without needing from you to make any calculations. To do this, you need to set it up as such:
import QtQuick 2.0 import org.kde.plasma.plasmoid 2.0 Item { id: root Layout.minimumWidth: inLatte && isHorizontal ? -1 : [plasma case] Layout.preferredWidth: inLatte && isHorizontal ? -1 : [plasma case] Layout.maximumWidth: inLatte && isHorizontal ? -1 : [plasma case] Layout.minimumHeight: inLatte && !isHorizontal ? -1 : [plasma case] Layout.preferredHeight: inLatte && !isHorizontal ? -1 : [plasma case] Layout.maximumHeight: inLatte && !isHorizontal ? -1 : [plasma case] readonly property bool isHorizontal: plasmoid.formFactor === PlasmaCore.Types.Horizontal //! Latte Connection property QtObject LatteBridge: null readonly property bool inLatte: LatteBridge !== null //! }
In the above example you can see that when the applet is not providing any information for its Layout [-1 case]
then Latte has the freedom to set it in the best appropriate
LatteBridge
LatteBridge <properties>
After the LatteBridge Object has been set from Latte you can access the following.
latteBrige <properties>
version[int] (readonly)
: LatteBridge Version whhich is based on Latte Version.
For example, Latte 0.9.0 produces a unique integer that can be used for numeric comparisons for greater than, lower than etc. If you want to make a version comparison, you can try the following in your code.
LatteBridge.version >= LatteBridge.actions.makeVersion(0,9,2)
applyPalette [bool] (readonly)
: true
when latte is advising the applet to use the Latte colors palette in order to draw its contents with proper contrast
inEditMode[bool] (readonly)
: true
when Latte behaves as a Plasma Panel concerning external shadow rendering, transparency levels, etc.
parabolicEffectEnabled[bool] (readonly)
: true
when Latte Parabolid Effect is enabled.
iconSize[int] (readonly)
: the current icon size used for all appletsin the containment this applet is present
maxZoomFactor[real] (readonly)
: the current zoom factor with values from 1.0 to 2.0
1 = No Scaling 1.2 = Scale to 120% 2 = Scale to 200%
actions [QtObject] (readonly)
: you can use it to pass information to Latte concerning your applet requirements. This is explained in detail in the LatteBridge.actions section
pallete [SchemeColors *QtObject] (readonly)
: the current Latte color scheme palette used. Properties available for color scheme object are provided through https://phabricator.kde.org/source/latte-dock/browse/master/app/wm/schemecolors.h
windowsTracker [QtObject] (readonly)
: all windows tracking information that can be used from applets to update their contents. It is explained in detail in the LatteBridge.windowsTracker section.
Important:You need to enable windowsTrackingEnabled
first though LatteBridge.actions object.
LatteBridge <signals>
broadcasted(string action, variant value)
Applets in Latte can create their own protocols in order to communicate with other applets. When such signal is received it means that some applet is requesting from you to make “action” with parameter “value” . A good example for this are the Window Title and Window AppMenu applets. These applets need to communicate with each other in order to hide or show themselves in Unity Mode. Window Title is shown when there is no mouse hovering and Window AppMenu when there is one. All this is orchestrated through applets without Latte taking any responsibility except broadcasting the requested actions only to the correct receivers. How applets are sending such actions through LatteBridge.actions is explained better at the relevant section. If you want to track this signal you can use:
import QtQuick 2.0 Item { id: root //! Latte Connection property QtObject LatteBridge: null readonly property bool inLatte: LatteBridge !== null //! Connections { target: LatteBridge onBroadcasted: { if (action === "actionname1") { //! your code here } else if (action === "actionname2") { //! your code here } } } }
LatteBridge <actions>
Through actions an applet can send information to Latte and other neighbour applets. The following functions can be used to accomplish this:
setProperty(appletId, parameter, value)
Applets can set their characteristics and demands through this function. For example when an applet wants to disable the Active Indicator in Latte Side can use:
LatteBridge.actions.setProperty(plasmoid.id, “activeIndicatorEnabled”, false);
OR when wants to disable the Latte Side Coloring that overlays the applets monochromatic in Smart Coloring mode then it can use:
LatteBridge.actions.setProperty(plasmoid.id, “latteSideColoringEnabled”, false);
getProperty(appletId, parameter)
Applets can read the current assigned characteristics through this function:
var indicatorEnabled = LatteBridge.actions.readProperty(plasmoid.id, “activeIndicatorEnabled”);
broadcastToApplet(receiverPluginId, action, value)
Applets can communicate with other neighbour applets. For example when Window Title is informing AppMenu that needs to hide itself it sends:
LatteBridge.actions.broadcastToApplet(“ord.kde.windowappmenu”,”setVisible”, false);
version(major, minor, patch)
It is used to produce a unique integer based on major, minor and patch versions in order to compare different versions, for example:
LatteBridge.version >= LatteBridge.actions.makeVersion(0,9,2)
LatteBridge.actions <applet characteristics>
Applets can have different demands and characteristics that can be set and accessed through setProperty and getProperty functions.
activeIndicatorEnabled[bool]: false
means Latte will not draw any indicator for this applet, a good example being the Global Menu plasmoid.
latteIconOverlayEnabled[bool]: false
means Latte will never try to identify the central icon used in order to make this applet draw itself correctly with parabolic effect. Most applets are using PlasmaCore.IconItem in order to draw the CompactRepresentation icon when they are in a panel, but plasma iconitem does not play nice with parabolic effect. This is why Latte is trying to handle the case and take resposibility by hiding the PlasmaCore.IconItem and draw a LatteComponents.IconItem instead. If you dont want this to happen then you must this property to false
.
latteSideColoringEnabled [bool]: false
means Latte will never overlay any color over this applet because applet takes resposibility for painting itself at all cases.
lengthMarginsEnabled [bool]: false
means means Latte will not draw any margins around this applet comparing to its neighbours. Good example is the spacer plasmoid that in panel mode does not need any extra margins around it.
means Latte will not draw any margins around this applet comparing to its neighbours. Good example is the spacer plasmoid that in panel mode does not need any extra margins around it.
parabolicEffectLocked[bool]: true
means Latte must disable parabolic effect for that specific applet.
windowsTrackingEnabled[bool]: true
means Latte must provide a, LatteBridge.windowsTracker object through LatteBridge
LatteBridge.windowsTracker
WindowTracker provides two major objects currentScreen and allScreens in order for applets to identify correctly which windows tracking states are useful for them.
LatteBridge.windowsTracker.currentScreen <properties>
activeWindowMaximized[bool] (readonly): true
when there is an active and maximized windows in current session.
activeWindowTouching[bool] (readonly) : true
when there is an active window in current screen and that window is also touching the Latte dock/panel.
existsWindowActive[bool] (readonly) : true
when there is an active window in current screen.
existsWindowMaximized[bool] (readonly): true
when there is a maximized window in current screen independent of if this window is active or not.
existsWindowTouching[bool] (readonly): true
where there is a window in current screen that is touching the Latte dock/panel independent of if this window is active or not
activeWindowScheme[SchemeColors *QtObject] (readonly):
color scheme object for window that is touching Latte dock/panel in current screen and null
if there is not any. Properties availble for color scheme object are provided through https://phabricator.kde.org/source/latte-dock/browse/master/app/wm/schemecolors.h
lastActiveWindow[LastActiveWindow *QtObject] (readonly):
last active window that is still present and shown in the current screen. Propertyies available for lastActiveWindow object are provided through https://phabricator.kde.org/source/latte-dock/browse/master/app/wm/tracker/lastactivewindow.h
LatteBridge.windowTracker.allScreens <properties>
activeWindowMaximized[bool] (readonly) : true
when there is an active maximized window in any screen.
existsWindowActive[bool] (readonly) : true
when there is an active window in any screen.
existsWindowMaximized[bool] (readonly) : true
when there is a maximized window in any screen independent of if this window is active or not.
activeWindowScheme[SchemeColors *QtObject] (readonly):
color scheme object for active window in any screen, and null
if there isn't any. Properties available for color scheme object are provided through https://phabricator.kde.org/source/latte-dock/browse/master/app/wm/schemecolors.h
lastActiveWindow
last active window that is still present and shown in any screen. Properties available for LastActiveWindow object are provided through https://phabricator.kde.org/source/latte-dock/browse/master/app/wm/tracker/lastactivewindow.h
Applet Examples
Latte Separator
Latte Spacer
Window Title Applet
Window Buttons Applet
Window AppMenu Applet
Indicators
Introduction
In Latte v0.9 every indicator style has its own standalone qml implementation that can be found in its own package, just like Plasma qml-only applets. In that way every indicator style can support its own specific user settings and also abstract its implementation from the main Latte development. Online Indicators can be found at the kde store(https://store.kde.org/browse/cat/563/) and can be installed through Latte, Effects page without needing from the users any special actions to accomplish the task.
Package Structure
The Indicator package should have the following structure:
metadata.desktop [required] package/ui/main.qml [required] package/config/main.xml [optional] package/config/config.qml [optional]
Metadata.desktop
Every indicator needs a desktop file in order to tell Latte where to find its implementation and what its author details are. The format is as such:
[Desktop Entry] Name=Latte Comment=Latte default indicator Encoding=UTF-8 Type=Service [required] Icon=latte-dock X-Plasma-API=declarativeappletscript [required] X-KDE-ServiceTypes=Latte/Indicator [required] X-Latte-MainScript=ui/main.qml [required] X-Latte-ConfigUi=config/config.qml [optional] X-Latte-ConfigXml=config/main.xml [optional] X-KDE-PluginInfo-Author=KDE Awesome Developer X-KDE-PluginInfo-Email=[email protected] X-KDE-PluginInfo-Name=org.kde.latte.default X-KDE-PluginInfo-Version=0.1 X-KDE-PluginInfo-Category=Latte Indicator X-KDE-PluginInfo-License=GPL v2+ X-KDE-PluginInfo-EnabledByDefault=true
X-Plasma-API
: must be present because it defines a qml-only plugin
X-KDE-ServiceTypes
: must be present with value Latte/Indicator
otherwise the indicator can not be installed and loaded
X-Latte-MainScript
: must be present and defines the main qml file for the indicator implementation
X-Latte-ConfigXml
: defines the xml settings that are going to be used from indicator implementation and user settings. It is optional and a package may not include it
X-Latte-ConfigUI
: defines the qml settings user interface. It is provided only when the indicator has settings that the user can choose from in order to adjust the indicate apprearnace and behaviour
QML Implementation
package/ui/main.qml
Every indicator main qml file must use LatteComponents.IndicatorItem
at its root
import QtQuick 2.0 import org.kde.latte 0.2 as Latte import org.kde.latte.components 1.0 as LatteComponents LatteComponents.IndicatorItem { id: root providesFrontLayer: false providesHoveredAnimation: false ... }
The LatteComponents.IndicatorItem
provides options to inform Latte what requirements and capabilities this indicator provides in order to appear, function and behave properly. All IndicatorItem options are [optional]:
LatteComponents.IndicatorItem [properties]
needsIconColors [bool] : true
when current icon main colors are needed. For example the Unity Indicator draws a background and glow that are provided from current icon colors.
needsMouseEventCoordinates [bool]: true
when mouse even coordinates are neded. An example is the click animation in android style that provides the Plasma Indicator.
providerFrontLayer [bool] : true
when a front layer is provided in order to draw contents above the current item/icon.
providesHoveredAnimation [bool]: true
if the Latte built-in hovered animation must be disabled
provideClickAnimation [bool]: true
if the Latte built-in clicked animation must be disabled
extraMaskThickness [int]
: How many pixels are needed above the indicator in order to be drawn correctly. Example: The Latte indicator in reverse mode can support glow, but that glow is drawn externally. Latte must be informed for this in order to not visually subtract that glow.
minThicknessPadding [int]
: The minimum thickness padding that is needd for the indicator
minThicknessPadding: 0.2 //20% of current icon size
svgImagePaths [Array (strings)]
: Plasma::SVG files must be loaded from Latte in order to avoid high memory consumption
svgImagePaths: [‘widgets/panel-background’, ‘../icons/separator.svg’]
The first SVG icon is provided from current plasma theme, and the second is located relevant to the package/ui
Tasks/Applets Information
As long as IndicatorItem has been set for the main qml file then the entire indicator qml implementation gains two different objects ( level
and indicator
) in order to access tasks/applets and general information
<level> object [properties]
<level>object [properties]
isBackground [bool] (readonly) : true
when the indicator background needs to be painted below the current icon/applet.
isForeground [bool] (readonly) : true
when the indicator foreground needs to be painted above the current icon/applet
<level> object [signals]
mousePressed(int x, int y, int button)
: can be tracked when needMouseEventSignals
property has been enabled in IndicatorItem in order to get mouse x,y coordinates and which mouse button was released.
< indicator > object [properties]
isTask [bool] (readonly): true
when main item is actually a task
isApplet [bool] : true
when main item is actually an applet
isLauncher [bool] (readonly)
: true when main item is a task in launcher state
isStartup [bool] (readonly)
: true when main item is a task in startup state
isWindow [bool] (readonly)
: true when main item is a task in window state
isActive [bool] (readonly)
: true when main item is active
isGroup [bool] (readonly)
: true when main item is a group of tasks
isHovered [bool] (readonly)
: true when main item is hovered
isMinimized [bool] (readonly)
: true when main item is a task in minimized state
isPressed [bool] (readonly)
: true when main item is pressed
inAttention [bool] (readonly)
: true when main item requires attention
inRemoving [bool] (readonly)
: true when main item in remove stage
isSquare [bool] (readonly)
: true when main item is has a squared layout
hasActive [bool] (readonly)
: true when a group of tasks has an active item
hasMinimized [bool] (readonly)
: true when a group of tasks has at least one minimized window
hasShown [bool] (readonly)
: true when a group of tasks has at least one shown (not minimimed) window
windowsCount [int] (readonly)
: how many windows exist in a grouped tasks item
windowsMinimizedCount [int] (readonly)
: how many minimized windows exist in a grouped tasks item
currentIconSize [int] (readonly)
: current icon size used for the entire dock or panel
maxIconSize [int] (readonly)
: maximum icon size that can occur from this dock or panel
scaleFactor [int] (readonly)
: current icon size used for the entire dock or panel
maxIconSize [int] (readonly)
: maximum icon size that can occur from this dock or panel
scaleFactor [real] (readonly)
: current scale factor for this item with values from 1.0 to 2.0
1 = Item is not zoomed 1.2 = Items is zoomed by 20% 2 = Item is zoomed by 100%
panelOpacity [real] (readonly)
: current panel background opacity
shadowColor [color] (readonly)
: current shadow color used for all items
animationsEnabled [bool] (readonly)
: true when animations are enabled
durationTime [real] (readonly)
: current duration time for animation. It is a multiplier that can be used for animations in order to respect user preference concerning animations speed
usePlasmaTabsStyle [bool] (readonly)
: true when the user has disabled latte indicator drawing for applets
iconBackgroundColor [color] (readonly)
:main background color produced from the current icon. [requires: needsIconColors:true from IndicatorItem]
iconGlowColor [color] (readonly)
: main glow color produced from the current icon. [requires: needsIconColors:true from IndicatorItem]
palette [QtObject] (readonly)
: current colors palette used. Provides backgroundColor, textColor etc. and [scheme] [string] (readonly) which is the absolutepath for the scheme file used
indicator.palette.backgroundColor //like theme.backgroundColor
configuration [QtObject] (readonly)
: object to access through indicator.configuration
the user settings specified through main.xml file
resources [QtObject] (readonly)
: object to access through indicator.resources
indicator specified resources.
resources.svgs [Array] (readonly)
: object to access through indicator.resources.svgs
specified Plasma/Svgs from IndicatorItem.svgImagePaths
import QtQuick 2.0 import org.kde.plasma.core 2.0 as PlasmaCore import org.kde.latte 0.2 as Latte import org.kde.latte.components 1.0 as LatteComponents LatteComponents.IndicatorItem { id: root svgImagePaths: [‘widgets/panel-background’, ‘../icons/separator.svg’] ... PlasmaCore.SvgItem { id: panelBackgroundSvgItem svg: indicator.resources.svgs[0] } ... }