1 #pragma once 2 3 #ifndef XSHCOLUMNVIEWER_H 4 #define XSHCOLUMNVIEWER_H 5 6 #include "tapp.h" 7 8 #include "toonz/tstageobject.h" 9 #include "toonz/txsheethandle.h" 10 #include "toonz/tscenehandle.h" 11 #include "toonz/tcolumnhandle.h" 12 #include "toonz/txsheet.h" 13 14 #include "../include/tundo.h" 15 #include "../include/historytypes.h" 16 17 #include <QWidget> 18 #include <QListWidget> 19 #include <QLineEdit> 20 #include <QPoint> 21 #include <QColor> 22 23 // forward declaration 24 class XsheetViewer; 25 class TObjectHandle; 26 class TXsheetHandle; 27 class TStageObjectId; 28 class TXshColumn; 29 class QComboBox; 30 class Orientation; 31 class TApp; 32 class TXsheet; 33 34 //============================================================================= 35 namespace XsheetGUI { 36 37 class DragTool; 38 39 //============================================================================= 40 // MotionPathMenu 41 //----------------------------------------------------------------------------- 42 43 class MotionPathMenu final : public QWidget { 44 Q_OBJECT 45 46 QRect m_mDeleteRect; 47 QRect m_mNormalRect; 48 QRect m_mRotateRect; 49 QPoint m_pos; 50 51 public: 52 #if QT_VERSION >= 0x050500 53 MotionPathMenu(QWidget *parent = 0, Qt::WindowFlags flags = 0); 54 #else 55 MotionPathMenu(QWidget *parent = 0, Qt::WFlags flags = 0); 56 #endif 57 58 ~MotionPathMenu(); 59 60 protected: 61 void paintEvent(QPaintEvent *) override; 62 void mousePressEvent(QMouseEvent *event) override; 63 void mouseMoveEvent(QMouseEvent *event) override; 64 void mouseReleaseEvent(QMouseEvent *event) override; 65 void leaveEvent(QEvent *event) override; 66 }; 67 68 //============================================================================= 69 // ChangeParentObjectWidget 70 //----------------------------------------------------------------------------- 71 72 class ChangeObjectWidget : public QListWidget { 73 Q_OBJECT 74 75 protected: 76 TObjectHandle *m_objectHandle; 77 TXsheetHandle *m_xsheetHandle; 78 int m_width; 79 80 public: 81 ChangeObjectWidget(QWidget *parent = 0); 82 ~ChangeObjectWidget(); 83 84 void show(const QPoint &pos); 85 void setObjectHandle(TObjectHandle *objectHandle); 86 void setXsheetHandle(TXsheetHandle *xsheetHandle); 87 refresh()88 virtual void refresh(){}; 89 90 protected: 91 void mouseMoveEvent(QMouseEvent *event) override; 92 void focusOutEvent(QFocusEvent *e) override; focusInEvent(QFocusEvent * e)93 void focusInEvent(QFocusEvent *e) override {} 94 void selectCurrent(const QString &text); 95 96 protected slots: 97 virtual void onTextChanged(const QString &) = 0; 98 }; 99 100 //============================================================================= 101 // ChangeObjectParent 102 //----------------------------------------------------------------------------- 103 104 class ChangeObjectParent final : public ChangeObjectWidget { 105 Q_OBJECT 106 107 public: 108 ChangeObjectParent(QWidget *parent = 0); 109 ~ChangeObjectParent(); 110 111 void refresh() override; 112 113 protected slots: 114 void onTextChanged(const QString &) override; 115 }; 116 117 //============================================================================= 118 // ChangeObjectHandle 119 //----------------------------------------------------------------------------- 120 121 class ChangeObjectHandle final : public ChangeObjectWidget { 122 Q_OBJECT 123 124 public: 125 ChangeObjectHandle(QWidget *parent = 0); 126 ~ChangeObjectHandle(); 127 128 void refresh() override; 129 130 protected slots: 131 void onTextChanged(const QString &) override; 132 }; 133 134 //============================================================================= 135 // RenameColumnField 136 //----------------------------------------------------------------------------- 137 138 class RenameColumnField final : public QLineEdit { 139 Q_OBJECT 140 141 int m_col; 142 143 TXsheetHandle *m_xsheetHandle; 144 145 public: 146 RenameColumnField(QWidget *parent, XsheetViewer *viewer); ~RenameColumnField()147 ~RenameColumnField() {} 148 setXsheetHandle(TXsheetHandle * xsheetHandle)149 void setXsheetHandle(TXsheetHandle *xsheetHandle) { 150 m_xsheetHandle = xsheetHandle; 151 } 152 153 void show(const QRect &rect, int col); 154 155 protected: 156 void focusOutEvent(QFocusEvent *) override; 157 158 protected slots: 159 void renameColumn(); 160 }; 161 162 //============================================================================= 163 // CameraColumnSwitchUndo 164 //----------------------------------------------------------------------------- 165 class CameraColumnSwitchUndo final : public TUndo { 166 int m_oldCameraIndex, m_newCameraIndex; 167 TXsheetHandle *m_xsheetHandle; 168 169 public: CameraColumnSwitchUndo(int oldIndex,int newIndex,TXsheetHandle * xshHandle)170 CameraColumnSwitchUndo(int oldIndex, int newIndex, TXsheetHandle *xshHandle) 171 : m_oldCameraIndex(oldIndex) 172 , m_newCameraIndex(newIndex) 173 , m_xsheetHandle(xshHandle) {} ~CameraColumnSwitchUndo()174 ~CameraColumnSwitchUndo() {} 175 undo()176 void undo() const override { 177 m_xsheetHandle->getXsheet()->setCameraColumnIndex(m_oldCameraIndex); 178 TApp::instance()->getCurrentScene()->notifySceneChanged(); 179 TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); 180 TApp::instance()->getCurrentColumn()->notifyColumnIndexSwitched(); 181 } 182 redo()183 void redo() const override { 184 m_xsheetHandle->getXsheet()->setCameraColumnIndex(m_newCameraIndex); 185 TApp::instance()->getCurrentScene()->notifySceneChanged(); 186 TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); 187 TApp::instance()->getCurrentColumn()->notifyColumnIndexSwitched(); 188 } 189 getSize()190 int getSize() const override { return sizeof(*this); } 191 getHistoryString()192 QString getHistoryString() override { 193 TStageObjectId objId = TStageObjectId::CameraId(m_newCameraIndex); 194 TStageObject *obj = m_xsheetHandle->getXsheet()->getStageObject(objId); 195 std::string objName = obj->getName(); 196 QString str = QObject::tr("Camera Column Switch : ") + 197 QString::fromStdString(objName); 198 return str; 199 } 200 getHistoryType()201 int getHistoryType() override { return HistoryType::Xsheet; } 202 }; 203 204 //============================================================================= 205 // ColumnArea 206 //----------------------------------------------------------------------------- 207 208 class ColumnTransparencyPopup final : public QWidget { 209 Q_OBJECT 210 211 QSlider *m_slider; 212 QLineEdit *m_value; 213 TXshColumn *m_column; 214 215 QComboBox *m_filterColorCombo; 216 217 public: 218 ColumnTransparencyPopup(QWidget *parent); 219 void setColumn(TXshColumn *column); 220 221 protected: 222 // void mouseMoveEvent ( QMouseEvent * e ); 223 void mouseReleaseEvent(QMouseEvent *e) override; 224 225 protected slots: 226 void onSliderReleased(); 227 void onSliderChange(int val); 228 void onSliderValueChanged(int); 229 void onValueChanged(const QString &); 230 231 void onFilterColorChanged(int id); 232 }; 233 234 class SoundColumnPopup final : public QWidget { 235 Q_OBJECT 236 237 QSlider *m_slider; 238 QLineEdit *m_value; 239 TXshColumn *m_column; 240 241 public: 242 SoundColumnPopup(QWidget *parent); 243 void setColumn(TXshColumn *column); 244 245 protected: 246 // void mouseMoveEvent ( QMouseEvent * e ); 247 void mouseReleaseEvent(QMouseEvent *e) override; 248 249 protected slots: 250 void onSliderReleased(); 251 void onSliderChange(int val); 252 void onSliderValueChanged(int); 253 void onValueChanged(const QString &); 254 }; 255 256 //! The class in charge of the region showing layer headers 257 class ColumnArea final : public QWidget { 258 Q_OBJECT 259 260 enum { 261 ToggleTransparency = 1, 262 ToggleAllTransparency, 263 TogglePreviewVisible, 264 ToggleAllPreviewVisible, 265 ToggleLock, 266 ToggleAllLock, 267 OpenSettings 268 }; 269 270 ColumnTransparencyPopup *m_columnTransparencyPopup; 271 SoundColumnPopup *m_soundColumnPopup; 272 QTimer *m_transparencyPopupTimer; 273 int m_doOnRelease; 274 XsheetViewer *m_viewer; 275 int m_col; 276 QRect m_indexBox; 277 QRect m_tabBox; 278 QRect m_nameBox; 279 QRect m_linkBox; 280 281 bool m_isPanning; 282 283 QPoint m_pos; 284 QString m_tooltip; 285 286 RenameColumnField *m_renameColumnField; 287 #ifndef LINETEST 288 ChangeObjectParent *m_changeObjectParent; 289 ChangeObjectHandle *m_changeObjectHandle; 290 #else 291 MotionPathMenu *m_motionPathMenu; 292 #endif 293 294 QAction *m_subsampling1; 295 QAction *m_subsampling2; 296 QAction *m_subsampling3; 297 QAction *m_subsampling4; 298 299 DragTool *getDragTool() const; 300 void setDragTool(DragTool *dragTool); 301 void startTransparencyPopupTimer(QMouseEvent *e); 302 303 // extracted all variables of drawSomething methods 304 class DrawHeader { 305 ColumnArea *area; 306 QPainter &p; 307 int col; 308 XsheetViewer *m_viewer; 309 const Orientation *o; 310 TApp *app; 311 TXsheet *xsh; 312 bool isEmpty, isCurrent; 313 TXshColumn *column; 314 QPoint orig; 315 316 public: 317 DrawHeader(ColumnArea *area, QPainter &p, int col); 318 319 void prepare() const; 320 321 void levelColors(QColor &columnColor, QColor &dragColor) const; 322 void soundColors(QColor &columnColor, QColor &dragColor) const; 323 void paletteColors(QColor &columnColor, QColor &dragColor) const; 324 325 void drawBaseFill(const QColor &columnColor, const QColor &dragColor) const; 326 void drawEye() const; 327 void drawPreviewToggle(int opacity) const; 328 void drawLock() const; 329 void drawConfig() const; 330 void drawColumnNumber() const; 331 void drawColumnName() const; 332 void drawThumbnail(QPixmap &iconPixmap) const; 333 void drawPegbarName() const; 334 void drawParentHandleName() const; 335 void drawFilterColor() const; 336 337 void drawSoundIcon(bool isPlaying) const; 338 void drawVolumeControl(double volume) const; 339 }; 340 341 public: 342 #if QT_VERSION >= 0x050500 343 ColumnArea(XsheetViewer *parent, Qt::WindowFlags flags = 0); 344 #else 345 ColumnArea(XsheetViewer *parent, Qt::WFlags flags = 0); 346 #endif 347 ~ColumnArea(); 348 349 void onControlPressed(bool pressed); 350 const bool isControlPressed(); 351 352 void drawFoldedColumnHead(QPainter &p, int col); 353 void drawLevelColumnHead(QPainter &p, int col); 354 void drawSoundColumnHead(QPainter &p, int col); 355 void drawPaletteColumnHead(QPainter &p, int col); 356 void drawSoundTextColumnHead(QPainter &p, int col); 357 358 QPixmap getColumnIcon(int columnIndex); 359 360 class Pixmaps { 361 public: 362 static const QPixmap &sound(); 363 static const QPixmap &soundPlaying(); 364 }; 365 366 protected: 367 void select(int columnIndex, QMouseEvent *event); 368 369 void paintEvent(QPaintEvent *) override; 370 371 void mousePressEvent(QMouseEvent *event) override; 372 void mouseMoveEvent(QMouseEvent *event) override; 373 void mouseReleaseEvent(QMouseEvent *event) override; 374 void mouseDoubleClickEvent(QMouseEvent *event) override; 375 void contextMenuEvent(QContextMenuEvent *event) override; 376 bool event(QEvent *event) override; 377 378 protected slots: 379 void onSubSampling(QAction *); 380 void openTransparencyPopup(); 381 void openSoundColumnPopup(); 382 void openCameraColumnPopup(QPoint pos); 383 void onCameraColumnChangedTriggered(); 384 void onXsheetCameraChange(int); 385 void onSetMask(int); 386 }; 387 388 //----------------------------------------------------------------------------- 389 } // namespace XsheetGUI; 390 //----------------------------------------------------------------------------- 391 392 #endif // XSHCOLUMNVIEWER_H 393