removed dependency in IndicatorsWindow from DropIndicators
This commit is contained in:
parent
f6f15611b1
commit
6a7fdbab6b
4 changed files with 168 additions and 159 deletions
|
@ -93,14 +93,25 @@ DropIndicators::~DropIndicators()
|
|||
|
||||
KDDockWidgets::DropIndicatorOverlayInterface::DropLocation DropIndicators::hover_impl(QPoint globalPos)
|
||||
{
|
||||
showDropAreaIfNeed(globalPos);
|
||||
DropLocation dropLocation = DropLocation_None;
|
||||
QRect dropRect = QRect();
|
||||
|
||||
return m_indicatorsWindow->hover(globalPos);
|
||||
if (isToolBar()) {
|
||||
dropLocation = dropLocationForToolBar(globalPos);
|
||||
dropRect = dropAreaRectForToolBar(dropLocation);
|
||||
} else {
|
||||
dropLocation = m_indicatorsWindow->dropLocationForPosition(globalPos);
|
||||
dropRect = dropAreaRectForPanel(dropLocation);
|
||||
}
|
||||
|
||||
showDropAreaIfNeed(dropRect, dropLocation);
|
||||
|
||||
return dropLocation;
|
||||
}
|
||||
|
||||
QPoint DropIndicators::posForIndicator(DropLocation loc) const
|
||||
{
|
||||
return m_indicatorsWindow->posForIndicator(loc);
|
||||
return m_indicatorsWindow->positionForIndicator(loc);
|
||||
}
|
||||
|
||||
bool DropIndicators::outterLeftIndicatorVisible() const
|
||||
|
@ -157,6 +168,29 @@ bool DropIndicators::isIndicatorVisible(DropLocation location) const
|
|||
return isDropAllowed(location);
|
||||
}
|
||||
|
||||
bool DropIndicators::onResize(QSize)
|
||||
{
|
||||
m_indicatorsWindow->resize(window()->size());
|
||||
return false;
|
||||
}
|
||||
|
||||
void DropIndicators::updateVisibility()
|
||||
{
|
||||
if (isHovered()) {
|
||||
m_indicatorsWindow->setVisible(true);
|
||||
updateWindowPosition();
|
||||
m_indicatorsWindow->raise();
|
||||
} else {
|
||||
m_rubberBand->setVisible(false);
|
||||
m_indicatorsWindow->setVisible(false);
|
||||
mainWindow()->setDockingHelperVisible(false);
|
||||
}
|
||||
|
||||
m_draggedDockProperties = readPropertiesFromObject(draggedDock());
|
||||
|
||||
emit indicatorsVisibilityChanged();
|
||||
}
|
||||
|
||||
bool DropIndicators::isDropAllowed(DropLocation location) const
|
||||
{
|
||||
if (location == DropLocation_None) {
|
||||
|
@ -194,6 +228,11 @@ bool DropIndicators::isDropAllowed(DropLocation location) const
|
|||
return false;
|
||||
}
|
||||
|
||||
bool DropIndicators::isToolBar() const
|
||||
{
|
||||
return m_draggedDockProperties.type == DockType::ToolBar;
|
||||
}
|
||||
|
||||
const KDDockWidgets::DockWidgetBase* DropIndicators::draggedDock() const
|
||||
{
|
||||
auto windowBeingDragged = KDDockWidgets::DragController::instance()->windowBeingDragged();
|
||||
|
@ -219,60 +258,11 @@ const KDDockWidgets::DockWidgetBase* DropIndicators::hoveredDock() const
|
|||
return docks.first();
|
||||
}
|
||||
|
||||
bool DropIndicators::isToolBar() const
|
||||
DropIndicators::DropLocation DropIndicators::dropLocationForToolBar(const QPoint& hoveredGlobalPos) const
|
||||
{
|
||||
return m_draggedDockProperties.type == DockType::ToolBar;
|
||||
}
|
||||
|
||||
const KDDockWidgets::DockWidgetBase* DropIndicators::draggedDock() const
|
||||
{
|
||||
auto windowBeingDragged = KDDockWidgets::DragController::instance()->windowBeingDragged();
|
||||
if (!windowBeingDragged || windowBeingDragged->dockWidgets().isEmpty()) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return windowBeingDragged->dockWidgets().first();
|
||||
}
|
||||
|
||||
bool DropIndicators::onResize(QSize)
|
||||
{
|
||||
m_indicatorsWindow->resize(window()->size());
|
||||
return false;
|
||||
}
|
||||
|
||||
void DropIndicators::updateVisibility()
|
||||
{
|
||||
if (isHovered() && m_hoveredFrame) {
|
||||
m_indicatorsWindow->setVisible(true);
|
||||
updateWindowPosition();
|
||||
m_indicatorsWindow->raise();
|
||||
} else {
|
||||
m_rubberBand->setVisible(false);
|
||||
m_indicatorsWindow->setVisible(false);
|
||||
mainWindow()->setDockingHelperVisible(false);
|
||||
}
|
||||
|
||||
m_draggedDockProperties = readPropertiesFromObject(draggedDock());
|
||||
|
||||
emit indicatorsVisibilityChanged();
|
||||
}
|
||||
|
||||
void DropIndicators::showDropAreaIfNeed(const QPoint& hoveredGlobalPos)
|
||||
{
|
||||
if (!isToolBar()) {
|
||||
return;
|
||||
}
|
||||
|
||||
const KDDockWidgets::DockWidgetBase* draggedDock = this->draggedDock();
|
||||
const KDDockWidgets::DockWidgetBase* hoveredDock = this->hoveredDock();
|
||||
|
||||
if (!draggedDock || !hoveredDock) {
|
||||
return;
|
||||
}
|
||||
|
||||
DockType hoveredDockType = readPropertiesFromObject(hoveredDock).type;
|
||||
DockType hoveredDockType = readPropertiesFromObject(hoveredDock()).type;
|
||||
if (hoveredDockType != DockType::ToolBar) {
|
||||
return;
|
||||
return DropLocation_None;
|
||||
}
|
||||
|
||||
QRect dropAreaRect = hoveredFrameRect();
|
||||
|
@ -280,41 +270,48 @@ void DropIndicators::showDropAreaIfNeed(const QPoint& hoveredGlobalPos)
|
|||
int distanceToLeftCorner = std::abs(dropAreaRect.x() - hoveredGlobalPos.x());
|
||||
int distanceToRightCorner = std::abs(dropAreaRect.x() + dropAreaRect.width() - hoveredGlobalPos.x());
|
||||
|
||||
DropLocation dropLocation = DropLocation_Left;
|
||||
|
||||
if (distanceToRightCorner < distanceToLeftCorner) {
|
||||
return DropLocation_Right;
|
||||
}
|
||||
|
||||
return DropLocation_Left;
|
||||
}
|
||||
|
||||
QRect DropIndicators::dropAreaRectForToolBar(DropLocation location) const
|
||||
{
|
||||
const KDDockWidgets::DockWidgetBase* draggedDock = this->draggedDock();
|
||||
const KDDockWidgets::DockWidgetBase* hoveredDock = this->hoveredDock();
|
||||
|
||||
if (!draggedDock || !hoveredDock) {
|
||||
return QRect();
|
||||
}
|
||||
|
||||
DockType hoveredDockType = readPropertiesFromObject(hoveredDock).type;
|
||||
if (hoveredDockType != DockType::ToolBar) {
|
||||
return QRect();
|
||||
}
|
||||
|
||||
QRect dropAreaRect = hoveredFrameRect();
|
||||
|
||||
if (location == DropLocation_Right) {
|
||||
dropAreaRect.setX(dropAreaRect.x() + dropAreaRect.width() - draggedDock->width());
|
||||
dropLocation = DropLocation_Right;
|
||||
}
|
||||
|
||||
if (draggedDock->width() <= hoveredDock->width() / 2) {
|
||||
dropAreaRect.setWidth(draggedDock->width());
|
||||
}
|
||||
|
||||
mainWindow()->setDockingHelperVisible(true);
|
||||
|
||||
m_rubberBand->setGeometry(dropAreaRect);
|
||||
m_rubberBand->setVisible(true);
|
||||
|
||||
setCurrentDropLocation(dropLocation);
|
||||
return dropAreaRect;
|
||||
}
|
||||
|
||||
void DropIndicators::setDropLocation(DropLocation location)
|
||||
QRect DropIndicators::dropAreaRectForPanel(DropLocation location) const
|
||||
{
|
||||
if (!isDropAllowed(location)) {
|
||||
return;
|
||||
}
|
||||
|
||||
setCurrentDropLocation(location);
|
||||
|
||||
if (location == DropLocation_Center) {
|
||||
m_rubberBand->setGeometry(m_hoveredFrame ? m_hoveredFrame->QWidgetAdapter::geometry() : rect());
|
||||
m_rubberBand->setVisible(true);
|
||||
return;
|
||||
return m_hoveredFrame ? m_hoveredFrame->QWidgetAdapter::geometry() : rect();
|
||||
}
|
||||
|
||||
KDDockWidgets::Location multisplitterLocation = locationToMultisplitterLocation(location);
|
||||
KDDockWidgets::Frame* relativeToFrame = nullptr;
|
||||
const KDDockWidgets::Frame* relativeToFrame = nullptr;
|
||||
|
||||
switch (location) {
|
||||
case DropLocation_Left:
|
||||
|
@ -322,7 +319,7 @@ void DropIndicators::setDropLocation(DropLocation location)
|
|||
case DropLocation_Right:
|
||||
case DropLocation_Bottom:
|
||||
if (!m_hoveredFrame) {
|
||||
return;
|
||||
return QRect();
|
||||
}
|
||||
relativeToFrame = m_hoveredFrame;
|
||||
break;
|
||||
|
@ -336,10 +333,6 @@ void DropIndicators::setDropLocation(DropLocation location)
|
|||
}
|
||||
|
||||
auto windowBeingDragged = KDDockWidgets::DragController::instance()->windowBeingDragged();
|
||||
|
||||
QRect rect = m_dropArea->rectForDrop(windowBeingDragged, multisplitterLocation,
|
||||
m_dropArea->itemForFrame(relativeToFrame));
|
||||
|
||||
auto draggedDock = this->draggedDock();
|
||||
|
||||
if (m_hoveredFrame && isToolBar() && draggedDock) {
|
||||
|
@ -352,6 +345,26 @@ void DropIndicators::setDropLocation(DropLocation location)
|
|||
}
|
||||
}
|
||||
|
||||
return m_dropArea->rectForDrop(windowBeingDragged, multisplitterLocation,
|
||||
m_dropArea->itemForFrame(relativeToFrame));
|
||||
}
|
||||
|
||||
void DropIndicators::showDropAreaIfNeed(const QRect& rect, DropLocation location)
|
||||
{
|
||||
if (rect.isNull()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!isDropAllowed(location)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (isToolBar()) {
|
||||
mainWindow()->setDockingHelperVisible(true);
|
||||
}
|
||||
|
||||
setCurrentDropLocation(location);
|
||||
|
||||
m_rubberBand->setGeometry(rect);
|
||||
m_rubberBand->setVisible(true);
|
||||
}
|
||||
|
|
|
@ -75,11 +75,11 @@ signals:
|
|||
void indicatorsVisibilityChanged();
|
||||
|
||||
private:
|
||||
friend class IndicatorsWindow;
|
||||
bool onResize(QSize newSize) override;
|
||||
void updateVisibility() override;
|
||||
|
||||
bool isIndicatorVisible(DropLocation location) const;
|
||||
bool isDropAllowed(DropLocation location) const;
|
||||
|
||||
bool isToolBar() const;
|
||||
|
||||
bool hoveringOverDock(DockType type) const;
|
||||
|
@ -87,14 +87,14 @@ private:
|
|||
const KDDockWidgets::DockWidgetBase* hoveredDock() const;
|
||||
const KDDockWidgets::DockWidgetBase* draggedDock() const;
|
||||
|
||||
void setDropLocation(DropLocation);
|
||||
DropLocation dropLocationForToolBar(const QPoint& hoveredGlobalPos) const;
|
||||
QRect dropAreaRectForToolBar(DropLocation location) const;
|
||||
QRect dropAreaRectForPanel(DropLocation location) const;
|
||||
|
||||
void showDropAreaIfNeed(const QRect& rect, DropLocation location);
|
||||
|
||||
void updateWindowPosition();
|
||||
|
||||
bool onResize(QSize newSize) override;
|
||||
void updateVisibility() override;
|
||||
|
||||
void showDropAreaIfNeed(const QPoint& hoveredGlobalPos);
|
||||
|
||||
KDDockWidgets::QWidgetOrQuick* m_rubberBand = nullptr;
|
||||
IndicatorsWindow* m_indicatorsWindow = nullptr;
|
||||
DockProperties m_draggedDockProperties;
|
||||
|
|
|
@ -30,7 +30,9 @@
|
|||
|
||||
using namespace mu::dock;
|
||||
|
||||
IndicatorsWindow::IndicatorsWindow(DropIndicators* dropIndicators)
|
||||
static constexpr int INDICATORS_COUNT = 9;
|
||||
|
||||
IndicatorsWindow::IndicatorsWindow(QQuickItem* dropIndicators)
|
||||
: QQuickView(),
|
||||
m_dropIndicators(dropIndicators)
|
||||
{
|
||||
|
@ -52,71 +54,43 @@ IndicatorsWindow::IndicatorsWindow(DropIndicators* dropIndicators)
|
|||
}
|
||||
}
|
||||
|
||||
KDDockWidgets::DropIndicatorOverlayInterface::DropLocation IndicatorsWindow::hover(QPoint pos)
|
||||
QQuickItem* IndicatorsWindow::dropIndicators() const
|
||||
{
|
||||
QQuickItem* item = indicatorForPos(pos);
|
||||
auto location = item ? locationForIndicator(item) : KDDockWidgets::DropIndicatorOverlayInterface::DropLocation_None;
|
||||
dropIndicators()->setDropLocation(location);
|
||||
return location;
|
||||
return m_dropIndicators;
|
||||
}
|
||||
|
||||
QQuickItem* IndicatorsWindow::indicatorForPos(QPoint pos) const
|
||||
QString IndicatorsWindow::iconName(int dropLocation, bool active) const
|
||||
{
|
||||
const QVector<QQuickItem*> indicators = indicatorItems();
|
||||
Q_ASSERT(indicators.size() == 9);
|
||||
|
||||
for (QQuickItem* item : indicators) {
|
||||
if (item->isVisible()) {
|
||||
QRect rect(0, 0, int(item->width()), int(item->height()));
|
||||
rect.moveTopLeft(item->mapToGlobal(QPointF(0, 0)).toPoint());
|
||||
if (rect.contains(pos)) {
|
||||
return item;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
QPoint IndicatorsWindow::posForIndicator(KDDockWidgets::DropIndicatorOverlayInterface::DropLocation loc) const
|
||||
{
|
||||
QQuickItem* indicator = IndicatorsWindow::indicatorForLocation(loc);
|
||||
return indicator->mapToGlobal(indicator->boundingRect().center()).toPoint();
|
||||
}
|
||||
|
||||
QString IndicatorsWindow::iconName(int loc, bool active) const
|
||||
{
|
||||
QString suffix = active ? QStringLiteral("_active")
|
||||
: QString();
|
||||
|
||||
QString suffix = active ? "_active" : QString();
|
||||
QString name;
|
||||
switch (loc) {
|
||||
|
||||
switch (dropLocation) {
|
||||
case KDDockWidgets::DropIndicatorOverlayInterface::DropLocation_Center:
|
||||
name = QStringLiteral("center");
|
||||
name = "center";
|
||||
break;
|
||||
case KDDockWidgets::DropIndicatorOverlayInterface::DropLocation_Left:
|
||||
name = QStringLiteral("inner_left");
|
||||
name = "inner_left";
|
||||
break;
|
||||
case KDDockWidgets::DropIndicatorOverlayInterface::DropLocation_Right:
|
||||
name = QStringLiteral("inner_right");
|
||||
name = "inner_right";
|
||||
break;
|
||||
case KDDockWidgets::DropIndicatorOverlayInterface::DropLocation_Bottom:
|
||||
name = QStringLiteral("inner_bottom");
|
||||
name = "inner_bottom";
|
||||
break;
|
||||
case KDDockWidgets::DropIndicatorOverlayInterface::DropLocation_Top:
|
||||
name = QStringLiteral("inner_top");
|
||||
name = "inner_top";
|
||||
break;
|
||||
case KDDockWidgets::DropIndicatorOverlayInterface::DropLocation_OutterLeft:
|
||||
name = QStringLiteral("outter_left");
|
||||
name = "outter_left";
|
||||
break;
|
||||
case KDDockWidgets::DropIndicatorOverlayInterface::DropLocation_OutterBottom:
|
||||
name = QStringLiteral("outter_bottom");
|
||||
name = "outter_bottom";
|
||||
break;
|
||||
case KDDockWidgets::DropIndicatorOverlayInterface::DropLocation_OutterRight:
|
||||
name = QStringLiteral("outter_right");
|
||||
name = "outter_right";
|
||||
break;
|
||||
case KDDockWidgets::DropIndicatorOverlayInterface::DropLocation_OutterTop:
|
||||
name = QStringLiteral("outter_top");
|
||||
name = "outter_top";
|
||||
break;
|
||||
case KDDockWidgets::DropIndicatorOverlayInterface::DropLocation_None:
|
||||
return QString();
|
||||
|
@ -125,43 +99,65 @@ QString IndicatorsWindow::iconName(int loc, bool active) const
|
|||
return name + suffix;
|
||||
}
|
||||
|
||||
DropIndicators* IndicatorsWindow::dropIndicators() const
|
||||
KDDockWidgets::DropIndicatorOverlayInterface::DropLocation IndicatorsWindow::dropLocationForPosition(const QPoint& pos) const
|
||||
{
|
||||
return m_dropIndicators;
|
||||
const QQuickItem* item = indicatorForPos(pos);
|
||||
return item ? locationForIndicator(item) : KDDockWidgets::DropIndicatorOverlayInterface::DropLocation_None;
|
||||
}
|
||||
|
||||
QQuickItem* IndicatorsWindow::indicatorForLocation(KDDockWidgets::DropIndicatorOverlayInterface::DropLocation loc) const
|
||||
const QQuickItem* IndicatorsWindow::indicatorForPos(QPoint pos) const
|
||||
{
|
||||
const QVector<QQuickItem*> indicators = indicatorItems();
|
||||
Q_ASSERT(indicators.size() == 9);
|
||||
for (const QQuickItem* item : indicatorItems()) {
|
||||
if (!item->isVisible()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
for (QQuickItem* item : indicators) {
|
||||
if (locationForIndicator(item) == loc) {
|
||||
QRect rect(0, 0, int(item->width()), int(item->height()));
|
||||
rect.moveTopLeft(item->mapToGlobal(QPointF(0, 0)).toPoint());
|
||||
|
||||
if (rect.contains(pos)) {
|
||||
return item;
|
||||
}
|
||||
}
|
||||
|
||||
qWarning() << Q_FUNC_INFO << "Couldn't find indicator for location" << loc;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
QPoint IndicatorsWindow::positionForIndicator(KDDockWidgets::DropIndicatorOverlayInterface::DropLocation dropLocation) const
|
||||
{
|
||||
const QQuickItem* indicator = IndicatorsWindow::indicatorForLocation(dropLocation);
|
||||
return indicator->mapToGlobal(indicator->boundingRect().center()).toPoint();
|
||||
}
|
||||
|
||||
KDDockWidgets::DropIndicatorOverlayInterface::DropLocation IndicatorsWindow::locationForIndicator(const QQuickItem* indicator) const
|
||||
{
|
||||
return KDDockWidgets::DropIndicatorOverlayInterface::DropLocation(indicator->property("indicatorType").toInt());
|
||||
}
|
||||
|
||||
QVector<QQuickItem*> IndicatorsWindow::indicatorItems() const
|
||||
const QQuickItem* IndicatorsWindow::indicatorForLocation(KDDockWidgets::DropIndicatorOverlayInterface::DropLocation dropLocation) const
|
||||
{
|
||||
QVector<QQuickItem*> indicators;
|
||||
indicators.reserve(9);
|
||||
for (const QQuickItem* item : indicatorItems()) {
|
||||
if (locationForIndicator(item) == dropLocation) {
|
||||
return item;
|
||||
}
|
||||
}
|
||||
|
||||
QQuickItem* root = rootObject();
|
||||
const QList<QQuickItem*> items = root->childItems();
|
||||
for (QQuickItem* item : items) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
QList<const QQuickItem*> IndicatorsWindow::indicatorItems() const
|
||||
{
|
||||
QList<const QQuickItem*> indicators;
|
||||
indicators.reserve(INDICATORS_COUNT);
|
||||
|
||||
QList<QQuickItem*> items = rootObject()->childItems();
|
||||
|
||||
for (const QQuickItem* item : items) {
|
||||
if (QString::fromLatin1(item->metaObject()->className()).startsWith(QLatin1String("DropIndicator_QMLTYPE"))) {
|
||||
indicators.push_back(item);
|
||||
} else if (item->objectName() == QLatin1String("innerIndicators")) {
|
||||
} else if (item->objectName() == "innerIndicators") {
|
||||
const QList<QQuickItem*> innerIndicators = item->childItems();
|
||||
|
||||
for (QQuickItem* innerItem : innerIndicators) {
|
||||
if (QString::fromLatin1(innerItem->metaObject()->className()).startsWith(QLatin1String("DropIndicator_QMLTYPE"))) {
|
||||
indicators.push_back(innerItem);
|
||||
|
@ -170,5 +166,7 @@ QVector<QQuickItem*> IndicatorsWindow::indicatorItems() const
|
|||
}
|
||||
}
|
||||
|
||||
Q_ASSERT(indicators.size() == INDICATORS_COUNT);
|
||||
|
||||
return indicators;
|
||||
}
|
||||
|
|
|
@ -28,31 +28,29 @@
|
|||
#include "thirdparty/KDDockWidgets/src/private/DropIndicatorOverlayInterface_p.h"
|
||||
|
||||
namespace mu::dock {
|
||||
class DropIndicators;
|
||||
class IndicatorsWindow : public QQuickView
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
Q_PROPERTY(mu::dock::DropIndicators* dropIndicators READ dropIndicators CONSTANT)
|
||||
Q_PROPERTY(QQuickItem* dropIndicators READ dropIndicators CONSTANT)
|
||||
|
||||
public:
|
||||
explicit IndicatorsWindow(DropIndicators* dropIndicators);
|
||||
explicit IndicatorsWindow(QQuickItem* dropIndicators);
|
||||
|
||||
DropIndicators* dropIndicators() const;
|
||||
QQuickItem* dropIndicators() const;
|
||||
Q_INVOKABLE QString iconName(int dropLocation, bool active) const;
|
||||
|
||||
KDDockWidgets::DropIndicatorOverlayInterface::DropLocation hover(QPoint pos);
|
||||
QPoint posForIndicator(KDDockWidgets::DropIndicatorOverlayInterface::DropLocation loc) const;
|
||||
QQuickItem* indicatorForLocation(KDDockWidgets::DropIndicatorOverlayInterface::DropLocation loc) const;
|
||||
|
||||
Q_INVOKABLE QString iconName(int loc, bool active) const;
|
||||
KDDockWidgets::DropIndicatorOverlayInterface::DropLocation dropLocationForPosition(const QPoint& pos) const;
|
||||
QPoint positionForIndicator(KDDockWidgets::DropIndicatorOverlayInterface::DropLocation dropLocation) const;
|
||||
|
||||
private:
|
||||
KDDockWidgets::DropIndicatorOverlayInterface::DropLocation locationForIndicator(const QQuickItem* indicator) const;
|
||||
const QQuickItem* indicatorForLocation(KDDockWidgets::DropIndicatorOverlayInterface::DropLocation dropLocation) const;
|
||||
|
||||
QQuickItem* indicatorForPos(QPoint) const;
|
||||
QVector<QQuickItem*> indicatorItems() const;
|
||||
const QQuickItem* indicatorForPos(QPoint) const;
|
||||
QList<const QQuickItem *> indicatorItems() const;
|
||||
|
||||
DropIndicators* m_dropIndicators = nullptr;
|
||||
QQuickItem* m_dropIndicators = nullptr;
|
||||
};
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue