Commit 9f537252 authored by Bernd Gehrmann's avatar Bernd Gehrmann
Browse files

Change annotate view to QListView. Based on a patch by André Wöbbeking <Woebbeking@web.de>

svn path=/trunk/kdesdk/cervisia/; revision=163073
parent c53a0cd7
/*
* Copyright (C) 1999-2001 Bernd Gehrmann
* Copyright (C) 1999-2002 Bernd Gehrmann
* bernd@physik.hu-berlin.de
*
* This program may be distributed under the terms of the Q Public
......@@ -11,193 +11,226 @@
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
#include "annotateview.h"
#include <qheader.h>
#include <qpainter.h>
#include <kapplication.h>
#include <kconfig.h>
#include "tiplabel.h"
#include "misc.h"
#include "cervisiapart.h"
#include "tiplabel.h"
#include "annotateview.h"
#include "annotateview.moc"
static const int ANN_BORDER = 4;
class AnnotateViewItem
class AnnotateViewItem : public QListViewItem
{
public:
QString rev;
QString author;
QString date;
QString content;
QString comment;
bool odd;
};
enum { LineNumberColumn, AuthorColumn, ContentColumn };
AnnotateViewItem(AnnotateView *parent, const QString &rev, const QString &author,
const QString &date, const QString &content, const QString &comment,
bool odd, int linenumber);
virtual int compare(QListViewItem *item, int col, bool ascending) const;
virtual int width(const QFontMetrics &, const QListView *, int col) const;
virtual QString text(int col) const;
virtual void paintCell(QPainter *, const QColorGroup &, int, int, int);
private:
QString mrev;
QString mauthor;
QString mdate;
QString mcontent;
QString mcomment;
bool modd;
int mlinenumber;
friend class AnnotateView;
static const int BORDER;
};
AnnotateView::AnnotateView( QWidget *parent, const char *name )
: QTableView(parent, name, WNorthWestGravity | WRepaintNoErase | WResizeNoErase)
const int AnnotateViewItem::BORDER = 4;
AnnotateViewItem::AnnotateViewItem(AnnotateView *parent, const QString &rev, const QString &author,
const QString &date, const QString &content, const QString &comment,
bool odd, int linenumber)
: QListViewItem(parent),
mrev(rev), mauthor(author), mdate(date), mcontent(content),
mcomment(comment), modd(odd), mlinenumber(linenumber)
{}
int AnnotateViewItem::compare(QListViewItem *item, int, bool) const
{
setNumRows(0);
setNumCols(3);
setTableFlags( Tbl_autoVScrollBar|Tbl_autoHScrollBar|
Tbl_smoothVScrolling );
setFrameStyle( QFrame::WinPanel | QFrame::Sunken );
setBackgroundMode(PaletteBase);
setMouseTracking(true);
int linenum1 = mlinenumber;
int linenum2 = static_cast<AnnotateViewItem*>(item)->mlinenumber;
KConfig *config = CervisiaPart::config();
config->setGroup("LookAndFeel");
setFont(config->readFontEntry("AnnotateFont"));
QFontMetrics fm(font());
return (linenum2 > linenum1)? -1 : (linenum2 < linenum1)? 1 : 0;
}
QString AnnotateViewItem::text(int col) const
{
switch (col)
{
case LineNumberColumn:
return QString::number(mlinenumber);
case AuthorColumn:
return mauthor.isNull()? "" : (mauthor + QChar(' ') + mrev);
case ContentColumn:
return mcontent;
default:
;
};
return "";
}
void AnnotateViewItem::paintCell(QPainter *p, const QColorGroup &, int col, int width, int align)
{
QColor backgroundColor;
switch (col)
{
case LineNumberColumn:
backgroundColor = QColor(222, 222, 222);
break;
default:
backgroundColor = modd? Qt::white : Qt::lightGray;
break;
};
p->fillRect(0, 0, width, height(), backgroundColor);
QString str = text(col);
if (str.isEmpty())
return;
if (align & (AlignTop || AlignBottom) == 0)
align |= AlignVCenter;
p->drawText(BORDER, 0, width - 2*BORDER, height(), align, str);
}
int AnnotateViewItem::width(const QFontMetrics &fm, const QListView *, int col) const
{
return fm.width(text(col)) + 2*BORDER;
}
setCellHeight(fm.lineSpacing());
setCellWidth(0);
currentRow = -1;
/*!
@todo The dummy column (remaining space eater) doesn't work
caused by a bug in QHeader::adjustHeaderSize() in Qt <= 3.0.4.
*/
AnnotateView::AnnotateView(QWidget *parent, const char *name)
: QListView(parent, name, WRepaintNoErase | WResizeNoErase)
{
setFrameStyle(QFrame::WinPanel | QFrame::Sunken);
setAllColumnsShowFocus(true);
setShowToolTips(false);
setSelectionMode(NoSelection);
header()->hide();
// setResizeMode(LastColumn);
addColumn(QString::null);
addColumn(QString::null);
addColumn(QString::null);
setSorting(AnnotateViewItem::LineNumberColumn);
setColumnAlignment(AnnotateViewItem::LineNumberColumn, Qt::AlignRight);
connect( this, SIGNAL(contentsMoving(int, int)), this, SLOT(hideLabel()) );
currentTipItem = 0;
currentLabel = 0;
items.setAutoDelete(true);
KConfig *config = CervisiaPart::config();
config->setGroup("LookAndFeel");
setFont(config->readFontEntry("AnnotateFont"));
}
AnnotateView::~AnnotateView()
{
delete currentLabel;
}
void AnnotateView::setFont(const QFont &font)
void AnnotateView::hideLabel()
{
QTableView::setFont(font);
QFontMetrics fm(font);
setCellHeight(fm.lineSpacing());
delete currentLabel;
currentLabel = 0;
}
void AnnotateView::addLine(const QString &rev, const QString &author, const QString &date,
const QString &content, const QString &comment, bool odd)
{
AnnotateViewItem *item = new AnnotateViewItem;
item->rev = rev;
item->author = author;
item->date = date;
item->content = content;
item->comment = comment;
item->odd = odd;
items.append(item);
setNumRows(numRows()+1);
(void) new AnnotateViewItem(this, rev, author, date, content, comment, odd, childCount()+1);
}
int AnnotateView::cellWidth(int col)
{
QFontMetrics fm(font());
switch (col)
{
case 0: return fm.width("10000");
case 1: return fm.width("1.0.1.0.1 gehrmab");
case 2: { int rest = cellWidth(0)+cellWidth(1); return viewWidth()-rest; }
default: return 0; // should not occur
}
}
QSize AnnotateView::sizeHint() const
{
QFontMetrics fm(font());
AnnotateView *that = const_cast<AnnotateView*>(this);
return QSize( that->cellWidth(0) + that->cellWidth(1) + 8*fm.width("0123456789"),
fm.lineSpacing()*8 );
QFontMetrics fm(fontMetrics());
return QSize(100 * fm.width("0"), 10 * fm.lineSpacing());
}
void AnnotateView::paintCell(QPainter *p, int row, int col)
void AnnotateView::contentsMouseMoveEvent(QMouseEvent *e)
{
AnnotateViewItem *item = items.at(row);
QPoint vp = contentsToViewport(e->pos());
AnnotateViewItem *item
= static_cast<AnnotateViewItem*>( itemAt(vp) );
int col = header()->sectionAt(vp.x());
int width = cellWidth(col);
int height = cellHeight();
if (item != currentTipItem || col != AnnotateViewItem::AuthorColumn)
hideLabel();
QColor backgroundColor;
int innerborder;
QString str;
if (col == 0)
{
backgroundColor = QColor(222, 222, 222);
innerborder = 0;
str.setNum(row+1);
}
else if (col == 1)
{
backgroundColor = item->odd? white : lightGray;
innerborder = ANN_BORDER;
if (!item->author.isNull())
if (!currentLabel && item && col == AnnotateViewItem::AuthorColumn && !item->mauthor.isNull())
{
QString text = "<qt><b>";
text += item->mrev;
text += "</b>&nbsp;&nbsp;";
text += item->mauthor;
text += "&nbsp;&nbsp;<b>";
text += item->mdate;
text += "</b>";
QStringList list = QStringList::split("\n", item->mcomment);
QStringList::Iterator it;
for (it = list.begin(); it != list.end(); ++it)
{
str = item->author;
str += " ";
str += item->rev;
text += "<br>";
text += (*it);
}
else
str = "";
}
else // col == 3
{
backgroundColor = item->odd? white : lightGray;
innerborder = 0;
str = item->content;
}
p->fillRect(0, 0, width, height, backgroundColor);
p->drawText(innerborder, 0, width-2*innerborder, height, AlignLeft, str);
}
text += "</qt>";
int left = header()->sectionPos(AnnotateViewItem::ContentColumn);
int top = viewport()->mapTo(this, itemRect(item).topLeft()).y();
currentLabel = new TipLabel(text);
currentLabel->showAt(mapToGlobal(QPoint(left, top)));
currentTipItem = item;
}
}
void AnnotateView::mouseMoveEvent(QMouseEvent *e)
void AnnotateView::leaveEvent(QEvent *)
{
int row = findRow(e->y());
int col = findCol(e->x());
if (row != currentRow || col != 1)
{
if (currentLabel)
currentLabel->hide();
delete currentLabel;
currentLabel = 0;
}
if (!currentLabel && row != -1 && col == 1)
{
AnnotateViewItem *item = items.at(row);
if (!item->author.isNull())
{
QString text = "<qt><b>";
text += item->rev;
text += "</b>&nbsp;&nbsp;";
text += item->author;
text += "&nbsp;&nbsp;<b>";
text += item->date;
text += "</b>";
QStringList list = QStringList::split("\n", item->comment);
QStringList::Iterator it;
for (it = list.begin(); it != list.end(); ++it)
{
text += "<br>";
text += (*it);
}
text += "</qt>";
int left; colXPos(2, &left);
int top; rowYPos(row, &top);
currentLabel = new TipLabel(text);
currentLabel->showAt(mapToGlobal(QPoint(left, top)));
currentRow = row;
}
}
QTableView::mouseMoveEvent(e);
hideLabel();
}
#include "annotateview.moc"
// Local Variables:
// c-basic-offset: 4
// End:
/*
* Copyright (C) 1999-2001 Bernd Gehrmann
* Copyright (C) 1999-2002 Bernd Gehrmann
* bernd@physik.hu-berlin.de
*
* This program may be distributed under the terms of the Q Public
......@@ -12,49 +12,36 @@
*/
#ifndef _ANNOTATEVIEW_H_
#define _ANNOTATEVIEW_H_
#ifndef ANNOTATEVIEW_H
#define ANNOTATEVIEW_H
#include <qlabel.h>
#if QT_VERSION < 300
#include <qlist.h>
#include <qtableview.h>
#else
#include <qptrlist.h>
#include <qttableview.h>
#endif
#include <qlistview.h>
class AnnotateViewItem;
class TipLabel;
class AnnotateViewItem;
#if QT_VERSION < 300
typedef QList<AnnotateViewItem> AnnotateViewItemList;
#else
typedef QtTableView QTableView; // XXX: This is a hack
typedef QPtrList<AnnotateViewItem> AnnotateViewItemList;
#endif
class AnnotateView : public QTableView
class AnnotateView : public QListView
{
Q_OBJECT
public:
AnnotateView( QWidget *parent=0, const char *name=0 );
~AnnotateView();
void addLine(const QString &rev, const QString &author, const QString &date,
const QString &content, const QString &comment, bool odd);
virtual void setFont(const QFont &font);
virtual int cellWidth(int col);
virtual QSize sizeHint() const;
virtual void paintCell(QPainter *p, int row, int col);
virtual void mouseMoveEvent(QMouseEvent *e);
virtual void contentsMouseMoveEvent(QMouseEvent *e);
virtual void leaveEvent(QEvent *);
private slots:
void hideLabel();
private:
AnnotateViewItemList items;
int currentRow;
TipLabel *currentLabel;
AnnotateViewItem *currentTipItem;
};
#endif
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment