From b478df61f54f08e0279d83e2cc11313fbdf28758 Mon Sep 17 00:00:00 2001 From: Ahmad Fatoum Date: Fri, 14 Apr 2017 11:33:57 +0200 Subject: Qt: Provide both file save and open preferences This is a breaking change. prefs_register_filename_preference hasn't been differentiating between files to be saved and ones to be opened. On GTK, a neutral dialog is used, so no problems there. On Qt, a save dialog has been always used, even in dissectors that were reading configuration files without modification. prefs_register_filename_preference now takes an argument to indicate whether UI could be a save dialog with a warning on overwriting a file, or whether it's a general purpose open file dialog. Qt now does this. Previously no warning was shown on overwriting a file, so it may be used for opening files too without irritating the user. This has been changed, as non-destructive reads should now use the open dialog. Dissectors were changed accordingly. Change-Id: I9087fefa5ee7ca58de0775d4fe2c0fdcfa3a3018 Reviewed-on: https://code.wireshark.org/review/21086 Petri-Dish: Peter Wu Tested-by: Petri Dish Buildbot Reviewed-by: Peter Wu --- ui/qt/module_preferences_scroll_area.cpp | 34 +++++++++++++++++++++++++------- ui/qt/module_preferences_scroll_area.h | 3 ++- ui/qt/preference_editor_frame.cpp | 2 +- ui/qt/preferences_dialog.cpp | 13 +++++++++--- ui/qt/protocol_preferences_menu.cpp | 4 ++-- 5 files changed, 42 insertions(+), 14 deletions(-) (limited to 'ui/qt') diff --git a/ui/qt/module_preferences_scroll_area.cpp b/ui/qt/module_preferences_scroll_area.cpp index e4829c928c..0ff2589f0a 100644 --- a/ui/qt/module_preferences_scroll_area.cpp +++ b/ui/qt/module_preferences_scroll_area.cpp @@ -189,7 +189,8 @@ pref_show(pref_t *pref, gpointer layout_ptr) vb->addLayout(hb); break; } - case PREF_FILENAME: + case PREF_SAVE_FILENAME: + case PREF_OPEN_FILENAME: case PREF_DIRNAME: { QLabel *label = new QLabel(prefs_get_title(pref)); @@ -260,7 +261,8 @@ ModulePreferencesScrollArea::ModulePreferencesScrollArea(module_t *module, QWidg connect(le, SIGNAL(textEdited(QString)), this, SLOT(uintLineEditTextEdited(QString))); break; case PREF_STRING: - case PREF_FILENAME: + case PREF_SAVE_FILENAME: + case PREF_OPEN_FILENAME: case PREF_DIRNAME: connect(le, SIGNAL(textEdited(QString)), this, SLOT(stringLineEditTextEdited(QString))); break; @@ -308,8 +310,11 @@ ModulePreferencesScrollArea::ModulePreferencesScrollArea(module_t *module, QWidg case PREF_UAT: connect(pb, SIGNAL(pressed()), this, SLOT(uatPushButtonPressed())); break; - case PREF_FILENAME: - connect(pb, SIGNAL(pressed()), this, SLOT(filenamePushButtonPressed())); + case PREF_SAVE_FILENAME: + connect(pb, SIGNAL(pressed()), this, SLOT(saveFilenamePushButtonPressed())); + break; + case PREF_OPEN_FILENAME: + connect(pb, SIGNAL(pressed()), this, SLOT(openFilenamePushButtonPressed())); break; case PREF_DIRNAME: connect(pb, SIGNAL(pressed()), this, SLOT(dirnamePushButtonPressed())); @@ -483,7 +488,7 @@ void ModulePreferencesScrollArea::uatPushButtonPressed() uat_dlg.exec(); } -void ModulePreferencesScrollArea::filenamePushButtonPressed() +void ModulePreferencesScrollArea::saveFilenamePushButtonPressed() { QPushButton *filename_pb = qobject_cast(sender()); if (!filename_pb) return; @@ -492,9 +497,24 @@ void ModulePreferencesScrollArea::filenamePushButtonPressed() if (!pref) return; QString filename = QFileDialog::getSaveFileName(this, wsApp->windowTitleString(prefs_get_title(pref)), - prefs_get_string_value(pref, pref_stashed), QString(), NULL, - QFileDialog::DontConfirmOverwrite); + prefs_get_string_value(pref, pref_stashed)); + + if (!filename.isEmpty()) { + prefs_set_string_value(pref, QDir::toNativeSeparators(filename).toStdString().c_str(), pref_stashed); + updateWidgets(); + } +} + +void ModulePreferencesScrollArea::openFilenamePushButtonPressed() +{ + QPushButton *filename_pb = qobject_cast(sender()); + if (!filename_pb) return; + + pref_t *pref = VariantPointer::asPtr(filename_pb->property(pref_prop_)); + if (!pref) return; + QString filename = QFileDialog::getOpenFileName(this, wsApp->windowTitleString(prefs_get_title(pref)), + prefs_get_string_value(pref, pref_stashed)); if (!filename.isEmpty()) { prefs_set_string_value(pref, QDir::toNativeSeparators(filename).toStdString().c_str(), pref_stashed); updateWidgets(); diff --git a/ui/qt/module_preferences_scroll_area.h b/ui/qt/module_preferences_scroll_area.h index 7b46e8dfe8..458efdf0af 100644 --- a/ui/qt/module_preferences_scroll_area.h +++ b/ui/qt/module_preferences_scroll_area.h @@ -62,7 +62,8 @@ private slots: void stringLineEditTextEdited(const QString &new_str); void rangeSyntaxLineEditTextEdited(const QString &new_str); void uatPushButtonPressed(); - void filenamePushButtonPressed(); + void saveFilenamePushButtonPressed(); + void openFilenamePushButtonPressed(); void dirnamePushButtonPressed(); }; diff --git a/ui/qt/preference_editor_frame.cpp b/ui/qt/preference_editor_frame.cpp index 5ac034c6b4..3bdc552b6b 100644 --- a/ui/qt/preference_editor_frame.cpp +++ b/ui/qt/preference_editor_frame.cpp @@ -41,7 +41,7 @@ #include // To do: -// - Handle PREF_FILENAME and PREF_DIRNAME. +// - Handle PREF_SAVE_FILENAME, PREF_OPEN_FILENAME and PREF_DIRNAME. PreferenceEditorFrame::PreferenceEditorFrame(QWidget *parent) : AccordionFrame(parent), diff --git a/ui/qt/preferences_dialog.cpp b/ui/qt/preferences_dialog.cpp index 347ff58070..26b4c62fcd 100644 --- a/ui/qt/preferences_dialog.cpp +++ b/ui/qt/preferences_dialog.cpp @@ -684,18 +684,25 @@ void PreferencesDialog::on_advancedTree_itemActivated(QTreeWidgetItem *item, int editor = cur_line_edit_; break; } - case PREF_FILENAME: + case PREF_SAVE_FILENAME: + case PREF_OPEN_FILENAME: case PREF_DIRNAME: { QString filename; - if (prefs_get_type(pref) == PREF_FILENAME) { + if (prefs_get_type(pref) == PREF_SAVE_FILENAME) { filename = QFileDialog::getSaveFileName(this, wsApp->windowTitleString(prefs_get_title(pref)), prefs_get_string_value(pref, pref_stashed)); + + } else if (prefs_get_type(pref) == PREF_OPEN_FILENAME) { + filename = QFileDialog::getOpenFileName(this, wsApp->windowTitleString(prefs_get_title(pref)), + prefs_get_string_value(pref, pref_stashed)); + } else { filename = QFileDialog::getExistingDirectory(this, wsApp->windowTitleString(prefs_get_title(pref)), - prefs_get_string_value(pref, pref_stashed)); + prefs_get_string_value(pref, pref_stashed)); } + if (!filename.isEmpty()) { prefs_set_string_value(pref, QDir::toNativeSeparators(filename).toStdString().c_str(), pref_stashed); adv_ti->updatePref(); diff --git a/ui/qt/protocol_preferences_menu.cpp b/ui/qt/protocol_preferences_menu.cpp index 75bade980b..f16aded36e 100644 --- a/ui/qt/protocol_preferences_menu.cpp +++ b/ui/qt/protocol_preferences_menu.cpp @@ -39,7 +39,7 @@ // To do: // - Elide really long items? -// - Handle PREF_FILENAME and PREF_DIRNAME. +// - Handle PREF_SAVE_FILENAME, PREF_OPEN_FILENAME and PREF_DIRNAME. // - Handle color prefs. class BoolPreferenceAction : public QAction @@ -244,7 +244,7 @@ void ProtocolPreferencesMenu::addMenuItem(preference *pref) case PREF_OBSOLETE: break; default: - // A type we currently don't handle (e.g. PREF_FILENAME). Just open + // A type we currently don't handle (e.g. PREF_SAVE_FILENAME). Just open // the prefs dialog. QString title = QString("%1" UTF8_HORIZONTAL_ELLIPSIS).arg(prefs_get_title(pref)); QAction *mpa = addAction(title); -- cgit v1.2.1