"""
Copyright 2011 Ryan Fobel
This file is part of MicroDrop.
MicroDrop is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
MicroDrop is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with MicroDrop. If not, see <http://www.gnu.org/licenses/>.
"""
import logging
logger = logging.getLogger(__name__)
from ..plugin_manager import (IPlugin, SingletonPlugin, implements,
PluginGlobals, ExtensionPoint, ScheduleRequest)
from ..app_context import get_app
PluginGlobals.push_env('microdrop')
[docs]class ConfigController(SingletonPlugin):
implements(IPlugin)
def __init__(self):
self.name = "microdrop.gui.config_controller"
self.app = None
[docs] def on_plugin_enable(self):
self.app = get_app()
self.app.config_controller = self
# load all app options from the config file
observers = ExtensionPoint(IPlugin)
for section_name, values_dict in self.app.config.data.iteritems():
service = observers.service(section_name)
if service:
if hasattr(service, 'set_app_values'):
service.set_app_values(values_dict)
else:
logger.error('Invalid section in config file: [%s].' %
section_name)
self.app.config.data.pop(section_name)
[docs] def on_app_exit(self):
self.app.config.save()
[docs] def on_dmf_device_changed(self, dmf_device):
device_name = None
if dmf_device:
device_name = dmf_device.name
if self.app.config['dmf_device']['name'] != device_name:
self.app.config['dmf_device']['name'] = device_name
self.app.config.save()
[docs] def on_dmf_device_swapped(self, old_dmf_device, dmf_device):
self.on_dmf_device_changed(dmf_device)
[docs] def on_protocol_changed(self):
if self.app.protocol.name != self.app.config['protocol']['name']:
self.app.config['protocol']['name'] = self.app.protocol.name
self.app.config.save()
[docs] def on_protocol_swapped(self, old_protocol, protocol):
self.on_protocol_changed()
[docs] def on_app_options_changed(self, plugin_name):
if self.app is None:
return
logger.debug('[ConfigController] on_app_options_changed: %s' %
plugin_name)
observers = ExtensionPoint(IPlugin)
service = observers.service(plugin_name)
if service:
if not hasattr(service, 'get_app_values'):
return
app_options = service.get_app_values()
if app_options:
if not plugin_name in self.app.config.data:
self.app.config.data[plugin_name] = {}
self.app.config.data[plugin_name].update(app_options)
self.app.config.save()
[docs] def get_schedule_requests(self, function_name):
"""
Returns a list of scheduling requests (i.e., ScheduleRequest
instances) for the function specified by function_name.
"""
if function_name == 'on_plugin_enable':
return [ScheduleRequest("microdrop.gui.main_window_controller",
self.name)]
elif function_name == 'on_protocol_swapped':
# make sure that the app's protocol reference is valid
return [ScheduleRequest("microdrop.app",
self.name)]
elif function_name == 'on_dmf_device_swapped':
# make sure that the app's dmf device reference is valid
return [ScheduleRequest("microdrop.app",
self.name)]
return []
PluginGlobals.pop_env()