Change the UI to Qt (work in progress)
--------------------------------------------------
Notes and details
--------------------------------------------------
Why was this done? Because wxWidgets was just lacking in many areas. I
know wxWidgets is designed to be used with native controls, and that's
great, but wxWidgets just is not a feature-complete toolkit for
multiplatform applications. It lacks in dialog editors, its code is
archaic and outdated, and I just feel frustrated every time I try to do
things with it.
Qt on the other hand.. I had to actually try Qt to realize how much
better it was as a toolkit. They've got everything from dialog editors,
to an IDE, a debugger, build tools, just everything, and it's all
top-notch and highly maintained. The focus of the toolkit is
application development, and they spend their time trying to help
people do exactly that: make programs. Great support, great tools,
and because of that, great toolkit. I just didn't want to alienate any
developers by being stubborn about native widgets.
There *are* some things that are rather lackluster about it and design
choices I disagree with though. For example, I realize that to have an
easy to use toolkit you have to have some level of code generation.
However, in my personal and humble opinion, moc just feels like a
terrible way to approach the problem. Even now I feel like there are a
variety of ways you could handle code generation and automatic
management of things like that. I don't like the idea of circumventing
the language itself like that. It feels like one giant massive hack.
--------------------------------------------------
Things that aren't working properly:
--------------------------------------------------
- Settings dialog is not implemented. The dialog is complete but the
code to handle the dialog hasn't been constructed yet.
- There is a problem with using Qt widgets as a device target on
windows, with at least OpenGL: if I have the preview widget
automatically resize itself, it seems to cause some sort of video
card failure that I don't understand.
- Because of the above, resizing the preview widget has been disabled
until I can figure out what's going on, so it's currently only a
32x32 area.
- Direct3D doesn't seem to render correctly either, seems that the
viewport is messed up or something. I'm sort of confused about
what's going on with it.
- The new main window seems to be triggering more race conditions than
the wxWidgets main window dialog did. I'm not entirely sure what's
going on here, but this may just be existing race conditions within
libobs itself that I just never spotted before (even though I tend to
be very thorough with race conditions any time I use variables
cross-thread)
2014-01-23 10:53:55 -08:00
|
|
|
/******************************************************************************
|
|
|
|
Copyright (C) 2013 by Hugh Bailey <obs.jim@gmail.com>
|
|
|
|
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation, either version 2 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
******************************************************************************/
|
|
|
|
|
|
|
|
#include "qt-wrappers.hpp"
|
2017-05-13 14:05:03 -07:00
|
|
|
#include "obs-app.hpp"
|
|
|
|
|
Change the UI to Qt (work in progress)
--------------------------------------------------
Notes and details
--------------------------------------------------
Why was this done? Because wxWidgets was just lacking in many areas. I
know wxWidgets is designed to be used with native controls, and that's
great, but wxWidgets just is not a feature-complete toolkit for
multiplatform applications. It lacks in dialog editors, its code is
archaic and outdated, and I just feel frustrated every time I try to do
things with it.
Qt on the other hand.. I had to actually try Qt to realize how much
better it was as a toolkit. They've got everything from dialog editors,
to an IDE, a debugger, build tools, just everything, and it's all
top-notch and highly maintained. The focus of the toolkit is
application development, and they spend their time trying to help
people do exactly that: make programs. Great support, great tools,
and because of that, great toolkit. I just didn't want to alienate any
developers by being stubborn about native widgets.
There *are* some things that are rather lackluster about it and design
choices I disagree with though. For example, I realize that to have an
easy to use toolkit you have to have some level of code generation.
However, in my personal and humble opinion, moc just feels like a
terrible way to approach the problem. Even now I feel like there are a
variety of ways you could handle code generation and automatic
management of things like that. I don't like the idea of circumventing
the language itself like that. It feels like one giant massive hack.
--------------------------------------------------
Things that aren't working properly:
--------------------------------------------------
- Settings dialog is not implemented. The dialog is complete but the
code to handle the dialog hasn't been constructed yet.
- There is a problem with using Qt widgets as a device target on
windows, with at least OpenGL: if I have the preview widget
automatically resize itself, it seems to cause some sort of video
card failure that I don't understand.
- Because of the above, resizing the preview widget has been disabled
until I can figure out what's going on, so it's currently only a
32x32 area.
- Direct3D doesn't seem to render correctly either, seems that the
viewport is messed up or something. I'm sort of confused about
what's going on with it.
- The new main window seems to be triggering more race conditions than
the wxWidgets main window dialog did. I'm not entirely sure what's
going on here, but this may just be existing race conditions within
libobs itself that I just never spotted before (even though I tend to
be very thorough with race conditions any time I use variables
cross-thread)
2014-01-23 10:53:55 -08:00
|
|
|
#include <graphics/graphics.h>
|
2019-03-26 22:01:22 -07:00
|
|
|
#include <util/threading.h>
|
Change the UI to Qt (work in progress)
--------------------------------------------------
Notes and details
--------------------------------------------------
Why was this done? Because wxWidgets was just lacking in many areas. I
know wxWidgets is designed to be used with native controls, and that's
great, but wxWidgets just is not a feature-complete toolkit for
multiplatform applications. It lacks in dialog editors, its code is
archaic and outdated, and I just feel frustrated every time I try to do
things with it.
Qt on the other hand.. I had to actually try Qt to realize how much
better it was as a toolkit. They've got everything from dialog editors,
to an IDE, a debugger, build tools, just everything, and it's all
top-notch and highly maintained. The focus of the toolkit is
application development, and they spend their time trying to help
people do exactly that: make programs. Great support, great tools,
and because of that, great toolkit. I just didn't want to alienate any
developers by being stubborn about native widgets.
There *are* some things that are rather lackluster about it and design
choices I disagree with though. For example, I realize that to have an
easy to use toolkit you have to have some level of code generation.
However, in my personal and humble opinion, moc just feels like a
terrible way to approach the problem. Even now I feel like there are a
variety of ways you could handle code generation and automatic
management of things like that. I don't like the idea of circumventing
the language itself like that. It feels like one giant massive hack.
--------------------------------------------------
Things that aren't working properly:
--------------------------------------------------
- Settings dialog is not implemented. The dialog is complete but the
code to handle the dialog hasn't been constructed yet.
- There is a problem with using Qt widgets as a device target on
windows, with at least OpenGL: if I have the preview widget
automatically resize itself, it seems to cause some sort of video
card failure that I don't understand.
- Because of the above, resizing the preview widget has been disabled
until I can figure out what's going on, so it's currently only a
32x32 area.
- Direct3D doesn't seem to render correctly either, seems that the
viewport is messed up or something. I'm sort of confused about
what's going on with it.
- The new main window seems to be triggering more race conditions than
the wxWidgets main window dialog did. I'm not entirely sure what's
going on here, but this may just be existing race conditions within
libobs itself that I just never spotted before (even though I tend to
be very thorough with race conditions any time I use variables
cross-thread)
2014-01-23 10:53:55 -08:00
|
|
|
#include <QWidget>
|
2016-01-14 06:07:38 -08:00
|
|
|
#include <QLayout>
|
2020-11-08 03:54:11 -08:00
|
|
|
#include <QComboBox>
|
Change the UI to Qt (work in progress)
--------------------------------------------------
Notes and details
--------------------------------------------------
Why was this done? Because wxWidgets was just lacking in many areas. I
know wxWidgets is designed to be used with native controls, and that's
great, but wxWidgets just is not a feature-complete toolkit for
multiplatform applications. It lacks in dialog editors, its code is
archaic and outdated, and I just feel frustrated every time I try to do
things with it.
Qt on the other hand.. I had to actually try Qt to realize how much
better it was as a toolkit. They've got everything from dialog editors,
to an IDE, a debugger, build tools, just everything, and it's all
top-notch and highly maintained. The focus of the toolkit is
application development, and they spend their time trying to help
people do exactly that: make programs. Great support, great tools,
and because of that, great toolkit. I just didn't want to alienate any
developers by being stubborn about native widgets.
There *are* some things that are rather lackluster about it and design
choices I disagree with though. For example, I realize that to have an
easy to use toolkit you have to have some level of code generation.
However, in my personal and humble opinion, moc just feels like a
terrible way to approach the problem. Even now I feel like there are a
variety of ways you could handle code generation and automatic
management of things like that. I don't like the idea of circumventing
the language itself like that. It feels like one giant massive hack.
--------------------------------------------------
Things that aren't working properly:
--------------------------------------------------
- Settings dialog is not implemented. The dialog is complete but the
code to handle the dialog hasn't been constructed yet.
- There is a problem with using Qt widgets as a device target on
windows, with at least OpenGL: if I have the preview widget
automatically resize itself, it seems to cause some sort of video
card failure that I don't understand.
- Because of the above, resizing the preview widget has been disabled
until I can figure out what's going on, so it's currently only a
32x32 area.
- Direct3D doesn't seem to render correctly either, seems that the
viewport is messed up or something. I'm sort of confused about
what's going on with it.
- The new main window seems to be triggering more race conditions than
the wxWidgets main window dialog did. I'm not entirely sure what's
going on here, but this may just be existing race conditions within
libobs itself that I just never spotted before (even though I tend to
be very thorough with race conditions any time I use variables
cross-thread)
2014-01-23 10:53:55 -08:00
|
|
|
#include <QMessageBox>
|
2015-06-27 01:48:58 -07:00
|
|
|
#include <QDataStream>
|
2019-08-08 03:25:33 -07:00
|
|
|
#include <QKeyEvent>
|
2020-07-17 04:32:38 -07:00
|
|
|
#include <QFileDialog>
|
2020-11-08 03:54:11 -08:00
|
|
|
#include <QStandardItemModel>
|
Change the UI to Qt (work in progress)
--------------------------------------------------
Notes and details
--------------------------------------------------
Why was this done? Because wxWidgets was just lacking in many areas. I
know wxWidgets is designed to be used with native controls, and that's
great, but wxWidgets just is not a feature-complete toolkit for
multiplatform applications. It lacks in dialog editors, its code is
archaic and outdated, and I just feel frustrated every time I try to do
things with it.
Qt on the other hand.. I had to actually try Qt to realize how much
better it was as a toolkit. They've got everything from dialog editors,
to an IDE, a debugger, build tools, just everything, and it's all
top-notch and highly maintained. The focus of the toolkit is
application development, and they spend their time trying to help
people do exactly that: make programs. Great support, great tools,
and because of that, great toolkit. I just didn't want to alienate any
developers by being stubborn about native widgets.
There *are* some things that are rather lackluster about it and design
choices I disagree with though. For example, I realize that to have an
easy to use toolkit you have to have some level of code generation.
However, in my personal and humble opinion, moc just feels like a
terrible way to approach the problem. Even now I feel like there are a
variety of ways you could handle code generation and automatic
management of things like that. I don't like the idea of circumventing
the language itself like that. It feels like one giant massive hack.
--------------------------------------------------
Things that aren't working properly:
--------------------------------------------------
- Settings dialog is not implemented. The dialog is complete but the
code to handle the dialog hasn't been constructed yet.
- There is a problem with using Qt widgets as a device target on
windows, with at least OpenGL: if I have the preview widget
automatically resize itself, it seems to cause some sort of video
card failure that I don't understand.
- Because of the above, resizing the preview widget has been disabled
until I can figure out what's going on, so it's currently only a
32x32 area.
- Direct3D doesn't seem to render correctly either, seems that the
viewport is messed up or something. I'm sort of confused about
what's going on with it.
- The new main window seems to be triggering more race conditions than
the wxWidgets main window dialog did. I'm not entirely sure what's
going on here, but this may just be existing race conditions within
libobs itself that I just never spotted before (even though I tend to
be very thorough with race conditions any time I use variables
cross-thread)
2014-01-23 10:53:55 -08:00
|
|
|
|
2014-04-03 14:41:22 -07:00
|
|
|
#if !defined(_WIN32) && !defined(__APPLE__)
|
2020-03-09 17:23:37 -07:00
|
|
|
#include <obs-nix-platform.h>
|
2014-04-03 14:41:22 -07:00
|
|
|
#include <QX11Info>
|
|
|
|
#endif
|
|
|
|
|
2020-03-09 17:23:37 -07:00
|
|
|
#ifdef ENABLE_WAYLAND
|
|
|
|
#include <qpa/qplatformnativeinterface.h>
|
|
|
|
#endif
|
|
|
|
|
Change the UI to Qt (work in progress)
--------------------------------------------------
Notes and details
--------------------------------------------------
Why was this done? Because wxWidgets was just lacking in many areas. I
know wxWidgets is designed to be used with native controls, and that's
great, but wxWidgets just is not a feature-complete toolkit for
multiplatform applications. It lacks in dialog editors, its code is
archaic and outdated, and I just feel frustrated every time I try to do
things with it.
Qt on the other hand.. I had to actually try Qt to realize how much
better it was as a toolkit. They've got everything from dialog editors,
to an IDE, a debugger, build tools, just everything, and it's all
top-notch and highly maintained. The focus of the toolkit is
application development, and they spend their time trying to help
people do exactly that: make programs. Great support, great tools,
and because of that, great toolkit. I just didn't want to alienate any
developers by being stubborn about native widgets.
There *are* some things that are rather lackluster about it and design
choices I disagree with though. For example, I realize that to have an
easy to use toolkit you have to have some level of code generation.
However, in my personal and humble opinion, moc just feels like a
terrible way to approach the problem. Even now I feel like there are a
variety of ways you could handle code generation and automatic
management of things like that. I don't like the idea of circumventing
the language itself like that. It feels like one giant massive hack.
--------------------------------------------------
Things that aren't working properly:
--------------------------------------------------
- Settings dialog is not implemented. The dialog is complete but the
code to handle the dialog hasn't been constructed yet.
- There is a problem with using Qt widgets as a device target on
windows, with at least OpenGL: if I have the preview widget
automatically resize itself, it seems to cause some sort of video
card failure that I don't understand.
- Because of the above, resizing the preview widget has been disabled
until I can figure out what's going on, so it's currently only a
32x32 area.
- Direct3D doesn't seem to render correctly either, seems that the
viewport is messed up or something. I'm sort of confused about
what's going on with it.
- The new main window seems to be triggering more race conditions than
the wxWidgets main window dialog did. I'm not entirely sure what's
going on here, but this may just be existing race conditions within
libobs itself that I just never spotted before (even though I tend to
be very thorough with race conditions any time I use variables
cross-thread)
2014-01-23 10:53:55 -08:00
|
|
|
static inline void OBSErrorBoxva(QWidget *parent, const char *msg, va_list args)
|
|
|
|
{
|
|
|
|
char full_message[4096];
|
|
|
|
vsnprintf(full_message, 4095, msg, args);
|
|
|
|
|
2014-07-12 12:28:32 -07:00
|
|
|
QMessageBox::critical(parent, "Error", full_message);
|
Change the UI to Qt (work in progress)
--------------------------------------------------
Notes and details
--------------------------------------------------
Why was this done? Because wxWidgets was just lacking in many areas. I
know wxWidgets is designed to be used with native controls, and that's
great, but wxWidgets just is not a feature-complete toolkit for
multiplatform applications. It lacks in dialog editors, its code is
archaic and outdated, and I just feel frustrated every time I try to do
things with it.
Qt on the other hand.. I had to actually try Qt to realize how much
better it was as a toolkit. They've got everything from dialog editors,
to an IDE, a debugger, build tools, just everything, and it's all
top-notch and highly maintained. The focus of the toolkit is
application development, and they spend their time trying to help
people do exactly that: make programs. Great support, great tools,
and because of that, great toolkit. I just didn't want to alienate any
developers by being stubborn about native widgets.
There *are* some things that are rather lackluster about it and design
choices I disagree with though. For example, I realize that to have an
easy to use toolkit you have to have some level of code generation.
However, in my personal and humble opinion, moc just feels like a
terrible way to approach the problem. Even now I feel like there are a
variety of ways you could handle code generation and automatic
management of things like that. I don't like the idea of circumventing
the language itself like that. It feels like one giant massive hack.
--------------------------------------------------
Things that aren't working properly:
--------------------------------------------------
- Settings dialog is not implemented. The dialog is complete but the
code to handle the dialog hasn't been constructed yet.
- There is a problem with using Qt widgets as a device target on
windows, with at least OpenGL: if I have the preview widget
automatically resize itself, it seems to cause some sort of video
card failure that I don't understand.
- Because of the above, resizing the preview widget has been disabled
until I can figure out what's going on, so it's currently only a
32x32 area.
- Direct3D doesn't seem to render correctly either, seems that the
viewport is messed up or something. I'm sort of confused about
what's going on with it.
- The new main window seems to be triggering more race conditions than
the wxWidgets main window dialog did. I'm not entirely sure what's
going on here, but this may just be existing race conditions within
libobs itself that I just never spotted before (even though I tend to
be very thorough with race conditions any time I use variables
cross-thread)
2014-01-23 10:53:55 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void OBSErrorBox(QWidget *parent, const char *msg, ...)
|
|
|
|
{
|
|
|
|
va_list args;
|
|
|
|
va_start(args, msg);
|
|
|
|
OBSErrorBoxva(parent, msg, args);
|
|
|
|
va_end(args);
|
|
|
|
}
|
|
|
|
|
2019-06-22 22:13:45 -07:00
|
|
|
QMessageBox::StandardButton
|
|
|
|
OBSMessageBox::question(QWidget *parent, const QString &title,
|
|
|
|
const QString &text,
|
|
|
|
QMessageBox::StandardButtons buttons,
|
|
|
|
QMessageBox::StandardButton defaultButton)
|
2017-05-13 14:05:03 -07:00
|
|
|
{
|
2019-06-22 22:13:45 -07:00
|
|
|
QMessageBox mb(QMessageBox::Question, title, text, buttons, parent);
|
2017-05-13 14:05:03 -07:00
|
|
|
mb.setDefaultButton(defaultButton);
|
2019-06-22 22:13:45 -07:00
|
|
|
if (buttons & QMessageBox::Ok)
|
2017-05-13 14:10:44 -07:00
|
|
|
mb.setButtonText(QMessageBox::Ok, QTStr("OK"));
|
2019-06-22 22:13:45 -07:00
|
|
|
#define translate_button(x) \
|
2017-05-13 14:05:03 -07:00
|
|
|
if (buttons & QMessageBox::x) \
|
|
|
|
mb.setButtonText(QMessageBox::x, QTStr(#x));
|
|
|
|
translate_button(Open);
|
|
|
|
translate_button(Save);
|
|
|
|
translate_button(Cancel);
|
|
|
|
translate_button(Close);
|
|
|
|
translate_button(Discard);
|
|
|
|
translate_button(Apply);
|
|
|
|
translate_button(Reset);
|
|
|
|
translate_button(Yes);
|
|
|
|
translate_button(No);
|
|
|
|
translate_button(No);
|
|
|
|
translate_button(Abort);
|
|
|
|
translate_button(Retry);
|
|
|
|
translate_button(Ignore);
|
|
|
|
#undef translate_button
|
|
|
|
return (QMessageBox::StandardButton)mb.exec();
|
|
|
|
}
|
|
|
|
|
2019-06-22 22:13:45 -07:00
|
|
|
void OBSMessageBox::information(QWidget *parent, const QString &title,
|
|
|
|
const QString &text)
|
2017-05-13 14:05:03 -07:00
|
|
|
{
|
2019-06-22 22:13:45 -07:00
|
|
|
QMessageBox mb(QMessageBox::Information, title, text, QMessageBox::Ok,
|
|
|
|
parent);
|
2017-05-13 14:05:03 -07:00
|
|
|
mb.setButtonText(QMessageBox::Ok, QTStr("OK"));
|
|
|
|
mb.exec();
|
|
|
|
}
|
|
|
|
|
2019-06-22 22:13:45 -07:00
|
|
|
void OBSMessageBox::warning(QWidget *parent, const QString &title,
|
|
|
|
const QString &text, bool enableRichText)
|
2019-03-30 07:42:35 -07:00
|
|
|
{
|
2019-06-22 22:13:45 -07:00
|
|
|
QMessageBox mb(QMessageBox::Warning, title, text, QMessageBox::Ok,
|
|
|
|
parent);
|
2019-05-31 20:52:17 -07:00
|
|
|
if (enableRichText)
|
|
|
|
mb.setTextFormat(Qt::RichText);
|
2019-03-30 07:42:35 -07:00
|
|
|
mb.setButtonText(QMessageBox::Ok, QTStr("OK"));
|
|
|
|
mb.exec();
|
|
|
|
}
|
|
|
|
|
2019-06-22 22:13:45 -07:00
|
|
|
void OBSMessageBox::critical(QWidget *parent, const QString &title,
|
|
|
|
const QString &text)
|
2019-03-30 07:42:35 -07:00
|
|
|
{
|
2019-06-22 22:13:45 -07:00
|
|
|
QMessageBox mb(QMessageBox::Critical, title, text, QMessageBox::Ok,
|
|
|
|
parent);
|
2019-03-30 07:42:35 -07:00
|
|
|
mb.setButtonText(QMessageBox::Ok, QTStr("OK"));
|
|
|
|
mb.exec();
|
|
|
|
}
|
|
|
|
|
2020-08-19 06:11:08 -07:00
|
|
|
bool QTToGSWindow(QWindow *window, gs_window &gswindow)
|
Change the UI to Qt (work in progress)
--------------------------------------------------
Notes and details
--------------------------------------------------
Why was this done? Because wxWidgets was just lacking in many areas. I
know wxWidgets is designed to be used with native controls, and that's
great, but wxWidgets just is not a feature-complete toolkit for
multiplatform applications. It lacks in dialog editors, its code is
archaic and outdated, and I just feel frustrated every time I try to do
things with it.
Qt on the other hand.. I had to actually try Qt to realize how much
better it was as a toolkit. They've got everything from dialog editors,
to an IDE, a debugger, build tools, just everything, and it's all
top-notch and highly maintained. The focus of the toolkit is
application development, and they spend their time trying to help
people do exactly that: make programs. Great support, great tools,
and because of that, great toolkit. I just didn't want to alienate any
developers by being stubborn about native widgets.
There *are* some things that are rather lackluster about it and design
choices I disagree with though. For example, I realize that to have an
easy to use toolkit you have to have some level of code generation.
However, in my personal and humble opinion, moc just feels like a
terrible way to approach the problem. Even now I feel like there are a
variety of ways you could handle code generation and automatic
management of things like that. I don't like the idea of circumventing
the language itself like that. It feels like one giant massive hack.
--------------------------------------------------
Things that aren't working properly:
--------------------------------------------------
- Settings dialog is not implemented. The dialog is complete but the
code to handle the dialog hasn't been constructed yet.
- There is a problem with using Qt widgets as a device target on
windows, with at least OpenGL: if I have the preview widget
automatically resize itself, it seems to cause some sort of video
card failure that I don't understand.
- Because of the above, resizing the preview widget has been disabled
until I can figure out what's going on, so it's currently only a
32x32 area.
- Direct3D doesn't seem to render correctly either, seems that the
viewport is messed up or something. I'm sort of confused about
what's going on with it.
- The new main window seems to be triggering more race conditions than
the wxWidgets main window dialog did. I'm not entirely sure what's
going on here, but this may just be existing race conditions within
libobs itself that I just never spotted before (even though I tend to
be very thorough with race conditions any time I use variables
cross-thread)
2014-01-23 10:53:55 -08:00
|
|
|
{
|
2020-08-19 06:11:08 -07:00
|
|
|
bool success = true;
|
|
|
|
|
Change the UI to Qt (work in progress)
--------------------------------------------------
Notes and details
--------------------------------------------------
Why was this done? Because wxWidgets was just lacking in many areas. I
know wxWidgets is designed to be used with native controls, and that's
great, but wxWidgets just is not a feature-complete toolkit for
multiplatform applications. It lacks in dialog editors, its code is
archaic and outdated, and I just feel frustrated every time I try to do
things with it.
Qt on the other hand.. I had to actually try Qt to realize how much
better it was as a toolkit. They've got everything from dialog editors,
to an IDE, a debugger, build tools, just everything, and it's all
top-notch and highly maintained. The focus of the toolkit is
application development, and they spend their time trying to help
people do exactly that: make programs. Great support, great tools,
and because of that, great toolkit. I just didn't want to alienate any
developers by being stubborn about native widgets.
There *are* some things that are rather lackluster about it and design
choices I disagree with though. For example, I realize that to have an
easy to use toolkit you have to have some level of code generation.
However, in my personal and humble opinion, moc just feels like a
terrible way to approach the problem. Even now I feel like there are a
variety of ways you could handle code generation and automatic
management of things like that. I don't like the idea of circumventing
the language itself like that. It feels like one giant massive hack.
--------------------------------------------------
Things that aren't working properly:
--------------------------------------------------
- Settings dialog is not implemented. The dialog is complete but the
code to handle the dialog hasn't been constructed yet.
- There is a problem with using Qt widgets as a device target on
windows, with at least OpenGL: if I have the preview widget
automatically resize itself, it seems to cause some sort of video
card failure that I don't understand.
- Because of the above, resizing the preview widget has been disabled
until I can figure out what's going on, so it's currently only a
32x32 area.
- Direct3D doesn't seem to render correctly either, seems that the
viewport is messed up or something. I'm sort of confused about
what's going on with it.
- The new main window seems to be triggering more race conditions than
the wxWidgets main window dialog did. I'm not entirely sure what's
going on here, but this may just be existing race conditions within
libobs itself that I just never spotted before (even though I tend to
be very thorough with race conditions any time I use variables
cross-thread)
2014-01-23 10:53:55 -08:00
|
|
|
#ifdef _WIN32
|
2020-03-09 17:23:37 -07:00
|
|
|
gswindow.hwnd = (HWND)window->winId();
|
Change the UI to Qt (work in progress)
--------------------------------------------------
Notes and details
--------------------------------------------------
Why was this done? Because wxWidgets was just lacking in many areas. I
know wxWidgets is designed to be used with native controls, and that's
great, but wxWidgets just is not a feature-complete toolkit for
multiplatform applications. It lacks in dialog editors, its code is
archaic and outdated, and I just feel frustrated every time I try to do
things with it.
Qt on the other hand.. I had to actually try Qt to realize how much
better it was as a toolkit. They've got everything from dialog editors,
to an IDE, a debugger, build tools, just everything, and it's all
top-notch and highly maintained. The focus of the toolkit is
application development, and they spend their time trying to help
people do exactly that: make programs. Great support, great tools,
and because of that, great toolkit. I just didn't want to alienate any
developers by being stubborn about native widgets.
There *are* some things that are rather lackluster about it and design
choices I disagree with though. For example, I realize that to have an
easy to use toolkit you have to have some level of code generation.
However, in my personal and humble opinion, moc just feels like a
terrible way to approach the problem. Even now I feel like there are a
variety of ways you could handle code generation and automatic
management of things like that. I don't like the idea of circumventing
the language itself like that. It feels like one giant massive hack.
--------------------------------------------------
Things that aren't working properly:
--------------------------------------------------
- Settings dialog is not implemented. The dialog is complete but the
code to handle the dialog hasn't been constructed yet.
- There is a problem with using Qt widgets as a device target on
windows, with at least OpenGL: if I have the preview widget
automatically resize itself, it seems to cause some sort of video
card failure that I don't understand.
- Because of the above, resizing the preview widget has been disabled
until I can figure out what's going on, so it's currently only a
32x32 area.
- Direct3D doesn't seem to render correctly either, seems that the
viewport is messed up or something. I'm sort of confused about
what's going on with it.
- The new main window seems to be triggering more race conditions than
the wxWidgets main window dialog did. I'm not entirely sure what's
going on here, but this may just be existing race conditions within
libobs itself that I just never spotted before (even though I tend to
be very thorough with race conditions any time I use variables
cross-thread)
2014-01-23 10:53:55 -08:00
|
|
|
#elif __APPLE__
|
2020-03-09 17:23:37 -07:00
|
|
|
gswindow.view = (id)window->winId();
|
Change the UI to Qt (work in progress)
--------------------------------------------------
Notes and details
--------------------------------------------------
Why was this done? Because wxWidgets was just lacking in many areas. I
know wxWidgets is designed to be used with native controls, and that's
great, but wxWidgets just is not a feature-complete toolkit for
multiplatform applications. It lacks in dialog editors, its code is
archaic and outdated, and I just feel frustrated every time I try to do
things with it.
Qt on the other hand.. I had to actually try Qt to realize how much
better it was as a toolkit. They've got everything from dialog editors,
to an IDE, a debugger, build tools, just everything, and it's all
top-notch and highly maintained. The focus of the toolkit is
application development, and they spend their time trying to help
people do exactly that: make programs. Great support, great tools,
and because of that, great toolkit. I just didn't want to alienate any
developers by being stubborn about native widgets.
There *are* some things that are rather lackluster about it and design
choices I disagree with though. For example, I realize that to have an
easy to use toolkit you have to have some level of code generation.
However, in my personal and humble opinion, moc just feels like a
terrible way to approach the problem. Even now I feel like there are a
variety of ways you could handle code generation and automatic
management of things like that. I don't like the idea of circumventing
the language itself like that. It feels like one giant massive hack.
--------------------------------------------------
Things that aren't working properly:
--------------------------------------------------
- Settings dialog is not implemented. The dialog is complete but the
code to handle the dialog hasn't been constructed yet.
- There is a problem with using Qt widgets as a device target on
windows, with at least OpenGL: if I have the preview widget
automatically resize itself, it seems to cause some sort of video
card failure that I don't understand.
- Because of the above, resizing the preview widget has been disabled
until I can figure out what's going on, so it's currently only a
32x32 area.
- Direct3D doesn't seem to render correctly either, seems that the
viewport is messed up or something. I'm sort of confused about
what's going on with it.
- The new main window seems to be triggering more race conditions than
the wxWidgets main window dialog did. I'm not entirely sure what's
going on here, but this may just be existing race conditions within
libobs itself that I just never spotted before (even though I tend to
be very thorough with race conditions any time I use variables
cross-thread)
2014-01-23 10:53:55 -08:00
|
|
|
#else
|
2020-03-09 17:23:37 -07:00
|
|
|
switch (obs_get_nix_platform()) {
|
|
|
|
case OBS_NIX_PLATFORM_X11_GLX:
|
|
|
|
case OBS_NIX_PLATFORM_X11_EGL:
|
|
|
|
gswindow.id = window->winId();
|
|
|
|
gswindow.display = obs_get_nix_platform_display();
|
|
|
|
break;
|
|
|
|
#ifdef ENABLE_WAYLAND
|
|
|
|
case OBS_NIX_PLATFORM_WAYLAND:
|
|
|
|
QPlatformNativeInterface *native =
|
|
|
|
QGuiApplication::platformNativeInterface();
|
|
|
|
gswindow.display =
|
|
|
|
native->nativeResourceForWindow("surface", window);
|
2020-08-19 06:11:08 -07:00
|
|
|
success = gswindow.display != nullptr;
|
2020-03-09 17:23:37 -07:00
|
|
|
break;
|
|
|
|
#endif
|
|
|
|
}
|
Change the UI to Qt (work in progress)
--------------------------------------------------
Notes and details
--------------------------------------------------
Why was this done? Because wxWidgets was just lacking in many areas. I
know wxWidgets is designed to be used with native controls, and that's
great, but wxWidgets just is not a feature-complete toolkit for
multiplatform applications. It lacks in dialog editors, its code is
archaic and outdated, and I just feel frustrated every time I try to do
things with it.
Qt on the other hand.. I had to actually try Qt to realize how much
better it was as a toolkit. They've got everything from dialog editors,
to an IDE, a debugger, build tools, just everything, and it's all
top-notch and highly maintained. The focus of the toolkit is
application development, and they spend their time trying to help
people do exactly that: make programs. Great support, great tools,
and because of that, great toolkit. I just didn't want to alienate any
developers by being stubborn about native widgets.
There *are* some things that are rather lackluster about it and design
choices I disagree with though. For example, I realize that to have an
easy to use toolkit you have to have some level of code generation.
However, in my personal and humble opinion, moc just feels like a
terrible way to approach the problem. Even now I feel like there are a
variety of ways you could handle code generation and automatic
management of things like that. I don't like the idea of circumventing
the language itself like that. It feels like one giant massive hack.
--------------------------------------------------
Things that aren't working properly:
--------------------------------------------------
- Settings dialog is not implemented. The dialog is complete but the
code to handle the dialog hasn't been constructed yet.
- There is a problem with using Qt widgets as a device target on
windows, with at least OpenGL: if I have the preview widget
automatically resize itself, it seems to cause some sort of video
card failure that I don't understand.
- Because of the above, resizing the preview widget has been disabled
until I can figure out what's going on, so it's currently only a
32x32 area.
- Direct3D doesn't seem to render correctly either, seems that the
viewport is messed up or something. I'm sort of confused about
what's going on with it.
- The new main window seems to be triggering more race conditions than
the wxWidgets main window dialog did. I'm not entirely sure what's
going on here, but this may just be existing race conditions within
libobs itself that I just never spotted before (even though I tend to
be very thorough with race conditions any time I use variables
cross-thread)
2014-01-23 10:53:55 -08:00
|
|
|
#endif
|
2020-08-19 06:11:08 -07:00
|
|
|
return success;
|
Change the UI to Qt (work in progress)
--------------------------------------------------
Notes and details
--------------------------------------------------
Why was this done? Because wxWidgets was just lacking in many areas. I
know wxWidgets is designed to be used with native controls, and that's
great, but wxWidgets just is not a feature-complete toolkit for
multiplatform applications. It lacks in dialog editors, its code is
archaic and outdated, and I just feel frustrated every time I try to do
things with it.
Qt on the other hand.. I had to actually try Qt to realize how much
better it was as a toolkit. They've got everything from dialog editors,
to an IDE, a debugger, build tools, just everything, and it's all
top-notch and highly maintained. The focus of the toolkit is
application development, and they spend their time trying to help
people do exactly that: make programs. Great support, great tools,
and because of that, great toolkit. I just didn't want to alienate any
developers by being stubborn about native widgets.
There *are* some things that are rather lackluster about it and design
choices I disagree with though. For example, I realize that to have an
easy to use toolkit you have to have some level of code generation.
However, in my personal and humble opinion, moc just feels like a
terrible way to approach the problem. Even now I feel like there are a
variety of ways you could handle code generation and automatic
management of things like that. I don't like the idea of circumventing
the language itself like that. It feels like one giant massive hack.
--------------------------------------------------
Things that aren't working properly:
--------------------------------------------------
- Settings dialog is not implemented. The dialog is complete but the
code to handle the dialog hasn't been constructed yet.
- There is a problem with using Qt widgets as a device target on
windows, with at least OpenGL: if I have the preview widget
automatically resize itself, it seems to cause some sort of video
card failure that I don't understand.
- Because of the above, resizing the preview widget has been disabled
until I can figure out what's going on, so it's currently only a
32x32 area.
- Direct3D doesn't seem to render correctly either, seems that the
viewport is messed up or something. I'm sort of confused about
what's going on with it.
- The new main window seems to be triggering more race conditions than
the wxWidgets main window dialog did. I'm not entirely sure what's
going on here, but this may just be existing race conditions within
libobs itself that I just never spotted before (even though I tend to
be very thorough with race conditions any time I use variables
cross-thread)
2014-01-23 10:53:55 -08:00
|
|
|
}
|
2014-11-01 13:45:01 -07:00
|
|
|
|
|
|
|
uint32_t TranslateQtKeyboardEventModifiers(Qt::KeyboardModifiers mods)
|
|
|
|
{
|
|
|
|
int obsModifiers = INTERACT_NONE;
|
|
|
|
|
|
|
|
if (mods.testFlag(Qt::ShiftModifier))
|
|
|
|
obsModifiers |= INTERACT_SHIFT_KEY;
|
|
|
|
if (mods.testFlag(Qt::AltModifier))
|
|
|
|
obsModifiers |= INTERACT_ALT_KEY;
|
|
|
|
#ifdef __APPLE__
|
|
|
|
// Mac: Meta = Control, Control = Command
|
|
|
|
if (mods.testFlag(Qt::ControlModifier))
|
|
|
|
obsModifiers |= INTERACT_COMMAND_KEY;
|
|
|
|
if (mods.testFlag(Qt::MetaModifier))
|
|
|
|
obsModifiers |= INTERACT_CONTROL_KEY;
|
|
|
|
#else
|
|
|
|
// Handle windows key? Can a browser even trap that key?
|
|
|
|
if (mods.testFlag(Qt::ControlModifier))
|
|
|
|
obsModifiers |= INTERACT_CONTROL_KEY;
|
|
|
|
if (mods.testFlag(Qt::MetaModifier))
|
|
|
|
obsModifiers |= INTERACT_COMMAND_KEY;
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
return obsModifiers;
|
|
|
|
}
|
2015-06-27 01:48:58 -07:00
|
|
|
|
2015-06-26 19:06:34 -07:00
|
|
|
QDataStream &operator<<(QDataStream &out,
|
2019-06-22 22:13:45 -07:00
|
|
|
const std::vector<std::shared_ptr<OBSSignal>> &)
|
2015-06-26 19:06:34 -07:00
|
|
|
{
|
|
|
|
return out;
|
|
|
|
}
|
|
|
|
|
|
|
|
QDataStream &operator>>(QDataStream &in,
|
2019-06-22 22:13:45 -07:00
|
|
|
std::vector<std::shared_ptr<OBSSignal>> &)
|
2015-06-26 19:06:34 -07:00
|
|
|
{
|
|
|
|
return in;
|
|
|
|
}
|
|
|
|
|
2015-06-27 01:48:58 -07:00
|
|
|
QDataStream &operator<<(QDataStream &out, const OBSScene &scene)
|
|
|
|
{
|
|
|
|
return out << QString(obs_source_get_name(obs_scene_get_source(scene)));
|
|
|
|
}
|
|
|
|
|
|
|
|
QDataStream &operator>>(QDataStream &in, OBSScene &scene)
|
|
|
|
{
|
|
|
|
QString sceneName;
|
|
|
|
|
|
|
|
in >> sceneName;
|
|
|
|
|
|
|
|
obs_source_t *source = obs_get_source_by_name(QT_TO_UTF8(sceneName));
|
|
|
|
scene = obs_scene_from_source(source);
|
2020-09-02 10:20:52 -07:00
|
|
|
obs_source_release(source);
|
2015-06-27 01:48:58 -07:00
|
|
|
|
|
|
|
return in;
|
|
|
|
}
|
2015-06-26 18:39:39 -07:00
|
|
|
|
|
|
|
QDataStream &operator<<(QDataStream &out, const OBSSceneItem &si)
|
|
|
|
{
|
2019-06-22 22:13:45 -07:00
|
|
|
obs_scene_t *scene = obs_sceneitem_get_scene(si);
|
2015-06-26 18:39:39 -07:00
|
|
|
obs_source_t *source = obs_sceneitem_get_source(si);
|
|
|
|
return out << QString(obs_source_get_name(obs_scene_get_source(scene)))
|
|
|
|
<< QString(obs_source_get_name(source));
|
|
|
|
}
|
|
|
|
|
|
|
|
QDataStream &operator>>(QDataStream &in, OBSSceneItem &si)
|
|
|
|
{
|
|
|
|
QString sceneName;
|
|
|
|
QString sourceName;
|
|
|
|
|
|
|
|
in >> sceneName >> sourceName;
|
|
|
|
|
|
|
|
obs_source_t *sceneSource =
|
|
|
|
obs_get_source_by_name(QT_TO_UTF8(sceneName));
|
|
|
|
|
|
|
|
obs_scene_t *scene = obs_scene_from_source(sceneSource);
|
|
|
|
si = obs_scene_find_source(scene, QT_TO_UTF8(sourceName));
|
|
|
|
|
|
|
|
obs_source_release(sceneSource);
|
|
|
|
|
|
|
|
return in;
|
|
|
|
}
|
2016-01-14 06:07:38 -08:00
|
|
|
|
|
|
|
void DeleteLayout(QLayout *layout)
|
|
|
|
{
|
|
|
|
if (!layout)
|
|
|
|
return;
|
|
|
|
|
|
|
|
for (;;) {
|
|
|
|
QLayoutItem *item = layout->takeAt(0);
|
|
|
|
if (!item)
|
|
|
|
break;
|
|
|
|
|
|
|
|
QLayout *subLayout = item->layout();
|
|
|
|
if (subLayout) {
|
|
|
|
DeleteLayout(subLayout);
|
|
|
|
} else {
|
|
|
|
delete item->widget();
|
|
|
|
delete item;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
delete layout;
|
|
|
|
}
|
2019-02-06 12:04:31 -08:00
|
|
|
|
|
|
|
class QuickThread : public QThread {
|
|
|
|
public:
|
2019-06-22 22:13:45 -07:00
|
|
|
explicit inline QuickThread(std::function<void()> func_) : func(func_)
|
2019-02-06 12:04:31 -08:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2019-06-22 22:13:45 -07:00
|
|
|
private:
|
|
|
|
virtual void run() override { func(); }
|
|
|
|
|
2019-02-06 12:04:31 -08:00
|
|
|
std::function<void()> func;
|
|
|
|
};
|
|
|
|
|
|
|
|
QThread *CreateQThread(std::function<void()> func)
|
|
|
|
{
|
|
|
|
return new QuickThread(func);
|
|
|
|
}
|
2019-02-06 13:22:59 -08:00
|
|
|
|
2019-03-26 22:01:22 -07:00
|
|
|
volatile long insideEventLoop = 0;
|
|
|
|
|
2019-02-06 13:22:59 -08:00
|
|
|
void ExecuteFuncSafeBlock(std::function<void()> func)
|
|
|
|
{
|
|
|
|
QEventLoop eventLoop;
|
|
|
|
|
2019-06-22 22:13:45 -07:00
|
|
|
auto wait = [&]() {
|
2019-02-06 13:22:59 -08:00
|
|
|
func();
|
|
|
|
QMetaObject::invokeMethod(&eventLoop, "quit",
|
2019-06-22 22:13:45 -07:00
|
|
|
Qt::QueuedConnection);
|
2019-02-06 13:22:59 -08:00
|
|
|
};
|
|
|
|
|
2019-03-26 22:01:22 -07:00
|
|
|
os_atomic_inc_long(&insideEventLoop);
|
2019-02-06 13:22:59 -08:00
|
|
|
QScopedPointer<QThread> thread(CreateQThread(wait));
|
|
|
|
thread->start();
|
|
|
|
eventLoop.exec();
|
|
|
|
thread->wait();
|
2019-03-26 22:01:22 -07:00
|
|
|
os_atomic_dec_long(&insideEventLoop);
|
2019-02-06 13:22:59 -08:00
|
|
|
}
|
|
|
|
|
2019-06-22 22:13:45 -07:00
|
|
|
void ExecuteFuncSafeBlockMsgBox(std::function<void()> func,
|
|
|
|
const QString &title, const QString &text)
|
2019-02-06 13:22:59 -08:00
|
|
|
{
|
|
|
|
QMessageBox dlg;
|
|
|
|
dlg.setWindowFlags(dlg.windowFlags() & ~Qt::WindowCloseButtonHint);
|
|
|
|
dlg.setWindowTitle(title);
|
|
|
|
dlg.setText(text);
|
2020-06-07 15:31:13 -07:00
|
|
|
dlg.setStandardButtons(QMessageBox::StandardButtons());
|
2019-02-06 13:22:59 -08:00
|
|
|
|
2019-06-22 22:13:45 -07:00
|
|
|
auto wait = [&]() {
|
2019-02-06 13:22:59 -08:00
|
|
|
func();
|
|
|
|
QMetaObject::invokeMethod(&dlg, "accept", Qt::QueuedConnection);
|
|
|
|
};
|
|
|
|
|
2019-03-26 22:01:22 -07:00
|
|
|
os_atomic_inc_long(&insideEventLoop);
|
2019-02-06 13:22:59 -08:00
|
|
|
QScopedPointer<QThread> thread(CreateQThread(wait));
|
|
|
|
thread->start();
|
|
|
|
dlg.exec();
|
|
|
|
thread->wait();
|
2019-03-26 22:01:22 -07:00
|
|
|
os_atomic_dec_long(&insideEventLoop);
|
2019-02-06 13:22:59 -08:00
|
|
|
}
|
2019-02-20 17:33:29 -08:00
|
|
|
|
|
|
|
static bool enable_message_boxes = false;
|
|
|
|
|
|
|
|
void EnableThreadedMessageBoxes(bool enable)
|
|
|
|
{
|
|
|
|
enable_message_boxes = enable;
|
|
|
|
}
|
|
|
|
|
2019-06-22 22:13:45 -07:00
|
|
|
void ExecThreadedWithoutBlocking(std::function<void()> func,
|
|
|
|
const QString &title, const QString &text)
|
2019-02-20 17:33:29 -08:00
|
|
|
{
|
|
|
|
if (!enable_message_boxes)
|
|
|
|
ExecuteFuncSafeBlock(func);
|
|
|
|
else
|
|
|
|
ExecuteFuncSafeBlockMsgBox(func, title, text);
|
|
|
|
}
|
2019-08-08 03:25:33 -07:00
|
|
|
|
|
|
|
bool LineEditCanceled(QEvent *event)
|
|
|
|
{
|
|
|
|
if (event->type() == QEvent::KeyPress) {
|
|
|
|
QKeyEvent *keyEvent = reinterpret_cast<QKeyEvent *>(event);
|
|
|
|
return keyEvent->key() == Qt::Key_Escape;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool LineEditChanged(QEvent *event)
|
|
|
|
{
|
|
|
|
if (event->type() == QEvent::KeyPress) {
|
|
|
|
QKeyEvent *keyEvent = reinterpret_cast<QKeyEvent *>(event);
|
|
|
|
|
|
|
|
switch (keyEvent->key()) {
|
|
|
|
case Qt::Key_Tab:
|
|
|
|
case Qt::Key_Backtab:
|
|
|
|
case Qt::Key_Enter:
|
|
|
|
case Qt::Key_Return:
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
} else if (event->type() == QEvent::FocusOut) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
2019-12-27 10:53:26 -08:00
|
|
|
|
2020-11-08 03:54:11 -08:00
|
|
|
void SetComboItemEnabled(QComboBox *c, int idx, bool enabled)
|
|
|
|
{
|
|
|
|
QStandardItemModel *model =
|
|
|
|
dynamic_cast<QStandardItemModel *>(c->model());
|
|
|
|
QStandardItem *item = model->item(idx);
|
|
|
|
item->setFlags(enabled ? Qt::ItemIsSelectable | Qt::ItemIsEnabled
|
|
|
|
: Qt::NoItemFlags);
|
|
|
|
}
|
|
|
|
|
2019-12-27 10:53:26 -08:00
|
|
|
void setThemeID(QWidget *widget, const QString &themeID)
|
|
|
|
{
|
|
|
|
if (widget->property("themeID").toString() != themeID) {
|
|
|
|
widget->setProperty("themeID", themeID);
|
|
|
|
|
|
|
|
/* force style sheet recalculation */
|
|
|
|
QString qss = widget->styleSheet();
|
|
|
|
widget->setStyleSheet("/* */");
|
|
|
|
widget->setStyleSheet(qss);
|
|
|
|
}
|
|
|
|
}
|
2020-07-17 04:32:38 -07:00
|
|
|
|
|
|
|
QString SelectDirectory(QWidget *parent, QString title, QString path)
|
|
|
|
{
|
|
|
|
QString dir = QFileDialog::getExistingDirectory(
|
|
|
|
parent, title, path,
|
|
|
|
QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
|
|
|
|
|
|
|
|
return dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
QString SaveFile(QWidget *parent, QString title, QString path,
|
|
|
|
QString extensions)
|
|
|
|
{
|
|
|
|
QString file =
|
|
|
|
QFileDialog::getSaveFileName(parent, title, path, extensions);
|
|
|
|
|
|
|
|
return file;
|
|
|
|
}
|
|
|
|
|
|
|
|
QString OpenFile(QWidget *parent, QString title, QString path,
|
|
|
|
QString extensions)
|
|
|
|
{
|
|
|
|
QString file =
|
|
|
|
QFileDialog::getOpenFileName(parent, title, path, extensions);
|
|
|
|
|
|
|
|
return file;
|
|
|
|
}
|
|
|
|
|
|
|
|
QStringList OpenFiles(QWidget *parent, QString title, QString path,
|
|
|
|
QString extensions)
|
|
|
|
{
|
|
|
|
QStringList files =
|
|
|
|
QFileDialog::getOpenFileNames(parent, title, path, extensions);
|
|
|
|
|
|
|
|
return files;
|
|
|
|
}
|