This class aims to implement Design Token idea into FreeCAD themes. It
allows themes to use generic variables with generic values so we could
use one qss theme and change the style based on values from preference
packs.
* Fix and add menu accelerators: menus common to all workbenches
I use menu accelerators fairly often, so I find it very frustrating when
they are missing, or worse, they don't work due to the same letter being
assigned to several commands.
This patch adds accelerators to lots of menu entries missing them and
fixes broken accelerators.
Wherever possible, standard accelerator keys are used:
https://doc.qt.io/qt-5/accelerators.html
This commit covers accelerator fixes that are common to all workbenches.
Accelerator fixes for specific workbenches will be done in separate
commits.
* Add missing accelerators: Spreadsheet workbench
* Core: Add possibility for task dialogs to associate a view and be able to close when associated view is closed.
* TaskImage: Use task dialog view association.
* Sketcher: Use task dialog view association. Preventing crash (https://github.com/FreeCAD/FreeCAD/issues/16702)
* EditableDatumLabel: Use QPointer to prevent crash
The Qt6 (up to Qt 6.7.3 now) contains bug, which can lead, under
specific circumstances, to crash of the application, when the
MDI window is closed. The circumstances are:
* at least 2 MDI windows needs to be open
* stylesheet muset set different size (border, margin) for activated and un-activated tabBar tab
* the closed window must be inactive, but created before the window now active and open
* race condition must occur betwee the closing and resize event handlers for the tabBar
(see qt bug for details)
So this bug only occures with Qt6 with the Dark or Light styles selected (no classic) and only if
specific sequence of steps is followed during opening and closing the MDI windows.
The bug is in Qt code path executed when QMdiArea::ActivationHistoryOrder is set.
The other possible workaround might be to change all the affected stylesheets, but this seems to me
impractical and also fragile, because the affected code path will be still active.
https://bugreports.qt.io/browse/QTBUG-129596
Improves the use of the ShapeAppearance property for the Part workbench.
removes DiffuseColor property
adds Python compatibility using custom attributes
transitions DiffuseColor to ShapeAppearance on open
Improved UI elements for setting object appearance, and appearance per face
Lays the foundation for future texture support
* New integration with 3Dconnexion devices
* CMake build option hidden for Mac
* Minor fixes, to be squashed to previous commit
* cmake: fix indent and case; to be squashed
* Corrected name case
---------
Co-authored-by: Patryk Skowroński <pskowronski@3dconnexion.com>
Co-authored-by: Chris Hennes <chennes@pioneerlibrarysystem.org>
Co-authored-by: Ladislav Michl <ladis@linux-mips.org>
=====================================================
Add Status bits. Currently only to mark whether an UI operation of restore was initiated by the user (via click in the open dialog or in the hyperlink of the shortcuts of the home page).
Preference Packs are collections of preferences that can be applied en
mass to the user's current setup. Any preference that can be stored in
user.cfg can be stored in a preference pack, and they are designed to be
easy to distribute.
Support is also added for saving a subset of current preferences into a
new preference pack in order to facilitate easy creation of new
"themes", etc.
The motivation of this patch is to make it easy for Python workbench
cache its own icons (possibly generated at runtime), saving the trouble
of pre-compiling the icons as binary resources.
* Gui.addIcon() now support a third argument as format. Default format
is 'XPM' as before. The intention is to allow user to cache other
format of icon image, like 'PNG'.
* ViewProviderPythonFeature::getIcon() now checks if the given string
argument is a key to a cached icon.
Application:
* signalNewDocument, check the extra argument, isMainDoc, the decide
whether to create view of the new document. This is so that external
linked document can be opened in background without crowding the tab
list.
* slotDeleteDocument, calls Document::beforeDelete()
* slotActiveDocument, creates view if none, because external document
is now opened without view.
* onLastWindowClosed(), switch to next active document, and creates view
if none.
* send(Has)MsgToFocusView(), new API to send message to the active view
in focus. This is to solve the ambiguity of things like pressing
delete key, copy, paste handling when the active new is not in focus.
For example, when spread sheet view is active, delete/copy/paste
handling should be different when the focus on the spread sheet view
or focus on tree view.
* tryClose(), delegate to MainWindow for close confirmation
* reopen(), new API to reload a partial document in full
Document/DocumentP:
* _CoinMap, new internal map for quick access view provider from its
root node.
* slotNewObject, modified to support view provider override from
App::FeaturePython, through new API
DocumentObject::getViewProviderNameOverride().
* slotDeletedObject/slotTransactionRemove, improve handling of geo group
children rebuild
* slotSkipRecompute, add special handling of document with skip
recompute. Some command cannot work when skip recompute is active.
For example, sketcher command will check if recompute is successful
on many commands, and will undo if not. New 'PartialCompute' flag is
added to allow recompute only the editing object and all its
dependencies if 'SkipRecompute' is active.
* slotTouchedObject, new signal handling of manually touched object.
* setModified(), do nothing if already modified. This is a critical
performance improvement, because marking tab window as modified turns
out to be a relatively expensive operation, and will cause massive
slow down if calling it on every property change.
* getViewProviderByPathFromHead/getViewProvidersByPath(), new APIs to
obtain view provider(s) from coin SoPath.
* save/saveAll/saveCopy, modified to support external document saving.
* Save/RestoreDocFile(), save and restore tree item recursive expansion
status.
* slotFinishRestoreObject(), handle new signal
signalFinishRestoreObject(), unifies postprocessing in restore and
import operation.
* createView/setActiveView(), add support of delayed view creations
* canClose(), delegate to MainWindows to ask for confirmation
* undo/redo(), support grouped transaction undo/redo. Transactions may
be grouped by the same transaction ID if they are triggered by a
single operation but involves objects from multiple documents.
* toggleInSceneGraph(), new API to add or remove root node from or to
scenegraph without deleting the view object.
MainWindow:
* Update command status using a single shot timer instead of periodical
one.
* Improve message display is status bar. Give error and warning message
higher priority (using QStatusBar::showMessage()) than normal status
message (using actionLabel), reversed from original implementation.
* confirmSave(), new API to check for modification, and ask user to save
the document before closing. The confirmation dialog allows user to
apply the answer to all document for convenience.
* saveAll(), new API to save all document with correct ordering in case
of external linking.
* createMimeDataFromSelection/insertFromMimeData(), support copy paste
object with external linking. A new dialog DlgObjectSelection is used
to let user select exactly which object to export.
CommandDoc/CommandWindow:
* Related changes to object delete, document import, export, and save.
The link support means that an object can now appear in more than one
places, and even inside a document different from its own. This patch
adds support for in-place editing, meaning that the object can be edited
at correct place regardless where it is.
See [here](https://git.io/fjPIk) for more info about the relavent APIs.
This patch includes two example of modifications to support in-place
editing. One is the ViewProviderDragger, which simply adds the dragger
node to editing root node by calling
View3DInventorViewer::setupEditingRoot(dragger). The other much more
complex one is ViewProviderSketch which calls setupEditingRoot(0) to
transfer all its children node into editing root. ViewProviderSketch
also includes various modifications to command invocation, because we
can no longer assume the active document is the owner of the editing
object.
This patch also includes necessary modification of the 'Show' module to
support in-place editing.