diff hgtabwidget.cpp @ 96:87ef2fa9ee8b

* Rename HgExpWidget to HgTabWidget
author Chris Cannam
date Wed, 24 Nov 2010 16:40:57 +0000
parents hgexpwidget.cpp@d1be9712818a
children 0bd32aedc6f6
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hgtabwidget.cpp	Wed Nov 24 16:40:57 2010 +0000
@@ -0,0 +1,174 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */
+
+/*
+    EasyMercurial
+
+    Based on HgExplorer by Jari Korhonen
+    Copyright (c) 2010 Jari Korhonen
+    Copyright (c) 2010 Chris Cannam
+    Copyright (c) 2010 Queen Mary, University of London
+    
+    This program is free software; you can redistribute it and/or
+    modify it under the terms of the GNU General Public License as
+    published by the Free Software Foundation; either version 2 of the
+    License, or (at your option) any later version.  See the file
+    COPYING included with this distribution for more information.
+*/
+
+#include "hgtabwidget.h"
+#include "common.h"
+#include "logparser.h"
+#include "changeset.h"
+#include "changesetitem.h"
+#include "grapher.h"
+#include "panner.h"
+#include "panned.h"
+#include "filestatuswidget.h"
+
+#include <QClipboard>
+#include <QContextMenuEvent>
+#include <QApplication>
+
+#include <iostream>
+
+HgTabWidget::HgTabWidget(QWidget *parent,
+                         QString remoteRepo,
+                         QString workFolderPath) :
+    QTabWidget(parent)
+{
+    // Work page
+    fileStatusWidget = new FileStatusWidget;
+    fileStatusWidget->setLocalPath(workFolderPath);
+    fileStatusWidget->setRemoteURL(remoteRepo);
+    connect(fileStatusWidget, SIGNAL(selectionChanged()),
+            this, SIGNAL(selectionChanged()));
+    addTab(fileStatusWidget, tr("My work"));
+
+    // History graph page
+    historyGraphPageWidget = new QWidget;
+    Panned *panned = new Panned;
+    Panner *panner = new Panner;
+    historyGraphWidget = panned;
+    historyGraphPanner = panner;
+    QGridLayout *layout = new QGridLayout;
+    layout->addWidget(historyGraphWidget, 0, 0);
+    layout->addWidget(historyGraphPanner, 0, 1);
+    panner->setMaximumWidth(80);
+    panner->connectToPanned(panned);
+    historyGraphPageWidget->setLayout(layout);
+    addTab(historyGraphPageWidget, tr("History"));
+}
+
+void HgTabWidget::clearSelections()
+{
+    fileStatusWidget->clearSelections();
+}
+
+bool HgTabWidget::canCommit() const
+{
+    return fileStatusWidget->haveChangesToCommit();
+}
+
+bool HgTabWidget::canAdd() const
+{
+    if (fileStatusWidget->getSelectedAddableFiles().empty()) return false;
+    if (!fileStatusWidget->getSelectedCommittableFiles().empty()) return false;
+    if (!fileStatusWidget->getSelectedRemovableFiles().empty()) return false;
+    return true;
+}
+
+bool HgTabWidget::canRemove() const
+{
+    if (fileStatusWidget->getSelectedRemovableFiles().empty()) return false;
+    if (!fileStatusWidget->getSelectedAddableFiles().empty()) return false;
+    return true;
+}
+
+bool HgTabWidget::canDoDiff() const
+{
+    return canCommit();
+}
+
+QStringList HgTabWidget::getAllSelectedFiles() const
+{
+    return fileStatusWidget->getAllSelectedFiles();
+}
+
+QStringList HgTabWidget::getSelectedCommittableFiles() const
+{
+    return fileStatusWidget->getSelectedCommittableFiles();
+}
+
+QStringList HgTabWidget::getSelectedAddableFiles() const
+{
+    return fileStatusWidget->getSelectedAddableFiles();
+}
+
+QStringList HgTabWidget::getSelectedRemovableFiles() const
+{
+    return fileStatusWidget->getSelectedRemovableFiles();
+}
+
+void HgTabWidget::updateWorkFolderFileList(QString fileList)
+{
+    fileStates.parseStates(fileList);
+    fileStatusWidget->setFileStates(fileStates);
+}
+
+void HgTabWidget::updateLocalRepoHgLogList(QString hgLogList)
+{
+    //!!!
+    Panned *panned = static_cast<Panned *>(historyGraphWidget);
+    Panner *panner = static_cast<Panner *>(historyGraphPanner);
+    QGraphicsScene *scene = new QGraphicsScene();
+    Changesets csets = parseChangeSets(hgLogList);
+    if (csets.empty()) return;
+    Grapher g(scene);
+    try {
+	g.layout(csets);
+    } catch (std::string s) {
+	std::cerr << "Internal error: Layout failed: " << s << std::endl;
+    }
+    QGraphicsScene *oldScene = panned->scene();
+    panned->setScene(scene);
+    panner->setScene(scene);
+    if (oldScene) delete oldScene;
+    ChangesetItem *tipItem = g.getItemFor(csets[0]);
+    if (tipItem) tipItem->ensureVisible();
+}
+
+Changesets HgTabWidget::parseChangeSets(QString changeSetsStr)
+{
+    Changesets csets;
+    LogList log = LogParser(changeSetsStr).parse();
+    foreach (LogEntry e, log) {
+        Changeset *cs = new Changeset();
+        foreach (QString key, e.keys()) {
+	    if (key == "parents") {
+		QStringList parents = e.value(key).split
+		    (" ", QString::SkipEmptyParts);
+		cs->setParents(parents);
+	    } else if (key == "timestamp") {
+		cs->setTimestamp(e.value(key).split(" ")[0].toULongLong());
+	    } else {
+		cs->setProperty(key.toLocal8Bit().data(), e.value(key));
+	    }
+        }
+        csets.push_back(cs);
+    }
+    for (int i = 0; i+1 < csets.size(); ++i) {
+	Changeset *cs = csets[i];
+	if (cs->parents().empty()) {
+	    QStringList list;
+	    list.push_back(csets[i+1]->id());
+	    cs->setParents(list);
+	}
+    }
+    return csets;
+}
+
+void HgTabWidget::setWorkFolderAndRepoNames(QString workFolderPath, QString remoteRepoPath)
+{
+    fileStatusWidget->setLocalPath(workFolderPath);
+    fileStatusWidget->setRemoteURL(remoteRepoPath);
+}