Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add delete button for layers #65

Closed
wants to merge 16 commits into from
21 changes: 16 additions & 5 deletions gui/elements/_layer_list.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from vispy.util.event import EmitterGroup, Event
from ..layers._base_layer import Layer

from .qt import QtLayerList
from .qt import QtLayerPanel


class ItemEvent(Event):
Expand Down Expand Up @@ -47,7 +47,7 @@ class LayerList:

def __init__(self, viewer=None):
self._list = []
self._qt = QtLayerList()
self._qt = QtLayerPanel(self)
self._viewer = None
self.total = 0
self.events = EmitterGroup(source=self,
Expand Down Expand Up @@ -297,7 +297,7 @@ def _add(self, event):
"""Callback when an item is added to set its order and viewer.
"""
layer = event.item
self._qt.insert(event.index, len(self), layer)
self._qt.layersList.insert(event.index, len(self), layer)
layer._order = -len(self)
layer.viewer = self.viewer

Expand All @@ -306,7 +306,7 @@ def _remove(self, event):
and reset its order.
"""
layer = event.item
self._qt.remove(layer)
self._qt.layersList.remove(layer)
layer.viewer = None
layer._order = 0

Expand All @@ -316,7 +316,18 @@ def _reorder(self, event):
"""
for i in range(len(self)):
self[i]._order = -i
self._qt.reorder(self)
self._qt.layersList.reorder()
canvas = self.viewer._canvas
canvas._draw_order.clear()
canvas.update()

def remove_selected(self):
"""Removes selected items from list.
"""
to_delete = []
for i in range(len(self)):
if self[i].selected:
to_delete.append(i)
to_delete.reverse()
for i in to_delete:
self.pop(i)
2 changes: 1 addition & 1 deletion gui/elements/qt/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from PyQt5.QtWidgets import QApplication as QtApplication

from ._viewer import QtViewer
from ._layerList import QtLayerList
from ._layerPanel import QtLayerPanel
from ._controls import QtControls
from ._imageLayer import QtImageLayer
from ._markersLayer import QtMarkersLayer
Expand Down
11 changes: 9 additions & 2 deletions gui/elements/qt/_layer.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@

dir_path = dirname(realpath(__file__))
path_on = join(dir_path,'icons','eye_on.png')
path_off = join(dir_path,'icons','eye_off.png')

class QtLayer(QFrame):
def __init__(self, layer):
Expand Down Expand Up @@ -110,7 +109,15 @@ def mouseMoveEvent(self, event):
drag = QDrag(self)
drag.setMimeData(mimeData)
drag.setHotSpot(event.pos() - self.rect().topLeft())
dropAction = drag.exec_(Qt.MoveAction)
dropAction = drag.exec_(Qt.MoveAction | Qt.CopyAction)

if dropAction == Qt.CopyAction:
if not self.layer.selected:
index = self.layer.viewer.layers.index(self.layer)
self.layer.viewer.layers.pop(index)
else:
self.layer.viewer.layers.remove_selected()


def unselectAll(self):
if self.layer.viewer is not None:
Expand Down
16 changes: 11 additions & 5 deletions gui/elements/qt/_layerList.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,14 @@
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QScrollArea
from ._layerDivider import QtDivider

import weakref


class QtLayerList(QScrollArea):
def __init__(self):
def __init__(self, layers):
super().__init__()

self.layers = weakref.proxy(layers)
sofroniewn marked this conversation as resolved.
Show resolved Hide resolved
self.setWidgetResizable(True)
#self.setFixedWidth(315)
self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
Expand All @@ -15,6 +19,7 @@ def __init__(self):
self.layersLayout.addWidget(QtDivider())
self.layersLayout.addStretch(1)
self.setAcceptDrops(True)
self.setToolTip('Layer list')

def insert(self, index, total, layer):
"""Inserts a layer widget at a specific index
Expand All @@ -36,14 +41,14 @@ def remove(self, layer):
divider.deleteLater()
divider = None

def reorder(self, layerList):
def reorder(self):
"""Reorders list of layer widgets by looping through all
widgets in list sequentially removing them and inserting
them into the correct place in final list.
"""
total = len(layerList)
total = len(self.layers)
for i in range(total):
layer = layerList[i]
layer = self.layers[i]
if layer._qt is not None:
index = self.layersLayout.indexOf(layer._qt)
divider = self.layersLayout.itemAt(index+1).widget()
Expand All @@ -55,7 +60,8 @@ def reorder(self, layerList):
def mouseReleaseEvent(self, event):
"""Unselects all layer widgets
"""
self.layersLayout.itemAt(1).widget().unselectAll()
if self.layersLayout.count() > 1:
self.layersLayout.itemAt(1).widget().unselectAll()

def dragLeaveEvent(self, event):
event.ignore()
Expand Down
64 changes: 64 additions & 0 deletions gui/elements/qt/_layerPanel.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QFrame
from ._layerList import QtLayerList
from os.path import dirname, join, realpath
import weakref

dir_path = dirname(realpath(__file__))
path_delete = join(dir_path,'icons','delete.png')
AhmetCanSolak marked this conversation as resolved.
Show resolved Hide resolved

class QtLayerPanel(QWidget):
def __init__(self, layers):
super().__init__()

layout = QVBoxLayout()
self.layersList = QtLayerList(layers)
self.layersControls = QtLayerControls(layers)
layout.addWidget(self.layersControls)
layout.addWidget(self.layersList)
self.setLayout(layout)

class QDeleteButton(QPushButton):
def __init__(self, layers):
super().__init__()

self.layers = weakref.proxy(layers)

self.setIcon(QIcon(path_delete))
self.setFixedWidth(28)
self.setFixedHeight(28)
self.setToolTip('Delete layers')
self.clicked.connect(self.on_click)
self.setAcceptDrops(True)
styleSheet = """QPushButton {background-color:lightGray; border-radius: 3px;}
QPushButton:pressed {background-color:rgb(71,143,205); border-radius: 3px;}
QPushButton:hover {background-color:rgb(71,143,205); border-radius: 3px;}"""
self.setStyleSheet(styleSheet)

def on_click(self):
self.layers.remove_selected()

def dragEnterEvent(self, event):
event.accept()
self.hover = True
self.update()

def dragLeaveEvent(self, event):
event.ignore()
self.hover = False
self.update()

def dropEvent(self, event):
event.setDropAction(Qt.CopyAction)
event.accept()

class QtLayerControls(QFrame):
def __init__(self, layers):
super().__init__()

layout = QHBoxLayout()
layout.addWidget(QDeleteButton(layers))
layout.addStretch(0)

self.setLayout(layout)
Binary file added gui/elements/qt/icons/delete.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.