forked from bernhardcl/coot
-
Notifications
You must be signed in to change notification settings - Fork 0
/
selectMapDialog.py
112 lines (92 loc) · 4.18 KB
/
selectMapDialog.py
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
#!/usr/bin/env python
"""Create a select map dialog box, similar to Coot's show_select_map_dialog(), but allow for a callback."""
# Copyright 2011 Kevin Keating
#
# Licensed under the Educational Community License, Version 2.0 (the
# "License"); you may not use this file except in compliance with the
# License. You may obtain a copy of the License at
#
# http://www.osedu.org/licenses/ECL-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an "AS IS"
# BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
# or implied. See the License for the specific language governing
# permissions and limitations under the License.
from coot import molecule_name, graphics_n_molecules, is_valid_map_molecule, imol_refinement_map, set_imol_refinement_map
import gtk
def selectMapDialog(callback = None):
"""Display a GUI for selecting the refinement map.
OPTIONAL ARGUMENTS:
callback - a function to call when the user clicks OK
RETURNS:
None
"""
#create a list of map molecules and their names
mapList = []
for imol in xrange(graphics_n_molecules()):
if is_valid_map_molecule(imol):
mapList.append(imol)
#if we have no maps, then display an error and don't invoke the callback
if len(mapList) == 0:
warningMessage = gtk.MessageDialog(type=gtk.MESSAGE_ERROR, buttons=gtk.BUTTONS_OK, message_format="Please load a map before using RCrane.")
warningMessage.set_title("RCrane Error")
warningMessage.run()
warningMessage.destroy()
else:
#if we have one or more maps
dialog = gtk.Dialog(title="Select Map for Fitting", buttons=(gtk.STOCK_OK, gtk.RESPONSE_OK))
#create a combo box that lists maps
mapListStore = gtk.ListStore(int, str)
for imol in mapList:
mapListStore.append([imol, str(imol) + " " + molecule_name(imol)])
mapCombo = gtk.ComboBox(mapListStore)
mapRender = gtk.CellRendererText()
mapCombo.pack_start(mapRender, True)
mapCombo.add_attribute(mapRender, 'text', 1)
#select the current refinemnt map, or the first map if no map has been selected
currentMap = imol_refinement_map()
if currentMap == -1:
set_imol_refinement_map(mapListStore[0][0])
mapCombo.set_active(0)
else:
#figure out which combobox row corresponds to the currently selected map
comboIndex = [i[0] for i in mapListStore].index(currentMap)
mapCombo.set_active(comboIndex)
#connect the changed signal for the combobox
mapCombo.connect("changed", __changeMap)
#add the label and frame
chooseLabel = gtk.Label("Choose a Map:")
frame = gtk.Frame()
frameBox = gtk.VBox(False, 0)
frame.add(frameBox)
frameBox.pack_start(chooseLabel, False, False, 2)
frameBox.pack_start(mapCombo, False, False, 2)
#pack things into the top area of the dialog box
dialog.vbox.pack_start(frame, False, False, 2)
dialog.vbox.show_all()
#connect the callback function
if callback is not None:
#if there is a callback function and the user clicks OK, then call the callback
#if the user clicks the close button, then don't call the callback
def checkResponse(dialog, responseID, callback):
if responseID == gtk.RESPONSE_OK: callback()
dialog.connect("response", checkResponse, callback)
#create the dialog box
dialog.run()
dialog.destroy()
def __changeMap(mapCombo):
"""Respond to the user selecting a map
ARGUMENTS:
mapCombo - the ComboBox object for map selection
RETURNS:
None
EFFECTS:
sets the refinement map to the newly selected map
"""
#figure out the newly selected map
mapListStore = mapCombo.get_model()
selectedMapIter = mapCombo.get_active_iter()
selectedImol = mapListStore.get_value(selectedMapIter, 0)
#set the refinement map
set_imol_refinement_map(selectedImol)