View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0013927 | Scribus | Usability | public | 2016-04-07 19:49 | 2026-09-24 04:01 |
| Reporter | jeff | Assigned To | nitramr | ||
| Priority | normal | Severity | feature | Reproducibility | always |
| Status | assigned | Resolution | open | ||
| Product Version | 1.5.2.svn | ||||
| Target Version | 1.7.0 | ||||
| Summary | 0013927: Make better use of available horizontal space for document pages in "Arrange Pages" (display master page names on the sides) | ||||
| Description | The current layout wastes a tremendous amount of space while simultaneously making it impossible to read the name of the master pages applied to the various pages (see attached screenshot). For the longest time I thought this felt broken, like some sort of alignment bug, but I see it's still present in 1.5.x so I'm reporting it and offering a UI suggestion for it. Since scribus only ever deals with single or dual-page documents, and there is always a certain amount of white space due to the width of the "Arrange pages" window/pane, we can leverage this space. My suggestion is to center the page icons, reduce their gutter (as you'll see in my mockup, they are actually closer together, horizontally speaking) and put the applied master pages' names on the side of each page (a compromise could be made between this and the current approach: the names labels could start "in" the pages icons and then extend outwards to the left or right, to have fit longer master pages names). Will attach a mockup to illustrate this. | ||||
| Additional Information | This is probably in line with the spirit of issue 0009948 and could actually replace it... | ||||
| Tags | #please_test, discussion, mockup | ||||
| Attached Files | |||||
| Patch | No | ||||
| related to | 0013297 | assigned | nitramr | [Feature] Color Code Master Pages like in Layers dialog (mockup included) |
| related to | 0009948 | closed | nitramr | Arrange pages dialog: no visual link between page and master page (1.4.03rc) |
| related to | 0010038 | new | allow horizontal flatpans on Canvas / Arrange Pages | |
| child of | 0003837 | acknowledged | Metabug: Master pages/Page templates |
|
|
Oh yeah, and for single-page layouts, instead of center-aligning the icons and having margins on both sides, the pages can be left-aligned as they are now, but with the master page name onto the right. |
|
|
If you want to go "all the way" with this, you could do something even more awesome: nuking the "Available master pages" section at the top, and in the remaining "Document pages" section at the bottom, have the master page names actually be interactive combobox/dropdown widgets that you can change directly, serving a dual purpose instead of just displaying the name. The "drag a master page to a document page" functionality gets replaced by the combobox. The only "problem" I foresee so far is that you might need to use a "tabs" layout (or a button, "Edit master pages") to separate "Document Pages" from "Master Pages" editing mode. |
|
|
Nice mockup. I like the idea of centering it so there is better use of the space. Keep in mind a few things: * devs are eyeing the developments going on over at indigoDock (https://github.com/nitramr/indigoDock) with the high probability of including it in 1.5.3 or 1.5.4 * Issues like those that have been proposed by PeterBenedek and implemented by Franz (0013297) to spruce up this MasterPages UI have been tried but they were reverted due to difference in aesthetics. So there may be less of an inclination to do any heavy coding for this current UI if it may change in one of the next minor versions. Nevertheless, mockups are always welcome. |
|
|
Why do we have all that wasted space in the Document Pages window? This mockup proposes something very clean with the ability for Scribus to actually implement Franz's 0013297 in a better way. There is room for the Master Page name, we can color code that. We could also add other information since, again, there is space to. |
|
|
Here is an attempt. A 2-patch series that applies cleanly on r27861. (arp = arrange pages) ## `arp1-stable-spread-geometry-v1.05.patch` - Makes `PageGrid` layout state authoritative through `setPageLayout()`. - Keeps `m_pageLayout` and `m_cellsInGroup` synchronized when page-group count changes. - Adds reusable row-content geometry helpers for spread width/start calculations. - Centers double-page rows from nominal spread geometry, including dummy slots on incomplete rows. - Leaves single-page and legacy multi-page positioning unchanged. - Provides the geometry API consumed by ARP2. ## `arp2-master-name-lanes-v1.06.patch` - Moves Small/Medium master-name painting out of page thumbnails into row-side label lanes. - Derives those lanes from ARP1’s spread geometry, so labels cannot influence page positioning. - Uses Qt font metrics, palette roles, clipping, style-derived spacing, and right elision. - Shares the same font/elision logic between painting and tooltip detection. - Restores in-thumbnail master-name rendering for Large preview, using a 75% font size. - Adds defensive handling for invalid/zero-width label rectangles. - Preserves page-number painting, selection geometry, DnD geometry, and legacy hidden multi-page rendering. arp1-stable-spread-geometry-v1.05.patch (5,183 bytes)
Index: scribus/ui/pagepalette_widgets.h
===================================================================
--- scribus/ui/pagepalette_widgets.h (revision 27861)
+++ scribus/ui/pagepalette_widgets.h (working copy)
@@ -206,7 +206,9 @@
int columnAt(QPoint pos);
int rowAt(QPoint pos);
+ int rowContentWidth(int rowId);
int rowWidth(int rowId);
+ int rowStartX(int rowId);
QRect rectAt(int row, int col);
QSize dummyPageSize();
Index: scribus/ui/pagepalette_widgets.cpp
===================================================================
--- scribus/ui/pagepalette_widgets.cpp (revision 27861)
+++ scribus/ui/pagepalette_widgets.cpp (working copy)
@@ -251,7 +251,21 @@
void PageGrid::setPageInGroup(int amount)
{
- m_cellsInGroup = amount;
+ switch (qBound(1, amount, 4))
+ {
+ case 2:
+ setPageLayout(PageLayout::doublePage);
+ break;
+ case 3:
+ setPageLayout(PageLayout::triplePage);
+ break;
+ case 4:
+ setPageLayout(PageLayout::quadroPage);
+ break;
+ default:
+ setPageLayout(PageLayout::singlePage);
+ break;
+ }
}
void PageGrid::setDocumentPageSize(QSizeF pageSize)
@@ -294,25 +308,29 @@
void PageGrid::setPageLayout(PageLayout layout)
{
- m_pageLayout = layout;
-
- switch(m_pageLayout)
+ int cellsInGroup = 1;
+ switch (layout)
{
- default:
- case PageLayout::singlePage:
- m_cellsInGroup = 1;
- break;
case PageLayout::doublePage:
- m_cellsInGroup = 2;
+ cellsInGroup = 2;
break;
case PageLayout::triplePage:
- m_cellsInGroup = 3;
+ cellsInGroup = 3;
break;
case PageLayout::quadroPage:
- m_cellsInGroup = 4;
+ cellsInGroup = 4;
+ break;
+ case PageLayout::singlePage:
+ default:
+ layout = PageLayout::singlePage;
break;
}
+ if (m_pageLayout == layout && m_cellsInGroup == cellsInGroup)
+ return;
+
+ m_pageLayout = layout;
+ m_cellsInGroup = cellsInGroup;
update();
}
@@ -415,7 +433,7 @@
int m_col = -1;
- QRect cellRect(m_groupSpace, m_rowSpace + row * (rowHeight() + m_rowSpace), dummyPageSize().width(), rowHeight());
+ QRect cellRect(rowStartX(row), m_rowSpace + row * (rowHeight() + m_rowSpace), dummyPageSize().width(), rowHeight());
int width = 0;
for (int i = 0; i <= m_cellsInGroup; ++i)
@@ -458,16 +476,16 @@
return (m_row < m_rows) ? m_row : m_rows -1;
}
-int PageGrid::rowWidth(int rowId)
+int PageGrid::rowContentWidth(int rowId)
{
- if(pageCount() == 0 || rowId < 0) return -1;
+ if (pageCount() == 0 || rowId < 0 || rowId >= rows())
+ return -1;
int width = 0;
-
+ // Keep dummy slots in the nominal width so incomplete facing rows stay centered as full spreads.
for (int i = 0; i < m_cellsInGroup; ++i)
{
- int id = pageId(rowId, i, false);
-
+ const int id = pageId(rowId, i, false);
if (pageInRange(id))
{
PageCell *pc = pageList.at(id);
@@ -476,21 +494,40 @@
else
width += dummyPageSize().width();
- width += m_cellGap;
+ if (i + 1 < m_cellsInGroup)
+ width += m_cellGap;
+ }
- };
+ return width;
+}
- width += m_groupSpace * 2;
+int PageGrid::rowWidth(int rowId)
+{
+ const int contentWidth = rowContentWidth(rowId);
+ if (contentWidth < 0)
+ return -1;
- return width;
+ // Preserve the historical trailing cell gap used by size calculations.
+ return contentWidth + m_groupSpace * 2 + m_cellGap;
+}
+
+int PageGrid::rowStartX(int rowId)
+{
+ if (m_pageLayout != PageLayout::doublePage)
+ return m_groupSpace;
+
+ const int contentWidth = rowContentWidth(rowId);
+ if (contentWidth <= 0)
+ return m_groupSpace;
+ return qMax(m_groupSpace, (width() - contentWidth) / 2);
}
QRect PageGrid::rectAt(int row, int col)
{
if ( row == -1 || col == -1) return QRect();
- QRect cellRect(m_groupSpace, m_rowSpace + row * (rowHeight() + m_rowSpace), dummyPageSize().width(), rowHeight());
+ QRect cellRect(rowStartX(row), m_rowSpace + row * (rowHeight() + m_rowSpace), dummyPageSize().width(), rowHeight());
int width = 0;
for (int i = 0; i <= m_cellsInGroup; ++i)
@@ -799,7 +836,6 @@
void PageGrid::paintEvent(QPaintEvent *event)
{
- int x = m_groupSpace;
int y = m_rowSpace;
int offset = 0;
QRect selectedPageRect;
@@ -815,7 +851,9 @@
// Draw pages
for (int r = 0; r < rows(); r++)
{
- int groupStart = m_groupSpace;
+ const int rowStart = rowStartX(r);
+ int x = rowStart;
+ int groupStart = rowStart;
int groupWidth = 0;
bool drawGroupRect = false;
@@ -851,7 +889,7 @@
offset = m_cellGap;
if(isLastRow(r + 1))
- groupStart = m_rtlBinding ? x : m_groupSpace;
+ groupStart = m_rtlBinding ? x : rowStart;
int w = cell->pageWidthByHeight(pageHeight()) + offset;
x += w;
@@ -868,7 +906,7 @@
// adjust start on first row if first page has an offset
if(isFirstRow(r))
- groupStart = m_rtlBinding ? m_groupSpace : x;
+ groupStart = m_rtlBinding ? rowStart : x;
}
}
@@ -877,7 +915,6 @@
painter.drawRect( QRect(groupStart, y, groupWidth, pageHeight()) );
y += m_rowHeight + m_rowSpace;
- x = m_groupSpace;
}
// Draw selected page
arp2-master-name-lanes-v1.06.patch (11,168 bytes)
Index: scribus/ui/pagepalette_widgets.h
===================================================================
--- scribus/ui/pagepalette_widgets.h (after ARP1 v1.05)
+++ scribus/ui/pagepalette_widgets.h (working copy)
@@ -14,6 +14,7 @@
#include <QDragLeaveEvent>
#include <QDragMoveEvent>
#include <QDropEvent>
+#include <QFont>
#include <QHBoxLayout>
#include <QImage>
#include <QKeyEvent>
@@ -209,7 +210,12 @@
int rowContentWidth(int rowId);
int rowWidth(int rowId);
int rowStartX(int rowId);
+ QRect rowSpreadRect(int row);
QRect rectAt(int row, int col);
+ QRect masterLabelRect(int row, int col);
+ bool usesExternalMasterLabels() const;
+ QFont masterNameFont(bool inThumbnail) const;
+ QString elidedMasterName(const QString& name, int width) const;
QSize dummyPageSize();
@@ -230,6 +236,7 @@
protected:
+ bool event(QEvent *event) override;
void paintEvent(QPaintEvent *event) override;
void resizeEvent(QResizeEvent *event) override;
Index: scribus/ui/pagepalette_widgets.cpp
===================================================================
--- scribus/ui/pagepalette_widgets.cpp (after ARP1 v1.05)
+++ scribus/ui/pagepalette_widgets.cpp (working copy)
@@ -11,7 +11,9 @@
#include <QDrag>
#include <QElapsedTimer>
#include <QEvent>
+#include <QFontMetrics>
#include <QHeaderView>
+#include <QHelpEvent>
#include <QLabel>
#include <QList>
#include <QMenu>
@@ -19,6 +21,7 @@
#include <QMessageBox>
#include <QPainter>
#include <QScrollArea>
+#include <QStyle>
#include <QStringView>
#include "iconmanager.h"
@@ -555,6 +558,88 @@
}
+QRect PageGrid::rowSpreadRect(int row)
+{
+ if (m_pageLayout != PageLayout::doublePage || row < 0 || row >= rows())
+ return QRect();
+
+ const int contentWidth = rowContentWidth(row);
+ if (contentWidth <= 0)
+ return QRect();
+
+ return QRect(rowStartX(row),
+ m_rowSpace + row * (rowHeight() + m_rowSpace),
+ contentWidth, pageHeight());
+}
+
+QRect PageGrid::masterLabelRect(int row, int col)
+{
+ if (!usesExternalMasterLabels() || row < 0 || row >= rows() || col < 0 || col >= columns())
+ return QRect();
+
+ const int styleGap = style()->pixelMetric(QStyle::PM_LayoutHorizontalSpacing, nullptr, this);
+ const int masterLabelGap = styleGap >= 0 ? styleGap : m_labelGap;
+ int left = 0;
+ int right = 0;
+ int top = m_rowSpace + row * (rowHeight() + m_rowSpace);
+
+ if (m_pageLayout == PageLayout::singlePage)
+ {
+ QRect pageRect = rectAt(row, col);
+ if (pageRect.isEmpty())
+ return QRect();
+
+ left = pageRect.right() + 1 + masterLabelGap;
+ right = width() - m_groupSpace - 1;
+ top = pageRect.top();
+ }
+ else
+ {
+ const QRect spreadRect = rowSpreadRect(row);
+ if (spreadRect.isEmpty())
+ return QRect();
+
+ top = spreadRect.top();
+ if (col == 0)
+ {
+ left = m_groupSpace;
+ right = spreadRect.left() - masterLabelGap - 1;
+ }
+ else
+ {
+ left = spreadRect.right() + 1 + masterLabelGap;
+ right = width() - m_groupSpace - 1;
+ }
+ }
+
+ const int availableWidth = right - left + 1;
+ if (availableWidth <= 0)
+ return QRect();
+
+ return QRect(left, top, availableWidth, pageHeight());
+}
+
+bool PageGrid::usesExternalMasterLabels() const
+{
+ return m_rowHeight != TileSize::Large
+ && (m_pageLayout == PageLayout::singlePage || m_pageLayout == PageLayout::doublePage);
+}
+
+QFont PageGrid::masterNameFont(bool inThumbnail) const
+{
+ QFont masterFont(font());
+ masterFont.setPointSizeF(inThumbnail ? m_fontSize * 0.75 : m_fontSize);
+ return masterFont;
+}
+
+QString PageGrid::elidedMasterName(const QString& name, int width) const
+{
+ if (width <= 0)
+ return QString();
+
+ return QFontMetrics(masterNameFont(false)).elidedText(name, Qt::ElideRight, width);
+}
+
QSize PageGrid::dummyPageSize()
{
double ratio = m_documentPageSize.width() / m_documentPageSize.height();
@@ -726,22 +811,11 @@
if (tile == nullptr)
return;
- QFont font(this->font().family(), m_fontSize, QFont::Normal);
- QFont fontName(this->font().family(), m_fontSize * 0.8, QFont::Normal);
+ QFont font(this->font());
+ font.setPointSize(m_fontSize);
QRect rectPage(cellPosition.x(), cellPosition.y(), tile->pageWidthByHeight(pageHeight()), pageHeight());
QRect rectCell(cellPosition.x(), cellPosition.y(), tile->pageWidthByHeight(pageHeight()), m_rowHeight);
- QString pageName = tile->pageName;
- int pageNameHyphen = tile->pageName.indexOf("-");
- // Fail fast if no hyphen or nothing to the left of it
- if (pageNameHyphen > 0)
- {
- // Trim whitespace and ensure at least 1-4 chars or ignore it
- QString tmp = tile->pageName.left(pageNameHyphen).trimmed();
- if (tmp.length() > 0 && tmp.length() < 5)
- pageName = tmp;
- }
-
painter.save();
// Draw Page
@@ -756,32 +830,46 @@
painter.setFont(font);
// Draw Page Number
- painter.setPen(QPen( labelColor ));
- painter.drawText(rectCell, Qt::AlignHCenter|Qt::AlignBottom | Qt::TextWordWrap, tile->pageNumberDisplay);
+ painter.setPen(QPen(labelColor));
+ painter.drawText(rectCell, Qt::AlignHCenter | Qt::AlignBottom | Qt::TextWordWrap, tile->pageNumberDisplay);
- // Draw Page Name
- painter.setFont((pageNameHyphen > 0) ? font : fontName);
- if (m_rowHeight == TileSize::Small)
- {
- painter.setPen(Qt::black);
- painter.drawText(rectPage.adjusted(1, 1, 0, 0), Qt::AlignVCenter | Qt::AlignCenter |Qt::TextWordWrap, pageName);
- }
- else
- {
- painter.setBackgroundMode(Qt::OpaqueMode);
- painter.setBackground(QColor(102, 102, 102));
- painter.setPen(Qt::white);
- painter.drawText(rectPage.adjusted(1, 1, 0, 0), Qt::AlignTop | ((isRight) ? Qt::AlignRight : Qt::AlignLeft) |Qt::TextWordWrap, pageName);
- }
+ const bool supportedPageLayout = m_pageLayout == PageLayout::singlePage || m_pageLayout == PageLayout::doublePage;
+ const bool drawMasterNameInPage = m_rowHeight == TileSize::Large || !supportedPageLayout;
+ if (drawMasterNameInPage)
+ {
+ QString pageName = tile->pageName;
+ int pageNameHyphen = tile->pageName.indexOf("-");
+ if (pageNameHyphen > 0)
+ {
+ QString tmp = tile->pageName.left(pageNameHyphen).trimmed();
+ if (tmp.length() > 0 && tmp.length() < 5)
+ pageName = tmp;
+ }
+ // Small/Medium single- and facing-page previews use external labels.
+ // Large previews reuse Scribus' established in-thumbnail treatment.
+ if (supportedPageLayout)
+ painter.setFont(masterNameFont(true));
+ else
+ {
+ QFont fontName(font);
+ fontName.setPointSizeF(m_fontSize * 0.8);
+ painter.setFont((pageNameHyphen > 0) ? font : fontName);
+ }
- // Draw selection
- // if(selected)
- // {
- // painter.setBrush(Qt::NoBrush);
- // painter.setPen( QPen(m_colorSelection, 2) );
- // painter.drawRect(rectPage);
- // }
+ if (m_rowHeight == TileSize::Small)
+ {
+ painter.setPen(Qt::black);
+ painter.drawText(rectPage.adjusted(1, 1, 0, 0), Qt::AlignVCenter | Qt::AlignCenter | Qt::TextWordWrap, pageName);
+ }
+ else
+ {
+ painter.setBackgroundMode(Qt::OpaqueMode);
+ painter.setBackground(QColor(102, 102, 102));
+ painter.setPen(Qt::white);
+ painter.drawText(rectPage.adjusted(1, 1, 0, 0), Qt::AlignTop | ((isRight) ? Qt::AlignRight : Qt::AlignLeft) | Qt::TextWordWrap, pageName);
+ }
+ }
// Draw hover
if (hovered)
@@ -790,7 +878,7 @@
colHover.setAlphaF(0.5);
painter.setBackgroundMode(Qt::TransparentMode);
painter.setBrush(colHover);
- painter.setPen( Qt::NoPen );
+ painter.setPen(Qt::NoPen);
painter.drawRect(rectPage);
}
@@ -834,17 +922,72 @@
*
* ********************************************************************************* */
+bool PageGrid::event(QEvent *event)
+{
+ if (event->type() == QEvent::ToolTip && pageCount() > 0
+ && (m_pageLayout == PageLayout::singlePage || m_pageLayout == PageLayout::doublePage))
+ {
+ QHelpEvent *helpEvent = static_cast<QHelpEvent *>(event);
+ const QPoint pos = helpEvent->pos();
+ const int row = rowAt(pos);
+
+ if (row >= 0)
+ {
+ for (int col = 0; col < columns(); ++col)
+ {
+ const int id = pageId(row, col, false);
+ if (!pageInRange(id))
+ continue;
+
+ PageCell *cell = getPageItem(id);
+ if (cell == nullptr)
+ continue;
+
+ QRect pageRect = rectAt(row, col);
+ pageRect.setHeight(pageHeight());
+ if (pageRect.contains(pos))
+ {
+ QToolTip::showText(helpEvent->globalPos(),
+ tr("Page %1\nMaster page: %2").arg(cell->pageNumberDisplay, cell->pageName),
+ this, pageRect);
+ return true;
+ }
+
+ const QRect labelRect = masterLabelRect(row, col);
+ if (!labelRect.isEmpty() && labelRect.contains(pos))
+ {
+ const QString elidedName = elidedMasterName(cell->pageName, labelRect.width());
+ if (!elidedName.isEmpty() && elidedName != cell->pageName)
+ {
+ QToolTip::showText(helpEvent->globalPos(), tr("Master page: %1").arg(cell->pageName), this, labelRect);
+ return true;
+ }
+ }
+ }
+ }
+
+ QToolTip::hideText();
+ event->ignore();
+ return true;
+ }
+
+ return QWidget::event(event);
+}
+
void PageGrid::paintEvent(QPaintEvent *event)
{
int y = m_rowSpace;
int offset = 0;
QRect selectedPageRect;
- QColor foregroundColor( PrefsManager::instance().appPrefs.displayPrefs.scratchColor.lightness() <= 128 ? Qt::white : Qt::black);
+ const QColor scratchColor = PrefsManager::instance().appPrefs.displayPrefs.scratchColor;
+ const QColor foregroundColor = scratchColor.lightness() <= 128
+ ? palette().color(QPalette::BrightText)
+ : palette().color(QPalette::WindowText);
QPainter painter(this);
// Draw background
- painter.fillRect(rect(), PrefsManager::instance().appPrefs.displayPrefs.scratchColor);
+ painter.fillRect(rect(), scratchColor);
if (pageCount() == 0) return;
@@ -910,6 +1053,41 @@
}
}
+ if (usesExternalMasterLabels())
+ {
+ painter.save();
+ painter.setFont(masterNameFont(false));
+ painter.setPen(QPen(foregroundColor));
+ painter.setRenderHint(QPainter::TextAntialiasing, true);
+
+ for (int c = 0; c < columns(); ++c)
+ {
+ const int id = pageId(r, c, false);
+ if (!pageInRange(id))
+ continue;
+
+ PageCell *cell = getPageItem(id);
+ const QRect labelRect = masterLabelRect(r, c);
+ if (cell == nullptr || labelRect.isEmpty())
+ continue;
+
+ const QString label = elidedMasterName(cell->pageName, labelRect.width());
+ if (label.isEmpty())
+ continue;
+
+ Qt::Alignment alignment = Qt::AlignVCenter | Qt::AlignLeft;
+ if (m_pageLayout == PageLayout::doublePage && c == 0)
+ alignment = Qt::AlignVCenter | Qt::AlignRight;
+
+ painter.save();
+ painter.setClipRect(labelRect);
+ painter.drawText(labelRect, alignment | Qt::TextSingleLine, label);
+ painter.restore();
+ }
+
+ painter.restore();
+ }
+
// Draw group border
if (drawGroupRect)
painter.drawRect( QRect(groupStart, y, groupWidth, pageHeight()) );
|
| Date Modified | Username | Field | Change |
|---|---|---|---|
| 2016-04-07 19:49 | jeff | New Issue | |
| 2016-04-07 19:49 | jeff | File Added: Scribus Arrange Pages annotated.png | |
| 2016-04-07 19:50 | jeff | File Added: Scribus Arrange Pages - mockup.png | |
| 2016-04-07 19:54 | jeff | Note Added: 0039887 | |
| 2016-04-07 19:57 | jeff | Note Added: 0039888 | |
| 2016-04-07 20:07 | jeff | Note Edited: 0039888 | |
| 2016-04-07 20:14 | Kunda | Note Added: 0039889 | |
| 2016-04-07 20:17 | Kunda | Note Edited: 0039889 | |
| 2016-04-07 20:34 | Kunda | Relationship added | related to 0013297 |
| 2016-04-07 20:35 | Kunda | Relationship added | child of 0003837 |
| 2016-04-07 20:35 | Kunda | Tag Attached: mockup | |
| 2016-04-07 20:36 | Kunda | Relationship added | related to 0009948 |
| 2016-04-28 13:24 | Kunda | Note Added: 0040573 | |
| 2016-04-28 13:24 | Kunda | Tag Attached: discussion | |
| 2016-05-09 16:29 | Kunda | Relationship added | related to 0010038 |
| 2023-05-27 16:11 | cbradney | Assigned To | => nitramr |
| 2023-05-27 16:11 | cbradney | Status | new => assigned |
| 2023-05-27 16:21 | cbradney | Target Version | => 1.7.0 |
| 2026-09-24 04:01 | buttar | Note Added: 0054494 | |
| 2026-09-24 04:01 | buttar | File Added: arp1-stable-spread-geometry-v1.05.patch | |
| 2026-09-24 04:01 | buttar | File Added: arp2-master-name-lanes-v1.06.patch | |
| 2026-09-24 04:01 | buttar | File Added: large-preview-PROPOSED.png | |
| 2026-09-24 04:01 | buttar | File Added: medium-preview-PROPOSED.png | |
| 2026-09-24 04:01 | buttar | File Added: small-preview-PROPOSED.png | |
| 2026-09-24 04:01 | buttar | Tag Attached: #please_test |