diff --git a/.gitignore b/.gitignore index 2a5bc08..16eedea 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,5 @@ tests/test qshowdiff doc/*.png *~ +src/qt/*.moc diff --git a/src/Makefile b/src/Makefile index c4cd01f..dbf1a9e 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,4 +1,6 @@ CC = g++ +MOC = /opt/qt4/bin/moc + CXXFLAGS = -Wall -Wno-long-long -pedantic -O2 DEBUGFLAGS = -g QT_INCLUDE = -DQT_SHARED -I/opt/qt4/include -I/opt/qt4/include/QtCore \ @@ -35,9 +37,9 @@ objs/%.o: %.cpp %.h objs/%.o: %.cpp $(CC) $(ALL_FLAGS) -c -o $@ $< -#qt/diff_view.cpp: qt/diff_view.moc -#qt/diff_view.moc: qt/diff_view.h -# moc -p'.' $< > $@ +qt/diff_view.cpp: qt/diff_view.moc +qt/diff_view.moc: qt/diff_view.h + $(MOC) -p'.' $< > $@ clean: rm -f objs/*.o diff --git a/src/diff/diff.cpp b/src/diff/diff.cpp index 7481125..12e3fc8 100644 --- a/src/diff/diff.cpp +++ b/src/diff/diff.cpp @@ -29,6 +29,17 @@ int Diff::paintModified(QPainter &painter) const return offset; } + +int Diff::paintOriginal(int pos, QPainter &painter) const +{ + return VectorOfPointers::_get(pos)->paintOriginal(painter, 0); +} + +int Diff::paintModified(int pos, QPainter &painter) const +{ + return VectorOfPointers::_get(pos)->paintModified(painter, 0); +} + // static member Diff Diff::diff; diff --git a/src/diff/diff.h b/src/diff/diff.h index 5dee474..d206b3b 100644 --- a/src/diff/diff.h +++ b/src/diff/diff.h @@ -25,8 +25,13 @@ class Diff : public VectorOfPointers{ void addFile(File *f){ VectorOfPointers::_add(f); } int numFiles() const { return VectorOfPointers::_size(); } + QString getFile(int pos) const + { return VectorOfPointers::_get(pos)->getFilename(); } + int paintOriginal(QPainter &) const; int paintModified(QPainter &) const; + int paintOriginal(int pos, QPainter &) const; + int paintModified(int pos, QPainter &) const; }; #endif diff --git a/src/diff/file.h b/src/diff/file.h index 1a58ad6..d999e6a 100644 --- a/src/diff/file.h +++ b/src/diff/file.h @@ -23,6 +23,11 @@ class File : public VectorOfPointers{ void addHunk(Hunk *h){ VectorOfPointers::_add(h);} int numHunks() const { return VectorOfPointers::_size();} + /** + * Return filename. + */ + QString getFilename() const { return _filename; } + int paintOriginal(QPainter &original, int offset) const; int paintModified(QPainter &original, int offset) const; }; diff --git a/src/diff/utils.h b/src/diff/utils.h index 075701a..6e5d3fd 100644 --- a/src/diff/utils.h +++ b/src/diff/utils.h @@ -86,6 +86,11 @@ class VectorOfPointers{ */ int _size() const { return _list.size(); } + /** + * Returns Type* at position pos in _list. + */ + Type *_get(int pos) const { return _list[pos]; } + list_iterator_t _begin() const { return _list.begin();} list_iterator_t _end() const { return _list.end();} diff --git a/src/qt/diff_view.cpp b/src/qt/diff_view.cpp index 05f4305..241618b 100644 --- a/src/qt/diff_view.cpp +++ b/src/qt/diff_view.cpp @@ -5,21 +5,22 @@ #include "../debug.h" #include "diff_view.h" +#include "diff_view.moc" DiffViewFrame::DiffViewFrame(QWidget *parent) : QWidget(parent) { QVBoxLayout *layout = new QVBoxLayout(); QSplitter *splitter = new QSplitter(Qt::Horizontal); - DiffView *original = new DiffView(true); - DiffView *modified = new DiffView(false); + _original = new DiffView(true); + _modified = new DiffView(false); QScrollArea *orig = new QScrollArea(); QScrollArea *modif = new QScrollArea(); - orig->setWidget(original); + orig->setWidget(_original); orig->setWidgetResizable(true); orig->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - modif->setWidget(modified); + modif->setWidget(_modified); modif->setWidgetResizable(true); splitter->addWidget(orig); @@ -45,6 +46,14 @@ DiffViewFrame::DiffViewFrame(QWidget *parent) : QWidget(parent) SLOT(setValue(int))); } +void DiffViewFrame::changeFile(int num) const +{ + if (num != -1){ + // num - 1 is there because num==0 is for 'All files' + _original->setCurrentFile(num - 1); + _modified->setCurrentFile(num - 1); + } +} /* DiffView */ void DiffView::paintEvent(QPaintEvent *e) @@ -52,11 +61,23 @@ void DiffView::paintEvent(QPaintEvent *e) int height; QPainter painter(this); if (_original){ - height = Diff::instance()->paintOriginal(painter); + if (_current_file == -1) + height = Diff::instance()->paintOriginal(painter); + else + height = Diff::instance()->paintOriginal(_current_file, painter); }else{ - height = Diff::instance()->paintModified(painter); + if (_current_file == -1) + height = Diff::instance()->paintModified(painter); + else + height = Diff::instance()->paintModified(_current_file, painter); } setFixedHeight(height); setMinimumWidth(Settings::max_line_width); } + +void DiffView::setCurrentFile(int num) +{ + _current_file = num; + repaint(); +} diff --git a/src/qt/diff_view.h b/src/qt/diff_view.h index ce487f7..0fa75fd 100644 --- a/src/qt/diff_view.h +++ b/src/qt/diff_view.h @@ -6,18 +6,39 @@ #include #include "../diff/diff.h" +class DiffView; + class DiffViewFrame : public QWidget{ + Q_OBJECT + private: + DiffView *_original; + DiffView *_modified; + + public: DiffViewFrame(QWidget *parent = 0); + + public slots: + /** + * Change which file will be displayed. + */ + void changeFile(int) const; }; class DiffView : public QWidget{ private: bool _original; + /** + * Number of current file. -1 if all files. + */ + int _current_file; + public: DiffView(bool original, QWidget *parent = 0) : QWidget(parent), - _original(original) {} + _original(original), _current_file(-1) {} void paintEvent(QPaintEvent *e); + + void setCurrentFile(int); }; #endif diff --git a/src/qt/main_window.cpp b/src/qt/main_window.cpp index 02a3b81..3375926 100644 --- a/src/qt/main_window.cpp +++ b/src/qt/main_window.cpp @@ -2,18 +2,30 @@ #include #include #include +#include //TODO: change to QListWidget #include "main_window.h" #include "diff_view.h" MainWindow::MainWindow() { QSplitter *splitter = new QSplitter(Qt::Vertical); - QWidget *top = new QWidget(); + QListWidget *top = new QListWidget(); DiffViewFrame *bottom = new DiffViewFrame(); - top->setMaximumHeight(100); + DBG("getFile(0) - " << Diff::instance()->getFile(0).toStdString()); + top->insertItem(0, new QListWidgetItem("All files")); + int len = Diff::instance()->numFiles(); + for (int i=0; i < len; i++){ + top->insertItem(i+1, new QListWidgetItem(Diff::instance()->getFile(i))); + } + splitter->addWidget(top); splitter->addWidget(bottom); + splitter->setStretchFactor(0,1); + splitter->setStretchFactor(1,10); setCentralWidget(splitter); + + connect(top, SIGNAL(currentRowChanged(int)), bottom, + SLOT(changeFile(int))); }