提交 d473b2da 编写于 作者: S SuslikV 提交者: jp9000

UI: Hide/show dialogs when minimizing to tray

Hides dialogs when minimizing to tray, and shows again when restoring
from tray.

Closes jp9000/obs-studio#737
上级 abe4bfd9
...@@ -2703,6 +2703,29 @@ void OBSBasic::CloseDialogs() ...@@ -2703,6 +2703,29 @@ void OBSBasic::CloseDialogs()
} }
} }
void OBSBasic::EnumDialogs()
{
visDialogs.clear();
modalDialogs.clear();
visMsgBoxes.clear();
/* fill list of Visible dialogs and Modal dialogs */
QList<QDialog*> dialogs = findChildren<QDialog*>();
for (QDialog *dialog : dialogs) {
if (dialog->isVisible())
visDialogs.append(dialog);
if (dialog->isModal())
modalDialogs.append(dialog);
}
/* fill list of Visible message boxes */
QList<QMessageBox*> msgBoxes = findChildren<QMessageBox*>();
for (QMessageBox *msgbox : msgBoxes) {
if (msgbox->isVisible())
visMsgBoxes.append(msgbox);
}
}
void OBSBasic::ClearSceneData() void OBSBasic::ClearSceneData()
{ {
disableSaving++; disableSaving++;
...@@ -2817,11 +2840,9 @@ void OBSBasic::on_actionRemux_triggered() ...@@ -2817,11 +2840,9 @@ void OBSBasic::on_actionRemux_triggered()
void OBSBasic::on_action_Settings_triggered() void OBSBasic::on_action_Settings_triggered()
{ {
disableHiding = true;
OBSBasicSettings settings(this); OBSBasicSettings settings(this);
settings.exec(); settings.exec();
SystemTray(false); SystemTray(false);
disableHiding = false;
} }
void OBSBasic::on_actionAdvAudioProperties_triggered() void OBSBasic::on_actionAdvAudioProperties_triggered()
...@@ -4893,6 +4914,15 @@ void OBSBasic::SetShowing(bool showing) ...@@ -4893,6 +4914,15 @@ void OBSBasic::SetShowing(bool showing)
"BasicWindow", "geometry", "BasicWindow", "geometry",
saveGeometry().toBase64().constData()); saveGeometry().toBase64().constData());
/* hide all visible child dialogs */
visDlgPositions.clear();
if (!visDialogs.isEmpty()) {
for (QDialog *dlg : visDialogs) {
visDlgPositions.append(dlg->pos());
dlg->hide();
}
}
if (showHide) if (showHide)
showHide->setText(QTStr("Basic.SystemTray.Show")); showHide->setText(QTStr("Basic.SystemTray.Show"));
QTimer::singleShot(250, this, SLOT(hide())); QTimer::singleShot(250, this, SLOT(hide()));
...@@ -4912,6 +4942,15 @@ void OBSBasic::SetShowing(bool showing) ...@@ -4912,6 +4942,15 @@ void OBSBasic::SetShowing(bool showing)
setVisible(true); setVisible(true);
/* show all child dialogs that was visible earlier */
if (!visDialogs.isEmpty()) {
for (int i = 0; i < visDialogs.size(); ++i) {
QDialog *dlg = visDialogs[i];
dlg->move(visDlgPositions[i]);
dlg->show();
}
}
/* Unminimize window if it was hidden to tray instead of task /* Unminimize window if it was hidden to tray instead of task
* bar. */ * bar. */
if (sysTrayMinimizeToTray()) { if (sysTrayMinimizeToTray()) {
...@@ -4923,6 +4962,18 @@ void OBSBasic::SetShowing(bool showing) ...@@ -4923,6 +4962,18 @@ void OBSBasic::SetShowing(bool showing)
} }
} }
void OBSBasic::ToggleShowHide()
{
bool showing = isVisible();
if (showing) {
/* check for modal dialogs */
EnumDialogs();
if (!modalDialogs.isEmpty() || !visMsgBoxes.isEmpty())
return;
}
SetShowing(!showing);
}
void OBSBasic::SystemTrayInit() void OBSBasic::SystemTrayInit()
{ {
trayIcon = new QSystemTrayIcon(QIcon(":/res/images/obs.png"), trayIcon = new QSystemTrayIcon(QIcon(":/res/images/obs.png"),
......
...@@ -38,6 +38,7 @@ ...@@ -38,6 +38,7 @@
#include <QPointer> #include <QPointer>
class QMessageBox;
class QListWidgetItem; class QListWidgetItem;
class VolControl; class VolControl;
class QNetworkReply; class QNetworkReply;
...@@ -162,7 +163,6 @@ private: ...@@ -162,7 +163,6 @@ private:
QPointer<QAction> showHide; QPointer<QAction> showHide;
QPointer<QAction> exit; QPointer<QAction> exit;
QPointer<QMenu> trayMenu; QPointer<QMenu> trayMenu;
bool disableHiding = false;
void DrawBackdrop(float cx, float cy); void DrawBackdrop(float cx, float cy);
...@@ -323,6 +323,14 @@ private: ...@@ -323,6 +323,14 @@ private:
bool sysTrayMinimizeToTray(); bool sysTrayMinimizeToTray();
void EnumDialogs();
QList<QDialog*> visDialogs;
QList<QDialog*> modalDialogs;
QList<QMessageBox*> visMsgBoxes;
QList<QPoint> visDlgPositions;
public slots: public slots:
void StartStreaming(); void StartStreaming();
void StopStreaming(); void StopStreaming();
...@@ -393,15 +401,7 @@ private slots: ...@@ -393,15 +401,7 @@ private slots:
void IconActivated(QSystemTrayIcon::ActivationReason reason); void IconActivated(QSystemTrayIcon::ActivationReason reason);
void SetShowing(bool showing); void SetShowing(bool showing);
inline void ToggleShowHide() void ToggleShowHide();
{
bool showing = isVisible();
if (disableHiding && showing)
return;
if (showing)
CloseDialogs();
SetShowing(!showing);
}
private: private:
/* OBS Callbacks */ /* OBS Callbacks */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册