For those with who are trying this out and are frustrated by the lack of key-bindings.
The key-binding system is better now because you can specify the use of the control key as well as the shift key modifier and you can over-ride the built-in key-bindings - there is one central repository rather than 3 independent ones.
Here is the key_bindings.py script that I've been using for several months - it contains some debugging and some test menu item and some user key bindings. Hopefully you will find it a useful template to get you going while coot default built-ins are put into place (some of them are already: G for blob navigation, Ctrl-G for model navigation, 1,2,3,4 for clipping adjustment).
Paul ######################################################################## To unsubscribe from the COOT list, click the following link: https://www.jiscmail.ac.uk/cgi-bin/WA-JISC.exe?SUBED1=COOT&A=1 This message was issued to members of www.jiscmail.ac.uk/COOT, a mailing list hosted by www.jiscmail.ac.uk, terms & conditions are available at https://www.jiscmail.ac.uk/policyandsecurity/
import coot import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk # thank you ebassi! import signal signal.signal(signal.SIGINT, signal.SIG_DFL) import coot_gui_api import coot_utils import fitting import random import extensions def make_store_for_map_molecule_combobox(): mol_store = Gtk.ListStore(int, str) for imol in coot_utils.molecule_number_list(): if coot.is_valid_map_molecule(imol) == 1: label_str = coot.molecule_name(imol) m_label_str = str(imol) + ' ' + label_str mol_store.append([imol, m_label_str]) return mol_store def fill_combobox_with_mol_options(combobox, filter_function): mols_ls = [] name_store = Gtk.ListStore(int, str) for imol in coot_utils.molecule_number_list(): if filter_function(imol): label_str = molecule_name(imol) m_label_str = str(imol) + ' ' + label_str name_store.append([imol, m_label_str]) return mols_ls # def fill_option_menu_with_mol_options(menu, filter_function): # mol_ls = [] # for mol_no in coot_utils.molecule_number_list(): # if filter_function(mol_no): # label_str = molecule_name(mol_no) # if (isinstance(label_str,(str,))): # mlabel_str = str(mol_no) + " " + label_str # menu.append_text(mlabel_str) # menu.set_active(0) # mol_ls.append(mol_no) # else: # print("OOps molecule name for molecule %s is %s" %(mol_no_ls,label_str)) # return mol_ls def sharpen_blur_map_gui(): def on_ok_button_clicked(button, combobox, check_button_for_resample, check_button_for_refinement_map, entry_for_blur, entry_for_resample, window): tree_iter = combobox.get_active_iter() if tree_iter is not None: model = combobox.get_model() it = model[tree_iter] imol_map = it[0] state_1 = check_button_for_resample.get_active() state_2 = check_button_for_refinement_map.get_active() print("state_1", state_1) print("state_2", state_2) imol_new = -1 t1 = entry_for_blur.get_text() blur_factor = float(t1) if state_1: t2 = entry_for_resample.get_text() resample_factor = float(t2) imol_new = coot.sharpen_blur_map_with_resampling(imol_map, blur_factor, resample_factor) else: imol_new = coot.sharpen_blur_map(imol_map, blur_factor) if state_2: print("set_imol_refinement_map() with ", imol_new) set_imol_refinement_map(imol_new) window.destroy() def on_mol_combobox_changed(combobox): # this function is not useful. For this dialog, we want to do things when # the "OK" button is pressed tree_iter = combobox.get_active_iter() if tree_iter is not None: model = combobox.get_model() it = model[tree_iter] print("Selected: imol=%s" % it) def on_check_button_toggled(check_button, entry_2, label_2): print("toggled", check_button) if check_button.get_active(): entry_2.set_sensitive(True) label_2.set_sensitive(True) else: entry_2.set_sensitive(False) label_2.set_sensitive(False) chooser_label = "Map for Sharpen/Blur" entry_hint_text_1 = "Sharpen/Blur:" # window = Gtk.Window(Gtk.WINDOW_TOPLEVEL) window = Gtk.Window() entry_hint_text_2 = "Factor:" default_entry_1_text = "20" default_entry_2_text = "1.3" label = Gtk.Label(chooser_label) vbox = Gtk.VBox(False, 2) hbox_for_sharpen = Gtk.HBox(False, 0) hbox_for_resample = Gtk.HBox(False, 0) entry_1 = Gtk.Entry(); entry_2 = Gtk.Entry(); entry_label_1 = Gtk.Label(entry_hint_text_1) entry_label_2 = Gtk.Label(entry_hint_text_2) hbox_buttons = Gtk.HBox(True, 2) # combobox = Gtk.combo_box_new_text() ok_button = Gtk.Button(" Make Map ") cancel_button = Gtk.Button(" Cancel ") h_sep = Gtk.HSeparator() # map_mol_list = fill_option_menu_with_map_mol_options(combobox) # map_mol_list = fill_option_menu_with_map_mol_options(combobox) combobox_items = make_store_for_map_molecule_combobox() combobox = Gtk.ComboBox.new_with_model(combobox_items) renderer_text = Gtk.CellRendererText() if len(combobox_items) > 0: combobox.set_active(0) combobox.set_entry_text_column(1) combobox.pack_start(renderer_text, True) combobox.add_attribute(renderer_text, "text", 1) combobox.connect("changed", on_mol_combobox_changed) check_button_for_resample = Gtk.CheckButton("Resample") check_button_for_refinement_map = Gtk.CheckButton("Make the new map the Refinement Map") window.set_title("Coot: Sharpen/Blur Map") window.set_default_size(400, 100) window.add(vbox) vbox.pack_start(label, False, False, 2) vbox.pack_start(combobox, False, False, 2) vbox.pack_start(hbox_for_sharpen, False, False, 2) vbox.pack_start(hbox_for_resample, False, False, 2) vbox.pack_start(check_button_for_refinement_map, False, False, 2) vbox.pack_start(h_sep, False, False, 2) vbox.pack_start(hbox_buttons, False, False, 2) hbox_for_sharpen.pack_start(entry_label_1, False, False, 2) hbox_for_sharpen.pack_start(entry_1, False, False, 2) hbox_for_resample.pack_start(check_button_for_resample, False, False, 2) hbox_for_resample.pack_start(entry_label_2, False, False, 2) hbox_for_resample.pack_start(entry_2, False, False, 2) hbox_buttons.pack_start(ok_button, False, False, 6) hbox_buttons.pack_start(cancel_button, False, False, 6) entry_1.set_size_request(52, -1) entry_2.set_size_request(52, -1) entry_1.set_text(default_entry_1_text) entry_2.set_text(default_entry_2_text) check_button_for_refinement_map.set_active(True) entry_label_2.set_sensitive(False) entry_2.set_sensitive(False) cancel_button.connect("clicked", lambda button: window.destroy()) # ok_button.connect("clicked", on_ok_button_clicked, combobox, map_mol_list, # entry_1, entry_2, check_button, check_button_for_refinement_map, window) ok_button.connect("clicked", on_ok_button_clicked, combobox, check_button_for_resample, check_button_for_refinement_map, entry_1, entry_2, window) check_button_for_resample.connect("toggled", on_check_button_toggled, entry_2, entry_label_2) window.show_all() def add_module_cryo_em_gui(): def make_masked_maps_using_active_atom(): active_atom = coot.active_residue_py() print("active_atom:", active_atom) if active_atom: imol = active_atom[0] coot.make_masked_maps_split_by_chain(imol, coot.imol_refinement_map()) if coot_gui_api.main_menubar(): main_menubar = coot_gui_api.main_menubar() menu = coot_menubar_menu("myCryo-EM") add_simple_coot_menu_menuitem(menu, "Sharpen/Blur...", lambda widget: sharpen_blur_map_gui()) # use a function here that extracts the active molecule add_simple_coot_menu_menuitem(menu, "Maps masked by chain", lambda widget: make_masked_maps_using_active_atom()) def toolbar_label_list(): try: import coot_gui_api except: return [] coot_main_toolbar = coot_gui_api.main_toolbar() coot_main_hbox = coot_gui_api.main_hbox() button_label_ls = [] return [] # ignore this bit for now try: for toolbar_child in coot_main_toolbar.get_children(): ls = [] try: label = toolbar_child.get_label() ls.append(label) ls.append(toolbar_child) button_label_ls.append(ls) except: # some toolitems we have from GTK2 cannot be accessed here # so we pass it and dont add it to the list. # nothing we can do about it. Probably good as we dont want to # play with the GTK2 toolitems only with the PYGTK ones. # # try if it has a name instead, e.g. toolitem try: label = toolbar_child.get_name() ls.append(label) ls.append(toolbar_child) button_label_ls.append(ls) except: pass except AttributeError as e: # this doesn't make sense until we have wired up the gui in the gtkbuilder mode. pass return button_label_ls def coot_toolbar_button(button_label, cb_function, icon_name=False, tooltip=False, toggle_button=False, use_button=False): try: import coot_gui_api except: print("""WARNING:: could not import coot_gui_api module, so we cannot make toolbar_buttons""") return False coot_main_toolbar = coot_gui_api.main_toolbar() if coot_main_toolbar == None: print("ERROR:: in coot_toolbar_button() coot_main_toolbar is null") return False # main body # found_button = False for f in toolbar_label_list(): if button_label in f: found_button = f[1] if found_button: # here we only try to add a new icon, we cannot overwrite the # callback function! toolbutton = found_button else: if toggle_button: toolbutton = Gtk.ToggleToolButton() toolbutton.set_label(button_label) else: toolbutton = Gtk.ToolButton(icon_widget=None, label=button_label) coot_main_toolbar.insert(toolbutton, -1) # insert at the end toolbutton.set_is_important(True) # to display the text, # otherwise only icon # tooltips? if tooltip: toolbutton.set_tooltip_text(tooltip) # coot_tooltips.set_tip(toolbutton, tooltip) def cb_wrapper(widget, callback_function): if (type(callback_function) is bytes): # old style with string as function eval(callback_function) else: # have function as callable and maybe extra args (all in one list) args = [] function = callback_function if (type(callback_function) is list): function = callback_function[0] args = callback_function[1:] # pass the widget/button as well? Maybe the cb function can # make use of it if use_button: args.append(widget) if callable(function): function(*args) else: print("ERROR:: cannot evaluate or call function", function) #toolbutton.connect("clicked", lambda w: eval(cb_function)) toolbutton.connect("clicked", cb_wrapper, cb_function) toolbutton.show() if (icon_name): # try to add a stock item try: toolbutton.set_stock_id(icon_name) except: # try to add a icon widget try: toolbutton.set_icon_widget(icon_name) except: print("INFO:: icon name/widget given but could not add the icon") return toolbutton # def map_molecule_list(): map_list = [] for i in range(coot.graphics_n_molecules()): if coot.is_valid_map_molecule(i): map_list.append(i) return map_list def auto_fit_rotamer_active_residue(): active_atom = coot.active_residue_py() if not active_atom: print("No active atom") else: imol = active_atom[0] chain_id = active_atom[1] res_no = active_atom[2] ins_code = active_atom[3] atom_name = active_atom[4] alt_conf = active_atom[5] print("active-atom:", active_atom) imol_map = coot.imol_refinement_map() replacement_state = coot.refinement_immediate_replacement_state() if imol_map == -1: coot.info_dialog("Oops. Must Select Map to fit to!") else: coot.auto_fit_best_rotamer(res_no, alt_conf, ins_code, chain_id, imol, imol_map, 1, 0.1) def just_one_or_next_map(): def next_map(current_map_number, map_number_list): try: current_idx = map_number_list.index(current_map_number) except: current_idx = -1 l = len(map_number_list) if current_idx > -1: next_index = 0 if current_idx + 1 == l else current_idx + 1 return map_number_list[next_index] return map_number_list[0] map_list = map_molecule_list() current_displayed_maps = [imol for imol in map_list if coot.map_is_displayed(imol) == 1] n_displayed = len(current_displayed_maps) # if nothing is displayed, display the first map in map-list # if one map is displayed, display the next map in map-list # if more than one map is displayed, display only the last map # in the current-displayed-maps if n_displayed == 0: if len(map_list) > 0: coot_utils.undisplay_all_maps_except(map_list[0]) elif n_displayed == 1: if len(map_list) > 1: coot_utils.undisplay_all_maps_except(next_map(current_displayed_maps[0], map_list)) else: coot_utils.undisplay_all_maps_except(current_displayed_maps[-1]) coot_toolbar_button("Sphere Refine", fitting.sphere_refine, icon_name="refine-1.svg", tooltip="RSR around active residue") def step_scrollable_map_number(): maps = map_molecule_list() current = coot.scroll_wheel_map() if maps: l = maps.index(current) if (l == len(maps) - 1): new_map = maps[0] else: new_map = maps[l+1] coot.set_scroll_wheel_map(new_map) def run_the_test_function(): # coot.test_function_py("blue-eyelashes-1.glb", 0) # coot.test_function_py("../../../gltf-sample-models/glTF-Sample-Models/2.0/Corset/glTF-Binary/Corset.glb", 0) # coot.test_function_py("glTF-Sample-Models-2.0/Box/glTF-Binary/Box.glb", 0) # coot.test_function_py("just-one-box.glb", 0) # coot.test_function_py("zelda.glb", 0) # coot.test_function_py("blue-eyelashes-1.glb", 0) # coot.test_function_py("augmented-box-2.glb", 0) # coot.test_function_py("3-planes.glb", 0) # coot.test_function_py("crow-2.glb", 0) # coot.test_function_py("zelda-2.glb", 0) coot.test_function_py("crow-7.glb", 0) # coot.test_function_py("japanese-box.glb", 0) # Ctrl-R should not be rocking - it's too valuable # # coot.add_key_binding_gtk3_py(114, 1, coot.reload_shaders, "Reload Shaders") coot.add_key_binding_gtk3_py(106, 0, auto_fit_rotamer_active_residue, "Autofit rotamer active residue") # Just one or next map, "X" coot.add_key_binding_gtk3_py(88, 0, just_one_or_next_map, "Just One or Next Map") # Change scroll map "V" coot.add_key_binding_gtk3_py(86, 0, step_scrollable_map_number, "Step Scrollable Map Number") # Shift T coot.add_key_binding_gtk3_py(84, 0, run_the_test_function, "Run the test function") def sphere_refine_fn(): fitting.sphere_refine(4.5) def refine_this_residue(): long_residues_refine(0) def triple_refine_residues(): long_residues_refine(1) coot.add_key_binding_gtk3_py(114, 0, refine_this_residue, "Refine This Residue") coot.add_key_binding_gtk3_py(116, 0, triple_refine_residues, "Triple Refine Residues") coot.add_key_binding_gtk3_py( 82, 0, sphere_refine_fn, "Sphere Refine") # this is the version that's on charybdis def long_residues_refine(n_residues=3): active_atom = coot.closest_atom_simple_py() # active_atom returns the CA if it can if not active_atom: print("No active atom") else: imol = active_atom[0] chain_id = active_atom[1] res_no = active_atom[2] ins_code = active_atom[3] atom_name = active_atom[4] alt_conf = active_atom[5] specs = [] print("############################ n_residues {} ".format(n_residues)) try: for ires in range(res_no-n_residues, res_no+n_residues+1): # test if the residue exists by looking for a residue name rn = coot.residue_name(imol, chain_id, ires, ins_code) print("residue name {} for {} {} {} {}".format(rn, imol, chain_id, ires, ins_code)) if rn: specs.append([chain_id, ires, ins_code]) coot.refine_residues_py(imol, specs) except TypeError as e: print(e) def chain_refine_active_chain(): active_atom = coot.closest_atom_simple_py() # active_atom returns the CA if it can if not active_atom: print("No active atom") else: imol = active_atom[0] chain_id = active_atom[1] res_no = active_atom[2] ins_code = active_atom[3] atom_name = active_atom[4] alt_conf = active_atom[5] specs = [] try: coot.refine_residues_py(imol, coot_utils.residues_in_chain(imol, chain_id)) except TypeError as e: print(e) def all_atom_refine(): active_atom = coot.closest_atom_simple_py() # active_atom returns the CA if it can if not active_atom: print("No active atom") else: imol = active_atom[0] chain_id = active_atom[1] res_no = active_atom[2] ins_code = active_atom[3] atom_name = active_atom[4] alt_conf = active_atom[5] specs = [] try: coot.refine_residues_py(imol, coot_utils.all_residues(imol)) except TypeError as e: print(e) def use_perspective(): current_state = coot.use_perspective_projection_state() if current_state == 0: coot.set_use_perspective_projection(1) else: coot.set_use_perspective_projection(0) # this is a toggle def use_ambient_occlusion(): current_state = coot.use_ambient_occlusion_state(); if current_state == 0: coot.set_use_ambient_occlusion(1) else: coot.set_use_ambient_occlusion(0) # this is a toggle def toggle_depth_blur(): current_state = coot.use_depth_blur_state(); if current_state == 0: coot.set_use_depth_blur(1) else: coot.set_use_depth_blur(0) # this is a toggle def use_fog(): current_state = coot.use_fog_state(); if current_state == 0: coot.set_use_fog(1) else: coot.set_use_fog(0) # this is a toggle def use_outline(): current_state = coot.use_outline_state(); if current_state == 0: coot.set_use_outline(1) else: coot.set_use_outline(0) # this is a toggle def draw_normals(): current_state = coot.draw_normals_state(); if current_state == 0: coot.set_draw_normals(1) else: coot.set_draw_normals(0) def wrap_fullscreen(): coot.fullscreen() coot.set_show_modelling_toolbar(0) def wrap_unfullscreen(): coot.unfullscreen() coot.set_show_modelling_toolbar(1) # coot.set_show_modelling_toolbar(0) # coot_toolbar_button("Map Shader", lambda: coot.reload_map_shader()) coot_toolbar_button("Perspective", lambda : use_perspective(), icon_name="gtk-zoom-in") coot_toolbar_button("Fog", lambda : use_fog(), icon_name="gtk-zoom-in") coot_toolbar_button("Long5", lambda : long_residues_refine(5), icon_name="gtk-zoom-in") # coot_toolbar_button("Fullscreen", lambda : wrap_fullscreen(), icon_name="gtk-zoom-in") # coot_toolbar_button("Unfullscreen", lambda : wrap_unfullscreen(), icon_name="gtk-zoom-in") # coot_toolbar_button("Outline", lambda : use_outline(), icon_name="gtk-zoom-in") # coot_toolbar_button("Normals", lambda : draw_normals(), icon_name="gtk-zoom-in") # coot_toolbar_button("Long30", lambda : long_residues_refine(30), icon_name="gtk-zoom-in") coot.add_key_binding_gtk3_py(69, 0, chain_refine_active_chain, "Chain Refine") def front_clip_reduce(): # c1 = coot.get_clipping_plane_front() # coot.set_clipping_front(c1 * 0.98) # c2 = coot.get_clipping_plane_front() # print("front clip was", c1, "c2", c2) coot.decrease_clipping_front() def front_clip_increase(): # c1 = coot.get_clipping_plane_front() # coot.set_clipping_front(c1 * 1.02) # c2 = coot.get_clipping_plane_front() # print("front clip was", c1, "now", c2) coot.increase_clipping_front() def back_clip_increase(): c = coot.get_clipping_plane_back() print("back clip was", c) coot.set_clipping_back(c * 1.05) def back_clip_reduce(): c = coot.get_clipping_plane_back() print("back clip was", c) coot.set_clipping_back(c * 0.95) def active_ligand_contact_dots(): active_atom = coot.active_residue_py() if active_atom: imol = active_atom[0] chain_id = active_atom[1] res_no = active_atom[2] ins_code = active_atom[3] atom_name = active_atom[4] alt_conf = active_atom[5] spec = [chain_id, res_no, ins_code] coot.coot_contact_dots_for_ligand_py(imol, spec) def active_all_atom_contact_dots(): active_atom = coot.active_residue_py() if active_atom: imol = active_atom[0] chain_id = active_atom[1] res_no = active_atom[2] ins_code = active_atom[3] atom_name = active_atom[4] alt_conf = active_atom[5] spec = [chain_id, res_no, ins_code] coot.coot_all_atom_contact_dots(imol) def clear_status_bar(): coot.add_status_bar_text("") # 1,2,3,4 are now built-ins already # coot.add_key_binding_gtk3_py(49, 0, front_clip_reduce, "User KB: Front Clip Reduce") # coot.add_key_binding_gtk3_py(50, 0, front_clip_increase, "User KB: Front Clip Increase") # coot.add_key_binding_gtk3_py(51, 0, back_clip_increase, "Back Clip Increase") # coot.add_key_binding_gtk3_py(52, 0, back_clip_reduce, "Back Clip Reduce") coot.add_key_binding_gtk3_py(53, 0, clear_status_bar, "Clear Status Bar") def add_simple_coot_menu_menuitem(menu, menu_item_label, activate_function): submenu = Gtk.Menu() sub_menuitem = Gtk.MenuItem(menu_item_label) menu.append(sub_menuitem) sub_menuitem.show() sub_menuitem.connect("activate", activate_function) def activate_display_residue_distortions(): active_atom = coot.active_residue_py() if active_atom: imol = active_atom[0] chain_id = active_atom[1] res_no = active_atom[2] ins_code = active_atom[3] atom_name = active_atom[4] alt_conf = active_atom[5] print("do this:", imol, chain_id, res_no, ins_code) coot.display_residue_distortions(imol, chain_id, res_no, ins_code) def local_ribbons(colour_scheme): active_atom = coot.active_residue_py() if active_atom: imol = active_atom[0] chain_id = active_atom[1] res_no = active_atom[2] ins_code = active_atom[3] atom_name = active_atom[4] alt_conf = active_atom[5] coot.add_molecular_representation_py(imol, "//", colour_scheme, "Ribbon") def set_bond_thickness_of_active_molecule(thickness): active_atom = coot.active_residue_py() if active_atom: imol = active_atom[0] coot.set_bond_thickness(imol, thickness) pass main_menubar = coot_gui_api.main_menubar() menu_label = "Test" menu = Gtk.Menu() menuitem = Gtk.MenuItem(menu_label) menuitem.set_submenu(menu) main_menubar.append(menuitem) menuitem.show() menu_sub = Gtk.Menu() menuitem_sub = Gtk.MenuItem("Other Tests") menuitem_sub.set_submenu(menu_sub) menu.append(menuitem_sub) menuitem_sub.show() add_simple_coot_menu_menuitem(menu_sub, "Screendump TGA", lambda widget : coot.screendump_tga("test.tga")) add_simple_coot_menu_menuitem(menu_sub, "Display Residue Distortions", lambda widget : activate_display_residue_distortions()) add_simple_coot_menu_menuitem(menu_sub, "Ligand Contact Dots", lambda widget : active_ligand_contact_dots()) add_simple_coot_menu_menuitem(menu_sub, "All-Atom Contact Dots", lambda widget : active_all_atom_contact_dots()) add_simple_coot_menu_menuitem(menu_sub, "Chain Ribbons", lambda widget : local_ribbons("Chain")) add_simple_coot_menu_menuitem(menu_sub, "Rainbow Ribbons", lambda widget : local_ribbons("colorRampChainsScheme")) add_simple_coot_menu_menuitem(menu_sub, "Surface", lambda widget : coot.add_molecular_representation_py(0, "//", "Chain", "MolecularSurface")) add_simple_coot_menu_menuitem(menu_sub, "bild", lambda widget : coot.import_bild('run_class001_angdist.bild')) add_simple_coot_menu_menuitem(menu_sub, "bild-our", lambda widget : coot.import_bild('run_it005_half1_class001_angdist.bild')) add_simple_coot_menu_menuitem(menu_sub, "Shiny 1", lambda widget : coot.set_map_shininess(1, 0.2)) add_simple_coot_menu_menuitem(menu_sub, "Shiny 2", lambda widget : coot.set_map_shininess(1, 0.5)) add_simple_coot_menu_menuitem(menu_sub, "Shiny 3", lambda widget : coot.set_map_shininess(1, 2.1)) add_simple_coot_menu_menuitem(menu_sub, "Shiny 4", lambda widget : coot.set_map_shininess(1, 9.1)) add_simple_coot_menu_menuitem(menu_sub, "Shiny 5", lambda widget : coot.set_map_shininess(1, 50.1)) add_simple_coot_menu_menuitem(menu_sub, "Shiny 6", lambda widget : coot.set_map_shininess(1, 220.1)) add_simple_coot_menu_menuitem(menu_sub, "Specular Strength 0.0", lambda widget : coot.set_map_specular_strength(1, 0.10)) add_simple_coot_menu_menuitem(menu_sub, "Specular Strength 0.1", lambda widget : coot.set_map_specular_strength(1, 0.1)) add_simple_coot_menu_menuitem(menu_sub, "Specular Strength 0.2", lambda widget : coot.set_map_specular_strength(1, 0.2)) add_simple_coot_menu_menuitem(menu_sub, "Specular Strength 0.5", lambda widget : coot.set_map_specular_strength(1, 0.5)) add_simple_coot_menu_menuitem(menu_sub, "Specular Strength 1.0", lambda widget : coot.set_map_specular_strength(1, 1.0)) add_simple_coot_menu_menuitem(menu_sub, "Specular Strength 2.0", lambda widget : coot.set_map_specular_strength(1, 2.0)) add_simple_coot_menu_menuitem(menu_sub, "Specular Strength 4.0", lambda widget : coot.set_map_specular_strength(1, 4.0)) add_simple_coot_menu_menuitem(menu_sub, "Bond width 3 ", lambda widget : set_bond_thickness_of_active_molecule(3)) add_simple_coot_menu_menuitem(menu_sub, "Bond width 4 ", lambda widget : set_bond_thickness_of_active_molecule(4)) add_simple_coot_menu_menuitem(menu_sub, "Bond width 5 ", lambda widget : set_bond_thickness_of_active_molecule(5)) add_simple_coot_menu_menuitem(menu_sub, "Bond width 6 ", lambda widget : set_bond_thickness_of_active_molecule(6)) add_simple_coot_menu_menuitem(menu_sub, "Bond width 7 ", lambda widget : set_bond_thickness_of_active_molecule(7)) add_simple_coot_menu_menuitem(menu_sub, "Bond width 8 ", lambda widget : set_bond_thickness_of_active_molecule(8)) add_simple_coot_menu_menuitem(menu_sub, "Bond width 9 ", lambda widget : set_bond_thickness_of_active_molecule(9)) add_simple_coot_menu_menuitem(menu_sub, "Bond width 10 ", lambda widget : set_bond_thickness_of_active_molecule(10)) add_simple_coot_menu_menuitem(menu_sub, "Bond width 11 ", lambda widget : set_bond_thickness_of_active_molecule(11)) add_simple_coot_menu_menuitem(menu_sub, "Bond width 12 ", lambda widget : set_bond_thickness_of_active_molecule(12)) add_simple_coot_menu_menuitem(menu_sub, "map shiny 1 10" , lambda widget : coot.set_map_material_specular(1, 1, 10)) add_simple_coot_menu_menuitem(menu_sub, "map shiny 1 200" , lambda widget : coot.set_map_material_specular(1, 1, 200)) add_simple_coot_menu_menuitem(menu_sub, "map shiny 0.1 10" , lambda widget : coot.set_map_material_specular(1, 0.1, 10)) # coot.set_default_bond_thickness(6) def toggle_show_fps(): state = coot.get_fps_flag() if state == 1: coot.set_show_fps(0) else: coot.set_show_fps(1) def coot_menubar_menu(s): menu = Gtk.Menu() menuitem = Gtk.MenuItem(s) menuitem.set_submenu(menu) main_menubar = coot_gui_api.main_menubar() main_menubar.append(menuitem) menuitem.show() return menu def pukka_puckers_test(): coot_utils.pukka_puckers_qm(0) def test_export_model(): coot.export_molecule_as_gltf(0, "test-coot-model.glb") def test_export_map(): coot.export_molecule_as_gltf(1, "test-coot-map.glb") add_module_cryo_em_gui() add_simple_coot_menu_menuitem(menu, "Framebuffer Scale 1", lambda widget: coot.set_framebuffer_scale_factor(1)) add_simple_coot_menu_menuitem(menu, "Framebuffer Scale 2", lambda widget: coot.set_framebuffer_scale_factor(2)) add_simple_coot_menu_menuitem(menu, "Toggle FPS", lambda widget: toggle_show_fps()) add_simple_coot_menu_menuitem(menu,"Show Toolbar", lambda widget: coot.set_show_modelling_toolbar(1)) add_simple_coot_menu_menuitem(menu, "All-Atom Contact Dots", lambda widget: active_molecule_contact_dots()) add_simple_coot_menu_menuitem(menu, "Load Shaders", lambda widget: coot.reload_shaders()) add_simple_coot_menu_menuitem(menu, "Load Map Shaders", lambda widget: coot.reload_map_shader()) add_simple_coot_menu_menuitem(menu, "Effects Shader type 0", lambda widget: coot.set_effects_shader_output_type(0)) add_simple_coot_menu_menuitem(menu, "Effects Shader type 1", lambda widget: coot.set_effects_shader_output_type(1)) add_simple_coot_menu_menuitem(menu, "Effects Shader type 2", lambda widget: coot.set_effects_shader_output_type(2)) add_simple_coot_menu_menuitem(menu, "Effects Shader type 3", lambda widget: coot.set_effects_shader_output_type(3)) add_simple_coot_menu_menuitem(menu, "Use Fancy Lighting", lambda widget: coot.set_use_fancy_lighting(1)) add_simple_coot_menu_menuitem(menu, "Use Basic Lighting", lambda widget: coot.set_use_fancy_lighting(0)) add_simple_coot_menu_menuitem(menu, "Use Basic Lines for Model Molecules", lambda widget: coot.set_use_simple_lines_for_model_molecules(1)) add_simple_coot_menu_menuitem(menu, "Use Standard Model Molecule Representation", lambda widget: coot.set_use_simple_lines_for_model_molecules(0)) add_simple_coot_menu_menuitem(menu, "Reorienting Next Residue Mode", lambda widget : coot.set_reorienting_next_residue_mode(1)) add_simple_coot_menu_menuitem(menu, "Reorienting Next Residue Mode Off", lambda widget : coot.set_reorienting_next_residue_mode(0)) add_simple_coot_menu_menuitem(menu, "Add Map Cap", lambda widget : coot.add_density_map_cap()) add_simple_coot_menu_menuitem(menu, "Go To Origin", lambda widget : coot.set_rotation_centre(0,0,0)) add_simple_coot_menu_menuitem(menu, "Pukka Puckers Test", lambda widget : pukka_puckers_test()) add_simple_coot_menu_menuitem(menu, "Load Test Models", lambda widget : coot.read_test_gltf_models()) add_simple_coot_menu_menuitem(menu, "Export model as glTF", lambda widget : test_export_model()) add_simple_coot_menu_menuitem(menu, "Export map as glTF", lambda widget : test_export_map()) # put this in its own menu? for i in range(21): f = i/20 if i == 0: f = 0.03 label = "Background colour Grey " + str(f) add_simple_coot_menu_menuitem(menu, label, lambda widget,f1=f: coot.set_background_colour(f1,f1,f1)) coot.set_map_radius(18) coot.set_dragged_refinement_steps_per_frame(2) # coot.set_do_coot_probe_dots_during_refine(1) # coot.set_contact_dots_density(0.8) coot.set_show_intermediate_atoms_rota_markup(1) coot.set_bond_smoothness_factor(2)