53 Commits
Author SHA1 Message Date
Ryan FosterandPatTheMav 07be61a2e3 UI: Use filename stem as fallback value on empty collection name
If - for some reason - the name in a scene collection is empty (or
the key doesn't even exist), use the filename stem as a fallback name.

This ensures that the scene collection entry in the cache has a valid
non-empty name.

Using an std::string allows the use of its "empty" method to check for
this otherwise invalid state of the collection data.

Ported from 1baa4619e4.

Co-authored-by: PatTheMav <PatTheMav@users.noreply.github.com>
2025-01-17 17:45:22 -05:00
Ryan FosterandPatTheMav e21712af3e UI: Prevent creation of scene collections with empty name
Empty names for scene collections are not allowed, but this constraint
is only enforced by UI code during text input.

Thus frontend API users are able to create valid scene collections with
empty names which will lead to later possible crashes as the scene
collection is malformed.

As the frontend API uses the related function CreateNewSceneCollection
which handles exceptions by this method, no crashes should occur when
an empty string is provided by an API caller.

Ported from 552c19cab2.

Co-authored-by: PatTheMav <PatTheMav@users.noreply.github.com>
2025-01-17 17:42:29 -05:00
derrodandRyan Foster 248955bd6e UI: Fix remigrating scene collections from absolute to relative 2025-01-08 13:33:02 -05:00
PatTheMavandRyan Foster b285a849b9 UI: Fix collision of existing backup files for new scene collections
The new Scene Collection code uses the lazy creation behaviour of
OBSBasic::Load, which itself uses obs_data_create_from_json_file_safe.

The internal implementation will create a new scene collection with the
contents of an existing backup file with the same name however, thus
users would end up with a nominally "new" scene collection that
contains contents of an old backup.

This update will remove any existing backup file colliding with the
name of the new, duplicated, or renamed, scene collection and remove it
before activating it (and having OBSBasic::Load create a new one).
2024-12-03 15:09:11 -05:00
PatTheMavandRyan Foster 072102701c UI: Use custom property on QAction to retain profile or collection name
On some platforms (e.g. KDE) accelerators are automatically added to
the text properties of QActions, thus changing the value returned by
text().

Thus we cannot rely on the text to always represent the same text that
we set originally and have to explicitly store and retrieve the value
as a property.

Coincidentally this not only fixes possible issues on other platforms,
but is also architecturally more correct.
2024-10-21 11:51:33 -04:00
PatTheMavandRyan Foster 918fe6171d UI: Update order of profiles and scene collections in their menus
The old method to update the profile menu iterated over the directory
entries of the profile directory in the order provided by the operating
system.

The system calls used for this explicitly state that the order of items
is "undefined" but seems to have followed a case-insensitive
alphabetical order on Windows, an order which users have come to expect.

The new code uses a std::map to store discovered profiles and scene
collections, which is ordered by key and with std::string used for keys
this means a lexicographical sorting of keys which is case-sensitive.

To restore the old behavior, profiles and scene collections need to be
added to their respective menus sorted by case-insensitive order, which
has to be done manually before adding the items.
2024-10-21 11:51:33 -04:00
PatTheMavandRyan Foster d9d9881789 UI: Fix deletion of scene collection backup on collection deletion
When a scene collection is deleted, the generated backup files should
not automatically be deleted. This was new behavior introduced in OBS
30.0.0.

This change restores the prior behavior.
2024-10-10 16:38:33 -04:00
PatTheMavandRyan Foster a05f5f5009 UI: Fix activation order of profile and scene collections after delete
After a profile or scene collection is deleted, the last item in each
list would have been automatically activated as the new current profile
or scene collection.

This is opposite to prior behavior, which would always select the first
item in the list.

This code restores the prior behavior.
2024-10-10 16:38:33 -04:00
Ryan Foster a1fbf1015f clang-format: Increase column limit from 80 to 120 2024-10-04 18:19:27 -04:00
PatTheMavandRyan Foster 3e0592dc20 UI: Rewrite scene collection system to enable user-provided storage
This change enables loading scene collections from locations different
than OBS' own configuration directory.

It also rewrites profile management in the app to work off an in-memory
collection of profiles found on disk and does not require iterating
over directory contents for most profile interactions by the app.
2024-09-12 16:18:46 -04:00
derrodandRodney 8251005ad3 UI: Add migration for relative coordinate system 2024-08-27 23:58:51 +02:00
cg2121andLain 89554112c1 UI: Cleanup frontend event handling
This adds a function to OBSBasic to call on_event, so every
time a event is called, the api variable doesn't have to be
checked everytime.
2024-08-10 17:35:22 -07:00
tytan652 48f139729f UI,shared: Move Qt Wrappers to its own directory 2024-07-27 07:38:36 +02:00
derrodandLain ad5f04e53d UI: Soft-delete scene collections
Instead of actually removing the file, simply rename it to the .bak
version which OBS ignores in most cases. That allows users to recover
accidentally deleted collections more easily, while only taking up a
few kilobytes of disk space at most.
2023-07-08 16:39:03 -07:00
Lain 106c7aa61f Update copyrights/names 2023-05-20 01:31:18 -07:00
derrodandRodney 02225aa8bf UI: Reset UUIDs in duplicated collection 2023-03-12 01:11:38 +01:00
derrodandRodney f55b251fa8 UI: Sort and pretty-print exported collections 2023-03-10 23:55:42 +01:00
VainockandMatt Gajownik e053f9dd26 UI,mac-avcapture: Use consistent variables in locales 2022-07-02 14:02:40 +10:00
Richard Stanway 377af35016 UI: Move scene import dialog to the stack
Changed for consistency as almost every other dialog in the application
is stack-allocated.
2022-05-16 21:51:01 +02:00
cg2121andJim 748cf32a43 UI: Add events for renaming profiles/collections
The events make it more clear when profiles or scene
collections are renamed.
2022-03-08 11:17:59 -08:00
VodBox 3d544653e8 UI: Cleanup libobs C++ type use 2021-11-26 23:23:51 +13:00
tt2468andJim feda1aaa28 UI: Add _CHANGING frontend events
Adds the following events:
- `OBS_FRONTEND_EVENT_SCENE_COLLECTION_CHANGING`
- `OBS_FRONTEND_EVENT_PROFILE_CHANGING`

Both emitted right before the change occurs. Can provide plugins with
better awareness of these critical operations happening, so that they
can react accordingly.
2021-11-10 06:36:23 -08:00
jp9000 fb42a2ad8c UI: Remove scene collection undo/redo actions 2021-05-30 11:54:46 -07:00
jp9000 78f1983f7d UI: Remove unnecessary Undo/Redo cleanup func
Since fixing the reference holding issue with scene/source deletion, the
undo/redo cleanup function (last param of add_action) is no longer
required.
2021-04-27 20:45:43 -07:00
jp9000 dde4d57d72 UI: Fix imported scene collection names duplicating
If an imported scene collection has a name that already exists, it will
instead be given a name plus an increment (e.g. "name 2", or "name 3",
etc)

Fixes obsproject/obs-studio#4442
2021-04-20 00:17:34 -07:00
jp9000 e39fa5e902 UI: Clear undo stack in ClearSceneData() instead
Makes more sense to clear it here.
2021-04-09 04:19:31 -07:00
Ford SmithandJim 0b583260a2 UI: Wipe undo/redo stack when switching scene collections 2021-04-08 16:45:04 -07:00
Ford SmithandFord Smith a374c023a1 UI: Undo/Redo Scene Collections
Implements undo/redo for scene collections. This includes operations
including rename, delete, and addition.
2021-03-29 03:06:26 -04:00
Ryan FosterandJim 9b1d1c1b3d UI: Make GetUnusedSceneCollectionFile usable elsewhere 2021-01-11 14:49:59 -08:00
Clayton Groeneveldandjp9000 762983b5d8 UI: Use non-native file dialog w/ Linux 2020-07-18 09:49:24 -07:00
Ryan Foster 27a3da2e70 UI: Fix GetUnusedSceneCollectionFile filename creation
GetUnusedSceneCollectionFile tries to create a safe, unused filename for
a new scene collection JSON file based on the user-specified scene
collection name. It would check the length of the safe version of the
user-specified name, but then it doesn't consider that the length may
have changed when GetClosestUnusedFileName was called to alter the
filename to prevent filename collisions by adding an incremented integer
to the end of the filename. This could result in OBS thinking a filename
was safe and available, but the resulting filename could be one that
already exists. OBS could then overwrite a scene collection JSON file
with this new file without any indication that the file previously
existed.

Instead of trying to calculate a length based off of the returned
filename, let's just use the length of the config path since it's a
known string.
2020-05-19 08:14:56 -04:00
Richard Stanway 4570fcbc72 UI: Fix memory leak 2020-03-19 15:50:32 +01:00
VodBox 191165c721 UI: Add advanced scene collection importer
This replaces the previous Open File dialog for importing collections
with a window for importing many collections at once, based on the remux
window, along with support for importing from OBS Classic, XSplit
Broadcaster and from Streamlabs' fork. This also translates sources
between OSes that Studio supports.
2020-02-16 17:56:06 +13:00
jp9000 cfddf1112b UI: Fix bug in untested/unused function code path
In the current user interface code, OBSBasic::AddSceneCollection has a
qname parameter to allow explicitly specifying a name, but that code
path is unused in the UI code itself, and qname is typically empty.  If
qname is not empty, it does not properly generate a file name associated
with that specified scene collection name.  This fixes that issue.
2019-12-04 15:50:41 -08:00
jp9000 f53df7da64 clang-format: Apply formatting
Code submissions have continually suffered from formatting
inconsistencies that constantly have to be addressed.  Using
clang-format simplifies this by making code formatting more consistent,
and allows automation of the code formatting so that maintainers can
focus more on the code itself instead of code formatting.
2019-06-23 23:49:10 -07:00
Richard Stanwayandjp9000 90df9ea290 UI: Update error message severity levels and show additional info 2019-04-19 05:45:19 -07:00
VodBox ab6c3e0f4b UI: Save scene collection before export 2018-12-21 11:26:13 +13:00
Ilya Melamedandjp9000 c768f703ad UI: Add obs_frontend_add_scene_collection API call
Allows the ability to add a new scene collection via the frontend API.
Blocks until the scene collection has been successfully added to ensure
synchronization between the calling thread and the UI thread.

(Jim: Added detailed description to commit message)

Closes obsproject/obs-studio#1232
2018-05-04 15:40:53 -07:00
jp9000 4fcc2cccfe UI: Move OpenSavedProjecters call to OBSBasic::Load()
Due to the commit 34c14829b6, source loading is now deferred
to after OBSInit(), which would cause saved scene/source projectors to
no longer load on startup.  This fixes that issue by moving the
OpenSavedProjectors call to OBSBasic::Load().
2018-04-18 19:34:18 -07:00
jp9000 f0f0d2c8f6 UI: Remove __FUNCTION__ usage
This code was originally tested with visual C, which supports using
__FUNCTION__ in this way.  These potential error cases shouldn't
technically happen anyway, so just remove __FUNCTION__.
2018-02-08 07:34:36 -08:00
Michelandjp9000 32e60ba65f UI: Import scene collection with correct filename
OBS assumes the name of the imported json file is also the name
of the scene collection, if the filename is different this can result
in duplicate scene collections after importing.

Closes jp9000/obs-studio#1177
2018-02-08 07:20:53 -08:00
Michelandjp9000 609334e427 UI: Fix problem with exporting scene collections/profiles
When exporting scene collections/profiles existing files are
not overwritten.

Closes jp9000/obs-studio#963
2017-07-21 07:46:39 -07:00
jp9000 12236d73f4 UI: Fix enumeration of scene collections on first run
When running the program for the first time, no scene collections will
show up in the scene collection menu.  This changes it to forcibly save
the first scene collection on the first run of the program, and then
re-enumerates the list to ensure it's listed.
2017-05-17 23:29:02 -07:00
jp9000 522f5cdf3b UI: Make sure all message box buttons are translated
Instead of QMessageBox::question and QMessageBox::information, use the
OBSMessageBox class, which translates all buttons.
2017-05-13 14:06:32 -07:00
jp9000 3774a73fe9 UI: Disable filter pasting when scene collection changed 2017-03-25 07:08:11 -07:00
cg2121andjp9000 bcd491a3d6 UI: Add copying/pasting of sources/filters
Closes jp9000/obs-studio#860
2017-03-25 04:29:49 -07:00
cg2121andjp9000 29f22e72a8 UI: Add option to save projectors
This adds an option to the general settings to save the opened
projectors on exit.

(Note: Fixed conflicts -Jim)

Closes jp9000/obs-studio#743
2017-01-29 06:02:15 -08:00
SuslikVandGitHub fae5082b8b UI: Fix Export QFileDialog parent 2016-12-24 13:44:41 +02:00
cg2121andjp9000 9f0c48d9c7 UI: Add import/export of scene collections & profiles
Closes jp9000/obs-studio#721
2016-12-19 04:44:57 -08:00
vicandjp9000 7db00a18fa UI: Fix property name bug in frontend API
This commit fixes a bug that would cause the frontend API function
obs_frontend_set_current_scene_collection to never be successful.  Due
to the bug, the following null pointer check would always fail, so the
action would never be triggered.

Modification by Jim: Instead of fixing the typo that caused this to
occur, make it so both scene collection menus and profile menus both use
"file_name" consistently.

Closes jp9000/obs-studio#712
2016-12-16 16:43:12 -08:00