Source code for cadbiom_gui.gt_gui.edit_mvc

## Filename    : edit_mvc.py
## Author(s)   : Geoffroy Andrieux
## Created     : 03/2010
## Revision    :
## Source      :
##
## Copyright 2012 - 2020 IRISA/IRSET
##
## This library 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 2.1 of the License, or
## any later version.
##
## This library 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.  The software and
## documentation provided here under is on an "as is" basis, and IRISA has
## no obligations to provide maintenance, support, updates, enhancements
## or modifications.
## In no event shall IRISA be liable to any party for direct, indirect,
## special, incidental or consequential damages, including lost profits,
## arising out of the use of this software and its documentation, even if
## IRISA have been advised of the possibility of such damage.  See
## the GNU General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with this library; if not, write to the Free Software Foundation,
## Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
##
## The original code contained here was initially developed by:
##
##     Geoffroy Andrieux.
##     IRISA
##     Symbiose team
##     IRISA  Campus de Beaulieu
##     35042 RENNES Cedex, FRANCE
##
##
## Contributor(s): Michel Le Borgne, Nolwenn Le Meur
##
"""
Class for managing a triple (Model, View, Controler) associated with a model
"""

from cadbiom.models.guard_transitions.chart_model import ChartModel
from chart_view import ChartPage, NavView
from cadbiom_gui.gt_gui.graphics.drawing_style import PlainDrawing, NavDrawing
from cadbiom_gui.gt_gui.chart_controler import ChartControler, NavControler
from layout import LayoutVisitor


[docs]class EditMVC(object): """Editor object composed of a MVC pattern Each instance of EditMVC is corresponding to an independant tab in the Cadbiom GUI. We use the following classes: ChartModel: Model ChartControler: Model controller NavControler: Overview controller ChartPage: Graph editor container NavView: Graph editor overview """ def __init__(self, chart, model_name, model=None, layout=False): """ :param chart: The charter using the edit mvc :param model_name: Name of the model :key model: (optional) Chart model :key layout: (optional) Flag to activate the default layout (hierarchical_LR). Default False. :type chart: <Charter> :type model_name: <str> :type model: <ChartModel> :type layout: <boolean> """ self.charter = chart self.ident = chart.ei_id chart.ei_id = chart.ei_id + 1 if model: self.model = model else: self.model = ChartModel(model_name) self.controler = ChartControler(self.model, chart.clipboard) xor, yor, width, height = chart.graph_notebook.get_allocation() # adjustment for notebook (-6, -38) self.viewpage = ChartPage( width - 6, height - 38, PlainDrawing(), self.controler, self.model ) self.view = self.viewpage.draw self.title = self.model.name # layout? if layout: # default layout if necessary lvi = LayoutVisitor(self.view, "hierarchical_LR") model.accept(lvi) # overview navigator self.navcontroler = NavControler() xor, yor, width, height = chart.overview_window.get_allocation() self.nav_view = NavView( width, height, NavDrawing(), self.navcontroler, self.model ) self.viewpage.attach(self.nav_view) # linked to view self.navcontroler.attach(self.viewpage) # registration of auxiliary windows self.aux_win = [] self.has_display = False
[docs] def change_model(self, new_model): """Change the model component""" self.clean_subwin() self.view.model.detach(self.view) # new model self.model = new_model self.controler.model = self.model self.navcontroler.model = self.model self.view.model = self.model self.nav_view.model = self.model self.view.model.attach(self.view) self.nav_view.model.attach(self.nav_view) self.display()
[docs] def display(self): """Update and show""" self.view.update() self.nav_view.update() self.viewpage.notify(None)
[docs] def update(self, node, transition): """Used in the observer pattern""" self.node = node self.transition = transition self.view.update() self.nav_view.update() self.viewpage.notify(None)
[docs] def connect(self, chart): """Initialize the GUI when the user switches from an EditMVC to another We connect the buttons and of the graphical interface to the components of the current EditMVC. Then the UI is sync with the current model :param chart: Mainwindow class :type chart: <Charter> """ # connect buttons to emvc controler chart.drawing_buttons_connect() # self.tab_button.set_sensitive(True) # attach charter to new edit_MVC controler self.controler.attach("edit_node", chart) chart.chart_info.set_controler(self.controler) # Force chart_info to be refreshed self.controler.notify("current_change") # nav window chart.overview_window.get_child().add(self.nav_view)
[docs] def disconnect(self, chart, w_destroy): """Inverse connect operation :param w_destroy: If true the window and its children are destroyed. If False, Subordinate windows are not destroyed. :type w_destroy: <boolean> """ if w_destroy: chart.drawing_button_disconnect() chart.drawing_button_enable() else: chart.drawing_button_disable() self.controler.detach("edit_node", chart) # self.tab_button.set_sensitive(False) if w_destroy: self.clean_subwin() chart.overview_window.get_child().remove(self.nav_view)
[docs] def on_zoom_plus(self, widget): """Zoom in""" self.view.zoom_plus()
[docs] def on_zoom_minus(self, widget): """Zoom out""" self.view.zoom_minus()
## sub windows management ##################################################
[docs] def win_register(self, win): """Subordinate windows registration""" self.aux_win.append(win)
[docs] def win_remove(self, win): """Subordinate windows are destroyed""" if win in self.aux_win: self.aux_win.remove(win)
[docs] def clean_subwin(self): """As it says""" for win in self.aux_win: win.destroy() self.aux_win = []