Git: Factor out the central widget from LogChangeDialog

To be used for "amend previous commit" feature

Change-Id: Id1190d67bdd1a3dd3866a6a0f9d41be5f9baaa4a
Reviewed-by: Tobias Hunger <tobias.hunger@digia.com>
This commit is contained in:
Orgad Shaneh
2013-04-29 19:05:31 +03:00
committed by Orgad Shaneh
parent 7b851602cc
commit c702639a8e
2 changed files with 100 additions and 66 deletions

View File

@@ -50,62 +50,30 @@ enum Columns
ColumnCount ColumnCount
}; };
LogChangeDialog::LogChangeDialog(bool isReset, QWidget *parent) LogChangeWidget::LogChangeWidget(QWidget *parent)
: QDialog(parent) : QTreeView(parent)
, m_treeView(new QTreeView(this))
, m_model(new QStandardItemModel(0, ColumnCount, this)) , m_model(new QStandardItemModel(0, ColumnCount, this))
, m_dialogButtonBox(new QDialogButtonBox(this))
, m_resetTypeComboBox(0)
{ {
QStringList headers; QStringList headers;
headers << tr("Sha1")<< tr("Subject"); headers << tr("Sha1")<< tr("Subject");
m_model->setHorizontalHeaderLabels(headers); m_model->setHorizontalHeaderLabels(headers);
QVBoxLayout *layout = new QVBoxLayout(this); setModel(m_model);
layout->addWidget(new QLabel(isReset ? tr("Reset to:") : tr("Select change:"), this)); setMinimumWidth(300);
m_treeView->setModel(m_model); setUniformRowHeights(true);
m_treeView->setMinimumWidth(300); setRootIsDecorated(false);
m_treeView->setUniformRowHeights(true); setSelectionBehavior(QAbstractItemView::SelectRows);
m_treeView->setRootIsDecorated(false);
m_treeView->setSelectionBehavior(QAbstractItemView::SelectRows);
layout->addWidget(m_treeView);
QHBoxLayout *popUpLayout = new QHBoxLayout;
if (isReset) {
popUpLayout->addWidget(new QLabel(tr("Reset type:"), this));
m_resetTypeComboBox = new QComboBox(this);
m_resetTypeComboBox->addItem(tr("Mixed"), QLatin1String("--mixed"));
m_resetTypeComboBox->addItem(tr("Hard"), QLatin1String("--hard"));
m_resetTypeComboBox->addItem(tr("Soft"), QLatin1String("--soft"));
popUpLayout->addWidget(m_resetTypeComboBox);
popUpLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Ignored));
} }
popUpLayout->addWidget(m_dialogButtonBox); bool LogChangeWidget::init(const QString &repository)
m_dialogButtonBox->addButton(QDialogButtonBox::Cancel);
QPushButton *okButton = m_dialogButtonBox->addButton(QDialogButtonBox::Ok);
layout->addLayout(popUpLayout);
connect(m_treeView, SIGNAL(doubleClicked(QModelIndex)),
okButton, SLOT(animateClick()));
connect(m_dialogButtonBox, SIGNAL(accepted()), this, SLOT(accept()));
connect(m_dialogButtonBox, SIGNAL(rejected()), this, SLOT(reject()));
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
resize(600, 400);
}
bool LogChangeDialog::runDialog(const QString &repository)
{ {
if (!populateLog(repository) || !m_model->rowCount()) if (!populateLog(repository) || !m_model->rowCount())
return QDialog::Rejected; return false;
selectionModel()->select(m_model->index(0, 0),
m_treeView->selectionModel()->select(m_model->index(0, 0),
QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows); QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows);
return true;
return exec() == QDialog::Accepted;
} }
QString LogChangeDialog::commit() const QString LogChangeWidget::commit() const
{ {
// Return Sha1, or empty for top commit. // Return Sha1, or empty for top commit.
if (const QStandardItem *sha1Item = currentItem(Sha1Column)) if (const QStandardItem *sha1Item = currentItem(Sha1Column))
@@ -113,22 +81,15 @@ QString LogChangeDialog::commit() const
return QString(); return QString();
} }
int LogChangeDialog::commitIndex() const int LogChangeWidget::commitIndex() const
{ {
const QModelIndex currentIndex = m_treeView->selectionModel()->currentIndex(); const QModelIndex currentIndex = selectionModel()->currentIndex();
if (currentIndex.isValid()) if (currentIndex.isValid())
return currentIndex.row(); return currentIndex.row();
return -1; return -1;
} }
QString LogChangeDialog::resetFlag() const bool LogChangeWidget::populateLog(const QString &repository)
{
if (!m_resetTypeComboBox)
return QString();
return m_resetTypeComboBox->itemData(m_resetTypeComboBox->currentIndex()).toString();
}
bool LogChangeDialog::populateLog(const QString &repository)
{ {
if (const int rowCount = m_model->rowCount()) if (const int rowCount = m_model->rowCount())
m_model->removeRows(0, rowCount); m_model->removeRows(0, rowCount);
@@ -162,13 +123,72 @@ bool LogChangeDialog::populateLog(const QString &repository)
return true; return true;
} }
const QStandardItem *LogChangeDialog::currentItem(int column) const const QStandardItem *LogChangeWidget::currentItem(int column) const
{ {
const QModelIndex currentIndex = m_treeView->selectionModel()->currentIndex(); const QModelIndex currentIndex = selectionModel()->currentIndex();
if (currentIndex.isValid()) if (currentIndex.isValid())
return m_model->item(currentIndex.row(), column); return m_model->item(currentIndex.row(), column);
return 0; return 0;
} }
LogChangeDialog::LogChangeDialog(bool isReset, QWidget *parent) :
QDialog(parent)
, widget(new LogChangeWidget)
, m_dialogButtonBox(new QDialogButtonBox(this))
, m_resetTypeComboBox(0)
{
QVBoxLayout *layout = new QVBoxLayout(this);
layout->addWidget(new QLabel(isReset ? tr("Reset to:") : tr("Select change:"), this));
layout->addWidget(widget);
QHBoxLayout *popUpLayout = new QHBoxLayout;
if (isReset) {
popUpLayout->addWidget(new QLabel(tr("Reset type:"), this));
m_resetTypeComboBox = new QComboBox(this);
m_resetTypeComboBox->addItem(tr("Mixed"), QLatin1String("--mixed"));
m_resetTypeComboBox->addItem(tr("Hard"), QLatin1String("--hard"));
m_resetTypeComboBox->addItem(tr("Soft"), QLatin1String("--soft"));
popUpLayout->addWidget(m_resetTypeComboBox);
popUpLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Ignored));
}
popUpLayout->addWidget(m_dialogButtonBox);
m_dialogButtonBox->addButton(QDialogButtonBox::Cancel);
QPushButton *okButton = m_dialogButtonBox->addButton(QDialogButtonBox::Ok);
layout->addLayout(popUpLayout);
connect(m_dialogButtonBox, SIGNAL(accepted()), this, SLOT(accept()));
connect(m_dialogButtonBox, SIGNAL(rejected()), this, SLOT(reject()));
connect(widget, SIGNAL(doubleClicked(QModelIndex)), okButton, SLOT(animateClick()));
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
resize(600, 400);
}
bool LogChangeDialog::runDialog(const QString &repository)
{
if (!widget->init(repository))
return QDialog::Rejected;
return QDialog::exec() == QDialog::Accepted;
}
QString LogChangeDialog::commit() const
{
return widget->commit();
}
int LogChangeDialog::commitIndex() const
{
return widget->commitIndex();
}
QString LogChangeDialog::resetFlag() const
{
if (!m_resetTypeComboBox)
return QString();
return m_resetTypeComboBox->itemData(m_resetTypeComboBox->currentIndex()).toString();
}
} // namespace Internal } // namespace Internal
} // namespace Git } // namespace Git

View File

@@ -31,9 +31,9 @@
#define LOGCHANGEDDIALOG_H #define LOGCHANGEDDIALOG_H
#include <QDialog> #include <QDialog>
#include <QTreeView>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QTreeView;
class QDialogButtonBox; class QDialogButtonBox;
class QComboBox; class QComboBox;
class QStandardItemModel; class QStandardItemModel;
@@ -43,13 +43,31 @@ QT_END_NAMESPACE
namespace Git { namespace Git {
namespace Internal { namespace Internal {
// A dialog that lists SHA1 and subject of the changes // A widget that lists SHA1 and subject of the changes
// Used for reset and interactive rebased // Used for reset and interactive rebase
class LogChangeWidget : public QTreeView
{
Q_OBJECT
public:
explicit LogChangeWidget(QWidget *parent = 0);
bool init(const QString &repository);
QString commit() const;
int commitIndex() const;
private:
bool populateLog(const QString &repository);
const QStandardItem *currentItem(int column = 0) const;
QStandardItemModel *m_model;
};
class LogChangeDialog : public QDialog class LogChangeDialog : public QDialog
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit LogChangeDialog(bool isReset, QWidget *parent = 0); LogChangeDialog(bool isReset, QWidget *parent = 0);
bool runDialog(const QString &repository); bool runDialog(const QString &repository);
@@ -58,11 +76,7 @@ public:
QString resetFlag() const; QString resetFlag() const;
private: private:
bool populateLog(const QString &repository); LogChangeWidget *widget;
const QStandardItem *currentItem(int column = 0) const;
QTreeView *m_treeView;
QStandardItemModel *m_model;
QDialogButtonBox *m_dialogButtonBox; QDialogButtonBox *m_dialogButtonBox;
QComboBox *m_resetTypeComboBox; QComboBox *m_resetTypeComboBox;
}; };