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 <QDebug>
#include <QTextCodec>
#include <QDialog>
#include <QDialogButtonBox>
#include <QLabel>
#include <QListWidget>
#include <QPushButton>
#include <QScrollBar>
#include <QVBoxLayout>
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
* contents. Should be easier with Qt. */
@@ -132,12 +157,21 @@ QTextCodec *CodecSelector::selectedCodec() const
void CodecSelector::buttonClicked(QAbstractButton *button)
{
Result result = Cancel;
CodecSelectorResult::Action result = CodecSelectorResult::Cancel;
if (button == m_reloadButton)
result = Reload;
result = CodecSelectorResult::Reload;
if (button == m_saveButton)
result = Save;
result = CodecSelectorResult::Save;
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

View File

@@ -5,44 +5,22 @@
#include "../core_global.h"
#include <QDialog>
#include <QLabel>
#include <QDialogButtonBox>
#include <QListWidget>
#include <QTextCodec>
#include <QWidget>
namespace Utils { class ListWidget; }
namespace Core { class BaseTextDocument; }
namespace Core {
class BaseTextDocument;
}
namespace Core {
class CORE_EXPORT CodecSelector : public QDialog
struct CORE_EXPORT CodecSelectorResult
{
Q_OBJECT
public:
CodecSelector(QWidget *parent, Core::BaseTextDocument *doc);
~CodecSelector() override;
QTextCodec *selectedCodec() const;
// Enumeration returned from QDialog::exec()
enum Result {
Cancel, Reload, Save
};
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;
enum Action { Cancel, Reload, Save };
Action action;
QTextCodec *codec;
};
CORE_EXPORT CodecSelectorResult askForCodec(QWidget *parent, Core::BaseTextDocument *doc);
} // namespace Core

View File

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

View File

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