1 #pragma once
2 
3 #ifndef TOOLOPTIONS_H
4 #define TOOLOPTIONS_H
5 
6 // TnzQt includes
7 #include "toonzqt/checkbox.h"
8 
9 // TnzLib includes
10 #include "toonz/tstageobject.h"
11 
12 // TnzCore includes
13 #include "tcommon.h"
14 #include "tproperty.h"
15 
16 // Qt includes
17 #include <QFrame>
18 #include <QAction>
19 #include <QList>
20 #include <QToolBar>
21 #include <QMap>
22 #include <QLabel>
23 #include <QRadioButton>
24 
25 // STD includes
26 #include <map>
27 
28 #undef DVAPI
29 #undef DVVAR
30 #ifdef TNZTOOLS_EXPORTS
31 #define DVAPI DV_EXPORT_API
32 #define DVVAR DV_EXPORT_VAR
33 #else
34 #define DVAPI DV_IMPORT_API
35 #define DVVAR DV_IMPORT_VAR
36 #endif
37 
38 //=============================================================================
39 
40 //    Forward declarations
41 
42 class TTool;
43 class ToolOptionToolBar;
44 class TPropertyGroup;
45 class TPaletteHandle;
46 class TFrameHandle;
47 class TObjectHandle;
48 class TXsheetHandle;
49 class ToolHandle;
50 class SelectionScaleField;
51 class SelectionRotationField;
52 class SelectionMoveField;
53 class ToolOptionSlider;
54 class ToolOptionIntSlider;
55 class ThickChangeField;
56 class ToolOptionCombo;
57 class ToolOptionCheckbox;
58 class PegbarChannelField;
59 class ToolOptionPairSlider;
60 class ToolOptionControl;
61 class ToolOptionPopupButton;
62 class TXshLevelHandle;
63 class NoScaleField;
64 class PegbarCenterField;
65 class RGBLabel;
66 class MeasuredValueField;
67 class PaletteController;
68 class ClickableLabel;
69 
70 class QLabel;
71 class QPushButton;
72 class QPropertyAnimation;
73 class QFrame;
74 class QHBoxLayout;
75 class QComboBox;
76 class QStackedWidget;
77 
78 //=============================================================================
79 
80 // Preprocessor definitions
81 
82 #define TOOL_OPTIONS_LEFT_MARGIN 5
83 
84 //=============================================================================
85 
86 //***********************************************************************************************
87 //    ToolOptionToolBar  declaration
88 //***********************************************************************************************
89 
90 class ToolOptionToolBar final : public QToolBar {
91 public:
92   ToolOptionToolBar(QWidget *parent = 0);
93 
94   void addSpacing(int width);
95 };
96 
97 //***********************************************************************************************
98 //    ToolOptionsBox  declaration
99 //***********************************************************************************************
100 
101 class ToolOptionsBox : public QFrame {
102   Q_OBJECT
103 
104 protected:
105   QMap<std::string, ToolOptionControl *>
106       m_controls;  //!< property name -> ToolOptionControl
107   QMap<std::string, QLabel *> m_labels;
108 
109   QHBoxLayout *m_layout;
110 
111 public:
112   ToolOptionsBox(QWidget *parent, bool isScrollable = true);
113   ~ToolOptionsBox();
114 
115   virtual void
116   updateStatus();  //!< Invokes updateStatus() on all registered controls
onStageObjectChange()117   virtual void onStageObjectChange() {}
118 
hLayout()119   QHBoxLayout *hLayout() { return m_layout; }
120   void addControl(ToolOptionControl *control);
121 
122   ToolOptionControl *control(const std::string &controlName) const;
123 
124   QLabel *addLabel(QString name);
125   void addLabel(std::string propName, QLabel *label);
126   void addSeparator();
127 };
128 
129 //***********************************************************************************************
130 //    ToolOptionControlBuilder  declaration
131 //***********************************************************************************************
132 
133 class ToolOptionControlBuilder final : public TProperty::Visitor {
134   ToolOptionsBox *m_panel;
135   TTool *m_tool;
136   TPaletteHandle *m_pltHandle;
137   ToolHandle *m_toolHandle;
138 
139   int m_singleValueWidgetType;
140   int m_enumWidgetType;
141 
142 public:
143   ToolOptionControlBuilder(ToolOptionsBox *panel, TTool *tool,
144                            TPaletteHandle *pltHandle,
145                            ToolHandle *toolHandle = 0);
146 
147   enum SingleValueWidgetType { SLIDER = 0, FIELD };
setSingleValueWidgetType(int type)148   void setSingleValueWidgetType(int type) { m_singleValueWidgetType = type; }
149 
150   enum EnumWidgetType { COMBOBOX = 0, POPUPBUTTON, FONTCOMBOBOX };
setEnumWidgetType(int type)151   void setEnumWidgetType(int type) { m_enumWidgetType = type; }
152 
153 private:
hLayout()154   QHBoxLayout *hLayout() { return m_panel->hLayout(); }
155   QLabel *addLabel(TProperty *p);
156 
157   void visit(TDoubleProperty *p);
158   void visit(TDoublePairProperty *p);
159   void visit(TIntPairProperty *p);
160   void visit(TIntProperty *p);
161   void visit(TBoolProperty *p);
162   void visit(TStringProperty *p);
163   void visit(TEnumProperty *p);
164   void visit(TStyleIndexProperty *p);
165   void visit(TPointerProperty *p);
166 };
167 
168 //***********************************************************************************************
169 //    GenericToolOptionsBox  declaration
170 //***********************************************************************************************
171 
172 class GenericToolOptionsBox : public ToolOptionsBox {
173 public:
174   GenericToolOptionsBox(QWidget *parent, TTool *tool, TPaletteHandle *pltHandle,
175                         int propertyGroupIdx = 0, ToolHandle *toolHandle = 0,
176                         bool scrollable = true);
177 };
178 
179 //=============================================================================
180 //
181 // ArrowToolOptionsBox
182 //
183 //=============================================================================
184 
185 class ArrowToolOptionsBox final : public ToolOptionsBox {
186   Q_OBJECT
187 
188   enum AXIS { Position = 0, Rotation, Scale, Shear, CenterPosition, AllAxis };
189 
190   TPropertyGroup *m_pg;
191   bool m_splined;
192   TTool *m_tool;
193   TFrameHandle *m_frameHandle;
194   TObjectHandle *m_objHandle;
195   TXsheetHandle *m_xshHandle;
196 
197   QWidget **m_axisOptionWidgets;
198   QWidget *m_pickWidget;
199 
200   // General
201   ToolOptionCombo *m_chooseActiveAxisCombo;
202   ToolOptionCombo *m_pickCombo;
203   // enable to choose the target pegbar from the combobox
204   QComboBox *m_currentStageObjectCombo;
205 
206   // Position
207   PegbarChannelField *m_motionPathPosField;
208   PegbarChannelField *m_ewPosField;
209   PegbarChannelField *m_nsPosField;
210   PegbarChannelField *m_zField;
211   NoScaleField *m_noScaleZField;
212   ClickableLabel *m_motionPathPosLabel;
213   ClickableLabel *m_ewPosLabel;
214   ClickableLabel *m_nsPosLabel;
215   ClickableLabel *m_zLabel;
216 
217   ToolOptionCheckbox *m_lockEWPosCheckbox;
218   ToolOptionCheckbox *m_lockNSPosCheckbox;
219 
220   // SO = Stacked Order
221   ClickableLabel *m_soLabel;
222   PegbarChannelField *m_soField;
223 
224   // Rotation
225   ClickableLabel *m_rotationLabel;
226   PegbarChannelField *m_rotationField;
227 
228   // Scale
229   ClickableLabel *m_globalScaleLabel;
230   ClickableLabel *m_scaleHLabel;
231   ClickableLabel *m_scaleVLabel;
232   PegbarChannelField *m_globalScaleField;
233   PegbarChannelField *m_scaleHField;
234   PegbarChannelField *m_scaleVField;
235   ToolOptionCheckbox *m_lockScaleHCheckbox;
236   ToolOptionCheckbox *m_lockScaleVCheckbox;
237   ToolOptionCombo *m_maintainCombo;
238 
239   // Shear
240   ClickableLabel *m_shearHLabel;
241   ClickableLabel *m_shearVLabel;
242   PegbarChannelField *m_shearHField;
243   PegbarChannelField *m_shearVField;
244   ToolOptionCheckbox *m_lockShearHCheckbox;
245   ToolOptionCheckbox *m_lockShearVCheckbox;
246 
247   // Center Position
248   ClickableLabel *m_ewCenterLabel;
249   ClickableLabel *m_nsCenterLabel;
250   PegbarCenterField *m_ewCenterField;
251   PegbarCenterField *m_nsCenterField;
252   ToolOptionCheckbox *m_lockEWCenterCheckbox;
253   ToolOptionCheckbox *m_lockNSCenterCheckbox;
254 
255   ToolOptionCheckbox *m_globalKey;
256 
257   // enables adjusting value by dragging on the label
258   void connectLabelAndField(ClickableLabel *label, MeasuredValueField *field);
259 
260 public:
261   ArrowToolOptionsBox(QWidget *parent, TTool *tool, TPropertyGroup *pg,
262                       TFrameHandle *frameHandle, TObjectHandle *objHandle,
263                       TXsheetHandle *xshHandle, ToolHandle *toolHandle);
264 
265   void updateStatus();
266   void onStageObjectChange();
267 
268 protected:
269   void showEvent(QShowEvent *);
270   void hideEvent(QShowEvent *);
271 
272   void setSplined(bool on);
273   bool isCurrentObjectSplined() const;
274 
275 protected slots:
onFrameSwitched()276   void onFrameSwitched() { updateStatus(); }
277   // update the object list in combobox
278   void updateStageObjectComboItems();
279   // syncronize the current item in the combobox to the selected stage object
280   void syncCurrentStageObjectComboItem();
281   // change the current stage object when user changes it via combobox by hand
282   void onCurrentStageObjectComboActivated(int index);
283 
284   void onCurrentAxisChanged(int);
285 };
286 
287 //=============================================================================
288 //
289 // SelectionToolOptionsBox
290 //
291 //=============================================================================
292 
293 class DraggableIconView : public QWidget {
294   Q_OBJECT
295 public:
QWidget(parent)296   DraggableIconView(QWidget *parent = 0) : QWidget(parent){};
297 
298 protected:
299   // these are used for dragging on the icon to
300   // change the value of the field
301   void mousePressEvent(QMouseEvent *) override;
302   void mouseMoveEvent(QMouseEvent *) override;
303   void mouseReleaseEvent(QMouseEvent *) override;
304 
305 signals:
306   void onMousePress(QMouseEvent *event);
307   void onMouseMove(QMouseEvent *event);
308   void onMouseRelease(QMouseEvent *event);
309 };
310 
311 class IconViewField final : public DraggableIconView {
312   Q_OBJECT
313 
314 public:
315   enum IconType {
316     Icon_ScalePeg = 0,
317     Icon_Rotation,
318     Icon_Position,
319     Icon_Thickness,
320     Icon_Amount
321   };
322 
323 private:
324   IconType m_iconType;
325 
326 protected:
327   QPixmap m_pm[Icon_Amount];
328   Q_PROPERTY(
329       QPixmap ScalePegPixmap READ getScalePegPixmap WRITE setScalePegPixmap);
330   Q_PROPERTY(
331       QPixmap RotationPixmap READ getRotationPixmap WRITE setRotationPixmap);
332   Q_PROPERTY(
333       QPixmap PositionPixmap READ getPositionPixmap WRITE setPositionPixmap);
334 
335 public:
336   IconViewField(QWidget *parent = 0, IconType iconType = Icon_ScalePeg);
337 
getScalePegPixmap()338   QPixmap getScalePegPixmap() const { return m_pm[Icon_ScalePeg]; }
setScalePegPixmap(const QPixmap & pixmap)339   void setScalePegPixmap(const QPixmap &pixmap) {
340     m_pm[Icon_ScalePeg] = pixmap;
341   }
getRotationPixmap()342   QPixmap getRotationPixmap() const { return m_pm[Icon_Rotation]; }
setRotationPixmap(const QPixmap & pixmap)343   void setRotationPixmap(const QPixmap &pixmap) {
344     m_pm[Icon_Rotation] = pixmap;
345   }
getPositionPixmap()346   QPixmap getPositionPixmap() const { return m_pm[Icon_Position]; }
setPositionPixmap(const QPixmap & pixmap)347   void setPositionPixmap(const QPixmap &pixmap) {
348     m_pm[Icon_Position] = pixmap;
349   }
350 
351 protected:
352   void paintEvent(QPaintEvent *e);
353 };
354 
355 //-----------------------------------------------------------------------------
356 
357 class SelectionToolOptionsBox final : public ToolOptionsBox,
358                                       public TProperty::Listener {
359   Q_OBJECT
360 
361   TTool *m_tool;
362 
363   ToolOptionCheckbox *m_setSaveboxCheckbox;
364   bool m_isVectorSelction;
365   QLabel *m_scaleXLabel;
366   SelectionScaleField *m_scaleXField;
367   QLabel *m_scaleYLabel;
368   SelectionScaleField *m_scaleYField;
369   DVGui::CheckBox *m_scaleLink;
370   SelectionRotationField *m_rotationField;
371   QLabel *m_moveXLabel;
372   SelectionMoveField *m_moveXField;
373   QLabel *m_moveYLabel;
374   SelectionMoveField *m_moveYField;
375   ThickChangeField *m_thickChangeField;
376 
377   ToolOptionPopupButton *m_capStyle;
378   ToolOptionPopupButton *m_joinStyle;
379   ToolOptionIntSlider *m_miterField;
380 
381 public:
382   SelectionToolOptionsBox(QWidget *parent, TTool *tool,
383                           TPaletteHandle *pltHandle, ToolHandle *toolHandle);
384 
385   void updateStatus();
386   void onPropertyChanged();
387 
388 protected slots:
389   // addToUndo is only set to false when dragging with the mouse
390   // to set the value.  It is set to true on mouse release.
391   void onScaleXValueChanged(bool addToUndo = true);
392   void onScaleYValueChanged(bool addToUndo = true);
393   void onSetSaveboxCheckboxChanged(bool);
394 };
395 
396 //=============================================================================
397 //
398 // GeometricToolOptionsBox
399 //
400 //=============================================================================
401 
402 class GeometricToolOptionsBox final : public ToolOptionsBox {
403   Q_OBJECT
404 
405   int m_targetType;
406 
407   QLabel *m_poligonSideLabel, *m_hardnessLabel;
408   ToolOptionSlider *m_hardnessField;
409   ToolOptionIntSlider *m_poligonSideField;
410   ToolOptionCombo *m_shapeField;
411   ToolOptionCheckbox *m_pencilMode;
412   ToolOptionIntSlider *m_miterField;
413   ToolOptionCheckbox *m_snapCheckbox, *m_smoothCheckbox;
414   ToolOptionCombo *m_snapSensitivityCombo;
415   TTool *m_tool;
416 
417 public:
418   GeometricToolOptionsBox(QWidget *parent, TTool *tool,
419                           TPaletteHandle *pltHandle, ToolHandle *toolHandle);
420 
421   void updateStatus();
422 
423 protected slots:
424   void onShapeValueChanged(int);
425   void onPencilModeToggled(bool);
426   void onJoinStyleChanged(int);
427 };
428 
429 //=============================================================================
430 //
431 // TypeToolOptionsBox
432 //
433 //=============================================================================
434 
435 class TypeToolOptionsBox final : public ToolOptionsBox {
436   Q_OBJECT
437 
438   TTool *m_tool;
439 
440 public:
441   TypeToolOptionsBox(QWidget *parent, TTool *tool, TPaletteHandle *pltHandle,
442                      ToolHandle *toolHandle);
443 
444   void updateStatus();
445 
446 protected slots:
447   void onFieldChanged();
448 };
449 
450 //=============================================================================
451 //
452 // PaintbrushToolOptionsBox
453 //
454 //=============================================================================
455 
456 class PaintbrushToolOptionsBox final : public ToolOptionsBox {
457   Q_OBJECT
458 
459   ToolOptionCombo *m_colorMode;
460   ToolOptionCheckbox *m_selectiveMode;
461 
462 public:
463   PaintbrushToolOptionsBox(QWidget *parent, TTool *tool,
464                            TPaletteHandle *pltHandle, ToolHandle *toolHandle);
465 
466   void updateStatus();
467 
468 protected slots:
469   void onColorModeChanged(int);
470 };
471 
472 //=============================================================================
473 //
474 // FullColorFillToolOptionsBox
475 //
476 //=============================================================================
477 
478 class FullColorFillToolOptionsBox final : public ToolOptionsBox {
479   Q_OBJECT
480 
481 public:
482   FullColorFillToolOptionsBox(QWidget *parent, TTool *tool,
483                               TPaletteHandle *pltHandle,
484                               ToolHandle *toolHandle);
485 };
486 
487 //=============================================================================
488 //
489 // FillToolOptionsBox
490 //
491 //=============================================================================
492 
493 class FillToolOptionsBox final : public ToolOptionsBox {
494   Q_OBJECT
495 
496   int m_targetType;
497   QLabel *m_fillDepthLabel;
498   ToolOptionCombo *m_colorMode, *m_toolType;
499   ToolOptionCheckbox *m_selectiveMode, *m_segmentMode, *m_onionMode,
500       *m_multiFrameMode, *m_autopaintMode;
501   ToolOptionPairSlider *m_fillDepthField;
502 
503 public:
504   FillToolOptionsBox(QWidget *parent, TTool *tool, TPaletteHandle *pltHandle,
505                      ToolHandle *toolHandle);
506 
507   void updateStatus();
508 
509 protected slots:
510   void onColorModeChanged(int);
511   void onToolTypeChanged(int);
512   void onOnionModeToggled(bool);
513   void onMultiFrameModeToggled(bool);
514 };
515 
516 //=============================================================================
517 //
518 // BrushToolOptionsBox
519 //
520 //=============================================================================
521 
522 class BrushToolOptionsBox final : public ToolOptionsBox {
523   Q_OBJECT
524 
525   TTool *m_tool;
526 
527   ToolOptionCheckbox *m_pencilMode;
528   QLabel *m_hardnessLabel;
529   ToolOptionSlider *m_hardnessField;
530   ToolOptionPopupButton *m_joinStyleCombo;
531   ToolOptionIntSlider *m_miterField;
532   ToolOptionCombo *m_presetCombo;
533   ToolOptionCheckbox *m_snapCheckbox;
534   ToolOptionCombo *m_snapSensitivityCombo;
535   QPushButton *m_addPresetButton;
536   QPushButton *m_removePresetButton;
537 
538 private:
539   class PresetNamePopup;
540   PresetNamePopup *m_presetNamePopup;
541   void filterControls();
542 
543 public:
544   BrushToolOptionsBox(QWidget *parent, TTool *tool, TPaletteHandle *pltHandle,
545                       ToolHandle *toolHandle);
546 
547   void updateStatus();
548 
549 protected slots:
550 
551   void onPencilModeToggled(bool);
552   void onAddPreset();
553   void onRemovePreset();
554 };
555 
556 //=============================================================================
557 //
558 // EraserToolOptionsBox
559 //
560 //=============================================================================
561 
562 class EraserToolOptionsBox final : public ToolOptionsBox {
563   Q_OBJECT
564 
565   ToolOptionCheckbox *m_pencilMode, *m_invertMode, *m_multiFrameMode;
566   ToolOptionCombo *m_toolType, *m_colorMode;
567   QLabel *m_hardnessLabel;
568   ToolOptionSlider *m_hardnessField;
569 
570 public:
571   EraserToolOptionsBox(QWidget *parent, TTool *tool, TPaletteHandle *pltHandle,
572                        ToolHandle *toolHandle);
573 
574   void updateStatus();
575 
576 protected slots:
577   void onPencilModeToggled(bool);
578   void onToolTypeChanged(int);
579   void onColorModeChanged(int);
580 };
581 
582 //=============================================================================
583 //
584 // RulerToolOptionsBox
585 //
586 //=============================================================================
587 
588 class RulerToolOptionsBox final : public ToolOptionsBox {
589   Q_OBJECT
590 
591   MeasuredValueField *m_Xfld;
592   MeasuredValueField *m_Yfld;
593   MeasuredValueField *m_Wfld;
594   MeasuredValueField *m_Hfld;
595   MeasuredValueField *m_Afld;
596   MeasuredValueField *m_Lfld;
597 
598   QLabel *m_XpixelFld;
599   QLabel *m_YpixelFld;
600   QLabel *m_WpixelFld;
601   QLabel *m_HpixelFld;
602 
603   TTool *m_tool;
604 
605 public:
606   RulerToolOptionsBox(QWidget *parent, TTool *tool);
607 
608   void updateValues(bool isRasterLevelEditing, double X, double Y, double W,
609                     double H, double A, double L, int Xpix = 0, int Ypix = 0,
610                     int Wpix = 0, int Hpix = 0);
611 
612   void resetValues();
613 };
614 
615 //=============================================================================
616 //
617 // TapeToolOptionsBox
618 //
619 //=============================================================================
620 
621 class TapeToolOptionsBox final : public ToolOptionsBox {
622   Q_OBJECT
623 
624   ToolOptionCheckbox *m_smoothMode, *m_joinStrokesMode;
625   ToolOptionCombo *m_toolMode, *m_typeMode;
626   QLabel *m_autocloseLabel;
627   ToolOptionSlider *m_autocloseField;
628 
629 public:
630   TapeToolOptionsBox(QWidget *parent, TTool *tool, TPaletteHandle *pltHandle,
631                      ToolHandle *toolHandle);
632 
633   void updateStatus();
634 
635 protected slots:
636   void onToolTypeChanged(int);
637   void onToolModeChanged(int);
638   void onJoinStrokesModeChanged();
639 };
640 
641 //=============================================================================
642 //
643 // RGBPickerToolOptionsBox
644 //
645 //=============================================================================
646 
647 class RGBPickerToolOptionsBox final : public ToolOptionsBox {
648   Q_OBJECT
649   ToolOptionCheckbox *m_realTimePickMode;
650   // label with background color
651   RGBLabel *m_currentRGBLabel;
652 
653 public:
654   RGBPickerToolOptionsBox(QWidget *parent, TTool *tool,
655                           TPaletteHandle *pltHandle, ToolHandle *toolHandle,
656                           PaletteController *paletteController);
657   void updateStatus();
658 protected slots:
659   void updateRealTimePickLabel(const QColor &);
660 };
661 
662 //=============================================================================
663 //
664 // StylePickerToolOptionsBox
665 //
666 //=============================================================================
667 
668 class StylePickerToolOptionsBox final : public ToolOptionsBox {
669   Q_OBJECT
670   ToolOptionCheckbox *m_realTimePickMode;
671 
672   QLabel *m_currentStyleLabel;
673 
674 public:
675   StylePickerToolOptionsBox(QWidget *parent, TTool *tool,
676                             TPaletteHandle *pltHandle, ToolHandle *toolHandle,
677                             PaletteController *paletteController);
678   void updateStatus();
679 protected slots:
680   void updateRealTimePickLabel(const int, const int, const int);
681 };
682 
683 //=============================================================================
684 //
685 // ShiftTraceToolOptionBox
686 // shown only when "Edit Shift" mode is active
687 //
688 //=============================================================================
689 
690 class ShiftTraceToolOptionBox final : public ToolOptionsBox {
691   Q_OBJECT
692   QFrame *m_prevFrame, *m_afterFrame;
693   QRadioButton *m_prevRadioBtn, *m_afterRadioBtn;
694   QPushButton *m_resetPrevGhostBtn, *m_resetAfterGhostBtn;
695   TTool *m_tool;
696   void resetGhost(int index);
697 
698 protected:
699   void showEvent(QShowEvent *) override;
700   void hideEvent(QShowEvent *);
701 
702 public:
703   ShiftTraceToolOptionBox(QWidget *parent = 0, TTool *tool = 0);
704   void updateStatus() override;
705 protected slots:
706   void onResetPrevGhostBtnPressed();
707   void onResetAfterGhostBtnPressed();
708   void onPrevRadioBtnClicked();
709   void onAfterRadioBtnClicked();
710   void updateColors();
711 };
712 
713 //=============================================================================
714 //
715 // ZoomToolOptionsBox
716 //
717 //=============================================================================
718 
719 class ZoomToolOptionsBox final : public ToolOptionsBox {
720   Q_OBJECT
721 
722 public:
723   ZoomToolOptionsBox(QWidget *parent, TTool *tool, TPaletteHandle *pltHandle,
724                      ToolHandle *toolHandle);
725 };
726 
727 //=============================================================================
728 //
729 // RotateToolOptionsBox
730 //
731 //=============================================================================
732 
733 class RotateToolOptionsBox final : public ToolOptionsBox {
734   Q_OBJECT
735 
736 public:
737   RotateToolOptionsBox(QWidget *parent, TTool *tool, TPaletteHandle *pltHandle,
738                        ToolHandle *toolHandle);
739 };
740 
741 //=============================================================================
742 //
743 // HandToolOptionsBox
744 //
745 //=============================================================================
746 
747 class HandToolOptionsBox final : public ToolOptionsBox {
748   Q_OBJECT
749 
750 public:
751   HandToolOptionsBox(QWidget *parent, TTool *tool, TPaletteHandle *pltHandle,
752                      ToolHandle *toolHandle);
753 };
754 
755 //-----------------------------------------------------------------------------
756 
757 class DVAPI ToolOptions final : public QFrame {
758   Q_OBJECT
759 
760   int m_width, m_height;
761   std::map<TTool *, ToolOptionsBox *> m_panels;
762   QWidget *m_panel;
763 
764 public:
765   ToolOptions();
766   ~ToolOptions();
767 
getPanel()768   QWidget *getPanel() const { return m_panel; }
769 
770 protected:
771   void showEvent(QShowEvent *);
772   void hideEvent(QShowEvent *);
773 
774 public slots:
775 
776   void onToolSwitched();
777   void onToolChanged();
778   void onStageObjectChange();
779 
780 signals:
781   // used in ComboViewer to handle Tab focus
782   void newPanelCreated();
783 
784   //  void toolOptionChange();
785 };
786 
787 #endif  // PANE_H
788