From 8ed8554cd4848256a7ffc681a6246600789d4570 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Mon, 28 Feb 2011 15:41:42 +0100 Subject: [PATCH] CodePaster: Allow for editing snippets. Introduce separate plain text mode parallel to diff-chunk mode using a stacked widget with a QPlainTextEdit. Task-number: QTCREATORBUG-3859 --- src/plugins/cpaster/cpasterplugin.cpp | 14 +-- src/plugins/cpaster/pasteview.cpp | 66 ++++++++---- src/plugins/cpaster/pasteview.h | 16 +++ src/plugins/cpaster/pasteview.ui | 147 ++++++++++++++------------ src/shared/cpaster/splitter.cpp | 3 +- 5 files changed, 152 insertions(+), 94 deletions(-) diff --git a/src/plugins/cpaster/cpasterplugin.cpp b/src/plugins/cpaster/cpasterplugin.cpp index ee4ba260fb4..f06bc1b9e78 100644 --- a/src/plugins/cpaster/cpasterplugin.cpp +++ b/src/plugins/cpaster/cpasterplugin.cpp @@ -217,16 +217,18 @@ static inline void fixSpecialCharacters(QString &data) void CodepasterPlugin::post(QString data, const QString &mimeType) { fixSpecialCharacters(data); - FileDataList lst = splitDiffToFiles(data.toLatin1()); - QString username = m_settings->username; - QString description; - QString comment; - QString protocolName; + + const QString username = m_settings->username; PasteView view(m_protocols, mimeType, 0); view.setProtocol(m_settings->protocol); - view.show(username, description, comment, lst); + const FileDataList diffChunks = splitDiffToFiles(data.toLatin1()); + if (diffChunks.isEmpty()) { + view.show(username, QString(), QString(), data); + } else { + view.show(username, QString(), QString(), diffChunks); + } } void CodepasterPlugin::fetch() diff --git a/src/plugins/cpaster/pasteview.cpp b/src/plugins/cpaster/pasteview.cpp index b85e3efcdaa..ad534432653 100644 --- a/src/plugins/cpaster/pasteview.cpp +++ b/src/plugins/cpaster/pasteview.cpp @@ -55,7 +55,8 @@ PasteView::PasteView(const QList protocols, QDialog(parent), m_protocols(protocols), m_commentPlaceHolder(tr("")), - m_mimeType(mt) + m_mimeType(mt), + m_mode(DiffChunkMode) { m_ui.setupUi(this); @@ -95,6 +96,9 @@ QString PasteView::comment() const QByteArray PasteView::content() const { + if (m_mode == PlainTextMode) + return m_ui.plainTextEdit->toPlainText().toUtf8(); + QByteArray newContent; for (int i = 0; i < m_ui.uiPatchList->count(); ++i) { QListWidgetItem *item = m_ui.uiPatchList->item(i); @@ -121,28 +125,15 @@ void PasteView::protocolChanged(int p) m_ui.uiComment->setEnabled(caps & Protocol::PostCommentCapability); } -int PasteView::show(const QString &user, const QString &description, const QString &comment, - const FileDataList &parts) +void PasteView::setupDialog(const QString &user, const QString &description, const QString &comment) { m_ui.uiUsername->setText(user); m_ui.uiDescription->setText(description); + m_ui.uiComment->setPlainText(comment.isEmpty() ? m_commentPlaceHolder : comment); +} - if (comment.isEmpty()) - m_ui.uiComment->setPlainText(m_commentPlaceHolder); - else - m_ui.uiComment->setPlainText(comment); - - QByteArray content; - m_parts = parts; - m_ui.uiPatchList->clear(); - foreach (const FileData &part, parts) { - QListWidgetItem *itm = new QListWidgetItem(part.filename, m_ui.uiPatchList); - itm->setCheckState(Qt::Checked); - itm->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled); - content += part.content; - } - m_ui.uiPatchView->setPlainText(content); - +int PasteView::showDialog() +{ m_ui.uiDescription->setFocus(); m_ui.uiDescription->selectAll(); @@ -159,6 +150,37 @@ int PasteView::show(const QString &user, const QString &description, const QStri return ret; } +// Show up with checkable list of diff chunks. +int PasteView::show(const QString &user, const QString &description, + const QString &comment, const FileDataList &parts) +{ + setupDialog(user, description, comment); + m_ui.uiPatchList->clear(); + m_parts = parts; + m_mode = DiffChunkMode; + QByteArray content; + foreach (const FileData &part, parts) { + QListWidgetItem *itm = new QListWidgetItem(part.filename, m_ui.uiPatchList); + itm->setCheckState(Qt::Checked); + itm->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled); + content += part.content; + } + m_ui.stackedWidget->setCurrentIndex(0); + m_ui.uiPatchView->setPlainText(content); + return showDialog(); +} + +// Show up with editable plain text. +int PasteView::show(const QString &user, const QString &description, + const QString &comment, const QString &content) +{ + setupDialog(user, description, comment); + m_mode = PlainTextMode; + m_ui.stackedWidget->setCurrentIndex(1); + m_ui.plainTextEdit->setPlainText(content); + return showDialog(); +} + void PasteView::accept() { const int index = m_ui.protocolBox->currentIndex(); @@ -170,8 +192,12 @@ void PasteView::accept() if (!Protocol::ensureConfiguration(protocol, this)) return; + const QByteArray data = content(); + if (data.isEmpty()) + return; + const Protocol::ContentType ct = Protocol::contentType(m_mimeType); - protocol->paste(content(), ct, user(), comment(), description()); + protocol->paste(data, ct, user(), comment(), description()); // Store settings and close QSettings *settings = Core::ICore::instance()->settings(); settings->beginGroup(QLatin1String(groupC)); diff --git a/src/plugins/cpaster/pasteview.h b/src/plugins/cpaster/pasteview.h index b5feca557e8..df4ba7e7113 100644 --- a/src/plugins/cpaster/pasteview.h +++ b/src/plugins/cpaster/pasteview.h @@ -45,13 +45,25 @@ class PasteView : public QDialog { Q_OBJECT public: + enum Mode + { + // Present a list of read-only diff chunks which the user can check for inclusion + DiffChunkMode, + // Present plain, editable text. + PlainTextMode + }; + explicit PasteView(const QList protocols, const QString &mimeType, QWidget *parent); ~PasteView(); + // Show up with checkable list of diff chunks. int show(const QString &user, const QString &description, const QString &comment, const FileDataList &parts); + // Show up with editable plain text. + int show(const QString &user, const QString &description, const QString &comment, + const QString &content); void setProtocol(const QString &protocol); @@ -68,12 +80,16 @@ private slots: void protocolChanged(int); private: + void setupDialog(const QString &user, const QString &description, const QString &comment); + int showDialog(); + const QList m_protocols; const QString m_commentPlaceHolder; const QString m_mimeType; Ui::ViewDialog m_ui; FileDataList m_parts; + Mode m_mode; }; } // namespace CodePaster #endif // VIEW_H diff --git a/src/plugins/cpaster/pasteview.ui b/src/plugins/cpaster/pasteview.ui index 80dc5560233..436db085519 100644 --- a/src/plugins/cpaster/pasteview.ui +++ b/src/plugins/cpaster/pasteview.ui @@ -6,18 +6,18 @@ 0 0 - 600 - 500 + 670 + 678 Send to Codepaster - + - + Protocol: @@ -27,7 +27,7 @@ - + &Username: @@ -44,7 +44,7 @@ - + &Description: @@ -89,68 +89,83 @@ p, li { white-space: pre-wrap; } - - - - 0 - 0 - - - - Parts to Send to Server - - - true - - - - 2 - - - 0 - - - - - - 0 - 1 - - - - true - - - - Patch 1 + + + + + + + + 0 + 0 + - - - - Patch 2 + + Parts to Send to Server - - - - - - - - 0 - 3 - - - - - Courier New - - - - true - - - - + + true + + + + 2 + + + 0 + + + + + + 0 + 1 + + + + true + + + + Patch 1 + + + + + Patch 2 + + + + + + + + + 0 + 3 + + + + + Courier New + + + + true + + + + + + + + + + + + + + + diff --git a/src/shared/cpaster/splitter.cpp b/src/shared/cpaster/splitter.cpp index cb04c38acb9..dd06818f04f 100644 --- a/src/shared/cpaster/splitter.cpp +++ b/src/shared/cpaster/splitter.cpp @@ -56,8 +56,7 @@ FileDataList splitDiffToFiles(const QByteArray &data) "\\n\\-\\-\\- ([^\\n\\r]*) [0-9\\-]* [0-9:\\.]*[^\\n\\r]*"; } else { - ret.append(FileData("", data)); - return ret; + return FileDataList(); } int splitIndex = 0, previousSplit = -1;