Qt: SimpleDialog fixes and updates.

Add WiresharkApplication::mainWindow and use it to move the C
simple_dialog routines to simple_dialog.cpp.

In SimpleDialog, make sure our checkbox is initialized. Don't store our
parent widget (which might go away) in a static variable, just use
wsApp->mainWindow(). Make sure we use check boxes only in Qt 5.2 or
later.

Bug: 13275
Change-Id: I72a9715c59f2efd50f722197f416179e87bb6a8b
Reviewed-on: https://code.wireshark.org/review/22805
Reviewed-by: Gerald Combs <gerald@wireshark.org>
Petri-Dish: Gerald Combs <gerald@wireshark.org>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Michael Mann <mmann78@netscape.net>
This commit is contained in:
Gerald Combs 2017-07-26 10:10:09 -07:00 committed by Michael Mann
parent ea233921b4
commit f86f54eb90
5 changed files with 118 additions and 92 deletions

View File

@ -39,7 +39,6 @@ DIAG_ON(frame-larger-than=)
#include <epan/plugin_if.h>
#include <epan/export_object.h>
#include "ui/commandline.h"
#include "ui/iface_toolbar.h"
#ifdef HAVE_LIBPCAP
@ -237,92 +236,6 @@ static void mainwindow_remove_toolbar(const gchar *menu_title)
}
}
gpointer
simple_dialog(ESD_TYPE_E type, gint btn_mask, const gchar *msg_format, ...)
{
va_list ap;
va_start(ap, msg_format);
SimpleDialog sd(gbl_cur_main_window_, type, btn_mask, msg_format, ap);
va_end(ap);
sd.exec();
return NULL;
}
/*
* Alert box, with optional "don't show this message again" variable
* and checkbox, and optional secondary text.
*/
void
simple_message_box(ESD_TYPE_E type, gboolean *notagain,
const char *secondary_msg, const char *msg_format, ...)
{
if (notagain && *notagain) {
return;
}
va_list ap;
va_start(ap, msg_format);
SimpleDialog sd(gbl_cur_main_window_, type, ESD_BTN_OK, msg_format, ap);
va_end(ap);
sd.setDetailedText(secondary_msg);
#if (QT_VERSION > QT_VERSION_CHECK(5, 2, 0))
QCheckBox *cb = NULL;
if (notagain) {
cb = new QCheckBox();
cb->setChecked(true);
cb->setText(QObject::tr("Don't show this message again."));
sd.setCheckBox(cb);
}
#endif
sd.exec();
#if (QT_VERSION > QT_VERSION_CHECK(5, 2, 0))
if (notagain && cb) {
*notagain = cb->isChecked();
}
#endif
}
/*
* Error alert box, taking a format and a va_list argument.
*/
void
vsimple_error_message_box(const char *msg_format, va_list ap)
{
#ifdef HAVE_LIBPCAP
// We want to quit after reading the capture file, hence
// we don't actually open the error dialog.
if (global_commandline_info.quit_after_cap)
exit(0);
#endif
SimpleDialog sd(gbl_cur_main_window_, ESD_TYPE_ERROR, ESD_BTN_OK, msg_format, ap);
sd.exec();
}
/*
* Warning alert box, taking a format and a va_list argument.
*/
void
vsimple_warning_message_box(const char *msg_format, va_list ap)
{
#ifdef HAVE_LIBPCAP
// We want to quit after reading the capture file, hence
// we don't actually open the error dialog.
if (global_commandline_info.quit_after_cap)
exit(0);
#endif
SimpleDialog sd(gbl_cur_main_window_, ESD_TYPE_WARN, ESD_BTN_OK, msg_format, ap);
sd.exec();
}
QMenu* MainWindow::findOrAddMenu(QMenu *parent_menu, QString& menu_text) {
QList<QAction *> actions = parent_menu->actions();
QList<QAction *>::const_iterator i;

View File

@ -21,13 +21,21 @@
#include "simple_dialog.h"
#include "file.h"
#include "epan/strutil.h"
#include "epan/prefs.h"
#include "ui/commandline.h"
#include <wsutil/utf8_entities.h>
#include <ui/qt/utils/qt_ui_utils.h>
#include "wireshark_application.h"
#if (QT_VERSION > QT_VERSION_CHECK(5, 2, 0))
#include <QCheckBox>
#endif
#include <QMessageBox>
#include <QRegExp>
#include <QTextCodec>
@ -66,6 +74,92 @@ simple_dialog_format_message(const char *msg)
return g_strdup(msg);
}
gpointer
simple_dialog(ESD_TYPE_E type, gint btn_mask, const gchar *msg_format, ...)
{
va_list ap;
va_start(ap, msg_format);
SimpleDialog sd(wsApp->mainWindow(), type, btn_mask, msg_format, ap);
va_end(ap);
sd.exec();
return NULL;
}
/*
* Alert box, with optional "don't show this message again" variable
* and checkbox, and optional secondary text.
*/
void
simple_message_box(ESD_TYPE_E type, gboolean *notagain,
const char *secondary_msg, const char *msg_format, ...)
{
if (notagain && *notagain) {
return;
}
va_list ap;
va_start(ap, msg_format);
SimpleDialog sd(wsApp->mainWindow(), type, ESD_BTN_OK, msg_format, ap);
va_end(ap);
sd.setDetailedText(secondary_msg);
#if (QT_VERSION > QT_VERSION_CHECK(5, 2, 0))
QCheckBox *cb = NULL;
if (notagain) {
cb = new QCheckBox();
cb->setChecked(true);
cb->setText(QObject::tr("Don't show this message again."));
sd.setCheckBox(cb);
}
#endif
sd.exec();
#if (QT_VERSION > QT_VERSION_CHECK(5, 2, 0))
if (notagain && cb) {
*notagain = cb->isChecked();
}
#endif
}
/*
* Error alert box, taking a format and a va_list argument.
*/
void
vsimple_error_message_box(const char *msg_format, va_list ap)
{
#ifdef HAVE_LIBPCAP
// We want to quit after reading the capture file, hence
// we don't actually open the error dialog.
if (global_commandline_info.quit_after_cap)
exit(0);
#endif
SimpleDialog sd(wsApp->mainWindow(), ESD_TYPE_ERROR, ESD_BTN_OK, msg_format, ap);
sd.exec();
}
/*
* Warning alert box, taking a format and a va_list argument.
*/
void
vsimple_warning_message_box(const char *msg_format, va_list ap)
{
#ifdef HAVE_LIBPCAP
// We want to quit after reading the capture file, hence
// we don't actually open the error dialog.
if (global_commandline_info.quit_after_cap)
exit(0);
#endif
SimpleDialog sd(wsApp->mainWindow(), ESD_TYPE_WARN, ESD_BTN_OK, msg_format, ap);
sd.exec();
}
/*
* Error alert box, taking a format and a list of arguments.
*/
@ -80,6 +174,7 @@ simple_error_message_box(const char *msg_format, ...)
}
SimpleDialog::SimpleDialog(QWidget *parent, ESD_TYPE_E type, int btn_mask, const char *msg_format, va_list ap) :
check_box_(0),
message_box_(0)
{
gchar *vmessage;
@ -170,11 +265,7 @@ void SimpleDialog::displayQueuedMessages(QWidget *parent)
return;
}
// Use last parent if not set
static QWidget *parent_w = NULL;
if (parent) parent_w = parent;
QMessageBox mb(parent_w);
QMessageBox mb(parent ? parent : wsApp->mainWindow());
switch(max_severity_) {
case ESD_TYPE_ERROR:
@ -227,7 +318,9 @@ int SimpleDialog::exec()
}
message_box_->setDetailedText(detailed_text_);
#if (QT_VERSION > QT_VERSION_CHECK(5, 2, 0))
message_box_->setCheckBox(check_box_);
#endif
int status = message_box_->exec();
delete message_box_;

View File

@ -35,7 +35,9 @@
typedef QPair<QString,QString> MessagePair;
#if (QT_VERSION > QT_VERSION_CHECK(5, 2, 0))
class QCheckBox;
#endif
class QMessageBox;
class QWidget;
@ -48,13 +50,17 @@ public:
static void displayQueuedMessages(QWidget *parent = 0);
void setDetailedText(QString text) { detailed_text_ = text; }
#if (QT_VERSION > QT_VERSION_CHECK(5, 2, 0))
void setCheckBox(QCheckBox *cb) { check_box_ = cb; }
#endif
int exec();
private:
const MessagePair splitMessage(QString &message) const;
QString detailed_text_;
#if (QT_VERSION > QT_VERSION_CHECK(5, 2, 0))
QCheckBox *check_box_;
#endif
QMessageBox *message_box_;
};

View File

@ -89,6 +89,7 @@
#include <QFontInfo>
#include <QLibraryInfo>
#include <QLocale>
#include <QMainWindow>
#include <QMutableListIterator>
#include <QSocketNotifier>
#include <QThread>
@ -462,6 +463,18 @@ void WiresharkApplication::applyCustomColorsFromRecent()
}
}
// Return the first top-level QMainWindow.
QWidget *WiresharkApplication::mainWindow()
{
foreach (QWidget *tlw, topLevelWidgets()) {
QMainWindow *tlmw = qobject_cast<QMainWindow *>(tlw);
if (tlmw && tlmw->isVisible()) {
return tlmw;
}
}
return 0;
}
void WiresharkApplication::storeCustomColorsInRecent()
{
if (QColorDialog::customCount()) {

View File

@ -130,6 +130,7 @@ public:
bool softwareUpdateCanShutdown();
void softwareUpdateShutdownRequest();
#endif
QWidget *mainWindow();
QTranslator translator;
QTranslator translatorQt;