Opened 3 years ago

Closed 3 years ago

#6843 closed defect (fixed)

Toolbar button causes brief spurious window appearance

Reported by: Tristan Croll Owned by: Greg Couch
Priority: normal Milestone:
Component: UI Version:
Keywords: Cc: Eric Pettersen, Tom Goddard
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
Attaching a quick screen-capture of some weird behaviour, related to ISOLDE's control of buttons on the ribbon bar. If you watch the middle of the screen, every time I press the play/pause/resume button a small floating window briefly flashes up. I've tracked the cause of this down to the callbacks that change the button states - these just (a) disable the two currently-irrelevant buttons in the play/pause/resume group; (b) enable the relevant one; and (c) bring it to the top. Anyway, if I disable those the effect goes away.

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  
Loaded crystallographic demo: PDB ID 3io0  
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  

> isolde sim start sel

ISOLDE: started sim  

> isolde sim pause

[Repeated 1 time(s)]

> select clear

> isolde sim resume

> isolde sim pause

> isolde sim resume

> 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
    -himerax-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
File attachment: 2022-05-12 19-05-21.mkv

2022-05-12 19-05-21.mkv

Attachments (3)

2022-05-12 19-05-21.mkv (7.6 MB ) - added by Tristan Croll 3 years ago.
Added by email2trac
tabbedtoolbar.py.diff (932 bytes ) - added by Tristan Croll 3 years ago.
Minimal "fix"
tabbedtoolbar-enabled.diff (1.3 KB ) - added by Greg Couch 3 years ago.
alternate fix

Change History (16)

by Tristan Croll, 3 years ago

Attachment: 2022-05-12 19-05-21.mkv added

Added by email2trac

comment:1 by Eric Pettersen, 3 years ago

Cc: Eric Pettersen Tom Goddard added
Component: UnassignedUI
Owner: set to Greg Couch
Platform: all
Project: ChimeraX
Status: newassigned
Summary: ChimeraX bug report submissionToolbar button causes brief spurious window appearance

comment:2 by Greg Couch, 3 years ago

The icon is changed with QToolbarButton::setDefaultAction to the existing action corresponding to the button that will be shown. Need to develop a simple test case that can be reported to the Qt company.

comment:3 by Tom Goddard, 3 years ago

Maybe you can in addition to disabling the unused buttons, hide them. Often there is some trick that can work around these Qt glitches.

comment:4 by Tristan Croll, 3 years ago

The toolbar API doesn't currently provide the option to hide buttons. Anyway, this might be specific to Windows... it isn't happening in my Linux build (in ChimeraX 1.4rc202205060510), in any case. Haven't done a Mac build since I started rebuilding ISOLDE's GUI, so can't comment on that.

in reply to:  6 comment:5 by goddard@…, 3 years ago

A Qt work-around could go into the Toolbar code that undisplays the buttons.  I was just suggesting that Tristan or Greg could try inserting that kind of extra line of Qt code -- I've done this monkey business pretty often with Qt to work around its glitches -- usually appearance problems on specific platforms (Mac most often).

comment:6 by Greg Couch, 3 years ago

Status: assignedfeedback

There are no plans to ever provide a toolbar API to hide a button.

Perhaps the glitch could be handled by running the event loop until the toolbar has been updated, so the displaying/undisplaying becaomes a no-op. Tristan, since you can reproduce this behavior, try adding:

from Qt.QtCore import QEventLoop
QEventLoop().processEvents(QEventLoop.ExcludeUserInputEvents)

at the end of site-packages/chimerax/ui/widgets/tabbedtoolbar.py's TabbedToolbar.show_group_button method (near line 520).

It might not be enough if a QTimer goes off while it is updating, but I don't completely understand how Qt events work.

in reply to:  8 comment:7 by goddard@…, 3 years ago

I strongly (very strongly) suggest not running the Qt event loop.  We have done this in other places of the code in the past and every time they led to crashes and hard to debug errors because the sub-eventloop processing allows things like redrawing to happen when the code is not expecting it.  It is really a recipe for disaster to run sub-eventloops, so even if it fixes your problem it will create a much more serious problem.

comment:8 by Greg Couch, 3 years ago

I still like to know if that fixes the problem. It's not a full event loop, it would only be processing outstanding events. And in this case, it would be okay if redrawing the graphics took place -- an extra frame before the "pause" button takes affect is fine.

comment:9 by Tristan Croll, 3 years ago

I'm afraid that didn't make a difference - the transient popup still happens.

comment:10 by Tristan Croll, 3 years ago

Ah - I think I know what's going on. It's not the group button being pushed to the top, it's enabling/disabling that's the culprit. Specifically, changing the enabled state of more than one button in the same iteration of the event loop (I think because each call to set_enabled() triggers a call to _redo_layout() by default). Will see what happens if I change ISOLDE's calls to use set_enabled(redo=False).

comment:11 by Greg Couch, 3 years ago

That makes sense. You also don't necessary need to disable any of the buttons. If it is already paused, then pause is a no-op.

by Tristan Croll, 3 years ago

Attachment: tabbedtoolbar.py.diff added

Minimal "fix"

comment:12 by Tristan Croll, 3 years ago

Didn't realise that the "set_enabled" method with the "redo" keyword option wasn't exposed to the API. The buttons I'm enabling/disabling aren't just those in the button group - they're various others that (e.g.) only make sense when a simulation is running, or when a single residue is selected. I could of course just have them do nothing when clicked under the wrong circumstances, but I find judicious enabling/disabling really helps guide the user to the "right" way of doing things.

The attached diff is a minimal hack that "fixes" the spurious-window problem (I wonder if it might be better to hand it the session object so it can use the "new frame" trigger instead?)... but it also unmasked a different bug: _redo_layout() pushes the "original top" button back to the top of a group. Wasn't seeing that before because I happened to be doing all the enable/disable calls before setting the group order.

by Greg Couch, 3 years ago

Attachment: tabbedtoolbar-enabled.diff added

alternate fix

comment:13 by Greg Couch, 3 years ago

Resolution: fixed
Status: feedbackclosed

Fixed with alternative fix that avoid recreating the buttons when setting if a button is enabled or not. Put in 1.4 release candidate too.

Note: See TracTickets for help on using tickets.