[Marble-devel] Not existing map theme properties vs. existing plugins?
Friedrich W. H. Kossebau
kossebau at kde.org
Tue Jul 26 00:45:57 UTC 2016
Hi,
when testing the Marble example apps, I found that in some cases setup calls
done via the MarbleWidget API did not work. E.g. calling
marbleWidget->setShowCompass(false);
with the earth/plain map does not hide the compass floatitem, it happily is
present in the view. And same with overview map and scalebar.
NO PROPERTY IN DGML -> MarbleWidget METHODS ARE SILENT NOOPS
The reason is that the earth/plain map in its dgml does not have a property
defined for those plugins. And the current code[1] just makes those
convenience methods for controlling plugin visibility simply noops, without
any hint even on the console log.
Now, MarbleMapPrivate::updateMapTheme() [2] completes this problem, as it
iterates over all plugins and only updates the visibilty of those plugins, for
which the dgml has a property defined, and leaves any other plugin to it's
default values (or any directly set one).
INCONSISTENCY IN MarbleWidget METHODS
For some reason e.g. MarbleMap::setShowCrosshairs() [3] does not work via
properties, but instead iterates over all plugins and sets the visibility
property directly on the plugin.
HOW SHOULD THIS WORK?
As I understood things, render plugins and map themes are independent of each
other, there can be plugins a theme does not know and there can be themes a
plugin does not know.
Currently a plugin has a fixed default setting for visibility and does not
care at all for themes here. While themes can have properties for the
visibility of plugins, whose values would then overrule the default setting of
a plugin.
The question seems to be how to control the visibility settings dynamically
from the code? What is the settings model that should rule the visibility of
everything? Especially when it comes to not existing map theme properties and
existing plugins?
BTW, MarbleMapPrivate constructor connects to signals visibilityChanged() both
of m_layerManager and m_floatItemsLayer. The first relays visibilityChanged()
signals from all render plugins, while the second relays the same signal for
all float items. Given render plugins are float items, this should result in
duplicated signal handling when a float item emits a signal, no? No tested
yet, but this smells like something is in the middle of rework?
[1]
--- 8< ---
void MarbleWidget::setShowCompass( bool visible )
{
d->m_map.setShowCompass( visible );
}
void MarbleMap::setShowCompass( bool visible )
{
setPropertyValue( "compass", visible );
}
void MarbleMap::setPropertyValue( const QString& name, bool value )
{
// [...]
d->m_model->mapTheme()->settings()->setPropertyValue( name, value );
// [...]
}
bool GeoSceneSettings::setPropertyValue( const QString& name, bool value )
{
// [...]
QVector<GeoSceneProperty*>::const_iterator it = d-
>m_properties.constBegin();
QVector<GeoSceneProperty*>::const_iterator propEnd = d-
>m_properties.constEnd();
for (; it != propEnd; ++it) {
if ( (*it)->name() == name ) {
(*it)->setValue( value );
return true;
}
}
// [...]
return false;
}
--- 8< ---
[2]
--- 8< ---
void MarbleMapPrivate::updateMapTheme()
{
// [...]
foreach (RenderPlugin *renderPlugin, m_renderPlugins) {
bool propertyAvailable = false;
m_model->mapTheme()->settings()->propertyAvailable( renderPlugin-
>nameId(), propertyAvailable );
bool propertyValue = false;
m_model->mapTheme()->settings()->propertyValue( renderPlugin-
>nameId(), propertyValue );
if ( propertyAvailable ) {
renderPlugin->setVisible( propertyValue );
}
}
// [...]
}
--- 8< ---
[3]
--- 8< ---
void MarbleMap::setShowCrosshairs( bool visible )
{
QList<RenderPlugin *> pluginList = renderPlugins();
QList<RenderPlugin *>::const_iterator i = pluginList.constBegin();
QList<RenderPlugin *>::const_iterator const end = pluginList.constEnd();
for (; i != end; ++i ) {
if ( (*i)->nameId() == "crosshairs" ) {
(*i)->setVisible( visible );
}
}
}
--- 8< ---
Cheers
Friedrich
More information about the Marble-devel
mailing list