File: views.py

package info (click to toggle)
pyxrd 0.8.4-6
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 7,848 kB
  • sloc: python: 26,500; sh: 301; makefile: 128
file content (204 lines) | stat: -rw-r--r-- 7,772 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
# coding=UTF-8
# ex:ts=4:sw=4:et=on

# Copyright (c) 2013, Mathijs Dumon
# All rights reserved.
# Complete license can be found in the LICENSE file.

from importlib_resources import resource_filename # @UnresolvedImport

import gi
gi.require_version('Gtk', '3.0')  # @UndefinedVariable
from gi.repository import Gtk, GdkPixbuf  # @UnresolvedImport

from pyxrd.data import settings

from pyxrd.generic.views import ObjectListStoreView, BaseView, HasChildView, FormattedTitleView

from pyxrd.project.views import ProjectView
from pyxrd.specimen.views import SpecimenView, EditMarkersView
from pyxrd.application.icons import get_icon_list

class AppView(HasChildView, FormattedTitleView):
    """
        The main application interface view.
        
        Attributes:
            project: the project view
            specimen: the specimen view
            markers: the markers view
            phases: the phases view
            atom_types: the atom_types view
            statistics: the statistics view
            mixtures: the mixtures view
            
        
    """
    builder = resource_filename(__name__, "glade/application.glade")
    top = "main_window"
    title_format = "PyXRD - %s"

    child_views = {
        "project": ProjectView,
        "specimen": SpecimenView,
        "markers": EditMarkersView, # FIXME this should be part of the specimen view/controller code
        "phases": ObjectListStoreView,
        "atom_types": ObjectListStoreView,
        "behaviours": ObjectListStoreView,
        "mixtures": ObjectListStoreView
    }

    widget_groups = {
        'full_mode_only': [
            "tbtn_edit_phases",
            #"tbtn_edit_behaviours",
            "tbtn_edit_atom_types",
            "tbtn_edit_mixtures",
            "tbtn_separator1",
            "btn_sample",
            "separator3",
            "separator4",
            "separator5",
            "main_menu_item_edit_phases",
            "main_menu_item_edit_atom_types",
            "main_menu_item_edit_mixtures"
        ]
    }

    # ------------------------------------------------------------
    #      Initialisation and other internals
    # ------------------------------------------------------------
    def __init__(self, *args, **kwargs):
        super(AppView, self).__init__(*args, **kwargs)

        # Setup about window:
        def on_aboutbox_response(dialog, response, *args):
            if response < 0:
                dialog.hide()
                dialog.emit_stop_by_name('response')

        def on_aboutbox_close(widget, event=None):
            self["about_window"].hide()
            return True

        self["about_window"].set_version(settings.VERSION)
        self["about_window"].set_website("https://github.com/PyXRD/PyXRD/blob/v%s/Manual.pdf" % settings.VERSION);
        pixbuf = GdkPixbuf.Pixbuf.new_from_file(resource_filename(__name__, "icons/pyxrd.png")) # @UndefinedVariable
        scaled_buf = pixbuf.scale_simple(212, 160, GdkPixbuf.InterpType.BILINEAR) # @UndefinedVariable
        self["about_window"].set_logo(scaled_buf)
        self["about_window"].connect("response", on_aboutbox_response)
        self["about_window"].connect("close", on_aboutbox_close)
        self["about_window"].connect("delete_event", on_aboutbox_close)

        self["main_window"].set_icon_list(get_icon_list())

        self.reset_all_views()
        if not settings.DEBUG:
            self.get_top_widget().maximize()
        self.set_layout_mode(settings.DEFAULT_LAYOUT)

        self._clear_gdk_windows()
        self.get_top_widget().show()

        return

    def _clear_gdk_windows(self):
        gdktops = Gtk.Window.list_toplevels()
        gtktop = self["main_window"]
        our_gdktop = gtktop.get_window()        
        for gdktop in gdktops:
            if not our_gdktop == gdktop:
                gdktop.hide()

    def setup_plot(self, plot_controller):
        # Get plot canvas widget
        self.canvas_widget = plot_controller.get_canvas_widget()
        self.canvas_widget.set_name("matplotlib_box2")
        self["matplotlib_box2"] = self.canvas_widget
        
        # Get plot toolbar widget
        self.nav_toolbar = plot_controller.get_toolbar_widget(self.get_top_widget())
        self.nav_toolbar.set_name("navtoolbar")
        self["navtoolbar"] = self.nav_toolbar
        
        # Insert into the window hierarchy:
        self["matplotlib_box"].add(self.canvas_widget)
        self["matplotlib_box"].show_all()       
        
        self["navtoolbar_box"].add(self.nav_toolbar)
        self.nav_toolbar.hide()

    def reset_child_view(self, view_name, class_type=None):
        if getattr(self, view_name, None) is not None:
            getattr(self, view_name).hide()
            setattr(self, view_name, None)
        if class_type == None:
            class_type = self.child_views[view_name]
        view = class_type(parent=self)
        setattr(self, view_name, view)
        view.set_layout_mode(self.current_layout_state)

        if view_name.lower() == "project":
            # Plug in this tree view in the main application:
            self._add_child_view(
                view.specimens_treeview_container, self["specimens_container"])

        return view

    def reset_all_views(self):
        for view_name, class_type in self.child_views.items():
            self.reset_child_view(view_name, class_type)

    # ------------------------------------------------------------
    #      Sensitivity updates
    # ------------------------------------------------------------
    def update_project_sensitivities(self, project_loaded):
        """
            Updates the views sensitivities according to the flag 'project_loaded'
            indicating whether or not there's a project loaded.
        """
        self["main_pained"].set_sensitive(project_loaded)
        self["project_actions"].set_sensitive(project_loaded)
        for action in self["project_actions"].list_actions():
            action.set_sensitive(project_loaded)

    def update_specimen_sensitivities(self, single_specimen_selected, multiple_specimen_selected):
        """
            Updates the views sensitivities according to the flags 
            'single_specimen_active' indicating whether or not there's a single
            specimen selected (= active) and 'multiple_specimen_active' 
            indicating whether or not there are multiple specimen selected.
        """
        self["specimen_actions"].set_sensitive(single_specimen_selected)
        self["specimens_actions"].set_sensitive(single_specimen_selected or multiple_specimen_selected)

    def update_plot_status(self, angularpos, dspacing, experimental, calculated=None):
        wrapper = "<span font_family=\"monospace\">%s</span>"
        text = ""
        if angularpos is not None:
            text = "20=% 3.2f °    d=% 3.2f nm    I<sub>e</sub>=% 5d" % (angularpos, dspacing, experimental)
            if calculated is not None:
                text += "    I<sub>c</sub>=% 5d" % calculated
        self["lbl_plot_info"].set_markup(wrapper % text) 
        
    # ------------------------------------------------------------
    #      View update methods
    # ------------------------------------------------------------
    def set_layout_mode(self, mode):
        super(AppView, self).set_layout_mode(mode)
        for view_name in self.child_views:
            getattr(self, view_name).set_layout_mode(mode)

    def show_plot_toolbar(self):
        self.nav_toolbar.show()
        
    def hide_plot_toolbar(self):
        self.nav_toolbar.hide()

    def show(self, *args, **kwargs):
        BaseView.show(self, *args, **kwargs)

    def get_toplevel(self):
        return self["main_window"]

    pass # end of class