forked from qt-creator/qt-creator
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:
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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;
|
||||
|
@@ -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;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user