Package mcbase :: Package libs :: Package designeditor :: Module sizehandler
[hide private]
[frames] | no frames]

Source Code for Module mcbase.libs.designeditor.sizehandler

  1  # -*- coding: utf-8 -*- 
  2   
  3  ########################################################################## 
  4  # sizehandler.py 
  5  # 
  6  # Nesnelerin etrafındaki deformasyon kareleri 
  7  # 
  8  # (C) 2007 Likya Yazılım ve Bilişim Hizmetleri Ltd. Şti. 
  9  ########################################################################## 
 10   
 11  from PyQt4.QtCore import * 
 12  from PyQt4.QtGui import * 
 13   
 14   
15 -class SizeHandler(QGraphicsRectItem):
16 ''' 17 Nesnelerin köşelerinde bulunan büyütme ve küçültme kareleridir. 18 ''' 19 TOP_LEFT = 0 20 TOP_MIDDLE = 1 21 TOP_RIGHT = 2 22 BOTTOM_LEFT = 3 23 BOTTOM_MIDDLE = 4 24 BOTTOM_RIGHT = 5 25 LEFT_MIDDLE = 6 26 RIGHT_MIDDLE = 7 27 MIDDLE_MIDDLE = 8 28
29 - def __init__(self, parent, plugin, location):
30 ''' 31 Büyültme, küçültme karesi oluşturur 32 ''' 33 QGraphicsRectItem.__init__(self, parent) 34 35 self._parent = parent 36 self._plugin = plugin 37 self._location = location 38 self._moving = False 39 self._initialParentPos = None 40 self._initialParentSize = None 41 42 # Nesnenin görünüp görünmeyeceğini nesneye göre ayarlıyoruz. 43 if not self._parent.isSelected(): 44 self.hide() 45 46 # Hareket ettirilebilir yapıyoruz. 47 self.setFlags(QGraphicsItem.ItemIsMovable) 48 49 # Karelerin genişliklerini ve uzunluklarını ayarlıyoruz. 50 rect = self.rect() 51 rect.setWidth(4) 52 rect.setHeight(4) 53 self.prepareGeometryChange() 54 self.setRect(rect) 55 56 # Mouse imlecini ayarlıyoruz. 57 self.updateCursor()
58
59 - def updateCursor(self):
60 ''' 61 Mouse karenin üzerine geldiğinde alacağı şekli belirliyoruz. 62 ''' 63 if self._location == SizeHandler.TOP_LEFT: 64 self.setCursor(Qt.SizeFDiagCursor) 65 66 elif self._location == SizeHandler.TOP_MIDDLE: 67 self.setCursor(Qt.SizeVerCursor) 68 69 elif self._location == SizeHandler.TOP_RIGHT: 70 self.setCursor(Qt.SizeBDiagCursor) 71 72 elif self._location == SizeHandler.BOTTOM_LEFT: 73 self.setCursor(Qt.SizeBDiagCursor) 74 75 elif self._location == SizeHandler.BOTTOM_MIDDLE: 76 self.setCursor(Qt.SizeVerCursor) 77 78 elif self._location == SizeHandler.BOTTOM_RIGHT: 79 self.setCursor(Qt.SizeFDiagCursor) 80 81 elif self._location == SizeHandler.LEFT_MIDDLE: 82 self.setCursor(Qt.SizeHorCursor) 83 84 elif self._location == SizeHandler.RIGHT_MIDDLE: 85 self.setCursor(Qt.SizeHorCursor) 86 87 elif self._location == SizeHandler.MIDDLE_MIDDLE: 88 self.setCursor(Qt.SizeAllCursor)
89
90 - def updatePosition(self):
91 ''' 92 Nesnenin yerine göre kendi yerini yeniden ayarlar. 93 ''' 94 width = self._parent.width() 95 height = self._parent.height() 96 97 if self._location == SizeHandler.TOP_LEFT: 98 self.setPos(QPointF(-2, -2)) 99 100 elif self._location == SizeHandler.TOP_MIDDLE: 101 self.setPos(QPointF(width/2 - 2, -2)) 102 103 elif self._location == SizeHandler.TOP_RIGHT: 104 self.setPos(QPointF(width - 2, -2)) 105 106 elif self._location == SizeHandler.BOTTOM_LEFT: 107 self.setPos(QPointF(-2, height - 2)) 108 109 elif self._location == SizeHandler.BOTTOM_MIDDLE: 110 self.setPos(QPointF(width/2 - 2, height - 2)) 111 112 elif self._location == SizeHandler.BOTTOM_RIGHT: 113 self.setPos(QPointF(width - 2, height - 2)) 114 115 elif self._location == SizeHandler.LEFT_MIDDLE: 116 self.setPos(QPointF(-2, height/2 - 2)) 117 118 elif self._location == SizeHandler.RIGHT_MIDDLE: 119 self.setPos(QPointF(width - 2, height/2 - 2)) 120 121 elif self._location == SizeHandler.MIDDLE_MIDDLE: 122 self.setPos(QPointF(width/2 - 2, height/2 - 2))
123
124 - def adjustParent(self, diff):
125 ''' 126 Karelerin hareketlerine göre nesneleri deforme ediyoruz. 127 ''' 128 # Nesnenin eski bilgilerini saklıyoruz. 129 oldPos = self._initialParentPos 130 oldSize = self._initialParentSize 131 132 if self._location == SizeHandler.RIGHT_MIDDLE: 133 self._parent.prepareGeometryChange() 134 self._parent.setWidth(oldSize.width() + diff.x()) 135 136 elif self._location == SizeHandler.LEFT_MIDDLE: 137 self._parent.prepareGeometryChange() 138 self._parent.setWidth(oldSize.width() - diff.x()) 139 self._parent.setPos(QPointF(oldPos.x() + diff.x(), oldPos.y())) 140 141 elif self._location == SizeHandler.BOTTOM_MIDDLE: 142 self._parent.prepareGeometryChange() 143 self._parent.setHeight(oldSize.height() + diff.y()) 144 145 elif self._location == SizeHandler.TOP_MIDDLE: 146 self._parent.prepareGeometryChange() 147 self._parent.setHeight(oldSize.height() - diff.y()) 148 self._parent.setPos(QPointF(oldPos.x(), oldPos.y() + diff.y())) 149 150 elif self._location == SizeHandler.BOTTOM_RIGHT: 151 self._parent.prepareGeometryChange() 152 self._parent.setWidth(oldSize.width() + diff.x()) 153 self._parent.setHeight(oldSize.height() + diff.y()) 154 155 elif self._location == SizeHandler.TOP_RIGHT: 156 self._parent.prepareGeometryChange() 157 self._parent.setWidth(oldSize.width() + diff.x()) 158 self._parent.setHeight(oldSize.height() - diff.y()) 159 self._parent.setPos(QPointF(oldPos.x(), oldPos.y() + diff.y())) 160 161 elif self._location == SizeHandler.TOP_LEFT: 162 self._parent.prepareGeometryChange() 163 self._parent.setWidth(oldSize.width() - diff.x()) 164 self._parent.setHeight(oldSize.height() - diff.y()) 165 self._parent.setPos(QPointF(oldPos.x() + diff.x(), oldPos.y() + diff.y())) 166 167 elif self._location == SizeHandler.BOTTOM_LEFT: 168 self._parent.prepareGeometryChange() 169 self._parent.setWidth(oldSize.width() - diff.x()) 170 self._parent.setHeight(oldSize.height() + diff.y()) 171 self._parent.setPos(QPointF(oldPos.x() + diff.x(), oldPos.y())) 172 173 elif self._location == SizeHandler.MIDDLE_MIDDLE: 174 self._parent.prepareGeometryChange() 175 self._parent.setPos(QPointF(oldPos.x() + diff.x(), oldPos.y() + diff.y())) 176 177 self._parent.updateSizeHandlers()
178
179 - def itemChange(self, change, value):
180 ''' 181 Kareler sürüklendiklerinde, gerekli düzenlemeleri yapar. 182 ''' 183 if change == QGraphicsItem.ItemPositionChange and self.scene() and self._moving: 184 oldPos = self.pos() 185 newPos = value.toPointF() 186 187 if self._location in (SizeHandler.LEFT_MIDDLE, SizeHandler.RIGHT_MIDDLE): 188 189 if self._plugin.requiresGridPosition(): 190 newPos = self._parent.mapToParent(newPos) 191 newPos = self._plugin.alignToGrid(newPos) 192 newPos = self._parent.mapFromParent(newPos) 193 194 return QVariant(QPointF(newPos.x(), oldPos.y())) 195 196 elif self._location in (SizeHandler.TOP_MIDDLE, SizeHandler.BOTTOM_MIDDLE): 197 return QVariant(QPointF(oldPos.x(), newPos.y())) 198 199 return QGraphicsRectItem.itemChange(self, change, value)
200
201 - def mousePressEvent(self, e):
202 ''' 203 Kare sürüklenip sürüklenmediğini buluyoruz. 204 ''' 205 QGraphicsRectItem.mousePressEvent(self, e) 206 207 self._initialParentPos = self._parent.pos() 208 self._initialParentSize = self._parent.rect().size()
209
210 - def mouseMoveEvent(self, e):
211 ''' 212 Kare sürüklenirken, nesnenin da beraber sürüklenmesini engelliyoruz. 213 ''' 214 if e.buttons() & Qt.LeftButton and self.flags() & QGraphicsItem.ItemIsMovable: 215 # Alanın nereye gideceğini buluyoruz. 216 newPos = QPointF(self.mapToParent(e.pos()) - self.matrix().map(e.buttonDownPos(Qt.LeftButton))) 217 self._moving = True 218 self.setPos(newPos) 219 220 # Altındaki nesneyi de değiştiriyoruz. 221 lastPos = e.lastPos() 222 currentPos = e.pos() 223 224 if lastPos != currentPos: 225 226 # Çerçevenin dışına çıkmasını engelliyoruz 227 framePos = self._parent.frame().scenePos() 228 frameSize = self._parent.frame().rect().size() 229 frameRect = QRectF(framePos, frameSize) 230 231 mousePos = self.scenePos() 232 233 # Ölçü karelerinin çerçeve dışına çıkmasına izin verme. 234 if not frameRect.contains(mousePos): 235 mousePos.setX(min(frameRect.right(), max(mousePos.x(), frameRect.left()))) 236 mousePos.setY(min(frameRect.bottom(), max(mousePos.y(), frameRect.top()))) 237 238 # Ölçü karesinin 4x4 'lük bir genişliği olduğu için bunu da hesaba katıyoruz. 239 marginPos = e.buttonDownPos(Qt.LeftButton) - QPointF(2, 2) 240 241 diff = mousePos - (e.buttonDownScenePos(Qt.LeftButton) - marginPos) 242 243 # Oluşan farka göre nesneyi değiştiriyoruz. 244 self.adjustParent(diff) 245 246 else: 247 e.ignore()
248
249 - def mouseReleaseEvent(self, e):
250 ''' 251 Kare sürüklenirken, alanın da beraber sürüklenmesini engelliyoruz. 252 ''' 253 QGraphicsRectItem.mouseReleaseEvent(self, e) 254 255 self._moving = False 256 257 currentParentPos = self._parent.pos() 258 currentParentSize = self._parent.rect().size() 259 260 width = self._parent.rect().width() 261 height = self._parent.rect().height() 262 263 # Eğer nesne kaybolmuş ise eski koordinatlarına geri dön 264 if width < 1 or height < 1: 265 self.prepareGeometryChange() 266 rect = self._parent.rect() 267 rect.setSize(self._initialParentSize) 268 269 self._parent.setRect(rect) 270 self._parent.setPos(self._initialParentPos) 271 272 self._parent.updateSizeHandlers() 273 274 # Nesne kaybolmamış ve ölçüleri değişmiş ise 275 elif self._initialParentPos != currentParentPos or self._initialParentSize != currentParentSize: 276 self.scene().emit(SIGNAL('itemResized(PyQt_PyObject, QPointF, QSizeF, QPointF, QSizeF)'), 277 self._parent, 278 self._initialParentPos, 279 self._initialParentSize, 280 currentParentPos, 281 currentParentSize)
282
283 - def paint(self, painter, option, widget):
284 ''' 285 Köşegenlerin şekillerini çizer. 286 ''' 287 painter.fillRect(self.rect(), QColor(Qt.red))
288