main() couldn't hold its own state since cleanup() needed access to it.
Having the state in a class allows QApplication::aboutToQuit to call
into a member function with access to the state.
Data used in logging still needs to be global due to
qInstallMessageHandler not accepting a void* to get back to this.
Set QGuiApplication attributes before constructing Qapplication as required,
by using comma operator to call an initialization function before construction
all members in the member initializer list.
Keep logic largely unchanged, but with a defined destruction order.
Destruction is still abnormal due to QApplication::aboutToQuit forcing
us to do partial cleanup before QApplication returns, since some OSes
will kill qTox before the QApplication returns.
Prior to 2f4e8dc3e8 we would take
the written ToxID and insert that straight into history without
any case check
Must be done prior to schema 11 since even though the UNIQUE constraint
on the peers table is fooled by the different case, the UNIQUE
constraint on the new chats and authors table which are stored as BLOBS
fail during upgrade when the two different case but equal ToxPks
collide.
Unfortunately it can't be done as its own upgrade since 11 was already
merged, and this is a prerequisite for 11 to pass for some users.
Execute prior to starting the split peer upgrade instead of as a larger
transaction for simplicity of the split upgrade, and since executing
this deduplication is idempotent.
Text comparisons in SQL are not case sensitive. Since we want to use this check
to specifically check for case mismatch, cast to blob which then does an exact
comparison.
Row ID's are not guaranteed to match those from the original peer table.
New checking method is equally strict since we already verify the number
of entries, and the SQL schema guarantees that entries are unique.
Register in Widget's constructor so that handler can always get back to
Widget.
Add unregistration functionality so that the handler doesn't run when
we've returned to the login window or when exiting.
Doesn't have a formula present, but is still linked to /usr/, so
conflicts with installing or upgrading git from out brewfile. Removing
it gives us a more standard environment, and allows us to test our
brewfile unmodified.
Fixes run failures like
https://github.com/qTox/qTox/runs/6111786910?check_suite_focus=true
feat(l10n): update Chinese (Simplified) translation from Weblate
feat(l10n): update Chinese (Simplified) translation from Weblate
Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (7 of 7 strings)
Translation: Tox/qTox - test, do not translate
Translate-URL: https://hosted.weblate.org/projects/tox/qtox-test-do-not-translate/zh_Hans/
feat(l10n): update Chinese (Simplified) translation from Weblate
feat(l10n): update Chinese (Simplified) translation from Weblate
Covers char* without size, and QByteArray.
Catches the case of QByteArray to QString implicit conversion like was
fixed in 47ee51c61d, but still allows
construction or assignment from string literals in source. Gives most
of the type safety of QT_NO_CAST_FROM_ASCII without having to wrap
every literal string in QStringLiteral.
No functional issues found during change.
QByteArray usually holds arbitrary binary data, which can have null
characters or invalid characters when converted to ASCII or UTF8.
Disallow implicit casting for safety, forcing an explicit decision if
the conversion is wanted.
The range of COMMIT..COMMIT does not count the starting commit, so
single commit PRs are completely unchecked, and multi commit PRs don't
have their first commit checked.
It's invalid to save a different profile than was loaded, so no need to
require the profile to be passed in again on save.
Removes dependence on Nexus singleton for Nexus::getProfile.
The function is documented as async, but is only async when called from
a different thread. Save is called from within Settings, it looks like
only from public functions that would be called on other threads, but
make it async regardless of calling thread for consistency.
There is already a sync function that is used, so safety is not lost.
Setting the parent of MessageBoxManager to Widget has a dual effect of
centreing the QMessageBox's on Widget' window which we want, but also
giving ownership of MessageBoxManager to Widget, which causes Widget to
destroy it in Widget's destructor. Since the original MessageBoxManager
must outlive Widget to be used in Settings and when loading Profiles
before Widget is constructed, we don't want Widget to destroy it.
Instead of juggling MessageBoxManager's parent around dynamically when
Nexus changes the active Window, just construct a second one in Widget
to be used by all its children with the parent set on Widget, centreing
the window and allowing it to have ownership.
Settings and Profile still use the original parent-less
MessageBoxManager since they show popups before Widget is constructed.
The same user may have sent a message both in the group and 1:1, so
generically remove aliases that have no associated messages, rather than
aliases that were used in the group.
Similarly, generically remove authors that have no associated aliases.
The group itself is a chat so will be removed through existing query.