colorlegend.py 4.31 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
# -*- coding: utf-8 -*-
"""
GEPARD - Gepard-Enabled PARticle Detection
Copyright (C) 2018  Lars Bittrich and Josef Brandt, Leibniz-Institut für 
Polymerforschung Dresden e. V. <bittrich-lars@ipfdd.de>    

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program, see COPYING.  
If not, see <https://www.gnu.org/licenses/>.
"""
from PyQt5 import QtCore, QtWidgets, QtGui
import numpy as np


WX, WY = 1024, 200
        
27
class ColorLegend(QtWidgets.QMdiSubWindow):
28 29 30 31 32 33 34 35 36 37 38 39 40
    def __init__(self, parent=None):
        super().__init__(parent)
        
        self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint|QtCore.Qt.FramelessWindowHint)
        
        self.setFixedSize(200, 800)
        self.wscale = 1
        self.drag = None
        self.items = []     	   #list of items to display (text, color)
        self.tileSize = 12
        self.fontSize = 15
        self.spacer = 10
        
41 42 43 44 45 46 47 48
    def setTextColorItems(self, items):
        for text, color in items:
            print(text, color)
            assert type(text)==str or type(text)==np.str_, "items must be tuples of text and QColor"
            assert type(color)==QtGui.QColor or type(color)==QtCore.Qt.GlobalColor, "items must be tuples of text and QColor"
        self.items = items
        self.update()
        
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
    def mousePressEvent(self, event):
        if event.button()==QtCore.Qt.LeftButton:
            self.drag = event.pos()
            
    def mouseMoveEvent(self, event):
        if self.drag is not None:
            p0 = event.pos()
            self.move(self.mapToParent(p0-self.drag))
            self.parentWidget().update()
        else:
            super().mouseMoveEvent(event)
                        
    def mouseReleaseEvent(self, event):
        self.drag = None
        super().mouseReleaseEvent(event)        

    def paintEvent(self, event):
        numEntries = len(self.items)
        if numEntries > 0:
            
            def getSize(fontsize, text, tileSize, spacer):
Hackmet's avatar
Hackmet committed
70 71 72 73
                font = QtGui.QFont()
                font.setPixelSize(fontSize)
                fm = QtGui.QFontMetrics(font)
                pixelwidth = fm.width(text)
Hackmet's avatar
Hackmet committed
74
                width, height = pixelwidth + tileSize + 4*spacer, numEntries * (fontSize+1*spacer) + spacer
75 76 77 78 79 80
                return width, height
            
            fontSize, tileSize, spacer = self.fontSize, self.tileSize, self.spacer
            longestEntry = max([i[0] for i in self.items], key=len)
            width, height = getSize(fontSize, longestEntry, tileSize, spacer)
            
Hackmet's avatar
Hackmet committed
81
#            scale smaller, if necessary
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
            if height > 1024:
                factor = 1024/height
                #prevent text getting tooo small:
                factor = np.clip(factor, 0.6, 1)        #0.6*15   would be fontSize 9
                
                height, tileSize, fontSize, spacer = height*factor, tileSize*factor, int(fontSize*factor), spacer*factor
                
                width, height = getSize(fontSize, longestEntry, tileSize, spacer)
                
            self.setFixedSize(width, height)
            
            qp = QtGui.QPainter()
            qp.begin(self)
            font = QtGui.QFont()
            font.setPixelSize(fontSize)
            qp.setFont(font)
            
            for index, item in enumerate(self.items):
                #draw Text
                x0 = tileSize+2*spacer
                y0 = index*(fontSize+spacer)
                rect= QtCore.QRectF(x0, y0, width, float(fontSize+spacer))
                qp.drawText(rect, QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter, item[0])
                
                #draw colored Box
                qp.setBrush(item[1])
                x0 = spacer
                y0 = index*(fontSize+spacer) + (fontSize - tileSize)/2 +spacer/2
                qp.drawRect(x0, y0, tileSize, tileSize)
            
            qp.end()