mirror of
https://github.com/fralx/LimeReport.git
synced 2025-11-25 08:28:06 +03:00
Rulers and inches support has been added
This commit is contained in:
@@ -277,10 +277,12 @@ void ReportDesignWidget::createTabs(){
|
||||
m_tabWidget->clear();
|
||||
int pageIndex = -1;
|
||||
for (int i = 0; i<m_report->pageCount();++i){
|
||||
QGraphicsView* view = new QGraphicsView(qobject_cast<QWidget*>(this));
|
||||
// QGraphicsView* view = new QGraphicsView(qobject_cast<QWidget*>(this));
|
||||
PageView* view = new PageView(qobject_cast<QWidget*>(this));
|
||||
view->setBackgroundBrush(QBrush(Qt::gray));
|
||||
view->setFrameShape(QFrame::NoFrame);
|
||||
view->setScene(m_report->pageAt(i));
|
||||
view->setPageItem(m_report->pageAt(i)->pageItem());
|
||||
|
||||
// foreach(QGraphicsItem* item, m_report->pageAt(i)->selectedItems()){
|
||||
// item->setSelected(false);
|
||||
@@ -1017,6 +1019,179 @@ void ReportDesignWidget::clear()
|
||||
m_scriptEditor->setPlainText("");
|
||||
}
|
||||
|
||||
void PageView::setPageItem(PageItemDesignIntf *pageItem)
|
||||
{
|
||||
if (!pageItem) return;
|
||||
m_pageItem = pageItem;
|
||||
if (!m_horizontalRuller){
|
||||
m_horizontalRuller = new Ruler(Ruler::Horizontal, this);
|
||||
m_horizontalRuller->setPage(pageItem);
|
||||
}
|
||||
if (!m_verticalRuller){
|
||||
m_verticalRuller = new Ruler(Ruler::Vertical, this);
|
||||
m_verticalRuller->setPage(pageItem);
|
||||
}
|
||||
}
|
||||
|
||||
bool PageView::viewportEvent(QEvent *event)
|
||||
{
|
||||
switch (event->type()) {
|
||||
case QEvent::MouseMove:
|
||||
m_horizontalRuller->setMousePos(dynamic_cast<QMouseEvent*>(event)->pos());
|
||||
m_verticalRuller->setMousePos(dynamic_cast<QMouseEvent*>(event)->pos());
|
||||
m_horizontalRuller->update();
|
||||
m_verticalRuller->update();
|
||||
break;
|
||||
//case QEvent::Resize:
|
||||
case QEvent::Paint:
|
||||
if (m_horizontalRuller){
|
||||
int x = mapFromScene(m_pageItem->boundingRect().x(),m_pageItem->boundingRect().y()).x();
|
||||
int y = mapFromScene(m_pageItem->boundingRect().x(),m_pageItem->boundingRect().y()).y();
|
||||
int width = mapFromScene(m_pageItem->boundingRect().bottomRight().x(),m_pageItem->boundingRect().bottomRight().y()).x();
|
||||
int height = mapFromScene(m_pageItem->boundingRect().bottomRight().x(),m_pageItem->boundingRect().bottomRight().y()).y();
|
||||
|
||||
x = x < 0 ? 0 : x;
|
||||
y = y < 0 ? 0 : y;
|
||||
|
||||
m_horizontalRuller->setGeometry(x+20, 0, (width-x), 20);
|
||||
m_verticalRuller->setGeometry(0, y+20, 20, (height - y));
|
||||
m_verticalRuller->update();
|
||||
m_horizontalRuller->update();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return QGraphicsView::viewportEvent(event);
|
||||
}
|
||||
|
||||
void Ruler::setPage(PageItemDesignIntf *page)
|
||||
{
|
||||
m_page = page;
|
||||
|
||||
}
|
||||
|
||||
void Ruler::paintEvent(QPaintEvent *event){
|
||||
QPainter painter(this);
|
||||
painter.setBrush(palette().background());
|
||||
painter.setPen(Qt::NoPen);
|
||||
painter.drawRect(event->rect());
|
||||
// painter.setPen(palette().foreground().color());
|
||||
|
||||
if (m_page){
|
||||
qreal rulerWidth = m_page->geometry().width() / m_page->unitFactor();
|
||||
qreal rulerHeight = m_page->geometry().height() / m_page->unitFactor();
|
||||
|
||||
QGraphicsView* view = qobject_cast<QGraphicsView*>(parent());
|
||||
|
||||
int hStartPos = view->mapFromScene(0,0).x();
|
||||
int vStartPos = view->mapFromScene(0,0).y();
|
||||
|
||||
QFont font = painter.font();
|
||||
font.setPointSize(7);
|
||||
painter.setFont(font);
|
||||
|
||||
switch (m_type) {
|
||||
case Horizontal:
|
||||
painter.setPen(Qt::NoPen);
|
||||
|
||||
if (isColorDark(palette().background().color()))
|
||||
painter.setBrush(QColor("#64893d"));
|
||||
else
|
||||
painter.setBrush(QColor("#b5da91"));
|
||||
|
||||
drawItemWithChildren(&painter, m_page);
|
||||
painter.setPen(palette().foreground().color());
|
||||
|
||||
for (int i = 0; i < rulerWidth / 10; ++i){
|
||||
int hs10 = view->mapFromScene(QPointF(m_page->geometry().topLeft().x() + i * 10 * m_page->unitFactor(), 0)).x();
|
||||
int hs5 = view->mapFromScene(QPointF(m_page->geometry().topLeft().x() + i * 10 * m_page->unitFactor() + 5 * m_page->unitFactor(), 0)).x();
|
||||
if (hs10 > 0){
|
||||
if (hStartPos > 0){
|
||||
hs10 -= hStartPos;
|
||||
hs5 -= hStartPos;
|
||||
}
|
||||
painter.drawLine(hs10, 15, hs10, 20);
|
||||
painter.drawLine(hs5, 10, hs5, 20);
|
||||
if ( i > 0)
|
||||
painter.drawText(QPoint(hs10 - (painter.fontMetrics().width(QString::number(i))/2), 12),
|
||||
QString::number(i));
|
||||
}
|
||||
}
|
||||
painter.setPen(Qt::black);
|
||||
painter.drawLine(m_mousePos.x() - (hStartPos > 0 ? hStartPos : 0) , 0,
|
||||
m_mousePos.x() - (hStartPos > 0 ? hStartPos : 0) , 20);
|
||||
break;
|
||||
case Vertical:
|
||||
painter.setPen(Qt::NoPen);
|
||||
|
||||
if (isColorDark(palette().background().color()))
|
||||
painter.setBrush(QColor("#64893d"));
|
||||
else
|
||||
painter.setBrush(QColor("#b5da91"));
|
||||
|
||||
drawItemWithChildren(&painter, m_page);
|
||||
painter.setPen(palette().foreground().color());
|
||||
for (int i = 0; i < rulerHeight / 10; ++i){
|
||||
int vs10 = view->mapFromScene(QPointF(0, m_page->geometry().topLeft().y()+i * 10 * m_page->unitFactor())).y();
|
||||
int vs5 = view->mapFromScene(QPointF(0, m_page->geometry().topLeft().y()+i * 10 * m_page->unitFactor() + 5 * m_page->unitFactor())).y();
|
||||
if (vs10 > 0){
|
||||
if (vStartPos > 0){
|
||||
vs10 -= vStartPos;
|
||||
vs5 -= vStartPos;
|
||||
}
|
||||
painter.drawLine(15, vs10, 20, vs10);
|
||||
if ( i > 0 )
|
||||
painter.drawText(QPoint( (15 - painter.fontMetrics().width(QString::number(i))) / 2 ,
|
||||
vs10 + (painter.fontMetrics().height()/2)), QString::number(i));
|
||||
painter.drawLine(10, vs5, 20, vs5);
|
||||
}
|
||||
}
|
||||
painter.setPen(Qt::black);
|
||||
painter.drawLine(0, m_mousePos.y() - (vStartPos > 0 ? vStartPos : 0),
|
||||
20, m_mousePos.y() - (vStartPos > 0 ? vStartPos : 0));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Ruler::drawItemWithChildren(QPainter* painter, BaseDesignIntf *item)
|
||||
{
|
||||
foreach(BaseDesignIntf* child, item->childBaseItems()){
|
||||
if (!child->childBaseItems().isEmpty())
|
||||
drawItemWithChildren(painter, child);
|
||||
else drawItem(painter, child);
|
||||
|
||||
}
|
||||
drawItem(painter, item);
|
||||
}
|
||||
|
||||
void Ruler::drawItem(QPainter* painter, BaseDesignIntf *item)
|
||||
{
|
||||
if (!item->isSelected()) return;
|
||||
|
||||
QGraphicsView* view = qobject_cast<QGraphicsView*>(parent());
|
||||
int hStartPos = view->mapFromScene(0,0).x();
|
||||
int vStartPos = view->mapFromScene(0,0).y();
|
||||
|
||||
switch (m_type) {
|
||||
case Horizontal:
|
||||
if (item->isSelected())
|
||||
painter->drawRect(view->mapFromScene(item->mapToScene(0,0)).x() - hStartPos, 0,
|
||||
view->mapFromScene(item->geometry().bottomRight().x() - item->pos().x(), 0).x() - hStartPos, 20);
|
||||
|
||||
|
||||
break;
|
||||
case Vertical:
|
||||
if (item->isSelected())
|
||||
painter->drawRect(0, view->mapFromScene(item->mapToScene(0, 0)).y() - vStartPos,
|
||||
20, view->mapFromScene(0, item->geometry().bottomRight().y() - item->pos().y()).y() - vStartPos);
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user