@@ -2181,6 +2181,8 @@ void MainWindow::registerWorkspaceDock(FolderAsWorkspaceDock *dock)
21812181
21822182void MainWindow::wireWorkspaceGitSignals (FolderAsWorkspaceDock *dock)
21832183{
2184+ dock->setGitOperationManager (m_gitOpMgr);
2185+
21842186 connect (dock, &FolderAsWorkspaceDock::gitDiffRequested,
21852187 this , [dock](const GitStatusEntry &entry) {
21862188 dock->showGitDiffPreview (entry);
@@ -2247,6 +2249,52 @@ void MainWindow::wireWorkspaceGitSignals(FolderAsWorkspaceDock *dock)
22472249 });
22482250 menu->addAction (sendToAi);
22492251 });
2252+
2253+ connect (dock, &FolderAsWorkspaceDock::gitMergeRequested, this ,
2254+ [this ](FolderAsWorkspaceDock *wsDock) {
2255+ auto *ctrl = wsDock->gitTabWidget () ? wsDock->gitTabWidget ()->controller () : nullptr ;
2256+ if (!ctrl) return ;
2257+ auto *picker = new BranchPickerPopup (this );
2258+ picker->setAttribute (Qt::WA_DeleteOnClose);
2259+ picker->setSelectOnly (true , tr (" Select branch to merge into %1…" ).arg (ctrl->currentBranch ()));
2260+ picker->setBranches (ctrl->branchesLocal (), ctrl->branchesRemote (),
2261+ ctrl->currentBranch ());
2262+ connect (picker, &BranchPickerPopup::branchSelected, this ,
2263+ [this , ctrl](const QString &branch) {
2264+ m_gitOpMgr->startMerge (ctrl, branch);
2265+ });
2266+ picker->popupAt (QCursor::pos ());
2267+ });
2268+ connect (dock, &FolderAsWorkspaceDock::gitRebaseRequested, this ,
2269+ [this ](FolderAsWorkspaceDock *wsDock) {
2270+ auto *ctrl = wsDock->gitTabWidget () ? wsDock->gitTabWidget ()->controller () : nullptr ;
2271+ if (!ctrl) return ;
2272+ auto *picker = new BranchPickerPopup (this );
2273+ picker->setAttribute (Qt::WA_DeleteOnClose);
2274+ picker->setSelectOnly (true , tr (" Select branch to rebase onto…" ));
2275+ picker->setBranches (ctrl->branchesLocal (), ctrl->branchesRemote (),
2276+ ctrl->currentBranch ());
2277+ connect (picker, &BranchPickerPopup::branchSelected, this ,
2278+ [this , ctrl](const QString &branch) {
2279+ m_gitOpMgr->startRebase (ctrl, branch);
2280+ });
2281+ picker->popupAt (QCursor::pos ());
2282+ });
2283+ connect (dock, &FolderAsWorkspaceDock::gitInteractiveRebaseRequested, this ,
2284+ [this ](FolderAsWorkspaceDock *wsDock) {
2285+ auto *ctrl = wsDock->gitTabWidget () ? wsDock->gitTabWidget ()->controller () : nullptr ;
2286+ if (!ctrl) return ;
2287+ auto *picker = new BranchPickerPopup (this );
2288+ picker->setAttribute (Qt::WA_DeleteOnClose);
2289+ picker->setSelectOnly (true , tr (" Select branch for interactive rebase…" ));
2290+ picker->setBranches (ctrl->branchesLocal (), ctrl->branchesRemote (),
2291+ ctrl->currentBranch ());
2292+ connect (picker, &BranchPickerPopup::branchSelected, this ,
2293+ [this , ctrl](const QString &branch) {
2294+ m_gitOpMgr->startInteractiveRebase (ctrl, branch);
2295+ });
2296+ picker->popupAt (QCursor::pos ());
2297+ });
22502298}
22512299
22522300void MainWindow::restoreOpenWorkspaces ()
@@ -3800,116 +3848,10 @@ void MainWindow::saveWorkspaceStatesOnly()
38003848 persistWorkspaceStatesMerged (live);
38013849}
38023850
3803- // --- Git Operation Menu & Wiring ---
3851+ // --- Git Operation Wiring ---
38043852
38053853void MainWindow::setupGitOperationMenu ()
38063854{
3807- auto *menuGit = menuBar ()->addMenu (tr (" &Git" ));
3808-
3809- auto *actionMerge = menuGit->addAction (tr (" Merge Branch..." ));
3810- auto *actionRebase = menuGit->addAction (tr (" Rebase Current Branch..." ));
3811- auto *actionInteractiveRebase = menuGit->addAction (tr (" Interactive Rebase..." ));
3812- menuGit->addSeparator ();
3813- auto *actionContinue = menuGit->addAction (tr (" Continue" ));
3814- auto *actionSkip = menuGit->addAction (tr (" Skip" ));
3815- auto *actionAbort = menuGit->addAction (tr (" Abort" ));
3816-
3817- connect (menuGit, &QMenu::aboutToShow, this , [=]() {
3818- const QString wsRoot = currentWorkspaceRoot ();
3819- bool hasWorkspace = !wsRoot.isEmpty ();
3820- auto state = m_gitOpMgr->state (wsRoot);
3821- bool idle = (state == GitOperationManager::OperationState::Idle);
3822- bool suspended = (state == GitOperationManager::OperationState::RebaseSuspended ||
3823- state == GitOperationManager::OperationState::RebaseSuspendedEdit ||
3824- state == GitOperationManager::OperationState::MergeConflicted);
3825-
3826- actionMerge->setEnabled (hasWorkspace && idle);
3827- actionRebase->setEnabled (hasWorkspace && idle);
3828- actionInteractiveRebase->setEnabled (hasWorkspace && idle);
3829- actionContinue->setEnabled (hasWorkspace && suspended);
3830- actionSkip->setEnabled (hasWorkspace &&
3831- (state == GitOperationManager::OperationState::RebaseSuspended));
3832- actionAbort->setEnabled (hasWorkspace && suspended);
3833- });
3834-
3835- connect (actionMerge, &QAction::triggered, this , [this ]() {
3836- auto *dock = activeWorkspaceDock ();
3837- if (!dock) return ;
3838- auto *ctrl = dock->gitTabWidget () ? dock->gitTabWidget ()->controller () : nullptr ;
3839- if (!ctrl) return ;
3840- // Use BranchPickerPopup for branch selection
3841- auto *picker = new BranchPickerPopup (this );
3842- picker->setBranches (ctrl->branchesLocal (), ctrl->branchesRemote (),
3843- ctrl->currentBranch ());
3844- connect (picker, &BranchPickerPopup::checkoutRequested, this ,
3845- [this , ctrl](const QString &branch) {
3846- m_gitOpMgr->startMerge (ctrl, branch);
3847- });
3848- picker->popupAt (QCursor::pos ());
3849- });
3850-
3851- connect (actionRebase, &QAction::triggered, this , [this ]() {
3852- auto *dock = activeWorkspaceDock ();
3853- if (!dock) return ;
3854- auto *ctrl = dock->gitTabWidget () ? dock->gitTabWidget ()->controller () : nullptr ;
3855- if (!ctrl) return ;
3856- auto *picker = new BranchPickerPopup (this );
3857- picker->setBranches (ctrl->branchesLocal (), ctrl->branchesRemote (),
3858- ctrl->currentBranch ());
3859- connect (picker, &BranchPickerPopup::checkoutRequested, this ,
3860- [this , ctrl](const QString &branch) {
3861- m_gitOpMgr->startRebase (ctrl, branch);
3862- });
3863- picker->popupAt (QCursor::pos ());
3864- });
3865-
3866- connect (actionInteractiveRebase, &QAction::triggered, this , [this ]() {
3867- auto *dock = activeWorkspaceDock ();
3868- if (!dock) return ;
3869- auto *ctrl = dock->gitTabWidget () ? dock->gitTabWidget ()->controller () : nullptr ;
3870- if (!ctrl) return ;
3871- auto *picker = new BranchPickerPopup (this );
3872- picker->setBranches (ctrl->branchesLocal (), ctrl->branchesRemote (),
3873- ctrl->currentBranch ());
3874- connect (picker, &BranchPickerPopup::checkoutRequested, this ,
3875- [this , ctrl](const QString &branch) {
3876- m_gitOpMgr->startInteractiveRebase (ctrl, branch);
3877- });
3878- picker->popupAt (QCursor::pos ());
3879- });
3880-
3881- connect (actionContinue, &QAction::triggered, this , [this ]() {
3882- auto *dock = activeWorkspaceDock ();
3883- if (!dock) return ;
3884- auto *ctrl = dock->gitTabWidget () ? dock->gitTabWidget ()->controller () : nullptr ;
3885- if (!ctrl) return ;
3886- auto state = m_gitOpMgr->state (ctrl->currentRepo ());
3887- if (state == GitOperationManager::OperationState::MergeConflicted)
3888- m_gitOpMgr->commitMerge (ctrl);
3889- else
3890- m_gitOpMgr->continueRebase (ctrl);
3891- });
3892-
3893- connect (actionSkip, &QAction::triggered, this , [this ]() {
3894- auto *dock = activeWorkspaceDock ();
3895- if (!dock) return ;
3896- auto *ctrl = dock->gitTabWidget () ? dock->gitTabWidget ()->controller () : nullptr ;
3897- if (!ctrl) return ;
3898- m_gitOpMgr->skipRebase (ctrl);
3899- });
3900-
3901- connect (actionAbort, &QAction::triggered, this , [this ]() {
3902- auto *dock = activeWorkspaceDock ();
3903- if (!dock) return ;
3904- auto *ctrl = dock->gitTabWidget () ? dock->gitTabWidget ()->controller () : nullptr ;
3905- if (!ctrl) return ;
3906- auto state = m_gitOpMgr->state (ctrl->currentRepo ());
3907- if (state == GitOperationManager::OperationState::MergeConflicted)
3908- m_gitOpMgr->abortMerge (ctrl);
3909- else
3910- m_gitOpMgr->abortRebase (ctrl);
3911- });
3912-
39133855 // Connect operation manager signals to UI
39143856 connect (m_gitOpMgr, &GitOperationManager::mergeConflicted, this ,
39153857 &MainWindow::showConflictListDock);
0 commit comments