View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0017321 | Scribus | User Interface | public | 2024-11-24 17:15 | 2024-11-24 20:50 |
Reporter | nitramr | Assigned To | nitramr | ||
Priority | normal | Severity | tweak | Reproducibility | N/A |
Status | resolved | Resolution | fixed | ||
Platform | Desktop PC | OS | Ubuntu | OS Version | 24.10 64-bit |
Product Version | 1.7.0.svn | ||||
Target Version | 1.7.0 | Fixed in Version | 1.7.0.svn | ||
Summary | 0017321: Ruler tab edit mode looks blurry on non-retina displays | ||||
Description | I made a UI update for the ruler to fix the blurry scale. The patch applies the following changes: - ruler is a little bigger and has new style for tab handles - ruler scale has a new scale tick on half position - right-click on a tab opens a context menu with all available types (replaces the iteration on right clicks) - double-click on a tab, opens the tab manager I faced a couple of other issues from 1.6.2 that are not fixed. In example: - tab edit mode is unusable when the text frame is horizontal mirrored - right indent has wrong position when there is a right margin This task solves the following tasks too: https://bugs.scribus.net/view.php?id=12960 https://bugs.scribus.net/view.php?id=16217 https://bugs.scribus.net/view.php?id=10888 | ||||
Tags | No tags attached. | ||||
Patch | Yes | ||||
related to | 0012960 | resolved | ale | in the ruler double clicking on tab or indent in should open the tabs dialog |
related to | 0016217 | resolved | ale | [PATCH] introduce an enum for the tab types |
related to | 0010888 | resolved | ale | Right clicking on the tab mark in the ruler should not cycle but show the list of available types |
|
ruler_2024-11-24_01.patch (27,032 bytes)
Index: resources/iconsets/1_7_0/1_7_0.xml =================================================================== --- resources/iconsets/1_7_0/1_7_0.xml (Revision 26450) +++ resources/iconsets/1_7_0/1_7_0.xml (Arbeitskopie) @@ -595,6 +595,11 @@ <icon id="paragraph-style-edit" file="16/action-edit.svg" /> <icon id="paragraph-style-new" file="16/action-add.svg" /> <icon id="paragraph-widow" file="16/paragraph-widow.svg" /> + <icon id="tabulator-center" file="16/tabulator-center.svg" /> + <icon id="tabulator-comma" file="16/tabulator-comma.svg" /> + <icon id="tabulator-dot" file="16/tabulator-dot.svg" /> + <icon id="tabulator-left" file="16/tabulator-left.svg" /> + <icon id="tabulator-right" file="16/tabulator-right.svg" /> <icon id="text-on-path-distance" file="16/text-on-path-distance.svg" /> <icon id="text-on-path-flip" file="16/object-flip-vertical.svg" /> <icon id="text-on-path-offset" file="16/text-on-path-offset.svg" /> Index: scribus/scribusview.cpp =================================================================== --- scribus/scribusview.cpp (Revision 26450) +++ scribus/scribusview.cpp (Arbeitskopie) @@ -115,6 +115,8 @@ undoManager(UndoManager::instance()), m_ScMW(mw) { + m_vhRulerHW = Hruler::rulerHeight(); + setObjectName("s"); QPalette p = palette(); p.setBrush(QPalette::Window, PrefsManager::instance().appPrefs.displayPrefs.scratchColor); Index: scribus/styles/paragraphstyle.h =================================================================== --- scribus/styles/paragraphstyle.h (Revision 26450) +++ scribus/styles/paragraphstyle.h (Arbeitskopie) @@ -66,6 +67,15 @@ AutomaticHyphenation = 2 }; + enum TabType + { + LeftTab = 0, + RightTab = 1, + DotTab = 2, + CommaTab = 3, + CenterTab = 4 + }; + struct TabRecord { qreal tabPosition {0.0}; Index: scribus/ui/hruler.cpp =================================================================== --- scribus/ui/hruler.cpp (Revision 26450) +++ scribus/ui/hruler.cpp (Arbeitskopie) @@ -35,10 +35,14 @@ #include "canvasgesture_rulermove.h" #include "hruler.h" +#include "scribus.h" +#include "scribusapp.h" #include "scribusdoc.h" #include "scribusview.h" #include "selection.h" +#include "tabmanager.h" #include "units.h" +#include "util_gui.h" #include "iconmanager.h" @@ -47,20 +51,31 @@ #else constexpr int topline = 3; #endif -constexpr int bottomline = 15; +constexpr int bottomline = 24; constexpr int rulerheight = (bottomline - topline); -constexpr int midline = (topline + rulerheight / 2); -constexpr int tabline = 7; +constexpr int midline = bottomline / 2; +constexpr int tabline = bottomline - 10; +constexpr int scaleS = bottomline - 4; +constexpr int scaleM = bottomline - 8; +constexpr int scaleL = bottomline - 12; +constexpr int textline = scaleL; Hruler::Hruler(ScribusView *pa, ScribusDoc *doc) : QWidget(pa), m_doc(doc), m_view(pa) { - setBackgroundRole(QPalette::Window); + //setBackgroundRole(QPalette::Window); //setAutoFillBackground(true); setMouseTracking(true); + m_contextMenu = new QMenu(); rulerGesture = new RulerGesture(m_view, RulerGesture::HORIZONTAL); unitChange(); + languageChange(); + setContextMenuPolicy(Qt::CustomContextMenu); + + connect(this, SIGNAL(customContextMenuRequested(QPoint)), SLOT(contextMenuRequested(QPoint))); + connect(m_contextMenu, SIGNAL(triggered(QAction*)), SLOT(tabTypeChanged(QAction*))); + connect(ScQApp, SIGNAL(iconSetChanged()), this, SLOT(languageChange())); // replace languageChange() if there are other icons than in context menu. } double Hruler::textBase() const @@ -99,6 +114,10 @@ m_offset += dist; } +int Hruler::rulerHeight() +{ + return bottomline; +} int Hruler::findRulerHandle(QPoint mp, int grabRadius) { @@ -187,7 +206,7 @@ const QString& textTabFillChar = m_doc->itemToolPrefs().textTabFillChar; ParagraphStyle::TabRecord tb; tb.tabPosition = tabPos; - tb.tabType = 0; + tb.tabType = ParagraphStyle::LeftTab; tb.tabFillChar = !textTabFillChar.isEmpty() ? textTabFillChar[0] : QChar(); m_tabValues.prepend(tb); m_currTab = 0; @@ -249,12 +268,6 @@ emit DocChanged(false); break; case rc_tab: - if (m->button() == Qt::RightButton) - { - m_tabValues[m_currTab].tabType += 1; - if (m_tabValues[m_currTab].tabType > 4) - m_tabValues[m_currTab].tabType = 0; - } paraStyle.setTabValues(m_tabValues); mustApplyStyle = true; emit DocChanged(false); @@ -447,6 +460,39 @@ } } +void Hruler::mouseDoubleClickEvent(QMouseEvent* m) +{ + QWidget::mouseDoubleClickEvent( m ); + + if (!m_doc || !m_currItem || m_doc->isLoading()) + return; + + m_rulerCode = findRulerHandle(m->pos(), m_doc->guidesPrefs().grabRadius); + + if ( m->button() == Qt::LeftButton && m_textEditMode && m_rulerCode == rc_tab) + { + m_mousePressed = false; + m_rulerCode = rc_none; + + PageItem_TextFrame *tItem = m_currItem->asTextFrame(); + if (tItem == nullptr) + return; + + const ParagraphStyle& style(m_doc->appMode == modeEdit ? tItem->currentStyle() : tItem->itemText.defaultStyle()); + TabManager *dia = new TabManager(this, m_doc->unitIndex(), style.tabValues(), tItem->columnWidth()); + if (dia->exec()) + { + ParagraphStyle paraStyle; + paraStyle.setTabValues(dia->tabList()); + Selection tempSelection(this, false); + tempSelection.addItem(m_currItem); + m_doc->itemSelection_ApplyParagraphStyle(paraStyle, &tempSelection); + emit DocChanged(false); + } + delete dia; + } +} + void Hruler::paintEvent(QPaintEvent *e) { if (m_doc->isLoading()) @@ -456,23 +502,28 @@ QFont ff = font(); ff.setPointSize(6); setFont(ff); + + const QPalette& palette = this->palette(); + const QColor& backgroundColor = palette.color(QPalette::Base); + QPainter p; p.begin(this); p.setClipRect(e->rect()); p.setFont(font()); - + p.fillRect(rect(), backgroundColor); + drawMarks(p); if (m_textEditMode) { - int rectX1 = textPosToLocal(m_distLeft); - int rectX2 = textPosToLocal(m_itemEndPos - m_itemPos - m_distRight); - const QPalette& palette = this->palette(); + const QColor& markerColor = blendColor(isDarkColor(backgroundColor), QColor(117, 182, 240), QColor(51, 132, 204)); + const QColor& marginColor = markerColor; + QColor columnColor = markerColor; + columnColor.setAlphaF(0.2); const QColor& textColor = palette.color(QPalette::Text); - p.fillRect(QRect(QPoint(rectX1, 1), QPoint(rectX2, 15)), palette.window()); - p.drawLine(rectX1, 16, rectX2, 16); + p.save(); - p.setRenderHints(QPainter::Antialiasing, true); + if (m_reverse) { p.translate( textPosToLocal(0), 0); @@ -485,37 +536,45 @@ double colWidth = (textWidth() - m_colGap * (m_cols - 1.0)) / m_cols; double pos = (colWidth + m_colGap) * currCol; double endPos = pos + colWidth; + + p.fillRect(QRect(QPoint(textPosToLocal(pos), 0), QPoint(textPosToLocal(endPos), bottomline)), backgroundColor); + p.fillRect(QRect(QPoint(textPosToLocal(pos), 0), QPoint(textPosToLocal(endPos), bottomline)), columnColor); + drawTextMarks(pos, endPos, p); - p.setPen(QPen(Qt::blue, 2, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin)); + // start braket + p.setPen(QPen(marginColor, 1, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin)); int xPos = textPosToLocal(pos); - p.drawLine(xPos, topline, xPos, bottomline); - if (currCol == 0) - { - p.drawLine(xPos, 15, (xPos + 4), 15); - p.drawLine(xPos, topline, (xPos + 4), topline); - } + p.drawLine(xPos, 0, xPos, bottomline); + p.drawLine(xPos, 0, (xPos + 8), 0); - p.setPen(QPen(Qt::blue, 1, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin)); - + // First Indent xPos = textPosToLocal(pos + m_firstIndent + m_leftMargin); - QPolygon cr; - cr.setPoints(3, xPos, midline, xPos + 3, topline, xPos - 3, topline); - p.drawPolygon(cr); + p.setPen(QPen(textColor, 1, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin)); + p.drawLine(xPos, tabline - 2, xPos, bottomline); + p.setPen(Qt::NoPen); + p.setRenderHints(QPainter::Antialiasing, true); + p.drawRect(QRect(xPos, tabline - 8, 8, 6)); + // Left Margin xPos = textPosToLocal(pos + m_leftMargin); QPolygon cr2; - cr2.setPoints(3, xPos, midline, xPos + 3, bottomline, xPos - 3, bottomline); + cr2.setPoints(3, xPos, tabline, xPos + 8, tabline, xPos, bottomline); p.drawPolygon(cr2); + // Right Margin xPos = textPosToLocal(pos + m_rightMargin); QPolygon cr3; - cr3.setPoints(3, xPos, topline, xPos, bottomline, xPos - 3, midline); + cr3.setPoints(3, xPos - 8, tabline, xPos, tabline, xPos, bottomline); p.drawPolygon(cr3); + p.setRenderHints(QPainter::Antialiasing, false); + + // Tabulator if (!m_tabValues.isEmpty()) { - p.setPen(QPen(textColor, 2, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin)); + int pWidth = 1; + p.setPen(QPen(textColor, pWidth * 2, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin)); for (int yg = 0; yg < m_tabValues.count(); ++yg) { xPos = textPosToLocal(pos + m_tabValues[yg].tabPosition); @@ -523,47 +582,47 @@ continue; switch (m_tabValues[yg].tabType) { - case 0: + case ParagraphStyle::LeftTab: if (m_reverse) { p.save(); p.translate(pos + m_tabValues[yg].tabPosition, 0); p.scale(-1, 1); - p.drawLine(0, tabline, 0, bottomline); - p.drawLine(0, bottomline, 8, bottomline); + p.drawLine(0, tabline, 0, bottomline - pWidth); + p.drawLine(0, bottomline - pWidth, 8, bottomline - pWidth); p.restore(); } else { - p.drawLine(xPos, tabline, xPos, bottomline); - p.drawLine(xPos, bottomline, xPos + 8, bottomline); + p.drawLine(xPos, tabline, xPos, bottomline - pWidth); + p.drawLine(xPos, bottomline - pWidth, xPos + 8, bottomline - pWidth); } break; - case 1: + case ParagraphStyle::RightTab: if (m_reverse) { p.save(); p.translate(pos + m_tabValues[yg].tabPosition, 0); p.scale(-1, 1); - p.drawLine(0, tabline, 0, bottomline); - p.drawLine(0, bottomline, -8, bottomline); + p.drawLine(0, tabline, 0, bottomline - pWidth); + p.drawLine(0, bottomline - pWidth, -8, bottomline - pWidth); p.restore(); } else { - p.drawLine(xPos, tabline, xPos, bottomline); - p.drawLine(xPos, bottomline, xPos - 8, bottomline); + p.drawLine(xPos, tabline, xPos, bottomline - pWidth); + p.drawLine(xPos, bottomline - pWidth, xPos - 8, bottomline - pWidth); } break; - case 2: - case 3: - p.drawLine(xPos, tabline, xPos, bottomline); - p.drawLine(xPos - 4, bottomline, xPos + 4, bottomline); - p.drawLine(xPos + 3, bottomline - 3, xPos + 2, bottomline - 3); + case ParagraphStyle::CommaTab: + case ParagraphStyle::DotTab: + p.drawLine(xPos, tabline, xPos, bottomline - pWidth); + p.drawLine(xPos - 4, bottomline - pWidth, xPos + 4, bottomline - pWidth); + p.drawLine(xPos + 3, bottomline - 3 - pWidth, xPos + 2, bottomline - 3 - pWidth); break; - case 4: - p.drawLine(xPos, tabline, xPos, bottomline); - p.drawLine(xPos - 4, bottomline, xPos + 4, bottomline); + case ParagraphStyle::CenterTab: + p.drawLine(xPos, tabline, xPos, bottomline - pWidth); + p.drawLine(xPos - 4, bottomline - pWidth, xPos + 4, bottomline - pWidth); break; default: break; @@ -571,14 +630,12 @@ } } - p.setPen(QPen(Qt::blue, 2, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin)); + // end braket + p.setPen(QPen(marginColor, 1, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin)); xPos = textPosToLocal(endPos); - p.drawLine(xPos, topline, xPos, bottomline); - if (currCol == m_cols - 1) - { - p.drawLine(xPos, bottomline, xPos - 4 , bottomline); - p.drawLine(xPos, topline, xPos - 4, topline); - } + p.drawLine(xPos, 0, xPos, bottomline - 1); + p.drawLine(xPos, 0, xPos - 8, 0); + } p.restore(); } @@ -593,13 +650,20 @@ void Hruler::drawMarker(QPainter& p) const { // draw slim marker + const QColor& markerColor = blendColor(isDarkColor(palette().color(QPalette::Base)), QColor(255, 117, 102), QColor(255, 71, 51)); QPolygon cr; + cr.setPoints(3, m_whereToDraw, 5, m_whereToDraw + 2, 0, m_whereToDraw - 2, 0); + p.resetTransform(); p.translate(-m_view->contentsX(), 0); - p.setPen(Qt::red); - p.setBrush(Qt::red); - cr.setPoints(5, m_whereToDraw, 5, m_whereToDraw, 16, m_whereToDraw, 5, m_whereToDraw + 2, 0, m_whereToDraw - 2, 0); + p.setPen(markerColor); + p.drawLine(m_whereToDraw, 0, m_whereToDraw, bottomline); + p.setRenderHints(QPainter::Antialiasing, true); + p.setPen(Qt::NoPen); + p.setBrush(markerColor); p.drawPolygon(cr); + p.setRenderHints(QPainter::Antialiasing, false); + } @@ -615,7 +679,7 @@ double firstMark = ceil(m_offset / m_iter) * m_iter - m_offset; while (firstMark < cc) { - p.drawLine(qRound(firstMark * sc), 13, qRound(firstMark * sc), 16); + p.drawLine(qRound(firstMark * sc), scaleS, qRound(firstMark * sc), bottomline); firstMark += m_iter; } firstMark = ceil(m_offset / m_iter2) * m_iter2 - m_offset; @@ -625,7 +689,6 @@ double xl, frac; while (firstMark < cc) { - p.drawLine(qRound(firstMark * sc), topline + 5, qRound(firstMark * sc), 16); switch (m_doc->unitIndex()) { case SC_MM: @@ -655,28 +718,41 @@ tx = QString::number(markC * m_iter2); break; } - drawNumber(tx, qRound(firstMark * sc) + 2, 9, p); - //p.drawText(qRound(firstMark * sc) + 2, 9, tx); + p.drawLine(qRound(firstMark * sc), scaleL, qRound(firstMark * sc), bottomline); + drawNumber(tx, qRound(firstMark * sc) + 2, p); firstMark += m_iter2; markC++; } + + if (m_doc->unitIndex() == SC_C || m_doc->unitIndex() == SC_P) + return; + + double tickStep = m_iter2 / 2.0; + firstMark = ceil(m_offset / tickStep) * tickStep - m_offset; + int markM = static_cast<int>(ceil(m_offset / tickStep)); + while (firstMark < cc) + { + p.drawLine(qRound(firstMark * sc), scaleM, qRound(firstMark * sc), bottomline); + firstMark += tickStep; + markM++; + } } void Hruler::drawTextMarks(double pos, double endPos, QPainter& p) const { double xl; - - p.setPen(QPen(Qt::blue, 1, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin)); - p.setBrush(Qt::blue); + QColor color = blendColor(isDarkColor(palette().color(QPalette::Base)), QColor(117, 182, 240), QColor(51, 132, 204)); + p.setPen(QPen(color, 1, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin)); + for (xl = pos; xl < endPos; xl += m_iter) { int xli = textPosToLocal(xl); - p.drawLine(xli, 10, xli, 16); + p.drawLine(xli, scaleS, xli, bottomline); } for (xl = pos; xl < endPos; xl += m_iter2) { int xli = textPosToLocal(xl); - p.drawLine(xli, topline, xli, 16); + p.drawLine(xli, scaleL, xli, bottomline); switch (m_doc->unitIndex()) { case SC_IN: @@ -697,11 +773,11 @@ p.save(); p.translate(xli - 2.0, 0); p.scale(-1, 1); - drawNumber(tx, 0, 17, p); + drawNumber(tx, 0, p); p.restore(); } else - drawNumber(tx, xli + 2, 9, p); + drawNumber(tx, xli + 2, p); break; } case SC_P: @@ -710,11 +786,11 @@ p.save(); p.translate(xli - 2.0, 0); p.scale(-1, 1); - drawNumber(QString::number((xl - pos) / m_iter / m_cor), 0, 17, p); + drawNumber(QString::number((xl - pos) / m_iter / m_cor), 0, p); p.restore(); } else - drawNumber(QString::number((xl - pos) / m_iter / m_cor), xli + 2, 9, p); + drawNumber(QString::number((xl - pos) / m_iter / m_cor), xli + 2, p); break; case SC_CM: if (m_reverse) @@ -722,11 +798,11 @@ p.save(); p.translate(xli - 2.0, 0); p.scale(-1, 1); - drawNumber(QString::number((xl - pos) / m_iter / 10 / m_cor), 0, 9, p); + drawNumber(QString::number((xl - pos) / m_iter / 10 / m_cor), 0, p); p.restore(); } else - drawNumber(QString::number((xl - pos) / m_iter / 10 / m_cor), xli + 2, 9, p); + drawNumber(QString::number((xl - pos) / m_iter / 10 / m_cor), xli + 2, p); break; case SC_C: if (m_reverse) @@ -734,11 +810,11 @@ p.save(); p.translate(xli - 2.0, 0); p.scale(-1, 1); - drawNumber(QString::number((xl - pos) / m_iter / m_cor), 0, 9, p); + drawNumber(QString::number((xl - pos) / m_iter / m_cor), 0, p); p.restore(); } else - drawNumber(QString::number((xl - pos) / m_iter / m_cor), xli + 2, 9, p); + drawNumber(QString::number((xl - pos) / m_iter / m_cor), xli + 2, p); break; default: if (m_reverse) @@ -746,19 +822,28 @@ p.save(); p.translate(xli - 2.0, 0); p.scale(-1, 1); - drawNumber(QString::number((xl - pos) / m_iter * 10 / m_cor), 0, 9, p); + drawNumber(QString::number((xl - pos) / m_iter * 10 / m_cor), 0, p); p.restore(); } else - drawNumber(QString::number((xl - pos) / m_iter * 10 / m_cor), xli + 2, 9, p); + drawNumber(QString::number((xl - pos) / m_iter * 10 / m_cor), xli + 2, p); break; } } + + if (m_doc->unitIndex() == SC_C || m_doc->unitIndex() == SC_P) + return; + + for (xl = pos; xl < endPos; xl += (m_iter2 / 2.0)) + { + int xli = textPosToLocal(xl); + p.drawLine(xli, scaleM, xli, bottomline); + } } -void Hruler::drawNumber(const QString& txt, int x, int y0, QPainter & p) const +void Hruler::drawNumber(const QString& txt, int x, QPainter & p) const { - const int y = y0 - 3 + topline; + const int y = textline; p.drawText(x,y,txt); } @@ -773,7 +858,7 @@ int currentCoor = where - m_view->contentsX(); m_whereToDraw = where; m_drawMark = true; - repaint(m_oldMark - 3, 0, 7, 17); + repaint(m_oldMark - 4, 0, 8, bottomline); // m_drawMark = false; m_oldMark = currentCoor; } @@ -980,3 +1065,49 @@ break; } } + +void Hruler::changeEvent(QEvent *e) +{ + if (e->type() == QEvent::LanguageChange) + { + languageChange(); + return; + } + QWidget::changeEvent(e); +} + +void Hruler::languageChange() +{ + IconManager &im = IconManager::instance(); + + QSignalBlocker sigMenu(m_contextMenu); + m_contextMenu->clear(); + m_contextMenu->addAction(im.loadIcon("tabulator-left"), tr("Left"))->setData(ParagraphStyle::LeftTab); + m_contextMenu->addAction(im.loadIcon("tabulator-center"), tr("Center"))->setData(ParagraphStyle::CenterTab); + m_contextMenu->addAction(im.loadIcon("tabulator-comma"), tr("Comma"))->setData(ParagraphStyle::CommaTab); + m_contextMenu->addAction(im.loadIcon("tabulator-dot"), tr("Dot"))->setData(ParagraphStyle::DotTab); + m_contextMenu->addAction(im.loadIcon("tabulator-right"), tr("Right"))->setData(ParagraphStyle::RightTab); +} + +void Hruler::contextMenuRequested(QPoint mouse) +{ + if (m_textEditMode && m_rulerCode == rc_tab) + { + m_mousePressed = false; + m_contextMenu->popup(this->mapToGlobal(mouse)); + } +} + +void Hruler::tabTypeChanged(QAction *action) +{ + m_tabValues[m_currTab].tabType = action->data().toInt(); + ParagraphStyle paraStyle; + paraStyle.setTabValues(m_tabValues); + + emit DocChanged(false); + + Selection tempSelection(this, false); + tempSelection.addItem(m_currItem); + m_doc->itemSelection_ApplyParagraphStyle(paraStyle, &tempSelection); + +} Index: scribus/ui/hruler.h =================================================================== --- scribus/ui/hruler.h (Revision 26450) +++ scribus/ui/hruler.h (Arbeitskopie) @@ -75,7 +75,12 @@ void shift(double pos); // using canvas coord void shiftRel(double dist); // using canvas coord double offset() const { return m_offset; } - + + static int rulerHeight(); + +protected: + void changeEvent(QEvent *e) override; + private: int findRulerHandle(QPoint mp, int grabRadius); @@ -83,6 +88,7 @@ void mousePressEvent(QMouseEvent *m) override; void mouseReleaseEvent(QMouseEvent *) override; void mouseMoveEvent(QMouseEvent *m) override; + void mouseDoubleClickEvent( QMouseEvent * m ) override; void enterEvent(QEnterEvent *m) override; void leaveEvent(QEvent *m) override; @@ -89,7 +95,7 @@ void drawMarks(QPainter& p) const; void drawTextMarks(double pos, double endPos, QPainter& p) const; void drawMarker(QPainter& p) const; - void drawNumber(const QString& num, int startx, int starty, QPainter & p) const; + void drawNumber(const QString& num, int startx, QPainter & p) const; void updateTabList(); PageItem* m_currItem {nullptr}; @@ -96,6 +102,7 @@ QList<ParagraphStyle::TabRecord> m_tabValues; ScribusDoc *m_doc {nullptr}; ScribusView *m_view {nullptr}; + QMenu *m_contextMenu {nullptr}; bool m_drawMark {false}; bool m_mousePressed {false}; bool m_reverse {false}; @@ -128,7 +135,12 @@ \param where where to draw */ void draw(int where); void unitChange(); + void languageChange(); +private slots: + void contextMenuRequested(QPoint mouse); + void tabTypeChanged(QAction *action); + signals: void DocChanged(bool); void MarkerMoved(double base, double xp); Index: scribus/ui/vruler.cpp =================================================================== --- scribus/ui/vruler.cpp (Revision 26450) +++ scribus/ui/vruler.cpp (Arbeitskopie) @@ -39,7 +39,18 @@ #include "scribusdoc.h" #include "scribusview.h" #include "units.h" +#include "util_gui.h" +#ifdef Q_OS_MACOS +constexpr int topline = 1; +#else +constexpr int topline = 3; +#endif +constexpr int bottomline = 24; +constexpr int scaleS = bottomline - 4; +constexpr int scaleM = bottomline - 8; +constexpr int scaleL = bottomline - 12; + Vruler::Vruler(ScribusView *pa, ScribusDoc *doc) : QWidget(pa), m_doc(doc), m_view(pa) @@ -97,12 +108,13 @@ p.setBrush(textColor); p.setPen(textColor); p.setFont(font()); - + p.fillRect(rect(), palette.color((QPalette::Base))); + double cc = height() / sc; double firstMark = ceil(m_offset / m_iter) * m_iter - m_offset; while (firstMark < cc) { - p.drawLine(13, qRound(firstMark * sc), 16, qRound(firstMark * sc)); + p.drawLine(scaleS, qRound(firstMark * sc), bottomline, qRound(firstMark * sc)); firstMark += m_iter; } firstMark = ceil(m_offset / m_iter2) * m_iter2 - m_offset; @@ -109,8 +121,8 @@ int markC = static_cast<int>(ceil(m_offset / m_iter2)); while (firstMark < cc) { - p.drawLine(8, qRound(firstMark * sc), 16, qRound(firstMark * sc)); int textY = qRound(firstMark * sc) + 10; + int scaleOffset = scaleL; switch (m_doc->unitIndex()) { case SC_MM: @@ -142,20 +154,41 @@ tx = QString::number(markC * m_iter2); break; } + p.drawLine(scaleOffset, qRound(firstMark * sc), bottomline, qRound(firstMark * sc)); drawNumber(tx, textY, &p); firstMark += m_iter2; markC++; } + + if (m_doc->unitIndex() != SC_C || m_doc->unitIndex() != SC_P) + { + double tickStep = m_iter2 / 2.0; + firstMark = ceil(m_offset / tickStep) * tickStep - m_offset; + int markM = static_cast<int>(ceil(m_offset / tickStep)); + while (firstMark < cc) + { + p.drawLine(scaleM, qRound(firstMark * sc), bottomline, qRound(firstMark * sc)); + firstMark += tickStep; + markM++; + } + } p.restore(); if (m_drawMark) { // draw slim marker + const QColor& markerColor = blendColor(isDarkColor(this->palette().color(QPalette::Base)), QColor(255, 117, 102), QColor(255, 71, 51)); QPolygon cr; + cr.setPoints(3, 5, m_whereToDraw, 0, m_whereToDraw + 2, 0, m_whereToDraw - 2); + + // p.resetTransform(); p.translate(0, -m_view->contentsY()); - p.setPen(Qt::red); - p.setBrush(Qt::red); - cr.setPoints(5, 5, m_whereToDraw, 16, m_whereToDraw, 5, m_whereToDraw, 0, m_whereToDraw + 2, 0, m_whereToDraw - 2); + p.setPen(markerColor); + p.drawLine(0, m_whereToDraw, bottomline, m_whereToDraw); + p.setRenderHints(QPainter::Antialiasing, true); + p.setPen(Qt::NoPen); + p.setBrush(markerColor); p.drawPolygon(cr); + p.setRenderHints(QPainter::Antialiasing, false); } p.end(); } @@ -163,10 +196,12 @@ void Vruler::drawNumber(const QString& num, int starty, QPainter *p) const { int textY = starty; + int fs = font().pointSize() + 2; + for (int i = 0; i < num.length(); ++i) { - p->drawText(1, textY, num.mid(i, 1)); - textY += 8; + p->drawText(scaleM - fs, textY, num.mid(i, 1)); + textY += fs; } } @@ -181,7 +216,7 @@ int currentCoor = where - m_view->contentsY(); m_whereToDraw = where; m_drawMark = true; - repaint(0, m_oldMark - 3, 17, 6); + repaint(0, m_oldMark - 4, bottomline, 8); // m_drawMark = false; m_oldMark = currentCoor; } @@ -201,17 +236,17 @@ if (sc < 0.3) { m_iter = unitRulerGetIter1FromIndex(docUnitIndex) * 3; - m_iter2 = unitRulerGetIter2FromIndex(docUnitIndex) * 3; + m_iter2 = unitRulerGetIter2FromIndex(docUnitIndex) * 3; } else if (sc < 0.2) { m_iter = unitRulerGetIter1FromIndex(docUnitIndex) * 2; - m_iter2 = unitRulerGetIter2FromIndex(docUnitIndex) * 2; + m_iter2 = unitRulerGetIter2FromIndex(docUnitIndex) * 2; } else { m_iter = unitRulerGetIter1FromIndex(docUnitIndex) / m_cor; - m_iter2 = unitRulerGetIter2FromIndex(docUnitIndex) / m_cor; + m_iter2 = unitRulerGetIter2FromIndex(docUnitIndex) / m_cor; } break; case SC_MM: @@ -218,7 +253,7 @@ if (sc > 1) m_cor = 10; m_iter = unitRulerGetIter1FromIndex(docUnitIndex) / m_cor; - m_iter2 = unitRulerGetIter2FromIndex(docUnitIndex) / m_cor; + m_iter2 = unitRulerGetIter2FromIndex(docUnitIndex) / m_cor; break; case SC_IN: m_iter = unitRulerGetIter1FromIndex(docUnitIndex); @@ -228,6 +263,7 @@ m_cor = 2; m_iter /= m_cor; m_iter2 /= m_cor; + m_iter3 /= m_cor; } if (sc > 4) { @@ -234,6 +270,7 @@ m_cor = 4; m_iter /= m_cor; m_iter2 /= m_cor; + m_iter3 /= m_cor; } if (sc < 0.25) { @@ -240,6 +277,7 @@ m_cor = 0.5; m_iter = 72.0*16.0; m_iter2 = 72.0*2.0; + m_iter3 = 72.0*8.0; } break; case SC_P: @@ -284,7 +322,7 @@ else { m_iter = unitRulerGetIter1FromIndex(docUnitIndex) / m_cor; - m_iter2 = unitRulerGetIter2FromIndex(docUnitIndex) / m_cor; + m_iter2 = unitRulerGetIter2FromIndex(docUnitIndex) / m_cor; } break; case SC_C: @@ -322,7 +360,7 @@ if (sc > 4) m_cor = 10; m_iter = unitRulerGetIter1FromIndex(0) / m_cor; - m_iter2 = unitRulerGetIter2FromIndex(0) / m_cor; + m_iter2 = unitRulerGetIter2FromIndex(0) / m_cor; break; } } Index: scribus/ui/vruler.h =================================================================== --- scribus/ui/vruler.h (Revision 26450) +++ scribus/ui/vruler.h (Arbeitskopie) @@ -30,6 +30,7 @@ class QMouseEvent; class QPaintEvent; +class PageItem; class PrefsManager; class RulerGesture; class ScribusDoc; @@ -73,6 +74,7 @@ double m_cor {0.0}; double m_iter {0.0}; double m_iter2 {0.0}; + double m_iter3 {0.0}; double m_offset {0.0}; int m_oldMark {0}; int m_whereToDraw {0}; |
Date Modified | Username | Field | Change |
---|---|---|---|
2024-11-24 17:15 | nitramr | New Issue | |
2024-11-24 17:15 | nitramr | Status | new => assigned |
2024-11-24 17:15 | nitramr | Assigned To | => nitramr |
2024-11-24 17:15 | nitramr | File Added: 1.6.2.png | |
2024-11-24 17:15 | nitramr | File Added: 1.7.0.png | |
2024-11-24 17:15 | nitramr | File Added: files.zip | |
2024-11-24 17:15 | nitramr | File Added: ruler_2024-11-24_01.patch | |
2024-11-24 17:16 | nitramr | Relationship added | related to 0012960 |
2024-11-24 17:16 | nitramr | Relationship added | related to 0016217 |
2024-11-24 17:16 | nitramr | Relationship added | related to 0010888 |
2024-11-24 17:17 | nitramr | Description Updated | |
2024-11-24 20:50 | cbradney | Status | assigned => resolved |
2024-11-24 20:50 | cbradney | Resolution | open => fixed |
2024-11-24 20:50 | cbradney | Fixed in Version | => 1.7.0.svn |