cleanup EditButton. Now the patch can be updated without recreation of the hole object

This commit is contained in:
Martin Marmsoler 2020-04-02 15:03:44 +02:00
parent 43d6554faf
commit edbd280186
2 changed files with 53 additions and 20 deletions

@ -1 +1 @@
Subproject commit 90af68bbe2690998f015f18b7c890f5868bcd3ee
Subproject commit f9fcda3c3489e0f2c9557d0bbfcf62f0d6600f19

View File

@ -273,15 +273,33 @@ public:
bool binary,
bool lfs,
QWidget *parent = nullptr)
: Button(parent)
: Button(parent),
mBinary(binary),
mLfs(lfs)
{
setObjectName("EditButton");
// Add edit button menu.
QMenu *menu = new QMenu(this);
mEditMenu = new QMenu(this);
mEditWorkingCopyAction = mEditMenu->addAction("Edit Working Copy");
mEditNewRevisionAction = mEditMenu->addAction("Edit New Revision");
mEditOldRevisionAction = mEditMenu->addAction("Edit Old Revision");
QString name = patch.name();
updatePatch(patch, index);
// why I am not able to directly use mEditMenu?
QMenu* menu = mEditMenu;
connect(this, &EditButton::clicked, [menu] {
menu->actions().first()->trigger();
});
setMenu(mEditMenu);
}
void updatePatch(const git::Patch &patch, int index)
{
RepoView *view = RepoView::parentView(this);
QString name = patch.name();
// Calculate starting line numbers.
int oldLine = -1;
@ -291,49 +309,56 @@ public:
newLine = patch.lineNumber(index, 0, git::Diff::NewFile);
}
disconnect(mEditWorkingCopyAction); // delete all connections from this sender
if (view->repo().workdir().exists(name)) {
QAction *action = menu->addAction("Edit Working Copy");
connect(action, &QAction::triggered, [this, view, name, newLine] {
mEditWorkingCopyAction->setVisible(true);
connect(mEditWorkingCopyAction, &QAction::triggered, [this, view, name, newLine] {
view->edit(name, newLine);
});
}
} else
mEditWorkingCopyAction->setVisible(false);
// Add revision edit actions.
QList<git::Commit> commits = view->commits();
git::Commit commit = !commits.isEmpty() ? commits.first() : git::Commit();
git::Blob newBlob = patch.blob(git::Diff::NewFile);
disconnect(mEditNewRevisionAction);
if (newBlob.isValid()) {
QAction *action = menu->addAction("Edit New Revision");
connect(action, &QAction::triggered,
mEditNewRevisionAction->setVisible(true);
connect(mEditNewRevisionAction, &QAction::triggered,
[this, view, name, newLine, newBlob, commit] {
view->openEditor(name, newLine, newBlob, commit);
});
}
} else
mEditNewRevisionAction->setVisible(false);
disconnect(mEditOldRevisionAction);
git::Blob oldBlob = patch.blob(git::Diff::OldFile);
if (oldBlob.isValid()) {
mEditOldRevisionAction->setVisible(true);
if (commit.isValid()) {
QList<git::Commit> parents = commit.parents();
if (!parents.isEmpty())
commit = parents.first();
}
QAction *action = menu->addAction("Edit Old Revision");
connect(action, &QAction::triggered,
connect(mEditOldRevisionAction, &QAction::triggered,
[this, view, name, oldLine, oldBlob, commit] {
view->openEditor(name, oldLine, oldBlob, commit);
});
}
} else
mEditOldRevisionAction->setVisible(false);
// Connect button click to the first menu action.
setEnabled(!menu->isEmpty() && !binary && !lfs);
connect(this, &EditButton::clicked, [menu] {
menu->actions().first()->trigger();
});
setMenu(menu);
bool enable = false;
for (auto action: mEditMenu->actions()) {
if (action->isVisible()) {
enable = true;
break;
}
}
setEnabled(enable && !mBinary && !mLfs);
}
protected:
void paintEvent(QPaintEvent *event) override
{
@ -357,6 +382,14 @@ protected:
painter.drawLine(x - r + 1, y + r - 5, x - r + 5, y + r - 1);
painter.drawLine(x + r - 6, y - r + 2, x + r - 2, y - r + 6);
}
private:
QMenu* mEditMenu{nullptr};
QAction* mEditWorkingCopyAction{nullptr};
QAction* mEditNewRevisionAction{nullptr};
QAction* mEditOldRevisionAction{nullptr};
bool mBinary;
bool mLfs;
};
class DiscardButton : public Button