Opened 3 years ago

Closed 3 years ago

Last modified 3 years ago

#6936 closed defect (fixed)

SpinBox Return keys forwarded to command line

Reported by: Tristan Croll Owned by: pett
Priority: normal Milestone:
Component: UI Version:
Keywords: Cc: chimerax-programmers
Blocked By: Blocking:
Notify when closed: Platform: all
Project: ChimeraX

Description

The following bug report has been submitted:
Platform:        Windows-10-10.0.19041
ChimeraX Version: 1.4rc202205111743 (2022-05-11 17:43:38 UTC)
Description
Typed a value into a `QDoubleSpinBox` in the new ISOLDE GUI (while docked in the side panel); when I pressed return on that it also executed the current command in the command line. 

Log:
> isolde shorthand
    
    
    Initialising ISOLDE-specific command aliases:
    Alias	Equivalent full command
    -------------------------------------------------
    st	isolde step {arguments}
    aw	isolde add water {arguments}
    awsf	isolde add water {arguments} sim false
    al	isolde add ligand {arguments}
    aa	isolde add aa $1 sel {arguments}
    ht	isolde mod his sel {arguments}
    so	setattr sel atoms occupancy {arguments}
    ab	isolde adjust bfactors {arguments}
    ss	isolde sim start sel
    rt	isolde release torsions sel {arguments}
    rd	isolde release distances sel {arguments}
    ra	rd; rt
    pf	isolde pepflip sel
    cf	isolde cisflip sel
    cbb	color bfactor {arguments}
    cbo	color byattr occupancy {arguments}
    cbc	color {arguments} bychain; color {arguments} byhet
    cs	clipper set contourSensitivity {arguments}
    

  
UCSF ChimeraX version: 1.4rc202205111743 (2022-05-11)  
© 2016-2022 Regents of the University of California. All rights reserved.  
How to cite UCSF ChimeraX  

> isolde demo crystal_intro

> set selectionWidth 4

before.pdb title:  
Crystal structure of etub from clostridium kluyveri [more info...]  
  
Chain information for before.pdb #1  
---  
Chain | Description | UniProt  
A | predicted microcompartment protein | A5N734_CLOK5  
  
before.pdb title:  
Crystal structure of etub from clostridium kluyveri [more info...]  
  
Chain information for before.pdb  
---  
Chain | Description | UniProt  
1.2/A | predicted microcompartment protein | A5N734_CLOK5  
  

WARNING: multiple experimental reflection datasets found:  
(dataset) FOBS, SIGFOBS,  
(dataset) IOBS, SIGIOBS,  
(dataset) DANO, SIGDANO,  
(dataset) F(+), SIGF(+), F(-), SIGF(-),  
(dataset) I(+), SIGI(+), I(-), SIGI(-)  
Automatically choosing "(dataset) FOBS, SIGFOBS".  

Opened (LIVE) 2mFo-DFc as #1.1.1.2, grid size 36,36,34, pixel 0.723, shown at
level 0.303, step 1, values float32  
Opened (LIVE) mFo-DFc as #1.1.1.3, grid size 36,36,34, pixel 0.723, shown at
level -0.0575,0.0575, step 1, values float32  
Opened (LIVE) 2mFo-DFc_sharp_29 as #1.1.1.4, grid size 36,36,34, pixel 0.723,
shown at level 0.603, step 1, values float32  
ISOLDE: Checking and correcting nomenclature for (pseudo)symmetric side
chains...  
ISOLDE: Corrected atom nomenclature of 12 residues in model #1.2 to IUPAC-IUB
standards.  
Opened (LIVE) MDFF potential as #1.1.1.5, grid size 36,36,34, pixel 0.723,
shown at level 0.366, step 1, values float32  
Loaded crystallographic demo: PDB ID 3io0  

> isolde sim start sel

ISOLDE: started sim  

> select clear

> isolde demo crystal_intro

before.pdb title:  
Crystal structure of etub from clostridium kluyveri [more info...]  
  
Chain information for before.pdb #2  
---  
Chain | Description | UniProt  
A | predicted microcompartment protein | A5N734_CLOK5  
  
before.pdb title:  
Crystal structure of etub from clostridium kluyveri [more info...]  
  
Chain information for before.pdb  
---  
Chain | Description | UniProt  
2.2/A | predicted microcompartment protein | A5N734_CLOK5  
  

WARNING: multiple experimental reflection datasets found:  
(dataset) FOBS, SIGFOBS,  
(dataset) IOBS, SIGIOBS,  
(dataset) DANO, SIGDANO,  
(dataset) F(+), SIGF(+), F(-), SIGF(-),  
(dataset) I(+), SIGI(+), I(-), SIGI(-)  
Automatically choosing "(dataset) FOBS, SIGFOBS".  

Opened (LIVE) 2mFo-DFc as #2.1.1.2, grid size 36,36,34, pixel 0.723, shown at
level 0.303, step 1, values float32  
Opened (LIVE) mFo-DFc as #2.1.1.3, grid size 36,36,34, pixel 0.723, shown at
level -0.0567,0.0567, step 1, values float32  
Opened (LIVE) 2mFo-DFc_sharp_29 as #2.1.1.4, grid size 36,36,34, pixel 0.723,
shown at level 0.603, step 1, values float32  
Loaded crystallographic demo: PDB ID 3io0  

> close #2

Deleting Crystallographic maps (3io0-sf.mtz)  
Deleting (LIVE) 2mFo-DFc  
Deleting (LIVE) mFo-DFc  
Deleting (LIVE) 2mFo-DFc_sharp_29  

> isolde demo crystal_intro

before.pdb title:  
Crystal structure of etub from clostridium kluyveri [more info...]  
  
Chain information for before.pdb #2  
---  
Chain | Description | UniProt  
A | predicted microcompartment protein | A5N734_CLOK5  
  
before.pdb title:  
Crystal structure of etub from clostridium kluyveri [more info...]  
  
Chain information for before.pdb  
---  
Chain | Description | UniProt  
2.2/A | predicted microcompartment protein | A5N734_CLOK5  
  

WARNING: multiple experimental reflection datasets found:  
(dataset) FOBS, SIGFOBS,  
(dataset) IOBS, SIGIOBS,  
(dataset) DANO, SIGDANO,  
(dataset) F(+), SIGF(+), F(-), SIGF(-),  
(dataset) I(+), SIGI(+), I(-), SIGI(-)  
Automatically choosing "(dataset) FOBS, SIGFOBS".  

Opened (LIVE) 2mFo-DFc as #2.1.1.2, grid size 36,36,34, pixel 0.723, shown at
level 0.303, step 1, values float32  
Opened (LIVE) mFo-DFc as #2.1.1.3, grid size 36,36,34, pixel 0.723, shown at
level -0.0572,0.0572, step 1, values float32  
Opened (LIVE) 2mFo-DFc_sharp_29 as #2.1.1.4, grid size 36,36,34, pixel 0.723,
shown at level 0.603, step 1, values float32  
Loaded crystallographic demo: PDB ID 3io0  

> close #2

Deleting Crystallographic maps (3io0-sf.mtz)  
Deleting (LIVE) 2mFo-DFc  
Deleting (LIVE) mFo-DFc  
Deleting (LIVE) 2mFo-DFc_sharp_29  

> isolde sim pause

> isolde sim resume

> isolde sim pause




OpenGL version: 3.3.0 NVIDIA 497.29
OpenGL renderer: NVIDIA GeForce RTX 2080/PCIe/SSE2
OpenGL vendor: NVIDIA Corporation

Python: 3.9.11
Locale: en_GB.cp1252
Qt version: PyQt6 6.3.0, Qt 6.3.0
Qt runtime version: 6.3.0
Qt platform: windows

Manufacturer: Notebook                        
Model: P7xxTM1
OS: Microsoft Windows 10 Education (Build 19041)
Memory: 68,654,501,888
MaxProcessMemory: 137,438,953,344
CPU: 16 Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz
OSLanguage: en-GB

Installed Packages:
    -: imerax-isolde
    -.imerax-isolde: 1.4.dev0
    -himerax-isolde: 1.4.dev0
    -imerax-isolde: 1.4.dev0
    alabaster: 0.7.12
    appdirs: 1.4.4
    Babel: 2.10.1
    backcall: 0.2.0
    blockdiag: 3.0.0
    certifi: 2021.10.8
    cftime: 1.6.0
    charset-normalizer: 2.0.12
    ChimeraX-AddCharge: 1.2.3
    ChimeraX-AddH: 2.1.11
    ChimeraX-AlignmentAlgorithms: 2.0
    ChimeraX-AlignmentHdrs: 3.2.1
    ChimeraX-AlignmentMatrices: 2.0
    ChimeraX-Alignments: 2.4.3
    ChimeraX-AlphaFold: 1.0
    ChimeraX-AltlocExplorer: 1.0.2
    ChimeraX-AmberInfo: 1.0
    ChimeraX-Arrays: 1.0
    ChimeraX-Atomic: 1.39.1
    ChimeraX-AtomicLibrary: 7.0
    ChimeraX-AtomSearch: 2.0.1
    ChimeraX-AxesPlanes: 2.1
    ChimeraX-BasicActions: 1.1
    ChimeraX-BILD: 1.0
    ChimeraX-BlastProtein: 2.1.1
    ChimeraX-BondRot: 2.0
    ChimeraX-BugReporter: 1.0
    ChimeraX-BuildStructure: 2.7
    ChimeraX-Bumps: 1.0
    ChimeraX-BundleBuilder: 1.1
    ChimeraX-ButtonPanel: 1.0
    ChimeraX-CageBuilder: 1.0
    ChimeraX-CellPack: 1.0
    ChimeraX-Centroids: 1.2
    ChimeraX-ChemGroup: 2.0
    ChimeraX-Clashes: 2.2.4
    ChimeraX-Clipper: 0.18.0
    ChimeraX-ColorActions: 1.0
    ChimeraX-ColorGlobe: 1.0
    ChimeraX-ColorKey: 1.5.1
    ChimeraX-CommandLine: 1.2.3
    ChimeraX-ConnectStructure: 2.0.1
    ChimeraX-Contacts: 1.0
    ChimeraX-Core: 1.4rc202205111743
    ChimeraX-CoreFormats: 1.1
    ChimeraX-coulombic: 1.3.2
    ChimeraX-Crosslinks: 1.0
    ChimeraX-Crystal: 1.0
    ChimeraX-CrystalContacts: 1.0
    ChimeraX-DataFormats: 1.2.2
    ChimeraX-Dicom: 1.1
    ChimeraX-DistMonitor: 1.1.5
    ChimeraX-Dssp: 2.0
    ChimeraX-EMDB-SFF: 1.0
    ChimeraX-ExperimentalCommands: 1.0
    ChimeraX-FileHistory: 1.0
    ChimeraX-FunctionKey: 1.0
    ChimeraX-Geometry: 1.2
    ChimeraX-gltf: 1.0
    ChimeraX-Graphics: 1.1
    ChimeraX-Hbonds: 2.1.2
    ChimeraX-Help: 1.2
    ChimeraX-HKCage: 1.3
    ChimeraX-IHM: 1.1
    ChimeraX-ImageFormats: 1.2
    ChimeraX-IMOD: 1.0
    ChimeraX-IO: 1.0.1
    ChimeraX-ISOLDE: 1.4.dev0
    ChimeraX-ItemsInspection: 1.0
    ChimeraX-Label: 1.1.1
    ChimeraX-ListInfo: 1.1.1
    ChimeraX-Log: 1.1.5
    ChimeraX-LookingGlass: 1.1
    ChimeraX-Maestro: 1.8.1
    ChimeraX-Map: 1.1
    ChimeraX-MapData: 2.0
    ChimeraX-MapEraser: 1.0
    ChimeraX-MapFilter: 2.0
    ChimeraX-MapFit: 2.0
    ChimeraX-MapSeries: 2.1
    ChimeraX-Markers: 1.0
    ChimeraX-Mask: 1.0
    ChimeraX-MatchMaker: 2.0.6
    ChimeraX-MDcrds: 2.6
    ChimeraX-MedicalToolbar: 1.0.1
    ChimeraX-Meeting: 1.0
    ChimeraX-MLP: 1.1
    ChimeraX-mmCIF: 2.7
    ChimeraX-MMTF: 2.1
    ChimeraX-Modeller: 1.5.5
    ChimeraX-ModelPanel: 1.3.2
    ChimeraX-ModelSeries: 1.0
    ChimeraX-Mol2: 2.0
    ChimeraX-Morph: 1.0
    ChimeraX-MouseModes: 1.1
    ChimeraX-Movie: 1.0
    ChimeraX-Neuron: 1.0
    ChimeraX-Nucleotides: 2.0.2
    ChimeraX-OpenCommand: 1.9
    ChimeraX-PDB: 2.6.6
    ChimeraX-PDBBio: 1.0
    ChimeraX-PDBLibrary: 1.0.2
    ChimeraX-PDBMatrices: 1.0
    ChimeraX-PickBlobs: 1.0
    ChimeraX-Positions: 1.0
    ChimeraX-PresetMgr: 1.1
    ChimeraX-PubChem: 2.1
    ChimeraX-ReadPbonds: 1.0.1
    ChimeraX-Registration: 1.1
    ChimeraX-RemoteControl: 1.0
    ChimeraX-ResidueFit: 1.0
    ChimeraX-RestServer: 1.1
    ChimeraX-RNALayout: 1.0
    ChimeraX-RotamerLibMgr: 2.0.1
    ChimeraX-RotamerLibsDunbrack: 2.0
    ChimeraX-RotamerLibsDynameomics: 2.0
    ChimeraX-RotamerLibsRichardson: 2.0
    ChimeraX-SaveCommand: 1.5
    ChimeraX-SchemeMgr: 1.0
    ChimeraX-SDF: 2.0
    ChimeraX-Segger: 1.0
    ChimeraX-Segment: 1.0
    ChimeraX-SelInspector: 1.0
    ChimeraX-SeqView: 2.6
    ChimeraX-Shape: 1.0.1
    ChimeraX-Shell: 1.0
    ChimeraX-Shortcuts: 1.1
    ChimeraX-ShowAttr: 1.0
    ChimeraX-ShowSequences: 1.0
    ChimeraX-SideView: 1.0
    ChimeraX-Smiles: 2.1
    ChimeraX-SmoothLines: 1.0
    ChimeraX-SpaceNavigator: 1.0
    ChimeraX-StdCommands: 1.8
    ChimeraX-STL: 1.0
    ChimeraX-Storm: 1.0
    ChimeraX-StructMeasure: 1.0.1
    ChimeraX-Struts: 1.0.1
    ChimeraX-Surface: 1.0
    ChimeraX-SwapAA: 2.0
    ChimeraX-SwapRes: 2.1.1
    ChimeraX-TapeMeasure: 1.0
    ChimeraX-Test: 1.0
    ChimeraX-Toolbar: 1.1.1
    ChimeraX-ToolshedUtils: 1.2.1
    ChimeraX-Tug: 1.0
    ChimeraX-UI: 1.18.2
    ChimeraX-uniprot: 2.2
    ChimeraX-UnitCell: 1.0
    ChimeraX-ViewDockX: 1.1.2
    ChimeraX-VIPERdb: 1.0
    ChimeraX-Vive: 1.1
    ChimeraX-VolumeMenu: 1.0
    ChimeraX-VTK: 1.0
    ChimeraX-WavefrontOBJ: 1.0
    ChimeraX-WebCam: 1.0
    ChimeraX-WebServices: 1.1.0
    ChimeraX-Zone: 1.0
    colorama: 0.4.4
    comtypes: 1.1.10
    cxservices: 1.2
    cycler: 0.11.0
    Cython: 0.29.26
    debugpy: 1.6.0
    decorator: 5.1.1
    docutils: 0.17.1
    entrypoints: 0.4
    filelock: 3.4.2
    fonttools: 4.33.3
    funcparserlib: 1.0.0
    grako: 3.16.5
    h5py: 3.6.0
    html2text: 2020.1.16
    idna: 3.3
    ihm: 0.27
    imagecodecs: 2021.11.20
    imagesize: 1.3.0
    ipykernel: 6.6.1
    ipython: 7.31.1
    ipython-genutils: 0.2.0
    jedi: 0.18.1
    Jinja2: 3.0.3
    jupyter-client: 7.1.0
    jupyter-core: 4.10.0
    kiwisolver: 1.4.2
    line-profiler: 3.4.0
    lxml: 4.7.1
    lz4: 3.1.10
    MarkupSafe: 2.1.1
    matplotlib: 3.5.1
    matplotlib-inline: 0.1.3
    msgpack: 1.0.3
    nest-asyncio: 1.5.5
    netCDF4: 1.5.8
    networkx: 2.6.3
    numexpr: 2.8.1
    numpy: 1.22.1
    openvr: 1.16.802
    packaging: 21.3
    ParmEd: 3.4.3
    parso: 0.8.3
    pickleshare: 0.7.5
    Pillow: 9.0.1
    pip: 21.3.1
    pkginfo: 1.8.2
    prompt-toolkit: 3.0.29
    psutil: 5.9.0
    pycollada: 0.7.2
    pydicom: 2.2.2
    Pygments: 2.11.2
    PyOpenGL: 3.1.5
    PyOpenGL-accelerate: 3.1.5
    pyparsing: 3.0.9
    PyQt6-commercial: 6.3.0
    PyQt6-Qt6: 6.3.0
    PyQt6-sip: 13.3.1
    PyQt6-WebEngine-commercial: 6.3.0
    PyQt6-WebEngine-Qt6: 6.3.0
    python-dateutil: 2.8.2
    pytz: 2022.1
    pywin32: 303
    pyzmq: 22.3.0
    qtconsole: 5.3.0
    QtPy: 2.1.0
    RandomWords: 0.3.0
    requests: 2.27.1
    scipy: 1.7.3
    setuptools: 59.8.0
    sfftk-rw: 0.7.2
    six: 1.16.0
    snowballstemmer: 2.2.0
    sortedcontainers: 2.4.0
    Sphinx: 4.3.2
    sphinx-autodoc-typehints: 1.15.2
    sphinxcontrib-applehelp: 1.0.2
    sphinxcontrib-blockdiag: 3.0.0
    sphinxcontrib-devhelp: 1.0.2
    sphinxcontrib-htmlhelp: 2.0.0
    sphinxcontrib-jsmath: 1.0.1
    sphinxcontrib-qthelp: 1.0.3
    sphinxcontrib-serializinghtml: 1.1.5
    suds-community: 1.0.0
    tables: 3.7.0
    tifffile: 2021.11.2
    tinyarray: 1.2.4
    tornado: 6.1
    traitlets: 5.2.0
    urllib3: 1.26.9
    wcwidth: 0.2.5
    webcolors: 1.11.1
    wheel: 0.37.1
    wheel-filename: 1.3.0
    WMI: 1.5.1

Change History (8)

comment:1 by pett, 3 years ago

Component: UnassignedUI
Owner: set to pett
Platform: all
Project: ChimeraX
Status: newaccepted
Summary: ChimeraX bug report submissionSpinBox Return keys forwarded to command line

comment:2 by pett, 3 years ago

Cc: chimerax-programmers added

in reply to:  3 ; comment:3 by pett, 3 years ago

The issue is that widgets such as QLineEdit, QComboBox, and various QSpinBox classes (basically classes with an embedded line editor) don't "eat" a Return key typed into the widget and therefore the key gets forwarded to the command line.  ChimeraX already filters Return keys coming QLineEdits and QComboBoxes.  I propose doing the same for QSpinBox classes, but feel I need buy-in from the team before committing this to the branch at this late date.  The diff is below.  What say you?

--Eric

iMac:/Users/pett/src/chimerax/src/bundles/ui<23> git diff
diff --git a/src/bundles/ui/src/gui.py b/src/bundles/ui/src/gui.py
index b5e64d3d7..060d033bd 100644
--- a/src/bundles/ui/src/gui.py
+++ b/src/bundles/ui/src/gui.py
@@ -2215,8 +2215,9 @@ class ToolWindow(StatusLogger):
         # Since forwarding keystrokes can shift the keyboard focus, don't forward keys that
         # are "unhandled" if those keys only change keyboard state (e.g. CapsLock).  Important
         # for the Python Shell retaining focus.
-        from Qt.QtWidgets import QLineEdit, QComboBox
-        if not self.floating and not isinstance(self.ui_area.focusWidget(), (QLineEdit, QComboBox)) \
+        from Qt.QtWidgets import QLineEdit, QComboBox, QAbstractSpinBox
+        if not self.floating \
+        and not isinstance(self.ui_area.focusWidget(), (QLineEdit, QComboBox, QAbstractSpinBox)) \
         and event.key() not in keyboard_state_keys:
             self.tool_instance.session.ui.forward_keystroke(event)
 


in reply to:  4 ; comment:4 by goddard@…, 3 years ago

I'd be inclined to put this fix in the daily build (ChimeraX 1.5) and not in ChimeraX 1.4.  Our plan was to release 1.4 this week so fixes for rare problems should probably not go in.

comment:5 by Tristan Croll, 3 years ago

Looks like something I could easily patch specifically into ISOLDE's GUI for the time being.

comment:6 by pett, 3 years ago

Okay, daily build only it is then.

Tristan, I don't think it will be easy for you to use the approach in the diff, because that is in code "above" your tool code, where the Return key has made its way to the surrounding ToolWindow and it's deciding whether to forward it on to the command line. I mean it's possible, it's just that there's a couple simpler / more direct approaches.

One is to use a chimerax.ui.options.FloatOption instead of a QDoubleSpinBox directly. Most ChimeraX interfaces use options instead of input widgets directly which is why it took this long to notice that QSpinBox suffers from the same problem as QLineEdit and QComboBox. The value of the option is its .value attribute. Options are designed to be laid out vertically in two columns: one labels, and one widgets. Containers to handle option layout are in chimerax.ui.options.containers.

If learning/using options is just to much at this stage, you could use the same approach that FloatOption uses to prevent the Return key from propagating: override the event() method. Looks at the NZDoubleSpinBox embedded class in chimerax.ui.options.options.py .

comment:7 by pett, 3 years ago

Resolution: fixed
Status: acceptedclosed

Okay, fix committed to daily build

comment:8 by Tristan Croll, 3 years ago

For the time being I've just overridden the event method as per your suggestion. The options approach definitely looks like something I should pay attention to - but I'd like to get this current effort finished and released first, and there is still a lot to sort out.

Note: See TracTickets for help on using tickets.