CodecSelector: Hide dialog class behind function

It isn't necessary to export the class (which would then best have a d-
pointer etc). Just provide a function that asks the user for a codec and
returns their decision. This makes the whole dialog an implementation
detail.

Change-Id: I7d574561cbe7f079a6d383ba65ba70f6868bbf05
Reviewed-by: hjk <hjk@qt.io>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
This commit is contained in:
Eike Ziller
2024-01-24 09:59:52 +01:00
parent f40c18784b
commit e1da48bf86
4 changed files with 64 additions and 52 deletions

View File

@@ -11,12 +11,37 @@
#include <utils/itemviews.h> #include <utils/itemviews.h>
#include <QDebug> #include <QDebug>
#include <QTextCodec> #include <QDialog>
#include <QDialogButtonBox>
#include <QLabel>
#include <QListWidget>
#include <QPushButton> #include <QPushButton>
#include <QScrollBar> #include <QScrollBar>
#include <QVBoxLayout> #include <QVBoxLayout>
namespace Core { namespace Core {
namespace Internal {
class CodecSelector : public QDialog
{
public:
CodecSelector(QWidget *parent, Core::BaseTextDocument *doc);
~CodecSelector() override;
QTextCodec *selectedCodec() const;
private:
void updateButtons();
void buttonClicked(QAbstractButton *button);
bool m_hasDecodingError;
bool m_isModified;
QLabel *m_label;
Utils::ListWidget *m_listWidget;
QDialogButtonBox *m_dialogButtonBox;
QAbstractButton *m_reloadButton;
QAbstractButton *m_saveButton;
};
/* custom class to make sure the width is wide enough for the /* custom class to make sure the width is wide enough for the
* contents. Should be easier with Qt. */ * contents. Should be easier with Qt. */
@@ -132,12 +157,21 @@ QTextCodec *CodecSelector::selectedCodec() const
void CodecSelector::buttonClicked(QAbstractButton *button) void CodecSelector::buttonClicked(QAbstractButton *button)
{ {
Result result = Cancel; CodecSelectorResult::Action result = CodecSelectorResult::Cancel;
if (button == m_reloadButton) if (button == m_reloadButton)
result = Reload; result = CodecSelectorResult::Reload;
if (button == m_saveButton) if (button == m_saveButton)
result = Save; result = CodecSelectorResult::Save;
done(result); done(result);
} }
} // namespace Internal
CodecSelectorResult askForCodec(QWidget *parent, BaseTextDocument *doc)
{
Internal::CodecSelector dialog(parent, doc);
const CodecSelectorResult::Action result = CodecSelectorResult::Action(dialog.exec());
return {result, dialog.selectedCodec()};
}
} // namespace Core } // namespace Core

View File

@@ -5,44 +5,22 @@
#include "../core_global.h" #include "../core_global.h"
#include <QDialog>
#include <QLabel>
#include <QDialogButtonBox>
#include <QListWidget>
#include <QTextCodec> #include <QTextCodec>
#include <QWidget>
namespace Utils { class ListWidget; } namespace Core {
namespace Core { class BaseTextDocument; } class BaseTextDocument;
}
namespace Core { namespace Core {
class CORE_EXPORT CodecSelector : public QDialog struct CORE_EXPORT CodecSelectorResult
{ {
Q_OBJECT enum Action { Cancel, Reload, Save };
Action action;
public: QTextCodec *codec;
CodecSelector(QWidget *parent, Core::BaseTextDocument *doc);
~CodecSelector() override;
QTextCodec *selectedCodec() const;
// Enumeration returned from QDialog::exec()
enum Result {
Cancel, Reload, Save
}; };
private: CORE_EXPORT CodecSelectorResult askForCodec(QWidget *parent, Core::BaseTextDocument *doc);
void updateButtons();
void buttonClicked(QAbstractButton *button);
bool m_hasDecodingError;
bool m_isModified;
QLabel *m_label;
Utils::ListWidget *m_listWidget;
QDialogButtonBox *m_dialogButtonBox;
QAbstractButton *m_reloadButton;
QAbstractButton *m_saveButton;
};
} // namespace Core } // namespace Core

View File

@@ -311,17 +311,17 @@ Core::IDocument::OpenResult DiffEditorDocument::open(QString *errorString, const
bool DiffEditorDocument::selectEncoding() bool DiffEditorDocument::selectEncoding()
{ {
Core::CodecSelector codecSelector(Core::ICore::dialogParent(), this); const CodecSelectorResult result = askForCodec(Core::ICore::dialogParent(), this);
switch (codecSelector.exec()) { switch (result.action) {
case Core::CodecSelector::Reload: { case CodecSelectorResult::Reload: {
setCodec(codecSelector.selectedCodec()); setCodec(result.codec);
QString errorMessage; QString errorMessage;
return reload(&errorMessage, Core::IDocument::FlagReload, Core::IDocument::TypeContents); return reload(&errorMessage, Core::IDocument::FlagReload, Core::IDocument::TypeContents);
} }
case Core::CodecSelector::Save: case CodecSelectorResult::Save:
setCodec(codecSelector.selectedCodec()); setCodec(result.codec);
return Core::EditorManager::saveDocument(this); return Core::EditorManager::saveDocument(this);
case Core::CodecSelector::Cancel: case CodecSelectorResult::Cancel:
break; break;
} }
return false; return false;

View File

@@ -1816,22 +1816,22 @@ void TextEditorWidgetPrivate::clearCurrentSuggestion()
void TextEditorWidget::selectEncoding() void TextEditorWidget::selectEncoding()
{ {
TextDocument *doc = d->m_document.data(); TextDocument *doc = d->m_document.data();
CodecSelector codecSelector(this, doc); const CodecSelectorResult result = Core::askForCodec(Core::ICore::dialogParent(), doc);
switch (result.action) {
switch (codecSelector.exec()) { case Core::CodecSelectorResult::Reload: {
case CodecSelector::Reload: {
QString errorString; QString errorString;
if (!doc->reload(&errorString, codecSelector.selectedCodec())) { if (!doc->reload(&errorString, result.codec)) {
QMessageBox::critical(this, Tr::tr("File Error"), errorString); QMessageBox::critical(this, Tr::tr("File Error"), errorString);
break; break;
} }
break; } break;
case CodecSelector::Save: }
doc->setCodec(codecSelector.selectedCodec()); case Core::CodecSelectorResult::Save:
doc->setCodec(result.codec);
EditorManager::saveDocument(textDocument()); EditorManager::saveDocument(textDocument());
updateTextCodecLabel(); updateTextCodecLabel();
break; break;
case CodecSelector::Cancel: case Core::CodecSelectorResult::Cancel:
break; break;
} }
} }