diff --git a/ci-scripts/osx/travis-build.sh b/ci-scripts/osx/travis-build.sh index 0e8d28fa..d5277b97 100644 --- a/ci-scripts/osx/travis-build.sh +++ b/ci-scripts/osx/travis-build.sh @@ -3,8 +3,10 @@ pushd thirdparty/tiff-4.0.3 ./configure && make popd cd toonz && mkdir build && cd build +QTVERSION=`ls /usr/local/Cellar/qt` +echo "QT Version detected: $QTVERSION" cmake ../sources \ - -DQT_PATH=/usr/local/Cellar/qt/5.12.2/lib/ \ + -DQT_PATH=/usr/local/Cellar/qt/$QTVERSION/lib/ \ -DTIFF_INCLUDE_DIR=../../thirdparty/tiff-4.0.3/libtiff/ \ -DSUPERLU_INCLUDE_DIR=../../thirdparty/superlu/SuperLU_4.1/include/ make -j 2 diff --git a/stuff/config/qss/Blue/Blue.qss b/stuff/config/qss/Blue/Blue.qss index 23417ad6..77fc2b08 100644 --- a/stuff/config/qss/Blue/Blue.qss +++ b/stuff/config/qss/Blue/Blue.qss @@ -1 +1 @@ -.button-show,#LoadLevelShowButton,#CleanupSettingsShowButton,#OutputSettingsShowButton,#FxSettingsPreviewShowButton{image:url('../Default/imgs/white/plus.svg');image-position:center center;margin:0;padding:1;min-width:10;min-height:10}.button-show:checked,#LoadLevelShowButton:checked,#CleanupSettingsShowButton:checked,#OutputSettingsShowButton:checked,#FxSettingsPreviewShowButton:checked{background-color:#2b2c2d;border-color:#262728;image:url('../Default/imgs/white/minus.svg')}.button-show:checked:pressed,#LoadLevelShowButton:checked:pressed,#CleanupSettingsShowButton:checked:pressed,#OutputSettingsShowButton:checked:pressed,#FxSettingsPreviewShowButton:checked:pressed{background-color:#2b2c2d;border-color:#262728}.button-show:checked:hover,#LoadLevelShowButton:checked:hover,#CleanupSettingsShowButton:checked:hover,#OutputSettingsShowButton:checked:hover,#FxSettingsPreviewShowButton:checked:hover{background-color:#303133}.button-tool,QToolButton,#CameraSettingsRadioButton::indicator,#ForceSquaredPixelButton,#SchematicBottomFrame QToolBar QToolButton,#EditToolLockButton::indicator,#flipCustomize{background-color:rgba(255,255,255,0);border:1 solid rgba(255,255,255,0);border-radius:2;color:#e4e5e9;margin:1;padding:0}.button-tool:hover,QToolButton:hover,#CameraSettingsRadioButton::indicator:hover,#ForceSquaredPixelButton:hover,#colorSliderAddButton:hover,#colorSliderSubButton:hover,#SchematicBottomFrame QToolBar QToolButton:hover,#EditToolLockButton::indicator:hover,#flipCustomize:hover{background-color:#6e7174;border-color:#6e7174;color:#e4e5e9}.button-tool:pressed,QToolButton:pressed,#CameraSettingsRadioButton::indicator:pressed,#ForceSquaredPixelButton:pressed,#colorSliderAddButton:pressed,#colorSliderSubButton:pressed,#SchematicBottomFrame QToolBar QToolButton:pressed,#EditToolLockButton::indicator:pressed,#flipCustomize:pressed{background-color:#2b2c2d;border-color:#262728;color:#e4e5e9}.button-tool:checked,QToolButton:checked,#CameraSettingsRadioButton::indicator:checked,#ForceSquaredPixelButton:checked,#SchematicBottomFrame QToolBar QToolButton:checked,#EditToolLockButton::indicator:checked,#flipCustomize:checked{background-color:#5385a6;border-color:#5385a6;color:#fff}.button-tool:checked:hover,QToolButton:checked:hover,#CameraSettingsRadioButton::indicator:checked:hover,#ForceSquaredPixelButton:checked:hover,#SchematicBottomFrame QToolBar QToolButton:checked:hover,#EditToolLockButton::indicator:checked:hover,#flipCustomize:checked:hover{background-color:#6c98b6;border-color:#6c98b6}.button-tool:disabled,QToolButton:disabled,#CameraSettingsRadioButton::indicator:disabled,#ForceSquaredPixelButton:disabled,#SchematicBottomFrame QToolBar QToolButton:disabled,#EditToolLockButton::indicator:disabled,#flipCustomize:disabled{color:#808080}.button-flat,PaletteViewer QToolBar QToolButton{background-color:none;border:0;border-radius:0;margin:0}.button-flat:hover,PaletteViewer QToolBar QToolButton:hover{background-color:#6e7174}.button-flat:pressed,PaletteViewer QToolBar QToolButton:pressed{background-color:#212223}.frame,.GroupBox,#LoadLevelFrame,#PsdSettingsGroupBox,#CleanupSettingsFrame,#OutputSettingsBox,#OutputSettingsCameraBox,#SolidLineFrame,#FunctionParametersPanel,QGroupBox{border:1 solid #212223;border-radius:2}.tab-container,#TabBarContainer{background-color:transparent;qproperty-BottomAboveLineColor:#323435;qproperty-BottomBelowLineColor:#212223}.tab-flat,#StyleEditorTabBar::tab,#PaletteTabBar::tab,#FxSettingsTabBar::tab{background-color:#323435;border-right:1 solid #212223;border-bottom:1 solid #212223;color:#94969a;padding:3 4 3 4}.tab-flat:hover,#StyleEditorTabBar::tab:hover,#PaletteTabBar::tab:hover,#FxSettingsTabBar::tab:hover{background-color:#414345;color:#94969a}.tab-flat:selected,#StyleEditorTabBar::tab:selected,#PaletteTabBar::tab:selected,#FxSettingsTabBar::tab:selected{background-color:#414345;color:#fff;border-bottom-color:#414345}.tab-flat:only-one,#StyleEditorTabBar::tab:only-one,#PaletteTabBar::tab:only-one,#FxSettingsTabBar::tab:only-one{margin:0}.tab-round{background-color:#323435;border-top:1 solid #212223;border-right:1 solid #212223;border-left:1 solid #212223;border-bottom:1 solid #212223;color:#94969a;margin:3 -1 0 0;padding:2 7 1 7}.tab-round:hover{background-color:#414345;color:#94969a}.tab-round:selected{background-color:#414345;border-top-right-radius:2;border-top-left-radius:2;border-bottom-color:#414345;color:#fff;margin:1 -1 -1 0;padding:2 7 2 7}.tab-round:only-one{margin:1 0 0 0;padding:3 7 3 7}.tab-round:last{margin-right:0;border-top-right-radius:2}.tab-round:first{border-top-left-radius:2}QWidget{background-color:#414345;color:#d6d8dd}QWidget:disabled{color:#808080}QFrame{border:0;margin:0;padding:0}QToolTip,#helpToolTip{background-color:#fff;border:1 solid #000;color:#000;padding:1 1}#DockSeparator,QMainWindow::separator,QSplitter::handle{background-color:#141516;height:4;width:4}#TDockPlaceholder{background-color:#F77272}TPanel{background-color:#141516}#TopBar{background:#414345;border:0;border-bottom:1 solid #212223;height:21}#TopBar #EditToolLockButton{background:#414345;spacing:0}#TopBar #EditToolLockButton::indicator{background:none;border:none;height:18;margin:1 2 0 0;padding-left:0;padding-right:0}#TopBarTabContainer{background-color:#414345;margin-bottom:1}#StackedMenuBar{border:0;margin:0;padding:0}QMenuBar{background-color:#414345;border:0}QMenuBar::item{background-color:#414345;border-left:1 solid #414345;margin:0;padding:3 5}QMenuBar::item:selected{background-color:rgba(255,255,255,0.15);color:#d6d8dd}QMenuBar::item:pressed{background-color:#5385a6;color:#fff}#TopBarTab{margin:0;padding:0}#TopBarTab::tab{background-color:#323435;border-top:1 solid #212223;border-right:1 solid #212223;color:#94969a;margin:0 0 0 0;padding:2 8 3 8}#TopBarTab::tab:hover{background-color:#414345;color:#94969a}#TopBarTab::tab:selected{background-color:#414345;color:#fff}#TopBarTab::tab:first{border-left:1 solid #212223}#TopBarTab::tab:last{border-right:1 solid #212223}QMenu{background-color:#414345;border:1 solid #212223;padding:2 0}QMenu::item{padding:3 28}QMenu::item:selected{background-color:#5385a6;color:#fff}QMenu::item:checked{color:#d6d8dd}QMenu::item:checked:selected{background-color:#5385a6;color:#fff}QMenu::item:disabled{background:none;color:#808080}QMenu::item:disabled:selected{border-color:transparent}QMenu::separator{border-top:1 solid #212223;height:0;margin:2 0}QMenu::icon{border-radius:2;margin:0 0 0 3;padding:1}QMenu::icon:checked{background-color:#5385a6}QMenu::indicator{margin-left:7}TPanelTitleBar{background-color:#323435;border-color:#212223;border-style:solid;border-width:0 0 1 0;height:20;min-height:20;qproperty-TitleColor:#8c9093;qproperty-ActiveTitleColor:#43AEE5;qproperty-BorderPixmap:url('none');qproperty-ActiveBorderPixmap:url('../Default/imgs/white/none');qproperty-FloatBorderPixmap:url('none');qproperty-FloatActiveBorderPixmap:url('../Default/imgs/white/none')}QAbstractScrollArea::corner{background-color:#2d2f30}QScrollBar{background-color:#2d2f30;border:0}QScrollBar:horizontal{height:16;margin:0}QScrollBar:vertical{margin:0;width:16}QScrollBar::handle{border:1 solid #4b4d50;border-radius:4}QScrollBar::handle:horizontal:hover,QScrollBar::handle:vertical:hover{background-color:#5f6265;border-color:#5f6265}QScrollBar::handle:horizontal:pressed,QScrollBar::handle:vertical:pressed{background-color:#72767a;border-color:#72767a}QScrollBar::handle:horizontal{background-color:#4b4d50;margin:3 16;min-width:20}QScrollBar::handle:vertical{background-color:#4b4d50;margin:16 3;min-height:20}QScrollBar::add-line{subcontrol-origin:margin;border:0}QScrollBar::add-line:horizontal{subcontrol-position:right;background-color:#2d2f30;margin:0;width:16}QScrollBar::add-line:vertical{subcontrol-position:bottom;background-color:#2d2f30;margin:0;height:16}QScrollBar::sub-line{border:0;subcontrol-origin:margin}QScrollBar::sub-line:horizontal{subcontrol-position:left;background-color:#2d2f30;margin:0;width:16}QScrollBar::sub-line:vertical{subcontrol-position:top;background-color:#2d2f30;margin:0;height:16}QScrollBar::up-arrow:vertical{image:url('../Default/imgs/white/scroll-up.svg');image-position:center center}QScrollBar::up-arrow:vertical:pressed{margin:1 0 0 0}QScrollBar::down-arrow:vertical{image:url('../Default/imgs/white/scroll-down.svg');image-position:center center}QScrollBar::down-arrow:vertical:pressed{margin:1 0 0 0}QScrollBar::left-arrow:horizontal{image:url('../Default/imgs/white/scroll-left.svg');image-position:center center}QScrollBar::left-arrow:horizontal:pressed{margin:1 0 0 0}QScrollBar::right-arrow:horizontal{image:url('../Default/imgs/white/scroll-right.svg');image-position:center center}QScrollBar::right-arrow:horizontal:pressed{margin:1 0 0 0}QScrollBar::sub-page:horizontal,QScrollBar::add-page:horizontal,QScrollBar::sub-page:vertical,QScrollBar::add-page:vertical{background:none}QToolBar{padding:0}QToolBar::separator:horizontal{border-left:1 solid #212223;margin:0 1;width:0}QToolBar::separator:vertical{border-top:1 solid #212223;height:0;margin:1 0}QToolBar QLabel{margin-top:1}QToolBar QToolBar{border:0}QToolButton::menu-indicator{image:none}QToolButton::menu-button{border-image:none}.DvScrollWidget QPushButton,DvScrollWidget QPushButton,#ScrollLeftButton QPushButton,#ScrollRightButton QPushButton,#ScrollUpButton QPushButton,#ScrollDownButton QPushButton{background-color:#616467;border:0 solid red;border-radius:0;padding:0;max-width:16}.DvScrollWidget QPushButton:hover,DvScrollWidget QPushButton:hover,#ScrollLeftButton QPushButton:hover,#ScrollRightButton QPushButton:hover,#ScrollUpButton QPushButton:hover,#ScrollDownButton QPushButton:hover{background-color:#6e7174}.DvScrollWidget QPushButton:pressed,DvScrollWidget QPushButton:pressed,#ScrollLeftButton QPushButton:pressed,#ScrollRightButton QPushButton:pressed,#ScrollUpButton QPushButton:pressed,#ScrollDownButton QPushButton:pressed{background-color:#2b2c2d}#ScrollLeftButton,#ScrollRightButton,#ScrollUpButton,#ScrollDownButton{margin:0;min-width:16}#ScrollLeftButton{border-right:1 solid #212223;image:url('../Default/imgs/white/scroll-left.svg')}#ScrollRightButton{border-left:1 solid #212223;margin-left:3;image:url('../Default/imgs/white/scroll-right.svg')}#ScrollUpButton{image:url('../Default/imgs/white/scroll-up.svg')}#ScrollDownButton{image:url('../Default/imgs/white/scroll-down.svg')}#keyFrameNavigator{background:none;margin:0;padding:0}#keyFrameNavigator QToolButton{min-width:18}#keyFrameNavigator #PreviousKey{image:url('../Default/imgs/white/prevkey.svg')}#keyFrameNavigator #PreviousKey:hover{image:url('../Default/imgs/white/prevkey_over.svg')}#keyFrameNavigator #PreviousKey:disabled{image:url('../Default/imgs/white/prevkey_disabled.svg')}#keyFrameNavigator #NextKey{image:url('../Default/imgs/white/nextkey.svg')}#keyFrameNavigator #NextKey:hover{image:url('../Default/imgs/white/nextkey_over.svg')}#keyFrameNavigator #NextKey:disabled{image:url('../Default/imgs/white/nextkey_disabled.svg')}.treeview,QTreeWidget,QTreeView,#FunctionEditorTree{background-color:#2d2f30;alternate-background-color:#323435;border:0;margin:0;outline:0}.treeview::item:selected,QTreeWidget::item:selected,QTreeView::item:selected,#FunctionEditorTree::item:selected{background-color:#5385a6;color:#fff}.treeview::branch:adjoins-item,QTreeWidget::branch:adjoins-item,QTreeView::branch:adjoins-item,#FunctionEditorTree::branch:adjoins-item{border-image:url('')}.treeview::branch:has-siblings,QTreeWidget::branch:has-siblings,QTreeView::branch:has-siblings,#FunctionEditorTree::branch:has-siblings{border-image:url('')}.treeview::branch:has-siblings:adjoins-item,QTreeWidget::branch:has-siblings:adjoins-item,QTreeView::branch:has-siblings:adjoins-item,#FunctionEditorTree::branch:has-siblings:adjoins-item{border-image:url('')}.treeview::branch:has-children:closed,QTreeWidget::branch:has-children:closed,QTreeView::branch:has-children:closed,#FunctionEditorTree::branch:has-children:closed{background:url('../Default/imgs/white/treebranch-closed.svg') no-repeat;background-position:center center;border-image:none;image:none}.treeview::branch:has-children:open,QTreeWidget::branch:has-children:open,QTreeView::branch:has-children:open,#FunctionEditorTree::branch:has-children:open{background:url('../Default/imgs/white/treebranch-open.svg') no-repeat;background-position:center center;image:none}.treeview::branch:has-children:has-siblings:closed,QTreeWidget::branch:has-children:has-siblings:closed,QTreeView::branch:has-children:has-siblings:closed,#FunctionEditorTree::branch:has-children:has-siblings:closed{background:url('../Default/imgs/white/treebranch-closed.svg') no-repeat;background-position:center center;border-image:none;image:none}.treeview::branch:has-children:has-siblings:open,QTreeWidget::branch:has-children:has-siblings:open,QTreeView::branch:has-children:has-siblings:open,#FunctionEditorTree::branch:has-children:has-siblings:open{background:url('../Default/imgs/white/treebranch-open.svg') no-repeat;background-position:center center;border-image:none;image:none}QListView{outline:0;background:#2d2f30;alternate-background-color:#323435}#TabBarContainer{background-color:#323435}.Button,QPushButton,.ComboBox,.ComboBox:checked,QComboBox,QComboBox:checked{background-color:#616467;border:1 solid #414345;border-radius:2;color:#e4e5e9;margin:0;padding:3 15}.Button:hover,QPushButton:hover,.ComboBox:hover,#ViewerFpsSlider::sub-line:horizontal:hover,#ViewerFpsSlider::add-line:horizontal:hover,QComboBox:hover{background-color:#6e7174;border-color:#414345;color:#e4e5e9}.Button:pressed,QPushButton:pressed,#ViewerFpsSlider::sub-line:horizontal:pressed,#ViewerFpsSlider::add-line:horizontal:pressed{background-color:#2b2c2d;border-color:#262728;color:#e4e5e9}.Button:checked,QPushButton:checked{background-color:#2b2c2d;border-color:#262728;color:#e4e5e9}.Button:checked:hover,QPushButton:checked:hover{background-color:#303133}.Button:checked:hover:pressed,QPushButton:checked:hover:pressed{background:#2b2c2d}.Button:disabled,QPushButton:disabled,.ComboBox:disabled,#ViewerFpsSlider::sub-line:horizontal:disabled,#ViewerFpsSlider::add-line:horizontal:disabled,QComboBox:disabled{background-color:#4d5052;border-color:#414345;color:#808080}#PushButton_NoPadding{padding:3}.ComboBox,.ComboBox:checked,QComboBox,QComboBox:checked{padding:1 0 1 4;margin:1 0}.ComboBox::drop-down,QComboBox::drop-down{image:url('../Default/imgs/white/combo_downarrow.svg');image-position:center center;width:16}.ComboBox::drop-down:disabled,QComboBox::drop-down:disabled{image:url('../Default/imgs/white/combo_downarrow_disabled.svg')}.ComboBox QAbstractItemView,QComboBox QAbstractItemView{background-color:#414345;border:1 solid #212223;selection-background-color:#5385a6;selection-color:#fff}.LineEdit,QPlainTextEdit,QLineEdit,#TaskSheetItem,#tasksRemoveBox,#tasksAddBox{background-color:#28292b;border:1 solid #262728;border-radius:2;color:#d6d8dd;selection-background-color:#5385a6;selection-color:#fff;padding:0 0 0 1}.LineEdit:focus,QPlainTextEdit:focus,QLineEdit:focus,#TaskSheetItem:focus,#tasksRemoveBox:focus,#tasksAddBox:focus{background-color:#28292b;border-color:#5385a6;color:#d6d8dd}.LineEdit:disabled,QPlainTextEdit:disabled,QLineEdit:disabled,#TaskSheetItem:disabled,#tasksRemoveBox:disabled,#tasksAddBox:disabled{background-color:#353638;border-color:#333537;color:#808080}.CheckBox,QCheckBox{color:#d6d8dd}.CheckBox:hover,QCheckBox:hover,.RadioButton:hover,QRadioButton:hover{color:#fff}.CheckBox:disabled,QCheckBox:disabled{color:#808080}.CheckBox::indicator,QMenu::indicator,QCheckBox::indicator,.GroupBox::indicator,QGroupBox::indicator{background-color:#28292b;border:1 solid #262728;border-radius:2;height:9;padding:1;width:9}.CheckBox::indicator:hover,QMenu::indicator:hover,.CheckBox::indicator:checked:hover,QCheckBox::indicator:hover,.GroupBox::indicator:hover,QMenu::indicator:checked:hover,QCheckBox::indicator:checked:hover,.GroupBox::indicator:checked:hover,QGroupBox::indicator:hover,QGroupBox::indicator:checked:hover{background-color:#28292b;border-color:#5385a6}.CheckBox::indicator:checked,QMenu::indicator:checked,QCheckBox::indicator:checked,.GroupBox::indicator:checked,QGroupBox::indicator:checked{background-color:#28292b;border-color:#262728;image:url('../Default/imgs/white/checkmark.svg')}.CheckBox::indicator:checked:disabled,QMenu::indicator:checked:disabled,QCheckBox::indicator:checked:disabled,.GroupBox::indicator:checked:disabled,QGroupBox::indicator:checked:disabled{background-color:#353638;border-color:#353638;image:url('../Default/imgs/white/checkmark_disabled.svg')}.CheckBox::indicator:disabled,QMenu::indicator:disabled,QCheckBox::indicator:disabled,.GroupBox::indicator:disabled,QGroupBox::indicator:disabled{background-color:#353638;border-color:#353638}.RadioButton::indicator:unchecked,QRadioButton::indicator:unchecked,#CameraSettingsRadioButton_Small::indicator:unchecked{image:url('../Default/imgs/white/radiobutton_unchecked.svg');image-position:center center}.RadioButton::indicator:checked,QRadioButton::indicator:checked,#CameraSettingsRadioButton_Small::indicator:checked{image:url('../Default/imgs/white/radiobutton_checked.svg');image-position:center center}.GroupBox,QGroupBox{margin:6 0 0 0;padding:5 0}.GroupBox::title,QGroupBox::title{subcontrol-origin:margin;left:15;margin:-3 0 0 0;padding:0 3}.GroupBox::title:hover,QGroupBox::title:hover{color:#fff}.GroupBox::title:disabled,QGroupBox::title:disabled{color:#808080}.GroupBox::indicator,QGroupBox::indicator{subcontrol-origin:margin;margin-top:2}.GroupBox:disabled,QGroupBox:disabled{color:#808080}.Slider::groove:horizontal,QSlider::groove:horizontal{background-color:transparent;background-image:url('../Default/imgs/white/slider-groove.svg');background-position:center center;background-repeat:repeat-x;margin:0;height:20;min-height:20}.Slider::groove:horizontal:disabled,QSlider::groove:horizontal:disabled{background-image:url('../Default/imgs/white/slider-groove_disabled.svg')}.Slider::handle:horizontal,QSlider::handle:horizontal{width:10;margin:-2 -1;image:url('../Default/imgs/white/slider-handle.svg')}.Slider::handle:horizontal:disabled,QSlider::handle:horizontal:disabled{image:url('../Default/imgs/white/slider-handle_disabled.svg')}#IntPairField,#DoublePairField{qproperty-LightLineColor:#262728;qproperty-LightLineEdgeColor:#262728;qproperty-DarkLineColor:#262728;qproperty-MiddleLineColor:#262728;qproperty-HandleLeftPixmap:url("../Default/imgs/white/slider-handle.svg");qproperty-HandleRightPixmap:url("../Default/imgs/white/slider-handle.svg");qproperty-HandleLeftGrayPixmap:url("../Default/imgs/white/slider-handle_disabled.svg");qproperty-HandleRightGrayPixmap:url("../Default/imgs/white/slider-handle_disabled.svg")}#DirTreeView{background-color:#2d2f30;alternate-background-color:#2d2f30;border:1 solid #212223;border-right:0}DvItemViewerPanel{qproperty-TextColor:#d6d8dd;qproperty-AlternateBackground:#3a3b3d;qproperty-SelectedTextColor:#fff;qproperty-FolderTextColor:#9fdaff;qproperty-SelectedItemBackground:#5385a6}#FileBrowser DvItemViewerPanel,#SceneCast DvItemViewerPanel{background-color:#414345}#FileBrowser #castFrame,#SceneCast #castFrame{border-top:1 solid #212223;border-right:1 solid #212223;border-bottom:1 solid #212223;margin:0}#FileBrowser QToolButton,#SceneCast QToolButton{padding:1}DvDirTreeView{qproperty-TextColor:#d6d8dd;qproperty-SelectedTextColor:#fff;qproperty-SelectedItemBackground:#5385a6;qproperty-FolderTextColor:#9fdaff;qproperty-SelectedFolderTextColor:#fff;alternate-background-color:#323435;background-color:#2d2f30;border:1 solid #212223}#FileDoesNotExistLabel{color:#f00}#SceneCast QToolBar{border-top:1 solid #212223}#SceneCast QToolButton{margin:3 1 2 1;padding:1}#CastBrowser{border:0;margin:0}#FilmStrip QComboBox{border-radius:0;border-width:0}#FilmStrip QComboBox QAbstractItemView{background-color:#414345}#CleanupSettings #CleanupSettingsFrame{margin-top:2;margin-bottom:4}#CleanupSettings QGroupBox{margin-bottom:3}ParamsPage{qproperty-TextColor:#d6d8dd}#CameraSettingsButton{padding:2}#CameraSettingsRadioButton:hover{background:none}#CameraSettingsRadioButton::indicator{border:1 solid rgba(255,255,255,0);height:18;padding:0;width:18}#CameraSettingsRadioButton::indicator:unchecked{image:url('../Default/imgs/white/lock_off.svg')}#CameraSettingsRadioButton::indicator:checked{background-color:#C34040;border-color:#C34040;image:url('../Default/imgs/white/lock_on.svg')}#CameraSettingsRadioButton::indicator:checked:hover{background-color:#d57a7a;border-color:#d57a7a}#CameraSettingsDPI{color:#9fdaff}#CameraSettingsRadioButton_Small{padding:0}#CameraSettingsRadioButton_Small::indicator{background-color:transparent;border:0;height:21;margin:0;width:11}#ForceSquaredPixelButton{height:16;border:1 solid rgba(255,255,255,0);image:url('../Default/imgs/white/fsp_unchecked.svg');padding:2;width:16;margin:0}#ForceSquaredPixelButton:checked{image:url('../Default/imgs/white/fsp_checked.svg')}#OutputSettingsLabel{color:#9fdaff}PencilTestPopup{min-height:730px;min-width:512px}#MatchLineButton{background-color:#66696c}#MatchLineButton:checked{background-color:#8c9093;border:2 solid #5385a6;border-radius:2}#LargeSizedText{font-size:17}#StartupLabel{padding:3}#StartupLabel:hover{background:#5a5d5f}QStatusBar{background-color:#c0c0c0}QStatusBar::item{border:0}QStatusBar QLabel{background-color:#c0c0c0}QStatusBar #StatusBarLabel{background-color:#fff;padding:1 3}#TitleTxtLabel{color:#9fdaff}#StyleEditor QPushButton{margin:2 1;padding:0}#StyleEditor #TabBarContainer{margin-left:-4}#StyleEditor #bottomWidget{border-top:1 solid #212223;padding:3 2 8 3}#StyleEditor #bottomWidget QPushButton{padding:3 5}#StyleEditorTabBar::tab::first{border-left:1 solid #212223}#HexagonalColorWheel{qproperty-BGColor:#414345}#colorSlider::groove:horizontal{height:1;border-image:none}#colorSlider::handle:horizontal{width:8;margin:-8 -4}#colorSliderAddButton,#colorSliderSubButton{background:none;border-color:transparent;image-position:center center;min-height:16;padding:0;min-width:18}#colorSliderAddButton{image:url('../Default/imgs/white/scroll-right.svg')}#colorSliderSubButton{image:url('../Default/imgs/white/scroll-left.svg')}#PlainColorPageParts{border-bottom:1 solid #212223}#PlainColorPageParts QLineEdit{max-width:35}PaletteViewer DvScrollWidget QPushButton{border-top:0;margin-bottom:1;max-width:15;min-width:15}PaletteViewer DvScrollWidget #ScrollLeftButton{border-radius:0;margin-bottom:1;max-width:16;min-width:16}PaletteViewer DvScrollWidget #ScrollRightButton{border-radius:0;margin-left:1;margin-bottom:1;max-width:16;min-width:16}PaletteViewer QToolBar{background:none;border-bottom:1 solid #212223;padding:0;margin:0}PaletteViewer QToolBar::separator:horizontal{margin:0}PaletteViewer QToolBar QToolButton{margin:0 0 1 0;padding:1 0 2 0}#PageViewer{qproperty-TextColor:#d6d8dd}#PaletteLockButton{border-radius:0;margin:0 0 1 1}#PaletteLockButton:checked{background-color:#C34040;border-color:#C34040}#PaletteLockButton:checked:hover{background-color:#d57a7a;border-color:#d57a7a}#WordButton{padding-right:0;padding-left:0}QDialog{background-color:#414345}QDialog #dialogButtonFrame{background-color:#37393a;border-top:1 solid #212223}QDialog #dialogButtonFrame QPushButton{border-color:#37393a;outline:0}QDialog #dialogButtonFrame QPushButton:focus{background-color:#5385a6;border-color:#37393a;color:#fff}QDialog #dialogButtonFrame QPushButton:focus:hover{background-color:#6c98b6}QDialog #dialogButtonFrame QPushButton:focus:pressed{background-color:#2b2c2d;border-color:#262728;color:#e4e5e9}#SceneSettings QLabel{color:#9fdaff}#PreferencesPopup QListWidget{background-color:#2d2f30;alternate-background-color:#2d2f30;border:1 solid #212223;font-size:13}#PreferencesPopup QListWidget::item{border:0;padding:3}#PreferencesPopup QListWidget::item:hover{color:#d6d8dd;background-color:rgba(255,255,255,0.15)}#PreferencesPopup QListWidget::item:selected{background-color:#5385a6;color:#fff}#ShortcutTree{border:1 solid #212223}#ShortcutTree::item{padding:1 0}#ShortcutTree QScrollBar:vertical{width:16;margin-right:-1}ProjectPopup QLabel{color:#9fdaff}#GearButton{qproperty-icon:url('../Default/imgs/white/gear.svg')}#SubfolderButton{qproperty-icon:url('../Default/imgs/white/subfolder.svg');padding-left:6px;padding-right:6px}#SubcameraButton{qproperty-icon:url('../Default/imgs/white/subcamera.svg');padding-left:6px;padding-right:6px}SchematicViewer{qproperty-TextColor:#d6d8dd;qproperty-VerticalLineColor:#222;qproperty-LevelColumnColor:#4C6E4C;qproperty-VectorColumnColor:#7B7B4C;qproperty-ChildColumnColor:#6A526B;qproperty-FullcolorColumnColor:#657A96;qproperty-FxColumnColor:#56553C;qproperty-PaletteColumnColor:#3A655F;qproperty-MeshColumnColor:#684D86;qproperty-ReferenceColumnColor:#616161;qproperty-TableColor:#62628c;qproperty-ActiveCameraColor:#2d7dca;qproperty-OtherCameraColor:#6c797b;qproperty-GroupColor:#3b6e9c;qproperty-PegColor:#9f6e3c;qproperty-SplineColor:#6a9d1c;qproperty-ActiveOutputColor:#2d7dca;qproperty-OtherOutputColor:#6c797b;qproperty-XsheetColor:#62628c;qproperty-NormalFxColor:#6a7e96;qproperty-MacroFxColor:#815c79;qproperty-ImageAdjustFxColor:#656287;qproperty-LayerBlendingFxColor:#4f757d;qproperty-MatteFxColor:#ae7171;qproperty-SchematicPreviewButtonBgOnColor:#c8c864;qproperty-SchematicPreviewButtonOnImage:url('../Default/imgs/white/x_prev_eye_on.svg');qproperty-SchematicPreviewButtonBgOffColor:#616161;qproperty-SchematicPreviewButtonOffImage:url('../Default/imgs/white/x_prev_eye_off.svg');qproperty-SchematicCamstandButtonBgOnColor:#eb906b;qproperty-SchematicCamstandButtonOnImage:url('../Default/imgs/white/x_table_view_on.svg');qproperty-SchematicCamstandButtonTranspImage:url('../Default/imgs/white/x_table_view_transp.svg');qproperty-SchematicCamstandButtonBgOffColor:#616161;qproperty-SchematicCamstandButtonOffImage:url('../Default/imgs/white/x_table_view_off.svg')}#SchematicBottomFrame{background-color:#414345;border:0;margin:0;padding:0}#SchematicBottomFrame QToolBar::separator:horizontal{margin:0}#SchematicBottomFrame QToolBar QToolButton{padding:0;margin:2}#SchematicSceneViewer{background-color:#353638;border-bottom:1 solid #212223}#FxSettingsTabBar::tab{border-top:1 solid #212223}#FxSettingsTabBar::tab::first,#FxSettingsTabBar::tab::only-one{border-left:1 solid #212223}FxSettings QToolBar{border-top:1 solid #212223;border-right:1 solid #212223;border-left:1 solid #212223;min-height:23;padding:3 0}FxSettings QToolBar QToolBar{border:0}#FxSettingsLabel{color:#a0e680}#FxSettingsHelpButton{background-color:#80a0dc;color:#000;padding-top:0;padding-bottom:0}#FxSettingsHelpButton:hover{background-color:#a8bee7}#ScriptConsole{font-family:'Courier New',monospace;border:0;color:#000000;padding:3}#ScriptConsole QFrame{background-color:#dcdcdc}#ScriptConsole TPanelTitleBar{background-color:#323435}#TaskSheetItemLabel{color:#d6d8dd}#Tasks QToolBar{border-bottom:1 solid #212223;margin:0;padding:0}#Tasks QToolBar QToolButton{margin:2 2 3 2}#ToolBar QToolBar{padding-left:2}#ToolOptions TPanelTitleBar{border-right:1 solid #212223;border-bottom:0}#CommandBar TPanelTitleBar{border-right:1 solid #212223;border-bottom:0}IconViewField{qproperty-ThicknessPixmap:url("../Default/imgs/white/selectiontool_thickness.svg")}#EditToolLockButton{spacing:0}#EditToolLockButton:hover{background:none}#EditToolLockButton::indicator{border:1 solid rgba(255,255,255,0);height:18;padding:0;width:18}#EditToolLockButton::indicator:unchecked{image:url('../Default/imgs/white/lock_off.svg')}#EditToolLockButton::indicator:checked{background-color:#C34040;border-color:#C34040;image:url('../Default/imgs/white/lock_on.svg')}#EditToolLockButton::indicator:checked:hover{background-color:#d57a7a;border-color:#d57a7a}PopupButton::menu-indicator{border-left:0;height:17;image:url('../Default/imgs/white/combo_downarrow.svg');width:10}PopupButton::menu-indicator:hover{image:url('../Default/imgs/white/combo_downarrow.svg')}PopupButton::menu-indicator:disabled{image:url('../Default/imgs/white/combo_downarrow_disabled.svg')}#Cap,#Join{padding:0 4 0 -8;max-width:32;min-width:32}#Cap QMenu,#Join QMenu{max-width:28;min-width:28}#Cap QMenu::item,#Join QMenu::item{max-width:28;min-width:28;padding:0}QToolBar#MediumPaddingToolBar QToolButton{padding-left:3;padding-right:3}QToolBar#WidePaddingToolBar QToolButton{padding-left:6;padding-right:6}#CommandBar{margin:0;padding:0;border:0}#CommandBar::separator:horizontal{margin-right:3;margin-left:3}#expandButton:checked{background-color:transparent;border-color:transparent;color:#d6d8dd}#expandButton:checked:hover{background-color:#6e7174;border-color:#6e7174}#expandButton:checked:pressed{background-color:#2b2c2d;border-color:#262728}#ComboViewerPanel Toolbar{border-bottom:1 solid #212223}#ComboViewerPanel Toolbar::separator:horizontal{margin:0 0 0 2}#ComboViewerPanel Toolbar QToolButton{margin:2 0 3 2}#ComboViewerToolOptions{border-bottom:1 solid #212223}#ComboViewer #ToolBarContainer,#ViewerPanel #ToolBarContainer,FlipBook #ToolBarContainer{background-color:transparent;border-top:2 solid #212223;border-bottom:1 solid #212223;padding-right:-1}#flipCustomize{margin-left:3}#flipCustomize::menu-button{background-color:transparent;width:35}#flipCustomize::menu-arrow{image:none}QToolBar#FlipConsolePlayToolBar::separator:horizontal{margin:0 3}QToolBar#FlipConsolePlayToolBar QToolButton{margin-top:2;margin-bottom:2;height:16;padding-left:1;padding-right:1}#ViewerFpsSlider{background-color:transparent;background-image:url('../Default/imgs/white/slider-groove.svg');background-position:center center;background-repeat:repeat-x;border:0;height:19;margin:0 3 0 37;max-width:300;min-width:0}#ViewerFpsSlider::sub-line:horizontal{subcontrol-origin:absolute;background-color:#616467;border:1 solid #414345;border-top-left-radius:2;border-bottom-left-radius:2;height:16;left:-33;width:14}#ViewerFpsSlider::add-line:horizontal{subcontrol-position:left;background-color:#616467;border:1 solid #414345;border-top-right-radius:2;border-bottom-right-radius:2;left:18;height:16;image-position:center center;width:13}#ViewerFpsSlider::handle::horizontal{background-color:#999c9f;border:1 solid #999c9f;border-radius:2;margin:2 0 3 0;min-width:9;width:9;max-width:9}FlipSlider{qproperty-PBHeight:15;qproperty-PBOverlay:url('../Default/imgs/white/flipslider.svg');qproperty-PBColorMarginLeft:1;qproperty-PBColorMarginTop:2;qproperty-PBColorMarginRight:1;qproperty-PBColorMarginBottom:2;qproperty-PBMarker:url('../Default/imgs/white/flipmarker.svg');qproperty-PBMarkerMarginLeft:3;qproperty-PBMarkerMarginRight:3;qproperty-notStartedColor:rgba(205,101,101,0.78);qproperty-startedColor:#1abc3f;qproperty-baseColor:#28292b;qproperty-finishedColor:#28292b}Ruler{qproperty-ParentBGColor:#414345;qproperty-ScaleColor:#d6d8dd}#RulerToolOptionValues{color:#000}#xsheetArea,#ScrollArea{background-color:#2d2f30;border:0}#xsheetScrollArea{border:0}#cornerWidget QToolButton{padding:0}#xsheetColumnAreaMenu_Preview{background-color:#E6E678}#xsheetColumnAreaMenu_Lock{background-color:#F5F5F5}#xsheetColumnAreaMenu_Camstand{background-color:#FFA480}#xsheetColumnAreaMenu_Preview,#xsheetColumnAreaMenu_Lock,#xsheetColumnAreaMenu_Camstand{color:#000}#noteTextEdit{color:#000}XsheetViewer{qproperty-TextColor:#d6d8dd;qproperty-BGColor:#353638;qproperty-LightLineColor:#262728;qproperty-MarkerLineColor:#1E96C4;qproperty-VerticalLineColor:#222;qproperty-VerticalLineHeadColor:#777b7f;qproperty-PreviewFrameTextColor:#9fdaff;qproperty-CurrentRowBgColor:#506082;qproperty-OnionSkinAreaBgColor:#303133;qproperty-EmptyColumnHeadColor:#5a5d60;qproperty-SelectedColumnTextColor:#E66464;qproperty-EmptyCellColor:#393b3d;qproperty-NotEmptyColumnColor:#414345;qproperty-SelectedEmptyCellColor:#64676a;qproperty-LevelColumnColor:#4C6E4C;qproperty-LevelColumnBorderColor:#8FB38F;qproperty-SelectedLevelColumnColor:#678667;qproperty-VectorColumnColor:#7B7B4C;qproperty-VectorColumnBorderColor:#BBBB9A;qproperty-SelectedVectorColumnColor:#949466;qproperty-ChildColumnColor:#6A526B;qproperty-ChildColumnBorderColor:#B1A3B3;qproperty-SelectedChildColumnColor:#816e82;qproperty-FullcolorColumnColor:#657A96;qproperty-FullcolorColumnBorderColor:#9EB8BB;qproperty-SelectedFullcolorColumnColor:#8895a6;qproperty-FxColumnColor:#56553C;qproperty-FxColumnBorderColor:#95958A;qproperty-SelectedFxColumnColor:#6f6e56;qproperty-ReferenceColumnColor:#616161;qproperty-ReferenceColumnBorderColor:#A2A2A2;qproperty-SelectedReferenceColumnColor:#7a7a7a;qproperty-PaletteColumnColor:#3A655F;qproperty-PaletteColumnBorderColor:#86ACA7;qproperty-SelectedPaletteColumnColor:#52807a;qproperty-MeshColumnColor:#684D86;qproperty-MeshColumnBorderColor:#BA92EF;qproperty-SelectedMeshColumnColor:#82689e;qproperty-SoundTextColumnColor:#c8c8c8;qproperty-SoundTextColumnBorderColor:#8c8c8c;qproperty-SelectedSoundTextColumnColor:#e2e2e2;qproperty-SoundColumnColor:#657456;qproperty-SoundColumnBorderColor:#A0AF7D;qproperty-SelectedSoundColumnColor:#7e8b72;qproperty-SoundColumnHlColor:#34FE5E;qproperty-SoundColumnTrackColor:#B6C29D;qproperty-ColumnHeadPastelizer:#000;qproperty-SelectedColumnHead:#506082;qproperty-LightLightBGColor:#393b3d;qproperty-LightBGColor:#eaebec;qproperty-DarkBGColor:#dbdcdd;qproperty-DarkLineColor:#8e9194;qproperty-XsheetColumnNameBgColor:rgba(0,0,0,0);qproperty-XsheetDragBarHighlightColor:rgba(255,255,255,0.5);qproperty-XsheetPreviewButtonBgOnColor:#c8c864;qproperty-XsheetPreviewButtonOnImage:url('../Default/imgs/white/x_prev_eye_on.svg');qproperty-XsheetPreviewButtonBgOffColor:rgba(255,255,255,0);qproperty-XsheetPreviewButtonOffImage:url('../Default/imgs/white/x_prev_eye_off.svg');qproperty-XsheetCamstandButtonBgOnColor:#eb906b;qproperty-XsheetCamstandButtonOnImage:url('../Default/imgs/white/x_table_view_on.svg');qproperty-XsheetCamstandButtonTranspImage:url('../Default/imgs/white/x_table_view_transp.svg');qproperty-XsheetCamstandButtonBgOffColor:rgba(255,255,255,0);qproperty-XsheetCamstandButtonOffImage:url('../Default/imgs/white/x_table_view_off.svg');qproperty-XsheetLockButtonBgOnColor:rgba(255,255,255,0.3);qproperty-XsheetLockButtonOnImage:url('../Default/imgs/white/x_lock_on.svg');qproperty-XsheetLockButtonBgOffColor:rgba(255,255,255,0);qproperty-XsheetLockButtonOffImage:url('../Default/imgs/white/x_lock_off.svg');qproperty-XsheetConfigButtonBgColor:rgba(255,255,255,0);qproperty-XsheetConfigButtonImage:url('../Default/imgs/white/x_config.svg');qproperty-TimelinePreviewButtonBgOnColor:rgba(255,255,255,0);qproperty-TimelinePreviewButtonOnImage:url('../Default/imgs/white/timeline_toggle_on.svg');qproperty-TimelinePreviewButtonBgOffColor:rgba(255,255,255,0);qproperty-TimelinePreviewButtonOffImage:url('../Default/imgs/white/timeline_toggle_off.svg');qproperty-TimelineCamstandButtonBgOnColor:rgba(255,255,255,0);qproperty-TimelineCamstandButtonOnImage:url('../Default/imgs/white/timeline_toggle_on.svg');qproperty-TimelineCamstandButtonTranspImage:url('../Default/imgs/white/timeline_toggle_transp.svg');qproperty-TimelineCamstandButtonBgOffColor:rgba(255,255,255,0);qproperty-TimelineCamstandButtonOffImage:url('../Default/imgs/white/timeline_toggle_off.svg');qproperty-TimelineLockButtonBgOnColor:rgba(255,255,255,0);qproperty-TimelineLockButtonOnImage:url('../Default/imgs/white/timeline_toggle_on.svg');qproperty-TimelineLockButtonBgOffColor:rgba(255,255,255,0);qproperty-TimelineLockButtonOffImage:url('../Default/imgs/white/timeline_toggle_off.svg');qproperty-TimelineConfigButtonBgColor:rgba(255,255,255,0);qproperty-TimelineConfigButtonImage:url('../Default/imgs/white/timeline_config.svg');qproperty-LayerHeaderPreviewImage:url('../Default/imgs/white/layer_header_prev_eye.svg');qproperty-LayerHeaderPreviewOverImage:url('../Default/imgs/white/layer_header_prev_eye_over.svg');qproperty-LayerHeaderCamstandImage:url('../Default/imgs/white/layer_header_table_view.svg');qproperty-LayerHeaderCamstandOverImage:url('../Default/imgs/white/layer_header_table_view_over.svg');qproperty-LayerHeaderLockImage:url('../Default/imgs/white/lock_on.svg');qproperty-LayerHeaderLockOverImage:url('../Default/imgs/white/lock_on_over.svg')}#XSheetToolbar{margin:0;padding:0;border:0}#XSheetToolbar QToolButton{padding:0;margin:4 1;min-height:19;height:19}#XSheetToolbar::separator:horizontal{margin:0 4}#FunctionEditor QToolBar{border-bottom:1 solid #212223}#FunctionEditor QToolBar QToolBar{border:0}#FunctionEditor QToolBar QLabel{margin-left:5}#FunctionEditor QToolBar QToolButton{height:18}#FunctionEditorTree{border-top:1 solid #212223}FunctionTreeView{qproperty-TextColor:#d6d8dd;qproperty-CurrentTextColor:#E66464}FunctionPanel{qproperty-BGColor:#343638;qproperty-ValueLineColor:#28292b;qproperty-FrameLineColor:#28292b;qproperty-OtherCurvesColor:#7f8386;qproperty-RulerBackground:#2d2e30;qproperty-TextColor:#d6d8dd;qproperty-SubColor:#000;qproperty-SelectedColor:#FFA500}SpreadsheetViewer{qproperty-LightLightBGColor:#393b3d;qproperty-CurrentRowBgColor:#506082;qproperty-LightLineColor:#262728;qproperty-MarkerLineColor:#1E96C4;qproperty-BGColor:#414345;qproperty-VerticalLineColor:#222;qproperty-KeyFrameColor:#995d1d;qproperty-KeyFrameBorderColor:#c9b04b;qproperty-SelectedKeyFrameColor:#be772b;qproperty-InBetweenColor:#666250;qproperty-InBetweenBorderColor:#cdcec8;qproperty-SelectedInBetweenColor:#7d7a6c;qproperty-SelectedEmptyColor:#64676a;qproperty-SelectedSceneRangeEmptyColor:#6d7073;qproperty-TextColor:#d6d8dd;qproperty-ColumnHeaderBorderColor:#777b7f;qproperty-SelectedColumnTextColor:#E66464}#ExpressionField{background-color:#e0e1e2;border:1 solid #2d2e2f;margin:0}#FunctionSegmentViewerLinkButton{background-image:url('../Default/imgs/white/segment_unlinked.svg');background-repeat:no-repeat}#FunctionSegmentViewerLinkButton:hover{background-repeat:no-repeat}#FunctionSegmentViewerLinkButton:checked{background-image:url('../Default/imgs/white/segment_linked.svg');background-repeat:no-repeat}#FunctionSegmentViewerLinkButton:disabled{background-image:url('../Default/imgs/white/segment_disabled.svg');background-repeat:no-repeat} \ No newline at end of file +.button-show,#LoadLevelShowButton,#CleanupSettingsShowButton,#OutputSettingsShowButton,#FxSettingsPreviewShowButton{image:url('../Default/imgs/white/plus.svg');image-position:center center;margin:0;padding:1;min-width:10;min-height:10}.button-show:checked,#LoadLevelShowButton:checked,#CleanupSettingsShowButton:checked,#OutputSettingsShowButton:checked,#FxSettingsPreviewShowButton:checked{background-color:#2b2c2d;border-color:#262728;image:url('../Default/imgs/white/minus.svg')}.button-show:checked:pressed,#LoadLevelShowButton:checked:pressed,#CleanupSettingsShowButton:checked:pressed,#OutputSettingsShowButton:checked:pressed,#FxSettingsPreviewShowButton:checked:pressed{background-color:#2b2c2d;border-color:#262728}.button-show:checked:hover,#LoadLevelShowButton:checked:hover,#CleanupSettingsShowButton:checked:hover,#OutputSettingsShowButton:checked:hover,#FxSettingsPreviewShowButton:checked:hover{background-color:#303133}.button-tool,QToolButton,#CameraSettingsRadioButton::indicator,#ForceSquaredPixelButton,#SchematicBottomFrame QToolBar QToolButton,#EditToolLockButton::indicator,#flipCustomize{background-color:rgba(255,255,255,0);border:1 solid rgba(255,255,255,0);border-radius:2;color:#e4e5e9;margin:1;padding:0}.button-tool:hover,QToolButton:hover,#CameraSettingsRadioButton::indicator:hover,#ForceSquaredPixelButton:hover,#colorSliderAddButton:hover,#colorSliderSubButton:hover,#SchematicBottomFrame QToolBar QToolButton:hover,#EditToolLockButton::indicator:hover,#flipCustomize:hover{background-color:#6e7174;border-color:#6e7174;color:#e4e5e9}.button-tool:pressed,QToolButton:pressed,#CameraSettingsRadioButton::indicator:pressed,#ForceSquaredPixelButton:pressed,#colorSliderAddButton:pressed,#colorSliderSubButton:pressed,#SchematicBottomFrame QToolBar QToolButton:pressed,#EditToolLockButton::indicator:pressed,#flipCustomize:pressed{background-color:#2b2c2d;border-color:#262728;color:#e4e5e9}.button-tool:checked,QToolButton:checked,#CameraSettingsRadioButton::indicator:checked,#ForceSquaredPixelButton:checked,#SchematicBottomFrame QToolBar QToolButton:checked,#EditToolLockButton::indicator:checked,#flipCustomize:checked{background-color:#5385a6;border-color:#5385a6;color:#fff}.button-tool:checked:hover,QToolButton:checked:hover,#CameraSettingsRadioButton::indicator:checked:hover,#ForceSquaredPixelButton:checked:hover,#SchematicBottomFrame QToolBar QToolButton:checked:hover,#EditToolLockButton::indicator:checked:hover,#flipCustomize:checked:hover{background-color:#6c98b6;border-color:#6c98b6}.button-tool:disabled,QToolButton:disabled,#CameraSettingsRadioButton::indicator:disabled,#ForceSquaredPixelButton:disabled,#SchematicBottomFrame QToolBar QToolButton:disabled,#EditToolLockButton::indicator:disabled,#flipCustomize:disabled{color:#808080}.button-flat,PaletteViewer QToolBar QToolButton{background-color:none;border:0;border-radius:0;margin:0}.button-flat:hover,PaletteViewer QToolBar QToolButton:hover{background-color:#6e7174}.button-flat:pressed,PaletteViewer QToolBar QToolButton:pressed{background-color:#212223}.frame,.GroupBox,#LoadLevelFrame,#PsdSettingsGroupBox,#CleanupSettingsFrame,#OutputSettingsBox,#OutputSettingsCameraBox,#SolidLineFrame,#FunctionParametersPanel,QGroupBox{border:1 solid #212223;border-radius:2}.tab-container,#TabBarContainer{background-color:transparent;qproperty-BottomAboveLineColor:#323435;qproperty-BottomBelowLineColor:#212223}.tab-flat,#StyleEditorTabBar::tab,#PaletteTabBar::tab,#FxSettingsTabBar::tab{background-color:#323435;border-right:1 solid #212223;border-bottom:1 solid #212223;color:#94969a;padding:3 4 3 4}.tab-flat:hover,#StyleEditorTabBar::tab:hover,#PaletteTabBar::tab:hover,#FxSettingsTabBar::tab:hover{background-color:#414345;color:#94969a}.tab-flat:selected,#StyleEditorTabBar::tab:selected,#PaletteTabBar::tab:selected,#FxSettingsTabBar::tab:selected{background-color:#414345;color:#fff;border-bottom-color:#414345}.tab-flat:only-one,#StyleEditorTabBar::tab:only-one,#PaletteTabBar::tab:only-one,#FxSettingsTabBar::tab:only-one{margin:0}.tab-round{background-color:#323435;border-top:1 solid #212223;border-right:1 solid #212223;border-left:1 solid #212223;border-bottom:1 solid #212223;color:#94969a;margin:3 -1 0 0;padding:2 7 1 7}.tab-round:hover{background-color:#414345;color:#94969a}.tab-round:selected{background-color:#414345;border-top-right-radius:2;border-top-left-radius:2;border-bottom-color:#414345;color:#fff;margin:1 -1 -1 0;padding:2 7 2 7}.tab-round:only-one{margin:1 0 0 0;padding:3 7 3 7}.tab-round:last{margin-right:0;border-top-right-radius:2}.tab-round:first{border-top-left-radius:2}QWidget{background-color:#414345;color:#d6d8dd}QWidget:disabled{color:#808080}QFrame{border:0;margin:0;padding:0}QToolTip,#helpToolTip{background-color:#fff;border:1 solid #000;color:#000;padding:1 1}#DockSeparator,QMainWindow::separator,QSplitter::handle{background-color:#141516;height:4;width:4}#TDockPlaceholder{background-color:#F77272}TPanel{background-color:#141516}#TopBar{background:#414345;border:0;border-bottom:1 solid #212223;height:21}#TopBar #EditToolLockButton{background:#414345;spacing:0}#TopBar #EditToolLockButton::indicator{background:none;border:none;height:18;margin:1 2 0 0;padding-left:0;padding-right:0}#TopBarTabContainer{background-color:#414345;margin-bottom:1}#StackedMenuBar{border:0;margin:0;padding:0}QMenuBar{background-color:#414345;border:0}QMenuBar::item{background-color:#414345;border-left:1 solid #414345;margin:0;padding:3 5}QMenuBar::item:selected{background-color:rgba(255,255,255,0.15);color:#d6d8dd}QMenuBar::item:pressed{background-color:#5385a6;color:#fff}#TopBarTab{margin:0;padding:0}#TopBarTab::tab{background-color:#323435;border-top:1 solid #212223;border-right:1 solid #212223;color:#94969a;margin:0 0 0 0;padding:2 8 3 8}#TopBarTab::tab:hover{background-color:#414345;color:#94969a}#TopBarTab::tab:selected{background-color:#414345;color:#fff}#TopBarTab::tab:first{border-left:1 solid #212223}#TopBarTab::tab:last{border-right:1 solid #212223}QMenu{background-color:#414345;border:1 solid #212223;padding:2 0}QMenu::item{padding:3 28}QMenu::item:selected{background-color:#5385a6;color:#fff}QMenu::item:checked{color:#d6d8dd}QMenu::item:checked:selected{background-color:#5385a6;color:#fff}QMenu::item:disabled{background:none;color:#808080}QMenu::item:disabled:selected{border-color:transparent}QMenu::separator{border-top:1 solid #212223;height:0;margin:2 0}QMenu::icon{border-radius:2;margin:0 0 0 3;padding:1}QMenu::icon:checked{background-color:#5385a6}QMenu::indicator{margin-left:7}TPanelTitleBar{background-color:#323435;border-color:#212223;border-style:solid;border-width:0 0 1 0;height:20;min-height:20;qproperty-TitleColor:#8c9093;qproperty-ActiveTitleColor:#43AEE5;qproperty-BorderPixmap:url('none');qproperty-ActiveBorderPixmap:url('../Default/imgs/white/none');qproperty-FloatBorderPixmap:url('none');qproperty-FloatActiveBorderPixmap:url('../Default/imgs/white/none')}QAbstractScrollArea::corner{background-color:#2d2f30}QScrollBar{background-color:#2d2f30;border:0}QScrollBar:horizontal{height:16;margin:0}QScrollBar:vertical{margin:0;width:16}QScrollBar::handle{border:1 solid #4b4d50;border-radius:4}QScrollBar::handle:horizontal:hover,QScrollBar::handle:vertical:hover{background-color:#5f6265;border-color:#5f6265}QScrollBar::handle:horizontal:pressed,QScrollBar::handle:vertical:pressed{background-color:#72767a;border-color:#72767a}QScrollBar::handle:horizontal{background-color:#4b4d50;margin:3 16;min-width:20}QScrollBar::handle:vertical{background-color:#4b4d50;margin:16 3;min-height:20}QScrollBar::add-line{subcontrol-origin:margin;border:0}QScrollBar::add-line:horizontal{subcontrol-position:right;background-color:#2d2f30;margin:0;width:16}QScrollBar::add-line:vertical{subcontrol-position:bottom;background-color:#2d2f30;margin:0;height:16}QScrollBar::sub-line{border:0;subcontrol-origin:margin}QScrollBar::sub-line:horizontal{subcontrol-position:left;background-color:#2d2f30;margin:0;width:16}QScrollBar::sub-line:vertical{subcontrol-position:top;background-color:#2d2f30;margin:0;height:16}QScrollBar::up-arrow:vertical{image:url('../Default/imgs/white/scroll-up.svg');image-position:center center}QScrollBar::up-arrow:vertical:pressed{margin:1 0 0 0}QScrollBar::down-arrow:vertical{image:url('../Default/imgs/white/scroll-down.svg');image-position:center center}QScrollBar::down-arrow:vertical:pressed{margin:1 0 0 0}QScrollBar::left-arrow:horizontal{image:url('../Default/imgs/white/scroll-left.svg');image-position:center center}QScrollBar::left-arrow:horizontal:pressed{margin:1 0 0 0}QScrollBar::right-arrow:horizontal{image:url('../Default/imgs/white/scroll-right.svg');image-position:center center}QScrollBar::right-arrow:horizontal:pressed{margin:1 0 0 0}QScrollBar::sub-page:horizontal,QScrollBar::add-page:horizontal,QScrollBar::sub-page:vertical,QScrollBar::add-page:vertical{background:none}QToolBar{padding:0}QToolBar::separator:horizontal{border-left:1 solid #212223;margin:0 1;width:0}QToolBar::separator:vertical{border-top:1 solid #212223;height:0;margin:1 0}QToolBar QLabel{margin-top:1}QToolBar QToolBar{border:0}QToolButton::menu-indicator{image:none}QToolButton::menu-button{border-image:none}.DvScrollWidget QPushButton,DvScrollWidget QPushButton,#ScrollLeftButton QPushButton,#ScrollRightButton QPushButton,#ScrollUpButton QPushButton,#ScrollDownButton QPushButton{background-color:#616467;border:0 solid red;border-radius:0;padding:0;max-width:16}.DvScrollWidget QPushButton:hover,DvScrollWidget QPushButton:hover,#ScrollLeftButton QPushButton:hover,#ScrollRightButton QPushButton:hover,#ScrollUpButton QPushButton:hover,#ScrollDownButton QPushButton:hover{background-color:#6e7174}.DvScrollWidget QPushButton:pressed,DvScrollWidget QPushButton:pressed,#ScrollLeftButton QPushButton:pressed,#ScrollRightButton QPushButton:pressed,#ScrollUpButton QPushButton:pressed,#ScrollDownButton QPushButton:pressed{background-color:#2b2c2d}#ScrollLeftButton,#ScrollRightButton,#ScrollUpButton,#ScrollDownButton{margin:0;min-width:16}#ScrollLeftButton{border-right:1 solid #212223;image:url('../Default/imgs/white/scroll-left.svg')}#ScrollRightButton{border-left:1 solid #212223;margin-left:3;image:url('../Default/imgs/white/scroll-right.svg')}#ScrollUpButton{image:url('../Default/imgs/white/scroll-up.svg')}#ScrollDownButton{image:url('../Default/imgs/white/scroll-down.svg')}#keyFrameNavigator{background:none;margin:0;padding:0}#keyFrameNavigator QToolButton{min-width:18}#keyFrameNavigator #PreviousKey{image:url('../Default/imgs/white/prevkey.svg')}#keyFrameNavigator #PreviousKey:hover{image:url('../Default/imgs/white/prevkey_over.svg')}#keyFrameNavigator #PreviousKey:disabled{image:url('../Default/imgs/white/prevkey_disabled.svg')}#keyFrameNavigator #NextKey{image:url('../Default/imgs/white/nextkey.svg')}#keyFrameNavigator #NextKey:hover{image:url('../Default/imgs/white/nextkey_over.svg')}#keyFrameNavigator #NextKey:disabled{image:url('../Default/imgs/white/nextkey_disabled.svg')}.treeview,QTreeWidget,QTreeView,#FunctionEditorTree{background-color:#2d2f30;alternate-background-color:#323435;border:0;margin:0;outline:0}.treeview::item:selected,QTreeWidget::item:selected,QTreeView::item:selected,#FunctionEditorTree::item:selected{background-color:#5385a6;color:#fff}.treeview::branch:adjoins-item,QTreeWidget::branch:adjoins-item,QTreeView::branch:adjoins-item,#FunctionEditorTree::branch:adjoins-item{border-image:url('')}.treeview::branch:has-siblings,QTreeWidget::branch:has-siblings,QTreeView::branch:has-siblings,#FunctionEditorTree::branch:has-siblings{border-image:url('')}.treeview::branch:has-siblings:adjoins-item,QTreeWidget::branch:has-siblings:adjoins-item,QTreeView::branch:has-siblings:adjoins-item,#FunctionEditorTree::branch:has-siblings:adjoins-item{border-image:url('')}.treeview::branch:has-children:closed,QTreeWidget::branch:has-children:closed,QTreeView::branch:has-children:closed,#FunctionEditorTree::branch:has-children:closed{background:url('../Default/imgs/white/treebranch-closed.svg') no-repeat;background-position:center center;border-image:none;image:none}.treeview::branch:has-children:open,QTreeWidget::branch:has-children:open,QTreeView::branch:has-children:open,#FunctionEditorTree::branch:has-children:open{background:url('../Default/imgs/white/treebranch-open.svg') no-repeat;background-position:center center;image:none}.treeview::branch:has-children:has-siblings:closed,QTreeWidget::branch:has-children:has-siblings:closed,QTreeView::branch:has-children:has-siblings:closed,#FunctionEditorTree::branch:has-children:has-siblings:closed{background:url('../Default/imgs/white/treebranch-closed.svg') no-repeat;background-position:center center;border-image:none;image:none}.treeview::branch:has-children:has-siblings:open,QTreeWidget::branch:has-children:has-siblings:open,QTreeView::branch:has-children:has-siblings:open,#FunctionEditorTree::branch:has-children:has-siblings:open{background:url('../Default/imgs/white/treebranch-open.svg') no-repeat;background-position:center center;border-image:none;image:none}QListView{outline:0;background:#2d2f30;alternate-background-color:#323435}#TabBarContainer{background-color:#323435}.Button,QPushButton,.ComboBox,.ComboBox:checked,QComboBox,QComboBox:checked{background-color:#616467;border:1 solid #414345;border-radius:2;color:#e4e5e9;margin:0;padding:3 15}.Button:hover,QPushButton:hover,.ComboBox:hover,#ViewerFpsSlider::sub-line:horizontal:hover,#ViewerFpsSlider::add-line:horizontal:hover,QComboBox:hover{background-color:#6e7174;border-color:#414345;color:#e4e5e9}.Button:pressed,QPushButton:pressed,#ViewerFpsSlider::sub-line:horizontal:pressed,#ViewerFpsSlider::add-line:horizontal:pressed{background-color:#2b2c2d;border-color:#262728;color:#e4e5e9}.Button:checked,QPushButton:checked{background-color:#2b2c2d;border-color:#262728;color:#e4e5e9}.Button:checked:hover,QPushButton:checked:hover{background-color:#303133}.Button:checked:hover:pressed,QPushButton:checked:hover:pressed{background:#2b2c2d}.Button:disabled,QPushButton:disabled,.ComboBox:disabled,#ViewerFpsSlider::sub-line:horizontal:disabled,#ViewerFpsSlider::add-line:horizontal:disabled,QComboBox:disabled{background-color:#4d5052;border-color:#414345;color:#808080}#PushButton_NoPadding{padding:3}.ComboBox,.ComboBox:checked,QComboBox,QComboBox:checked{padding:1 0 1 4;margin:1 0}.ComboBox::drop-down,QComboBox::drop-down{image:url('../Default/imgs/white/combo_downarrow.svg');image-position:center center;width:16}.ComboBox::drop-down:disabled,QComboBox::drop-down:disabled{image:url('../Default/imgs/white/combo_downarrow_disabled.svg')}.ComboBox QAbstractItemView,QComboBox QAbstractItemView{background-color:#414345;border:1 solid #212223;selection-background-color:#5385a6;selection-color:#fff}.LineEdit,QPlainTextEdit,QLineEdit,#TaskSheetItem,#tasksRemoveBox,#tasksAddBox{background-color:#28292b;border:1 solid #262728;border-radius:2;color:#d6d8dd;selection-background-color:#5385a6;selection-color:#fff;padding:0 0 0 1}.LineEdit:focus,QPlainTextEdit:focus,QLineEdit:focus,#TaskSheetItem:focus,#tasksRemoveBox:focus,#tasksAddBox:focus{background-color:#28292b;border-color:#5385a6;color:#d6d8dd}.LineEdit:disabled,QPlainTextEdit:disabled,QLineEdit:disabled,#TaskSheetItem:disabled,#tasksRemoveBox:disabled,#tasksAddBox:disabled{background-color:#353638;border-color:#333537;color:#808080}.CheckBox,QCheckBox{color:#d6d8dd}.CheckBox:hover,QCheckBox:hover,.RadioButton:hover,QRadioButton:hover{color:#fff}.CheckBox:disabled,QCheckBox:disabled{color:#808080}.CheckBox::indicator,QMenu::indicator,QCheckBox::indicator,.GroupBox::indicator,QGroupBox::indicator{background-color:#28292b;border:1 solid #262728;border-radius:2;height:9;padding:1;width:9}.CheckBox::indicator:hover,QMenu::indicator:hover,.CheckBox::indicator:checked:hover,QCheckBox::indicator:hover,.GroupBox::indicator:hover,QMenu::indicator:checked:hover,QCheckBox::indicator:checked:hover,.GroupBox::indicator:checked:hover,QGroupBox::indicator:hover,QGroupBox::indicator:checked:hover{background-color:#28292b;border-color:#5385a6}.CheckBox::indicator:checked,QMenu::indicator:checked,QCheckBox::indicator:checked,.GroupBox::indicator:checked,QGroupBox::indicator:checked{background-color:#28292b;border-color:#262728;image:url('../Default/imgs/white/checkmark.svg')}.CheckBox::indicator:checked:disabled,QMenu::indicator:checked:disabled,QCheckBox::indicator:checked:disabled,.GroupBox::indicator:checked:disabled,QGroupBox::indicator:checked:disabled{background-color:#353638;border-color:#353638;image:url('../Default/imgs/white/checkmark_disabled.svg')}.CheckBox::indicator:disabled,QMenu::indicator:disabled,QCheckBox::indicator:disabled,.GroupBox::indicator:disabled,QGroupBox::indicator:disabled{background-color:#353638;border-color:#353638}.RadioButton::indicator:unchecked,QRadioButton::indicator:unchecked,#CameraSettingsRadioButton_Small::indicator:unchecked{image:url('../Default/imgs/white/radiobutton_unchecked.svg');image-position:center center}.RadioButton::indicator:checked,QRadioButton::indicator:checked,#CameraSettingsRadioButton_Small::indicator:checked{image:url('../Default/imgs/white/radiobutton_checked.svg');image-position:center center}.GroupBox,QGroupBox{margin:6 0 0 0;padding:5 0}.GroupBox::title,QGroupBox::title{subcontrol-origin:margin;left:15;margin:-3 0 0 0;padding:0 3}.GroupBox::title:hover,QGroupBox::title:hover{color:#fff}.GroupBox::title:disabled,QGroupBox::title:disabled{color:#808080}.GroupBox::indicator,QGroupBox::indicator{subcontrol-origin:margin;margin-top:2}.GroupBox:disabled,QGroupBox:disabled{color:#808080}.Slider::groove:horizontal,QSlider::groove:horizontal{background-color:transparent;background-image:url('../Default/imgs/white/slider-groove.svg');background-position:center center;background-repeat:repeat-x;margin:0;height:20;min-height:20}.Slider::groove:horizontal:disabled,QSlider::groove:horizontal:disabled{background-image:url('../Default/imgs/white/slider-groove_disabled.svg')}.Slider::handle:horizontal,QSlider::handle:horizontal{width:10;margin:-2 -1;image:url('../Default/imgs/white/slider-handle.svg')}.Slider::handle:horizontal:disabled,QSlider::handle:horizontal:disabled{image:url('../Default/imgs/white/slider-handle_disabled.svg')}#IntPairField,#DoublePairField{qproperty-LightLineColor:#262728;qproperty-LightLineEdgeColor:#262728;qproperty-DarkLineColor:#262728;qproperty-MiddleLineColor:#262728;qproperty-HandleLeftPixmap:url("../Default/imgs/white/slider-handle.svg");qproperty-HandleRightPixmap:url("../Default/imgs/white/slider-handle.svg");qproperty-HandleLeftGrayPixmap:url("../Default/imgs/white/slider-handle_disabled.svg");qproperty-HandleRightGrayPixmap:url("../Default/imgs/white/slider-handle_disabled.svg")}#DirTreeView{background-color:#2d2f30;alternate-background-color:#2d2f30;border:1 solid #212223;border-right:0}DvItemViewerPanel{qproperty-TextColor:#d6d8dd;qproperty-AlternateBackground:#3a3b3d;qproperty-SelectedTextColor:#fff;qproperty-FolderTextColor:#9fdaff;qproperty-SelectedItemBackground:#5385a6}#FileBrowser DvItemViewerPanel,#SceneCast DvItemViewerPanel{background-color:#414345}#FileBrowser #castFrame,#SceneCast #castFrame{border-top:1 solid #212223;border-right:1 solid #212223;border-bottom:1 solid #212223;margin:0}#FileBrowser QToolButton,#SceneCast QToolButton{padding:1}DvDirTreeView{qproperty-TextColor:#d6d8dd;qproperty-SelectedTextColor:#fff;qproperty-SelectedItemBackground:#5385a6;qproperty-FolderTextColor:#9fdaff;qproperty-SelectedFolderTextColor:#fff;alternate-background-color:#323435;background-color:#2d2f30;border:1 solid #212223}#FileDoesNotExistLabel{color:#f00}#SceneCast QToolBar{border-top:1 solid #212223}#SceneCast QToolButton{margin:3 1 2 1;padding:1}#CastBrowser{border:0;margin:0}#FilmStrip QComboBox{border-radius:0;border-width:0}#FilmStrip QComboBox QAbstractItemView{background-color:#414345}#CleanupSettings #CleanupSettingsFrame{margin-top:2;margin-bottom:4}#CleanupSettings QGroupBox{margin-bottom:3}ParamsPage{qproperty-TextColor:#d6d8dd}#CameraSettingsButton{padding:2}#CameraSettingsRadioButton:hover{background:none}#CameraSettingsRadioButton::indicator{border:1 solid rgba(255,255,255,0);height:18;padding:0;width:18}#CameraSettingsRadioButton::indicator:unchecked{image:url('../Default/imgs/white/lock_off.svg')}#CameraSettingsRadioButton::indicator:checked{background-color:#C34040;border-color:#C34040;image:url('../Default/imgs/white/lock_on.svg')}#CameraSettingsRadioButton::indicator:checked:hover{background-color:#d57a7a;border-color:#d57a7a}#CameraSettingsDPI{color:#9fdaff}#CameraSettingsRadioButton_Small{padding:0}#CameraSettingsRadioButton_Small::indicator{background-color:transparent;border:0;height:21;margin:0;width:11}#ForceSquaredPixelButton{height:16;border:1 solid rgba(255,255,255,0);image:url('../Default/imgs/white/fsp_unchecked.svg');padding:2;width:16;margin:0}#ForceSquaredPixelButton:checked{image:url('../Default/imgs/white/fsp_checked.svg')}#OutputSettingsLabel{color:#9fdaff}PencilTestPopup{min-height:730px;min-width:512px}#MatchLineButton{background-color:#66696c}#MatchLineButton:checked{background-color:#8c9093;border:2 solid #5385a6;border-radius:2}#LargeSizedText{font-size:17px}#StartupLabel{padding:3}#StartupLabel:hover{background:#5a5d5f}QStatusBar{background-color:#c0c0c0}QStatusBar::item{border:0}QStatusBar QLabel{background-color:#c0c0c0}QStatusBar #StatusBarLabel{background-color:#fff;padding:1 3}#TitleTxtLabel{color:#9fdaff}#StyleEditor QPushButton{margin:2 1;padding:0}#StyleEditor #TabBarContainer{margin-left:-4}#StyleEditor #bottomWidget{border-top:1 solid #212223;padding:3 2 8 3}#StyleEditor #bottomWidget QPushButton{padding:3 5}#StyleEditorTabBar::tab::first{border-left:1 solid #212223}#HexagonalColorWheel{qproperty-BGColor:#414345}#colorSlider::groove:horizontal{height:1;border-image:none}#colorSlider::handle:horizontal{width:8;margin:-8 -4}#colorSliderAddButton,#colorSliderSubButton{background:none;border-color:transparent;image-position:center center;min-height:16;padding:0;min-width:18}#colorSliderAddButton{image:url('../Default/imgs/white/scroll-right.svg')}#colorSliderSubButton{image:url('../Default/imgs/white/scroll-left.svg')}#PlainColorPageParts{border-bottom:1 solid #212223}#PlainColorPageParts QLineEdit{max-width:35}PaletteViewer DvScrollWidget QPushButton{border-top:0;margin-bottom:1;max-width:15;min-width:15}PaletteViewer DvScrollWidget #ScrollLeftButton{border-radius:0;margin-bottom:1;max-width:16;min-width:16}PaletteViewer DvScrollWidget #ScrollRightButton{border-radius:0;margin-left:1;margin-bottom:1;max-width:16;min-width:16}PaletteViewer QToolBar{background:none;border-bottom:1 solid #212223;padding:0;margin:0}PaletteViewer QToolBar::separator:horizontal{margin:0}PaletteViewer QToolBar QToolButton{margin:0 0 1 0;padding:1 0 2 0}#PageViewer{qproperty-TextColor:#d6d8dd}#PaletteLockButton{border-radius:0;margin:0 0 1 1}#PaletteLockButton:checked{background-color:#C34040;border-color:#C34040}#PaletteLockButton:checked:hover{background-color:#d57a7a;border-color:#d57a7a}#WordButton{padding-right:0;padding-left:0}QDialog{background-color:#414345}QDialog #dialogButtonFrame{background-color:#37393a;border-top:1 solid #212223}QDialog #dialogButtonFrame QPushButton{border-color:#37393a;outline:0}QDialog #dialogButtonFrame QPushButton:focus{background-color:#5385a6;border-color:#37393a;color:#fff}QDialog #dialogButtonFrame QPushButton:focus:hover{background-color:#6c98b6}QDialog #dialogButtonFrame QPushButton:focus:pressed{background-color:#2b2c2d;border-color:#262728;color:#e4e5e9}#SceneSettings QLabel{color:#9fdaff}#PreferencesPopup QListWidget{background-color:#2d2f30;alternate-background-color:#2d2f30;border:1 solid #212223;font-size:13px}#PreferencesPopup QListWidget::item{border:0;padding:3}#PreferencesPopup QListWidget::item:hover{color:#d6d8dd;background-color:rgba(255,255,255,0.15)}#PreferencesPopup QListWidget::item:selected{background-color:#5385a6;color:#fff}#ShortcutTree{border:1 solid #212223}#ShortcutTree::item{padding:1 0}#ShortcutTree QScrollBar:vertical{width:16;margin-right:-1}ProjectPopup QLabel{color:#9fdaff}#GearButton{qproperty-icon:url('../Default/imgs/white/gear.svg')}#SubfolderButton{qproperty-icon:url('../Default/imgs/white/subfolder.svg');padding-left:6px;padding-right:6px}#SubcameraButton{qproperty-icon:url('../Default/imgs/white/subcamera.svg');padding-left:6px;padding-right:6px}SchematicViewer{qproperty-TextColor:#d6d8dd;qproperty-VerticalLineColor:#222;qproperty-LevelColumnColor:#4C6E4C;qproperty-VectorColumnColor:#7B7B4C;qproperty-ChildColumnColor:#6A526B;qproperty-FullcolorColumnColor:#657A96;qproperty-FxColumnColor:#56553C;qproperty-PaletteColumnColor:#3A655F;qproperty-MeshColumnColor:#684D86;qproperty-ReferenceColumnColor:#616161;qproperty-TableColor:#62628c;qproperty-ActiveCameraColor:#2d7dca;qproperty-OtherCameraColor:#6c797b;qproperty-GroupColor:#3b6e9c;qproperty-PegColor:#9f6e3c;qproperty-SplineColor:#6a9d1c;qproperty-ActiveOutputColor:#2d7dca;qproperty-OtherOutputColor:#6c797b;qproperty-XsheetColor:#62628c;qproperty-NormalFxColor:#6a7e96;qproperty-MacroFxColor:#815c79;qproperty-ImageAdjustFxColor:#656287;qproperty-LayerBlendingFxColor:#4f757d;qproperty-MatteFxColor:#ae7171;qproperty-SchematicPreviewButtonBgOnColor:#c8c864;qproperty-SchematicPreviewButtonOnImage:url('../Default/imgs/white/x_prev_eye_on.svg');qproperty-SchematicPreviewButtonBgOffColor:#616161;qproperty-SchematicPreviewButtonOffImage:url('../Default/imgs/white/x_prev_eye_off.svg');qproperty-SchematicCamstandButtonBgOnColor:#eb906b;qproperty-SchematicCamstandButtonOnImage:url('../Default/imgs/white/x_table_view_on.svg');qproperty-SchematicCamstandButtonTranspImage:url('../Default/imgs/white/x_table_view_transp.svg');qproperty-SchematicCamstandButtonBgOffColor:#616161;qproperty-SchematicCamstandButtonOffImage:url('../Default/imgs/white/x_table_view_off.svg')}#SchematicBottomFrame{background-color:#414345;border:0;margin:0;padding:0}#SchematicBottomFrame QToolBar::separator:horizontal{margin:0}#SchematicBottomFrame QToolBar QToolButton{padding:0;margin:2}#SchematicSceneViewer{background-color:#353638;border-bottom:1 solid #212223}#FxSettingsTabBar::tab{border-top:1 solid #212223}#FxSettingsTabBar::tab::first,#FxSettingsTabBar::tab::only-one{border-left:1 solid #212223}FxSettings QToolBar{border-top:1 solid #212223;border-right:1 solid #212223;border-left:1 solid #212223;min-height:23;padding:3 0}FxSettings QToolBar QToolBar{border:0}#FxSettingsLabel{color:#a0e680}#FxSettingsHelpButton{background-color:#80a0dc;color:#000;padding-top:0;padding-bottom:0}#FxSettingsHelpButton:hover{background-color:#a8bee7}#ScriptConsole{font-family:'Courier New',monospace;border:0;color:#000000;padding:3}#ScriptConsole QFrame{background-color:#dcdcdc}#ScriptConsole TPanelTitleBar{background-color:#323435}#TaskSheetItemLabel{color:#d6d8dd}#Tasks QToolBar{border-bottom:1 solid #212223;margin:0;padding:0}#Tasks QToolBar QToolButton{margin:2 2 3 2}#ToolBar QToolBar{padding-left:2}#ToolOptions TPanelTitleBar{border-right:1 solid #212223;border-bottom:0}#CommandBar TPanelTitleBar{border-right:1 solid #212223;border-bottom:0}IconViewField{qproperty-ThicknessPixmap:url("../Default/imgs/white/selectiontool_thickness.svg")}#EditToolLockButton{spacing:0}#EditToolLockButton:hover{background:none}#EditToolLockButton::indicator{border:1 solid rgba(255,255,255,0);height:18;padding:0;width:18}#EditToolLockButton::indicator:unchecked{image:url('../Default/imgs/white/lock_off.svg')}#EditToolLockButton::indicator:checked{background-color:#C34040;border-color:#C34040;image:url('../Default/imgs/white/lock_on.svg')}#EditToolLockButton::indicator:checked:hover{background-color:#d57a7a;border-color:#d57a7a}PopupButton::menu-indicator{border-left:0;height:17;image:url('../Default/imgs/white/combo_downarrow.svg');width:10}PopupButton::menu-indicator:hover{image:url('../Default/imgs/white/combo_downarrow.svg')}PopupButton::menu-indicator:disabled{image:url('../Default/imgs/white/combo_downarrow_disabled.svg')}#Cap,#Join{padding:0 4 0 -8;max-width:32;min-width:32}#Cap QMenu,#Join QMenu{max-width:28;min-width:28}#Cap QMenu::item,#Join QMenu::item{max-width:28;min-width:28;padding:0}QToolBar#MediumPaddingToolBar QToolButton{padding-left:3;padding-right:3}QToolBar#WidePaddingToolBar QToolButton{padding-left:6;padding-right:6}#CommandBar{margin:0;padding:0;border:0}#CommandBar::separator:horizontal{margin-right:3;margin-left:3}#expandButton:checked{background-color:transparent;border-color:transparent;color:#d6d8dd}#expandButton:checked:hover{background-color:#6e7174;border-color:#6e7174}#expandButton:checked:pressed{background-color:#2b2c2d;border-color:#262728}#ComboViewerPanel Toolbar{border-bottom:1 solid #212223}#ComboViewerPanel Toolbar::separator:horizontal{margin:0 0 0 2}#ComboViewerPanel Toolbar QToolButton{margin:2 0 3 2}#ComboViewerToolOptions{border-bottom:1 solid #212223}#ComboViewer #ToolBarContainer,#ViewerPanel #ToolBarContainer,FlipBook #ToolBarContainer{background-color:transparent;border-top:2 solid #212223;border-bottom:1 solid #212223;padding-right:-1}#flipCustomize{margin-left:3}#flipCustomize::menu-button{background-color:transparent;width:35}#flipCustomize::menu-arrow{image:none}QToolBar#FlipConsolePlayToolBar::separator:horizontal{margin:0 3}QToolBar#FlipConsolePlayToolBar QToolButton{margin-top:2;margin-bottom:2;height:16;padding-left:1;padding-right:1}#ViewerFpsSlider{background-color:transparent;background-image:url('../Default/imgs/white/slider-groove.svg');background-position:center center;background-repeat:repeat-x;border:0;height:19;margin:0 3 0 37;max-width:300;min-width:0}#ViewerFpsSlider::sub-line:horizontal{subcontrol-origin:absolute;background-color:#616467;border:1 solid #414345;border-top-left-radius:2;border-bottom-left-radius:2;height:16;left:-33;width:14}#ViewerFpsSlider::add-line:horizontal{subcontrol-position:left;background-color:#616467;border:1 solid #414345;border-top-right-radius:2;border-bottom-right-radius:2;left:18;height:16;image-position:center center;width:13}#ViewerFpsSlider::handle::horizontal{background-color:#999c9f;border:1 solid #999c9f;border-radius:2;margin:2 0 3 0;min-width:9;width:9;max-width:9}FlipSlider{qproperty-PBHeight:15;qproperty-PBOverlay:url('../Default/imgs/white/flipslider.svg');qproperty-PBColorMarginLeft:1;qproperty-PBColorMarginTop:2;qproperty-PBColorMarginRight:1;qproperty-PBColorMarginBottom:2;qproperty-PBMarker:url('../Default/imgs/white/flipmarker.svg');qproperty-PBMarkerMarginLeft:3;qproperty-PBMarkerMarginRight:3;qproperty-notStartedColor:rgba(205,101,101,0.78);qproperty-startedColor:#1abc3f;qproperty-baseColor:#28292b;qproperty-finishedColor:#28292b}Ruler{qproperty-ParentBGColor:#414345;qproperty-ScaleColor:#d6d8dd}#RulerToolOptionValues{color:#000}#xsheetArea,#ScrollArea{background-color:#2d2f30;border:0}#xsheetScrollArea{border:0}#cornerWidget QToolButton{padding:0}#xsheetColumnAreaMenu_Preview{background-color:#E6E678}#xsheetColumnAreaMenu_Lock{background-color:#F5F5F5}#xsheetColumnAreaMenu_Camstand{background-color:#FFA480}#xsheetColumnAreaMenu_Preview,#xsheetColumnAreaMenu_Lock,#xsheetColumnAreaMenu_Camstand{color:#000}#noteTextEdit{color:#000}XsheetViewer{qproperty-TextColor:#d6d8dd;qproperty-BGColor:#353638;qproperty-LightLineColor:#262728;qproperty-MarkerLineColor:#1E96C4;qproperty-VerticalLineColor:#222;qproperty-VerticalLineHeadColor:#777b7f;qproperty-PreviewFrameTextColor:#9fdaff;qproperty-CurrentRowBgColor:#506082;qproperty-OnionSkinAreaBgColor:#303133;qproperty-EmptyColumnHeadColor:#5a5d60;qproperty-SelectedColumnTextColor:#E66464;qproperty-EmptyCellColor:#393b3d;qproperty-NotEmptyColumnColor:#414345;qproperty-SelectedEmptyCellColor:#64676a;qproperty-LevelColumnColor:#4C6E4C;qproperty-LevelColumnBorderColor:#8FB38F;qproperty-SelectedLevelColumnColor:#678667;qproperty-VectorColumnColor:#7B7B4C;qproperty-VectorColumnBorderColor:#BBBB9A;qproperty-SelectedVectorColumnColor:#949466;qproperty-ChildColumnColor:#6A526B;qproperty-ChildColumnBorderColor:#B1A3B3;qproperty-SelectedChildColumnColor:#816e82;qproperty-FullcolorColumnColor:#657A96;qproperty-FullcolorColumnBorderColor:#9EB8BB;qproperty-SelectedFullcolorColumnColor:#8895a6;qproperty-FxColumnColor:#56553C;qproperty-FxColumnBorderColor:#95958A;qproperty-SelectedFxColumnColor:#6f6e56;qproperty-ReferenceColumnColor:#616161;qproperty-ReferenceColumnBorderColor:#A2A2A2;qproperty-SelectedReferenceColumnColor:#7a7a7a;qproperty-PaletteColumnColor:#3A655F;qproperty-PaletteColumnBorderColor:#86ACA7;qproperty-SelectedPaletteColumnColor:#52807a;qproperty-MeshColumnColor:#684D86;qproperty-MeshColumnBorderColor:#BA92EF;qproperty-SelectedMeshColumnColor:#82689e;qproperty-SoundTextColumnColor:#c8c8c8;qproperty-SoundTextColumnBorderColor:#8c8c8c;qproperty-SelectedSoundTextColumnColor:#e2e2e2;qproperty-SoundColumnColor:#657456;qproperty-SoundColumnBorderColor:#A0AF7D;qproperty-SelectedSoundColumnColor:#7e8b72;qproperty-SoundColumnHlColor:#34FE5E;qproperty-SoundColumnTrackColor:#B6C29D;qproperty-ColumnHeadPastelizer:#000;qproperty-SelectedColumnHead:#506082;qproperty-LightLightBGColor:#393b3d;qproperty-LightBGColor:#eaebec;qproperty-DarkBGColor:#dbdcdd;qproperty-DarkLineColor:#8e9194;qproperty-XsheetColumnNameBgColor:rgba(0,0,0,0);qproperty-XsheetDragBarHighlightColor:rgba(255,255,255,0.5);qproperty-XsheetPreviewButtonBgOnColor:#c8c864;qproperty-XsheetPreviewButtonOnImage:url('../Default/imgs/white/x_prev_eye_on.svg');qproperty-XsheetPreviewButtonBgOffColor:rgba(255,255,255,0);qproperty-XsheetPreviewButtonOffImage:url('../Default/imgs/white/x_prev_eye_off.svg');qproperty-XsheetCamstandButtonBgOnColor:#eb906b;qproperty-XsheetCamstandButtonOnImage:url('../Default/imgs/white/x_table_view_on.svg');qproperty-XsheetCamstandButtonTranspImage:url('../Default/imgs/white/x_table_view_transp.svg');qproperty-XsheetCamstandButtonBgOffColor:rgba(255,255,255,0);qproperty-XsheetCamstandButtonOffImage:url('../Default/imgs/white/x_table_view_off.svg');qproperty-XsheetLockButtonBgOnColor:rgba(255,255,255,0.3);qproperty-XsheetLockButtonOnImage:url('../Default/imgs/white/x_lock_on.svg');qproperty-XsheetLockButtonBgOffColor:rgba(255,255,255,0);qproperty-XsheetLockButtonOffImage:url('../Default/imgs/white/x_lock_off.svg');qproperty-XsheetConfigButtonBgColor:rgba(255,255,255,0);qproperty-XsheetConfigButtonImage:url('../Default/imgs/white/x_config.svg');qproperty-TimelinePreviewButtonBgOnColor:rgba(255,255,255,0);qproperty-TimelinePreviewButtonOnImage:url('../Default/imgs/white/timeline_toggle_on.svg');qproperty-TimelinePreviewButtonBgOffColor:rgba(255,255,255,0);qproperty-TimelinePreviewButtonOffImage:url('../Default/imgs/white/timeline_toggle_off.svg');qproperty-TimelineCamstandButtonBgOnColor:rgba(255,255,255,0);qproperty-TimelineCamstandButtonOnImage:url('../Default/imgs/white/timeline_toggle_on.svg');qproperty-TimelineCamstandButtonTranspImage:url('../Default/imgs/white/timeline_toggle_transp.svg');qproperty-TimelineCamstandButtonBgOffColor:rgba(255,255,255,0);qproperty-TimelineCamstandButtonOffImage:url('../Default/imgs/white/timeline_toggle_off.svg');qproperty-TimelineLockButtonBgOnColor:rgba(255,255,255,0);qproperty-TimelineLockButtonOnImage:url('../Default/imgs/white/timeline_toggle_on.svg');qproperty-TimelineLockButtonBgOffColor:rgba(255,255,255,0);qproperty-TimelineLockButtonOffImage:url('../Default/imgs/white/timeline_toggle_off.svg');qproperty-TimelineConfigButtonBgColor:rgba(255,255,255,0);qproperty-TimelineConfigButtonImage:url('../Default/imgs/white/timeline_config.svg');qproperty-LayerHeaderPreviewImage:url('../Default/imgs/white/layer_header_prev_eye.svg');qproperty-LayerHeaderPreviewOverImage:url('../Default/imgs/white/layer_header_prev_eye_over.svg');qproperty-LayerHeaderCamstandImage:url('../Default/imgs/white/layer_header_table_view.svg');qproperty-LayerHeaderCamstandOverImage:url('../Default/imgs/white/layer_header_table_view_over.svg');qproperty-LayerHeaderLockImage:url('../Default/imgs/white/lock_on.svg');qproperty-LayerHeaderLockOverImage:url('../Default/imgs/white/lock_on_over.svg')}#XSheetToolbar{margin:0;padding:0;border:0}#XSheetToolbar QToolButton{padding:0;margin:4 1;min-height:19;height:19}#XSheetToolbar::separator:horizontal{margin:0 4}#FunctionEditor QToolBar{border-bottom:1 solid #212223}#FunctionEditor QToolBar QToolBar{border:0}#FunctionEditor QToolBar QLabel{margin-left:5}#FunctionEditor QToolBar QToolButton{height:18}#FunctionEditorTree{border-top:1 solid #212223}FunctionTreeView{qproperty-TextColor:#d6d8dd;qproperty-CurrentTextColor:#E66464}FunctionPanel{qproperty-BGColor:#343638;qproperty-ValueLineColor:#28292b;qproperty-FrameLineColor:#28292b;qproperty-OtherCurvesColor:#7f8386;qproperty-RulerBackground:#2d2e30;qproperty-TextColor:#d6d8dd;qproperty-SubColor:#000;qproperty-SelectedColor:#FFA500}SpreadsheetViewer{qproperty-LightLightBGColor:#393b3d;qproperty-CurrentRowBgColor:#506082;qproperty-LightLineColor:#262728;qproperty-MarkerLineColor:#1E96C4;qproperty-BGColor:#414345;qproperty-VerticalLineColor:#222;qproperty-KeyFrameColor:#995d1d;qproperty-KeyFrameBorderColor:#c9b04b;qproperty-SelectedKeyFrameColor:#be772b;qproperty-InBetweenColor:#666250;qproperty-InBetweenBorderColor:#cdcec8;qproperty-SelectedInBetweenColor:#7d7a6c;qproperty-SelectedEmptyColor:#64676a;qproperty-SelectedSceneRangeEmptyColor:#6d7073;qproperty-TextColor:#d6d8dd;qproperty-ColumnHeaderBorderColor:#777b7f;qproperty-SelectedColumnTextColor:#E66464}#ExpressionField{background-color:#e0e1e2;border:1 solid #2d2e2f;margin:0}#FunctionSegmentViewerLinkButton{background-image:url('../Default/imgs/white/segment_unlinked.svg');background-repeat:no-repeat}#FunctionSegmentViewerLinkButton:hover{background-repeat:no-repeat}#FunctionSegmentViewerLinkButton:checked{background-image:url('../Default/imgs/white/segment_linked.svg');background-repeat:no-repeat}#FunctionSegmentViewerLinkButton:disabled{background-image:url('../Default/imgs/white/segment_disabled.svg');background-repeat:no-repeat} \ No newline at end of file diff --git a/stuff/config/qss/Dark/Dark.qss b/stuff/config/qss/Dark/Dark.qss index 0012b988..b42a3d6e 100644 --- a/stuff/config/qss/Dark/Dark.qss +++ b/stuff/config/qss/Dark/Dark.qss @@ -1 +1 @@ -.button-show,#LoadLevelShowButton,#CleanupSettingsShowButton,#OutputSettingsShowButton,#FxSettingsPreviewShowButton{image:url('../Default/imgs/white/plus.svg');image-position:center center;margin:0;padding:1;min-width:10;min-height:10}.button-show:checked,#LoadLevelShowButton:checked,#CleanupSettingsShowButton:checked,#OutputSettingsShowButton:checked,#FxSettingsPreviewShowButton:checked{background-color:#191919;border-color:#141414;image:url('../Default/imgs/white/minus.svg')}.button-show:checked:pressed,#LoadLevelShowButton:checked:pressed,#CleanupSettingsShowButton:checked:pressed,#OutputSettingsShowButton:checked:pressed,#FxSettingsPreviewShowButton:checked:pressed{background-color:#191919;border-color:#141414}.button-show:checked:hover,#LoadLevelShowButton:checked:hover,#CleanupSettingsShowButton:checked:hover,#OutputSettingsShowButton:checked:hover,#FxSettingsPreviewShowButton:checked:hover{background-color:#1e1e1e}.button-tool,QToolButton,#CameraSettingsRadioButton::indicator,#ForceSquaredPixelButton,#SchematicBottomFrame QToolBar QToolButton,#EditToolLockButton::indicator,#flipCustomize{background-color:rgba(255,255,255,0);border:1 solid rgba(255,255,255,0);border-radius:2;color:#dbdbdb;margin:1;padding:0}.button-tool:hover,QToolButton:hover,#CameraSettingsRadioButton::indicator:hover,#ForceSquaredPixelButton:hover,#colorSliderAddButton:hover,#colorSliderSubButton:hover,#SchematicBottomFrame QToolBar QToolButton:hover,#EditToolLockButton::indicator:hover,#flipCustomize:hover{background-color:#5e5e5e;border-color:#5e5e5e;color:#dbdbdb}.button-tool:pressed,QToolButton:pressed,#CameraSettingsRadioButton::indicator:pressed,#ForceSquaredPixelButton:pressed,#colorSliderAddButton:pressed,#colorSliderSubButton:pressed,#SchematicBottomFrame QToolBar QToolButton:pressed,#EditToolLockButton::indicator:pressed,#flipCustomize:pressed{background-color:#191919;border-color:#141414;color:#dbdbdb}.button-tool:checked,QToolButton:checked,#CameraSettingsRadioButton::indicator:checked,#ForceSquaredPixelButton:checked,#SchematicBottomFrame QToolBar QToolButton:checked,#EditToolLockButton::indicator:checked,#flipCustomize:checked{background-color:#5385a6;border-color:#5385a6;color:#fff}.button-tool:checked:hover,QToolButton:checked:hover,#CameraSettingsRadioButton::indicator:checked:hover,#ForceSquaredPixelButton:checked:hover,#SchematicBottomFrame QToolBar QToolButton:checked:hover,#EditToolLockButton::indicator:checked:hover,#flipCustomize:checked:hover{background-color:#6c98b6;border-color:#6c98b6}.button-tool:disabled,QToolButton:disabled,#CameraSettingsRadioButton::indicator:disabled,#ForceSquaredPixelButton:disabled,#SchematicBottomFrame QToolBar QToolButton:disabled,#EditToolLockButton::indicator:disabled,#flipCustomize:disabled{color:#808080}.button-flat,PaletteViewer QToolBar QToolButton{background-color:none;border:0;border-radius:0;margin:0}.button-flat:hover,PaletteViewer QToolBar QToolButton:hover{background-color:#5e5e5e}.button-flat:pressed,PaletteViewer QToolBar QToolButton:pressed{background-color:#161616}.frame,.GroupBox,#LoadLevelFrame,#PsdSettingsGroupBox,#CleanupSettingsFrame,#OutputSettingsBox,#OutputSettingsCameraBox,#SolidLineFrame,#FunctionParametersPanel,QGroupBox{border:1 solid #161616;border-radius:2}.tab-container,#TabBarContainer{background-color:transparent;qproperty-BottomAboveLineColor:#262626;qproperty-BottomBelowLineColor:#161616}.tab-flat,#StyleEditorTabBar::tab,#PaletteTabBar::tab,#FxSettingsTabBar::tab{background-color:#262626;border-right:1 solid #161616;border-bottom:1 solid #161616;color:#8b8b8b;padding:3 4 3 4}.tab-flat:hover,#StyleEditorTabBar::tab:hover,#PaletteTabBar::tab:hover,#FxSettingsTabBar::tab:hover{background-color:#303030;color:#8b8b8b}.tab-flat:selected,#StyleEditorTabBar::tab:selected,#PaletteTabBar::tab:selected,#FxSettingsTabBar::tab:selected{background-color:#303030;color:#f4f4f4;border-bottom-color:#303030}.tab-flat:only-one,#StyleEditorTabBar::tab:only-one,#PaletteTabBar::tab:only-one,#FxSettingsTabBar::tab:only-one{margin:0}.tab-round{background-color:#262626;border-top:1 solid #161616;border-right:1 solid #161616;border-left:1 solid #161616;border-bottom:1 solid #161616;color:#8b8b8b;margin:3 -1 0 0;padding:2 7 1 7}.tab-round:hover{background-color:#303030;color:#8b8b8b}.tab-round:selected{background-color:#303030;border-top-right-radius:2;border-top-left-radius:2;border-bottom-color:#303030;color:#f4f4f4;margin:1 -1 -1 0;padding:2 7 2 7}.tab-round:only-one{margin:1 0 0 0;padding:3 7 3 7}.tab-round:last{margin-right:0;border-top-right-radius:2}.tab-round:first{border-top-left-radius:2}QWidget{background-color:#303030;color:#cecece}QWidget:disabled{color:#808080}QFrame{border:0;margin:0;padding:0}QToolTip,#helpToolTip{background-color:#fff;border:1 solid #000;color:#000;padding:1 1}#DockSeparator,QMainWindow::separator,QSplitter::handle{background-color:#0c0c0c;height:4;width:4}#TDockPlaceholder{background-color:#F77272}TPanel{background-color:#0c0c0c}#TopBar{background:#303030;border:0;border-bottom:1 solid #161616;height:21}#TopBar #EditToolLockButton{background:#303030;spacing:0}#TopBar #EditToolLockButton::indicator{background:none;border:none;height:18;margin:1 2 0 0;padding-left:0;padding-right:0}#TopBarTabContainer{background-color:#303030;margin-bottom:1}#StackedMenuBar{border:0;margin:0;padding:0}QMenuBar{background-color:#303030;border:0}QMenuBar::item{background-color:#303030;border-left:1 solid #303030;margin:0;padding:3 5}QMenuBar::item:selected{background-color:rgba(255,255,255,0.15);color:#cecece}QMenuBar::item:pressed{background-color:#5385a6;color:#fff}#TopBarTab{margin:0;padding:0}#TopBarTab::tab{background-color:#262626;border-top:1 solid #161616;border-right:1 solid #161616;color:#8b8b8b;margin:0 0 0 0;padding:2 8 3 8}#TopBarTab::tab:hover{background-color:#303030;color:#8b8b8b}#TopBarTab::tab:selected{background-color:#303030;color:#f4f4f4}#TopBarTab::tab:first{border-left:1 solid #161616}#TopBarTab::tab:last{border-right:1 solid #161616}QMenu{background-color:#303030;border:1 solid #161616;padding:2 0}QMenu::item{padding:3 28}QMenu::item:selected{background-color:#5385a6;color:#fff}QMenu::item:checked{color:#cecece}QMenu::item:checked:selected{background-color:#5385a6;color:#fff}QMenu::item:disabled{background:none;color:#808080}QMenu::item:disabled:selected{border-color:transparent}QMenu::separator{border-top:1 solid #161616;height:0;margin:2 0}QMenu::icon{border-radius:2;margin:0 0 0 3;padding:1}QMenu::icon:checked{background-color:#5385a6}QMenu::indicator{margin-left:7}TPanelTitleBar{background-color:#262626;border-color:#161616;border-style:solid;border-width:0 0 1 0;height:20;min-height:20;qproperty-TitleColor:#7d7d7d;qproperty-ActiveTitleColor:#fff;qproperty-BorderPixmap:url('none');qproperty-ActiveBorderPixmap:url('../Default/imgs/white/none');qproperty-FloatBorderPixmap:url('none');qproperty-FloatActiveBorderPixmap:url('../Default/imgs/white/none')}QAbstractScrollArea::corner{background-color:#262626}QScrollBar{background-color:#262626;border:0}QScrollBar:horizontal{height:16;margin:0}QScrollBar:vertical{margin:0;width:16}QScrollBar::handle{border:1 solid #3a3a3a;border-radius:4}QScrollBar::handle:horizontal:hover,QScrollBar::handle:vertical:hover{background-color:#4f4f4f;border-color:#4f4f4f}QScrollBar::handle:horizontal:pressed,QScrollBar::handle:vertical:pressed{background-color:#636363;border-color:#636363}QScrollBar::handle:horizontal{background-color:#3a3a3a;margin:3 16;min-width:20}QScrollBar::handle:vertical{background-color:#3a3a3a;margin:16 3;min-height:20}QScrollBar::add-line{subcontrol-origin:margin;border:0}QScrollBar::add-line:horizontal{subcontrol-position:right;background-color:#262626;margin:0;width:16}QScrollBar::add-line:vertical{subcontrol-position:bottom;background-color:#262626;margin:0;height:16}QScrollBar::sub-line{border:0;subcontrol-origin:margin}QScrollBar::sub-line:horizontal{subcontrol-position:left;background-color:#262626;margin:0;width:16}QScrollBar::sub-line:vertical{subcontrol-position:top;background-color:#262626;margin:0;height:16}QScrollBar::up-arrow:vertical{image:url('../Default/imgs/white/scroll-up.svg');image-position:center center}QScrollBar::up-arrow:vertical:pressed{margin:1 0 0 0}QScrollBar::down-arrow:vertical{image:url('../Default/imgs/white/scroll-down.svg');image-position:center center}QScrollBar::down-arrow:vertical:pressed{margin:1 0 0 0}QScrollBar::left-arrow:horizontal{image:url('../Default/imgs/white/scroll-left.svg');image-position:center center}QScrollBar::left-arrow:horizontal:pressed{margin:1 0 0 0}QScrollBar::right-arrow:horizontal{image:url('../Default/imgs/white/scroll-right.svg');image-position:center center}QScrollBar::right-arrow:horizontal:pressed{margin:1 0 0 0}QScrollBar::sub-page:horizontal,QScrollBar::add-page:horizontal,QScrollBar::sub-page:vertical,QScrollBar::add-page:vertical{background:none}QToolBar{padding:0}QToolBar::separator:horizontal{border-left:1 solid #161616;margin:0 1;width:0}QToolBar::separator:vertical{border-top:1 solid #161616;height:0;margin:1 0}QToolBar QLabel{margin-top:1}QToolBar QToolBar{border:0}QToolButton::menu-indicator{image:none}QToolButton::menu-button{border-image:none}.DvScrollWidget QPushButton,DvScrollWidget QPushButton,#ScrollLeftButton QPushButton,#ScrollRightButton QPushButton,#ScrollUpButton QPushButton,#ScrollDownButton QPushButton{background-color:#515151;border:0 solid red;border-radius:0;padding:0;max-width:16}.DvScrollWidget QPushButton:hover,DvScrollWidget QPushButton:hover,#ScrollLeftButton QPushButton:hover,#ScrollRightButton QPushButton:hover,#ScrollUpButton QPushButton:hover,#ScrollDownButton QPushButton:hover{background-color:#5e5e5e}.DvScrollWidget QPushButton:pressed,DvScrollWidget QPushButton:pressed,#ScrollLeftButton QPushButton:pressed,#ScrollRightButton QPushButton:pressed,#ScrollUpButton QPushButton:pressed,#ScrollDownButton QPushButton:pressed{background-color:#191919}#ScrollLeftButton,#ScrollRightButton,#ScrollUpButton,#ScrollDownButton{margin:0;min-width:16}#ScrollLeftButton{border-right:1 solid #161616;image:url('../Default/imgs/white/scroll-left.svg')}#ScrollRightButton{border-left:1 solid #161616;margin-left:3;image:url('../Default/imgs/white/scroll-right.svg')}#ScrollUpButton{image:url('../Default/imgs/white/scroll-up.svg')}#ScrollDownButton{image:url('../Default/imgs/white/scroll-down.svg')}#keyFrameNavigator{background:none;margin:0;padding:0}#keyFrameNavigator QToolButton{min-width:18}#keyFrameNavigator #PreviousKey{image:url('../Default/imgs/white/prevkey.svg')}#keyFrameNavigator #PreviousKey:hover{image:url('../Default/imgs/white/prevkey_over.svg')}#keyFrameNavigator #PreviousKey:disabled{image:url('../Default/imgs/white/prevkey_disabled.svg')}#keyFrameNavigator #NextKey{image:url('../Default/imgs/white/nextkey.svg')}#keyFrameNavigator #NextKey:hover{image:url('../Default/imgs/white/nextkey_over.svg')}#keyFrameNavigator #NextKey:disabled{image:url('../Default/imgs/white/nextkey_disabled.svg')}.treeview,QTreeWidget,QTreeView,#FunctionEditorTree{background-color:#262626;alternate-background-color:#2b2b2b;border:0;margin:0;outline:0}.treeview::item:selected,QTreeWidget::item:selected,QTreeView::item:selected,#FunctionEditorTree::item:selected{background-color:#5385a6;color:#fff}.treeview::branch:adjoins-item,QTreeWidget::branch:adjoins-item,QTreeView::branch:adjoins-item,#FunctionEditorTree::branch:adjoins-item{border-image:url('')}.treeview::branch:has-siblings,QTreeWidget::branch:has-siblings,QTreeView::branch:has-siblings,#FunctionEditorTree::branch:has-siblings{border-image:url('')}.treeview::branch:has-siblings:adjoins-item,QTreeWidget::branch:has-siblings:adjoins-item,QTreeView::branch:has-siblings:adjoins-item,#FunctionEditorTree::branch:has-siblings:adjoins-item{border-image:url('')}.treeview::branch:has-children:closed,QTreeWidget::branch:has-children:closed,QTreeView::branch:has-children:closed,#FunctionEditorTree::branch:has-children:closed{background:url('../Default/imgs/white/treebranch-closed.svg') no-repeat;background-position:center center;border-image:none;image:none}.treeview::branch:has-children:open,QTreeWidget::branch:has-children:open,QTreeView::branch:has-children:open,#FunctionEditorTree::branch:has-children:open{background:url('../Default/imgs/white/treebranch-open.svg') no-repeat;background-position:center center;image:none}.treeview::branch:has-children:has-siblings:closed,QTreeWidget::branch:has-children:has-siblings:closed,QTreeView::branch:has-children:has-siblings:closed,#FunctionEditorTree::branch:has-children:has-siblings:closed{background:url('../Default/imgs/white/treebranch-closed.svg') no-repeat;background-position:center center;border-image:none;image:none}.treeview::branch:has-children:has-siblings:open,QTreeWidget::branch:has-children:has-siblings:open,QTreeView::branch:has-children:has-siblings:open,#FunctionEditorTree::branch:has-children:has-siblings:open{background:url('../Default/imgs/white/treebranch-open.svg') no-repeat;background-position:center center;border-image:none;image:none}QListView{outline:0;background:#262626;alternate-background-color:#2b2b2b}#TabBarContainer{background-color:#262626}.Button,QPushButton,.ComboBox,.ComboBox:checked,QComboBox,QComboBox:checked{background-color:#515151;border:1 solid #303030;border-radius:2;color:#dbdbdb;margin:0;padding:3 15}.Button:hover,QPushButton:hover,.ComboBox:hover,#ViewerFpsSlider::sub-line:horizontal:hover,#ViewerFpsSlider::add-line:horizontal:hover,QComboBox:hover{background-color:#5e5e5e;border-color:#303030;color:#dbdbdb}.Button:pressed,QPushButton:pressed,#ViewerFpsSlider::sub-line:horizontal:pressed,#ViewerFpsSlider::add-line:horizontal:pressed{background-color:#191919;border-color:#141414;color:#dbdbdb}.Button:checked,QPushButton:checked{background-color:#191919;border-color:#141414;color:#dbdbdb}.Button:checked:hover,QPushButton:checked:hover{background-color:#1e1e1e}.Button:checked:hover:pressed,QPushButton:checked:hover:pressed{background:#191919}.Button:disabled,QPushButton:disabled,.ComboBox:disabled,#ViewerFpsSlider::sub-line:horizontal:disabled,#ViewerFpsSlider::add-line:horizontal:disabled,QComboBox:disabled{background-color:#3d3d3d;border-color:#303030;color:#808080}#PushButton_NoPadding{padding:3}.ComboBox,.ComboBox:checked,QComboBox,QComboBox:checked{padding:1 0 1 4;margin:1 0}.ComboBox::drop-down,QComboBox::drop-down{image:url('../Default/imgs/white/combo_downarrow.svg');image-position:center center;width:16}.ComboBox::drop-down:disabled,QComboBox::drop-down:disabled{image:url('../Default/imgs/white/combo_downarrow_disabled.svg')}.ComboBox QAbstractItemView,QComboBox QAbstractItemView{background-color:#303030;border:1 solid #161616;selection-background-color:#5385a6;selection-color:#fff}.LineEdit,QPlainTextEdit,QLineEdit,#TaskSheetItem,#tasksRemoveBox,#tasksAddBox{background-color:#1c1c1c;border:1 solid #3d3d3d;border-radius:2;color:#cecece;selection-background-color:#5385a6;selection-color:#fff;padding:0 0 0 1}.LineEdit:focus,QPlainTextEdit:focus,QLineEdit:focus,#TaskSheetItem:focus,#tasksRemoveBox:focus,#tasksAddBox:focus{background-color:#1c1c1c;border-color:#5385a6;color:#cecece}.LineEdit:disabled,QPlainTextEdit:disabled,QLineEdit:disabled,#TaskSheetItem:disabled,#tasksRemoveBox:disabled,#tasksAddBox:disabled{background-color:#262626;border-color:#363636;color:#808080}.CheckBox,QCheckBox{color:#cecece}.CheckBox:hover,QCheckBox:hover,.RadioButton:hover,QRadioButton:hover{color:#fff}.CheckBox:disabled,QCheckBox:disabled{color:#808080}.CheckBox::indicator,QMenu::indicator,QCheckBox::indicator,.GroupBox::indicator,QGroupBox::indicator{background-color:#1c1c1c;border:1 solid #3d3d3d;border-radius:2;height:9;padding:1;width:9}.CheckBox::indicator:hover,QMenu::indicator:hover,.CheckBox::indicator:checked:hover,QCheckBox::indicator:hover,.GroupBox::indicator:hover,QMenu::indicator:checked:hover,QCheckBox::indicator:checked:hover,.GroupBox::indicator:checked:hover,QGroupBox::indicator:hover,QGroupBox::indicator:checked:hover{background-color:#1c1c1c;border-color:#5385a6}.CheckBox::indicator:checked,QMenu::indicator:checked,QCheckBox::indicator:checked,.GroupBox::indicator:checked,QGroupBox::indicator:checked{background-color:#1c1c1c;border-color:#3d3d3d;image:url('../Default/imgs/white/checkmark.svg')}.CheckBox::indicator:checked:disabled,QMenu::indicator:checked:disabled,QCheckBox::indicator:checked:disabled,.GroupBox::indicator:checked:disabled,QGroupBox::indicator:checked:disabled{background-color:#262626;border-color:#191919;image:url('../Default/imgs/white/checkmark_disabled.svg')}.CheckBox::indicator:disabled,QMenu::indicator:disabled,QCheckBox::indicator:disabled,.GroupBox::indicator:disabled,QGroupBox::indicator:disabled{background-color:#262626;border-color:#191919}.RadioButton::indicator:unchecked,QRadioButton::indicator:unchecked,#CameraSettingsRadioButton_Small::indicator:unchecked{image:url('../Default/imgs/white/radiobutton_unchecked.svg');image-position:center center}.RadioButton::indicator:checked,QRadioButton::indicator:checked,#CameraSettingsRadioButton_Small::indicator:checked{image:url('../Default/imgs/white/radiobutton_checked.svg');image-position:center center}.GroupBox,QGroupBox{margin:6 0 0 0;padding:5 0}.GroupBox::title,QGroupBox::title{subcontrol-origin:margin;left:15;margin:-3 0 0 0;padding:0 3}.GroupBox::title:hover,QGroupBox::title:hover{color:#fff}.GroupBox::title:disabled,QGroupBox::title:disabled{color:#808080}.GroupBox::indicator,QGroupBox::indicator{subcontrol-origin:margin;margin-top:2}.GroupBox:disabled,QGroupBox:disabled{color:#808080}.Slider::groove:horizontal,QSlider::groove:horizontal{background-color:transparent;background-image:url('../Default/imgs/white/slider-groove_dark.svg');background-position:center center;background-repeat:repeat-x;margin:0;height:20;min-height:20}.Slider::groove:horizontal:disabled,QSlider::groove:horizontal:disabled{background-image:url('../Default/imgs/white/slider-groove_disabled_dark.svg')}.Slider::handle:horizontal,QSlider::handle:horizontal{width:10;margin:-2 -1;image:url('../Default/imgs/white/slider-handle.svg')}.Slider::handle:horizontal:disabled,QSlider::handle:horizontal:disabled{image:url('../Default/imgs/white/slider-handle_disabled.svg')}#IntPairField,#DoublePairField{qproperty-LightLineColor:#191919;qproperty-LightLineEdgeColor:#191919;qproperty-DarkLineColor:#191919;qproperty-MiddleLineColor:#191919;qproperty-HandleLeftPixmap:url("../Default/imgs/white/slider-handle.svg");qproperty-HandleRightPixmap:url("../Default/imgs/white/slider-handle.svg");qproperty-HandleLeftGrayPixmap:url("../Default/imgs/white/slider-handle_disabled.svg");qproperty-HandleRightGrayPixmap:url("../Default/imgs/white/slider-handle_disabled.svg")}#DirTreeView{background-color:#262626;alternate-background-color:#262626;border:1 solid #161616;border-right:0}DvItemViewerPanel{qproperty-TextColor:#cecece;qproperty-AlternateBackground:#282828;qproperty-SelectedTextColor:#fff;qproperty-FolderTextColor:#9fdaff;qproperty-SelectedItemBackground:#5385a6}#FileBrowser DvItemViewerPanel,#SceneCast DvItemViewerPanel{background-color:#303030}#FileBrowser #castFrame,#SceneCast #castFrame{border-top:1 solid #161616;border-right:1 solid #161616;border-bottom:1 solid #161616;margin:0}#FileBrowser QToolButton,#SceneCast QToolButton{padding:1}DvDirTreeView{qproperty-TextColor:#cecece;qproperty-SelectedTextColor:#fff;qproperty-SelectedItemBackground:#5385a6;qproperty-FolderTextColor:#9fdaff;qproperty-SelectedFolderTextColor:#fff;alternate-background-color:#2b2b2b;background-color:#262626;border:1 solid #161616}#FileDoesNotExistLabel{color:#f00}#SceneCast QToolBar{border-top:1 solid #161616}#SceneCast QToolButton{margin:3 1 2 1;padding:1}#CastBrowser{border:0;margin:0}#FilmStrip QComboBox{border-radius:0;border-width:0}#FilmStrip QComboBox QAbstractItemView{background-color:#303030}#CleanupSettings #CleanupSettingsFrame{margin-top:2;margin-bottom:4}#CleanupSettings QGroupBox{margin-bottom:3}ParamsPage{qproperty-TextColor:#cecece}#CameraSettingsButton{padding:2}#CameraSettingsRadioButton:hover{background:none}#CameraSettingsRadioButton::indicator{border:1 solid rgba(255,255,255,0);height:18;padding:0;width:18}#CameraSettingsRadioButton::indicator:unchecked{image:url('../Default/imgs/white/lock_off.svg')}#CameraSettingsRadioButton::indicator:checked{background-color:#C34040;border-color:#C34040;image:url('../Default/imgs/white/lock_on.svg')}#CameraSettingsRadioButton::indicator:checked:hover{background-color:#d57a7a;border-color:#d57a7a}#CameraSettingsDPI{color:#9fdaff}#CameraSettingsRadioButton_Small{padding:0}#CameraSettingsRadioButton_Small::indicator{background-color:transparent;border:0;height:21;margin:0;width:11}#ForceSquaredPixelButton{height:16;border:1 solid rgba(255,255,255,0);image:url('../Default/imgs/white/fsp_unchecked.svg');padding:2;width:16;margin:0}#ForceSquaredPixelButton:checked{image:url('../Default/imgs/white/fsp_checked.svg')}#OutputSettingsLabel{color:#9fdaff}PencilTestPopup{min-height:730px;min-width:512px}#MatchLineButton{background-color:#565656}#MatchLineButton:checked{background-color:#7d7d7d;border:2 solid #5385a6;border-radius:2}#LargeSizedText{font-size:17}#StartupLabel{padding:3}#StartupLabel:hover{background:#4a4a4a}QStatusBar{background-color:#c0c0c0}QStatusBar::item{border:0}QStatusBar QLabel{background-color:#c0c0c0}QStatusBar #StatusBarLabel{background-color:#fff;padding:1 3}#TitleTxtLabel{color:#9fdaff}#StyleEditor QPushButton{margin:2 1;padding:0}#StyleEditor #TabBarContainer{margin-left:-4}#StyleEditor #bottomWidget{border-top:1 solid #161616;padding:3 2 8 3}#StyleEditor #bottomWidget QPushButton{padding:3 5}#StyleEditorTabBar::tab::first{border-left:1 solid #161616}#HexagonalColorWheel{qproperty-BGColor:#303030}#colorSlider::groove:horizontal{height:1;border-image:none}#colorSlider::handle:horizontal{width:8;margin:-8 -4}#colorSliderAddButton,#colorSliderSubButton{background:none;border-color:transparent;image-position:center center;min-height:16;padding:0;min-width:18}#colorSliderAddButton{image:url('../Default/imgs/white/scroll-right.svg')}#colorSliderSubButton{image:url('../Default/imgs/white/scroll-left.svg')}#PlainColorPageParts{border-bottom:1 solid #161616}#PlainColorPageParts QLineEdit{max-width:35}PaletteViewer DvScrollWidget QPushButton{border-top:0;margin-bottom:1;max-width:15;min-width:15}PaletteViewer DvScrollWidget #ScrollLeftButton{border-radius:0;margin-bottom:1;max-width:16;min-width:16}PaletteViewer DvScrollWidget #ScrollRightButton{border-radius:0;margin-left:1;margin-bottom:1;max-width:16;min-width:16}PaletteViewer QToolBar{background:none;border-bottom:1 solid #161616;padding:0;margin:0}PaletteViewer QToolBar::separator:horizontal{margin:0}PaletteViewer QToolBar QToolButton{margin:0 0 1 0;padding:1 0 2 0}#PageViewer{qproperty-TextColor:#cecece}#PaletteLockButton{border-radius:0;margin:0 0 1 1}#PaletteLockButton:checked{background-color:#C34040;border-color:#C34040}#PaletteLockButton:checked:hover{background-color:#d57a7a;border-color:#d57a7a}#WordButton{padding-right:0;padding-left:0}QDialog{background-color:#303030}QDialog #dialogButtonFrame{background-color:#282828;border-top:1 solid #161616}QDialog #dialogButtonFrame QPushButton{border-color:#282828;outline:0}QDialog #dialogButtonFrame QPushButton:focus{background-color:#5385a6;border-color:#282828;color:#f4f4f4}QDialog #dialogButtonFrame QPushButton:focus:hover{background-color:#6c98b6}QDialog #dialogButtonFrame QPushButton:focus:pressed{background-color:#191919;border-color:#141414;color:#dbdbdb}#SceneSettings QLabel{color:#9fdaff}#PreferencesPopup QListWidget{background-color:#262626;alternate-background-color:#262626;border:1 solid #161616;font-size:13}#PreferencesPopup QListWidget::item{border:0;padding:3}#PreferencesPopup QListWidget::item:hover{color:#cecece;background-color:rgba(255,255,255,0.15)}#PreferencesPopup QListWidget::item:selected{background-color:#5385a6;color:#fff}#ShortcutTree{border:1 solid #161616}#ShortcutTree::item{padding:1 0}#ShortcutTree QScrollBar:vertical{width:16;margin-right:-1}ProjectPopup QLabel{color:#9fdaff}#GearButton{qproperty-icon:url('../Default/imgs/white/gear.svg')}#SubfolderButton{qproperty-icon:url('../Default/imgs/white/subfolder.svg');padding-left:6px;padding-right:6px}#SubcameraButton{qproperty-icon:url('../Default/imgs/white/subcamera.svg');padding-left:6px;padding-right:6px}SchematicViewer{qproperty-TextColor:#cecece;qproperty-VerticalLineColor:#090909;qproperty-LevelColumnColor:#4C6E4C;qproperty-VectorColumnColor:#7B7B4C;qproperty-ChildColumnColor:#6A526B;qproperty-FullcolorColumnColor:#657A96;qproperty-FxColumnColor:#56553C;qproperty-PaletteColumnColor:#3A655F;qproperty-MeshColumnColor:#684D86;qproperty-ReferenceColumnColor:#616161;qproperty-TableColor:#62628c;qproperty-ActiveCameraColor:#2d7dca;qproperty-OtherCameraColor:#6c797b;qproperty-GroupColor:#3b6e9c;qproperty-PegColor:#9f6e3c;qproperty-SplineColor:#6a9d1c;qproperty-ActiveOutputColor:#2d7dca;qproperty-OtherOutputColor:#6c797b;qproperty-XsheetColor:#62628c;qproperty-NormalFxColor:#6a7e96;qproperty-MacroFxColor:#815c79;qproperty-ImageAdjustFxColor:#656287;qproperty-LayerBlendingFxColor:#4f757d;qproperty-MatteFxColor:#ae7171;qproperty-SchematicPreviewButtonBgOnColor:#c8c864;qproperty-SchematicPreviewButtonOnImage:url('../Default/imgs/white/x_prev_eye_on.svg');qproperty-SchematicPreviewButtonBgOffColor:#616161;qproperty-SchematicPreviewButtonOffImage:url('../Default/imgs/white/x_prev_eye_off.svg');qproperty-SchematicCamstandButtonBgOnColor:#eb906b;qproperty-SchematicCamstandButtonOnImage:url('../Default/imgs/white/x_table_view_on.svg');qproperty-SchematicCamstandButtonTranspImage:url('../Default/imgs/white/x_table_view_transp.svg');qproperty-SchematicCamstandButtonBgOffColor:#616161;qproperty-SchematicCamstandButtonOffImage:url('../Default/imgs/white/x_table_view_off.svg')}#SchematicBottomFrame{background-color:#303030;border:0;margin:0;padding:0}#SchematicBottomFrame QToolBar::separator:horizontal{margin:0}#SchematicBottomFrame QToolBar QToolButton{padding:0;margin:2}#SchematicSceneViewer{background-color:#232323;border-bottom:1 solid #161616}#FxSettingsTabBar::tab{border-top:1 solid #161616}#FxSettingsTabBar::tab::first,#FxSettingsTabBar::tab::only-one{border-left:1 solid #161616}FxSettings QToolBar{border-top:1 solid #161616;border-right:1 solid #161616;border-left:1 solid #161616;min-height:23;padding:3 0}FxSettings QToolBar QToolBar{border:0}#FxSettingsLabel{color:#a0e680}#FxSettingsHelpButton{background-color:#80a0dc;color:#000;padding-top:0;padding-bottom:0}#FxSettingsHelpButton:hover{background-color:#a8bee7}#ScriptConsole{font-family:'Courier New',monospace;border:0;color:#000000;padding:3}#ScriptConsole QFrame{background-color:#dcdcdc}#ScriptConsole TPanelTitleBar{background-color:#262626}#TaskSheetItemLabel{color:#cecece}#Tasks QToolBar{border-bottom:1 solid #161616;margin:0;padding:0}#Tasks QToolBar QToolButton{margin:2 2 3 2}#ToolBar QToolBar{padding-left:2}#ToolOptions TPanelTitleBar{border-right:1 solid #161616;border-bottom:0}#CommandBar TPanelTitleBar{border-right:1 solid #161616;border-bottom:0}IconViewField{qproperty-ThicknessPixmap:url("../Default/imgs/white/selectiontool_thickness.svg")}#EditToolLockButton{spacing:0}#EditToolLockButton:hover{background:none}#EditToolLockButton::indicator{border:1 solid rgba(255,255,255,0);height:18;padding:0;width:18}#EditToolLockButton::indicator:unchecked{image:url('../Default/imgs/white/lock_off.svg')}#EditToolLockButton::indicator:checked{background-color:#C34040;border-color:#C34040;image:url('../Default/imgs/white/lock_on.svg')}#EditToolLockButton::indicator:checked:hover{background-color:#d57a7a;border-color:#d57a7a}PopupButton::menu-indicator{border-left:0;height:17;image:url('../Default/imgs/white/combo_downarrow.svg');width:10}PopupButton::menu-indicator:hover{image:url('../Default/imgs/white/combo_downarrow.svg')}PopupButton::menu-indicator:disabled{image:url('../Default/imgs/white/combo_downarrow_disabled.svg')}#Cap,#Join{padding:0 4 0 -8;max-width:32;min-width:32}#Cap QMenu,#Join QMenu{max-width:28;min-width:28}#Cap QMenu::item,#Join QMenu::item{max-width:28;min-width:28;padding:0}QToolBar#MediumPaddingToolBar QToolButton{padding-left:3;padding-right:3}QToolBar#WidePaddingToolBar QToolButton{padding-left:6;padding-right:6}#CommandBar{margin:0;padding:0;border:0}#CommandBar::separator:horizontal{margin-right:3;margin-left:3}#expandButton:checked{background-color:transparent;border-color:transparent;color:#cecece}#expandButton:checked:hover{background-color:#5e5e5e;border-color:#5e5e5e}#expandButton:checked:pressed{background-color:#191919;border-color:#141414}#ComboViewerPanel Toolbar{border-bottom:1 solid #161616}#ComboViewerPanel Toolbar::separator:horizontal{margin:0 0 0 2}#ComboViewerPanel Toolbar QToolButton{margin:2 0 3 2}#ComboViewerToolOptions{border-bottom:1 solid #161616}#ComboViewer #ToolBarContainer,#ViewerPanel #ToolBarContainer,FlipBook #ToolBarContainer{background-color:transparent;border-top:2 solid #161616;border-bottom:1 solid #161616;padding-right:-1}#flipCustomize{margin-left:3}#flipCustomize::menu-button{background-color:transparent;width:35}#flipCustomize::menu-arrow{image:none}QToolBar#FlipConsolePlayToolBar::separator:horizontal{margin:0 3}QToolBar#FlipConsolePlayToolBar QToolButton{margin-top:2;margin-bottom:2;height:16;padding-left:1;padding-right:1}#ViewerFpsSlider{background-color:transparent;background-image:url('../Default/imgs/white/slider-groove_dark.svg');background-position:center center;background-repeat:repeat-x;border:0;height:19;margin:0 3 0 37;max-width:300;min-width:0}#ViewerFpsSlider::sub-line:horizontal{subcontrol-origin:absolute;background-color:#515151;border:1 solid #303030;border-top-left-radius:2;border-bottom-left-radius:2;height:16;left:-33;width:14}#ViewerFpsSlider::add-line:horizontal{subcontrol-position:left;background-color:#515151;border:1 solid #303030;border-top-right-radius:2;border-bottom-right-radius:2;left:18;height:16;image-position:center center;width:13}#ViewerFpsSlider::handle::horizontal{background-color:#898989;border:1 solid #898989;border-radius:2;margin:2 0 3 0;min-width:9;width:9;max-width:9}FlipSlider{qproperty-PBHeight:15;qproperty-PBOverlay:url('../Default/imgs/white/flipslider_dark.svg');qproperty-PBColorMarginLeft:1;qproperty-PBColorMarginTop:2;qproperty-PBColorMarginRight:1;qproperty-PBColorMarginBottom:2;qproperty-PBMarker:url('../Default/imgs/white/flipmarker_dark.svg');qproperty-PBMarkerMarginLeft:3;qproperty-PBMarkerMarginRight:3;qproperty-notStartedColor:rgba(205,101,101,0.78);qproperty-startedColor:#1abc3f;qproperty-baseColor:#1c1c1c;qproperty-finishedColor:#1c1c1c}Ruler{qproperty-ParentBGColor:#303030;qproperty-ScaleColor:#cecece}#RulerToolOptionValues{color:#000}#xsheetArea,#ScrollArea{background-color:#1c1c1c;border:0}#xsheetScrollArea{border:0}#cornerWidget QToolButton{padding:0}#xsheetColumnAreaMenu_Preview{background-color:#E6E678}#xsheetColumnAreaMenu_Lock{background-color:#F5F5F5}#xsheetColumnAreaMenu_Camstand{background-color:#FFA480}#xsheetColumnAreaMenu_Preview,#xsheetColumnAreaMenu_Lock,#xsheetColumnAreaMenu_Camstand{color:#000}#noteTextEdit{color:#000}XsheetViewer{qproperty-TextColor:#cecece;qproperty-BGColor:#282828;qproperty-LightLineColor:#1f1f1f;qproperty-MarkerLineColor:#1E96C4;qproperty-VerticalLineColor:#090909;qproperty-VerticalLineHeadColor:#686868;qproperty-PreviewFrameTextColor:#9fdaff;qproperty-CurrentRowBgColor:#506082;qproperty-OnionSkinAreaBgColor:#1e1e1e;qproperty-EmptyColumnHeadColor:#444;qproperty-SelectedColumnTextColor:#E66464;qproperty-EmptyCellColor:#303030;qproperty-NotEmptyColumnColor:#383838;qproperty-SelectedEmptyCellColor:#545454;qproperty-LevelColumnColor:#4C6E4C;qproperty-LevelColumnBorderColor:#8FB38F;qproperty-SelectedLevelColumnColor:#678667;qproperty-VectorColumnColor:#7B7B4C;qproperty-VectorColumnBorderColor:#BBBB9A;qproperty-SelectedVectorColumnColor:#949466;qproperty-ChildColumnColor:#6A526B;qproperty-ChildColumnBorderColor:#B1A3B3;qproperty-SelectedChildColumnColor:#816e82;qproperty-FullcolorColumnColor:#657A96;qproperty-FullcolorColumnBorderColor:#9EB8BB;qproperty-SelectedFullcolorColumnColor:#8895a6;qproperty-FxColumnColor:#56553C;qproperty-FxColumnBorderColor:#95958A;qproperty-SelectedFxColumnColor:#6f6e56;qproperty-ReferenceColumnColor:#616161;qproperty-ReferenceColumnBorderColor:#A2A2A2;qproperty-SelectedReferenceColumnColor:#7a7a7a;qproperty-PaletteColumnColor:#3A655F;qproperty-PaletteColumnBorderColor:#86ACA7;qproperty-SelectedPaletteColumnColor:#52807a;qproperty-MeshColumnColor:#684D86;qproperty-MeshColumnBorderColor:#BA92EF;qproperty-SelectedMeshColumnColor:#82689e;qproperty-SoundTextColumnColor:#c8c8c8;qproperty-SoundTextColumnBorderColor:#8c8c8c;qproperty-SelectedSoundTextColumnColor:#e2e2e2;qproperty-SoundColumnColor:#657456;qproperty-SoundColumnBorderColor:#A0AF7D;qproperty-SelectedSoundColumnColor:#7e8b72;qproperty-SoundColumnHlColor:#34FE5E;qproperty-SoundColumnTrackColor:#B6C29D;qproperty-ColumnHeadPastelizer:#000;qproperty-SelectedColumnHead:#506082;qproperty-LightLightBGColor:#303030;qproperty-LightBGColor:#d8d8d8;qproperty-DarkBGColor:#c9c9c9;qproperty-DarkLineColor:#7e7e7e;qproperty-XsheetColumnNameBgColor:rgba(0,0,0,0);qproperty-XsheetDragBarHighlightColor:rgba(255,255,255,0.5);qproperty-XsheetPreviewButtonBgOnColor:#c8c864;qproperty-XsheetPreviewButtonOnImage:url('../Default/imgs/white/x_prev_eye_on.svg');qproperty-XsheetPreviewButtonBgOffColor:rgba(255,255,255,0);qproperty-XsheetPreviewButtonOffImage:url('../Default/imgs/white/x_prev_eye_off.svg');qproperty-XsheetCamstandButtonBgOnColor:#eb906b;qproperty-XsheetCamstandButtonOnImage:url('../Default/imgs/white/x_table_view_on.svg');qproperty-XsheetCamstandButtonTranspImage:url('../Default/imgs/white/x_table_view_transp.svg');qproperty-XsheetCamstandButtonBgOffColor:rgba(255,255,255,0);qproperty-XsheetCamstandButtonOffImage:url('../Default/imgs/white/x_table_view_off.svg');qproperty-XsheetLockButtonBgOnColor:rgba(255,255,255,0.3);qproperty-XsheetLockButtonOnImage:url('../Default/imgs/white/x_lock_on.svg');qproperty-XsheetLockButtonBgOffColor:rgba(255,255,255,0);qproperty-XsheetLockButtonOffImage:url('../Default/imgs/white/x_lock_off.svg');qproperty-XsheetConfigButtonBgColor:rgba(255,255,255,0);qproperty-XsheetConfigButtonImage:url('../Default/imgs/white/x_config.svg');qproperty-TimelinePreviewButtonBgOnColor:rgba(255,255,255,0);qproperty-TimelinePreviewButtonOnImage:url('../Default/imgs/white/timeline_toggle_on.svg');qproperty-TimelinePreviewButtonBgOffColor:rgba(255,255,255,0);qproperty-TimelinePreviewButtonOffImage:url('../Default/imgs/white/timeline_toggle_off.svg');qproperty-TimelineCamstandButtonBgOnColor:rgba(255,255,255,0);qproperty-TimelineCamstandButtonOnImage:url('../Default/imgs/white/timeline_toggle_on.svg');qproperty-TimelineCamstandButtonTranspImage:url('../Default/imgs/white/timeline_toggle_transp.svg');qproperty-TimelineCamstandButtonBgOffColor:rgba(255,255,255,0);qproperty-TimelineCamstandButtonOffImage:url('../Default/imgs/white/timeline_toggle_off.svg');qproperty-TimelineLockButtonBgOnColor:rgba(255,255,255,0);qproperty-TimelineLockButtonOnImage:url('../Default/imgs/white/timeline_toggle_on.svg');qproperty-TimelineLockButtonBgOffColor:rgba(255,255,255,0);qproperty-TimelineLockButtonOffImage:url('../Default/imgs/white/timeline_toggle_off.svg');qproperty-TimelineConfigButtonBgColor:rgba(255,255,255,0);qproperty-TimelineConfigButtonImage:url('../Default/imgs/white/timeline_config.svg');qproperty-LayerHeaderPreviewImage:url('../Default/imgs/white/layer_header_prev_eye.svg');qproperty-LayerHeaderPreviewOverImage:url('../Default/imgs/white/layer_header_prev_eye_over.svg');qproperty-LayerHeaderCamstandImage:url('../Default/imgs/white/layer_header_table_view.svg');qproperty-LayerHeaderCamstandOverImage:url('../Default/imgs/white/layer_header_table_view_over.svg');qproperty-LayerHeaderLockImage:url('../Default/imgs/white/lock_on.svg');qproperty-LayerHeaderLockOverImage:url('../Default/imgs/white/lock_on_over.svg')}#XSheetToolbar{margin:0;padding:0;border:0}#XSheetToolbar QToolButton{padding:0;margin:4 1;min-height:19;height:19}#XSheetToolbar::separator:horizontal{margin:0 4}#FunctionEditor QToolBar{border-bottom:1 solid #161616}#FunctionEditor QToolBar QToolBar{border:0}#FunctionEditor QToolBar QLabel{margin-left:5}#FunctionEditor QToolBar QToolButton{height:18}#FunctionEditorTree{border-top:1 solid #161616}FunctionTreeView{qproperty-TextColor:#cecece;qproperty-CurrentTextColor:#E66464}FunctionPanel{qproperty-BGColor:#232323;qproperty-ValueLineColor:#161616;qproperty-FrameLineColor:#161616;qproperty-OtherCurvesColor:#707070;qproperty-RulerBackground:#1b1b1b;qproperty-TextColor:#cecece;qproperty-SubColor:#000;qproperty-SelectedColor:#FFA500}SpreadsheetViewer{qproperty-LightLightBGColor:#303030;qproperty-CurrentRowBgColor:#506082;qproperty-LightLineColor:#1f1f1f;qproperty-MarkerLineColor:#1E96C4;qproperty-BGColor:#383838;qproperty-VerticalLineColor:#090909;qproperty-KeyFrameColor:#995d1d;qproperty-KeyFrameBorderColor:#c9b04b;qproperty-SelectedKeyFrameColor:#be772b;qproperty-InBetweenColor:#666250;qproperty-InBetweenBorderColor:#cdcec8;qproperty-SelectedInBetweenColor:#7d7a6c;qproperty-SelectedEmptyColor:#545454;qproperty-SelectedSceneRangeEmptyColor:#5d5d5d;qproperty-TextColor:#cecece;qproperty-ColumnHeaderBorderColor:#686868;qproperty-SelectedColumnTextColor:#E66464}#ExpressionField{background-color:#cecece;border:1 solid #1b1b1b;margin:0}#FunctionSegmentViewerLinkButton{background-image:url('../Default/imgs/white/segment_unlinked.svg');background-repeat:no-repeat}#FunctionSegmentViewerLinkButton:hover{background-repeat:no-repeat}#FunctionSegmentViewerLinkButton:checked{background-image:url('../Default/imgs/white/segment_linked.svg');background-repeat:no-repeat}#FunctionSegmentViewerLinkButton:disabled{background-image:url('../Default/imgs/white/segment_disabled.svg');background-repeat:no-repeat} \ No newline at end of file +.button-show,#LoadLevelShowButton,#CleanupSettingsShowButton,#OutputSettingsShowButton,#FxSettingsPreviewShowButton{image:url('../Default/imgs/white/plus.svg');image-position:center center;margin:0;padding:1;min-width:10;min-height:10}.button-show:checked,#LoadLevelShowButton:checked,#CleanupSettingsShowButton:checked,#OutputSettingsShowButton:checked,#FxSettingsPreviewShowButton:checked{background-color:#191919;border-color:#141414;image:url('../Default/imgs/white/minus.svg')}.button-show:checked:pressed,#LoadLevelShowButton:checked:pressed,#CleanupSettingsShowButton:checked:pressed,#OutputSettingsShowButton:checked:pressed,#FxSettingsPreviewShowButton:checked:pressed{background-color:#191919;border-color:#141414}.button-show:checked:hover,#LoadLevelShowButton:checked:hover,#CleanupSettingsShowButton:checked:hover,#OutputSettingsShowButton:checked:hover,#FxSettingsPreviewShowButton:checked:hover{background-color:#1e1e1e}.button-tool,QToolButton,#CameraSettingsRadioButton::indicator,#ForceSquaredPixelButton,#SchematicBottomFrame QToolBar QToolButton,#EditToolLockButton::indicator,#flipCustomize{background-color:rgba(255,255,255,0);border:1 solid rgba(255,255,255,0);border-radius:2;color:#dbdbdb;margin:1;padding:0}.button-tool:hover,QToolButton:hover,#CameraSettingsRadioButton::indicator:hover,#ForceSquaredPixelButton:hover,#colorSliderAddButton:hover,#colorSliderSubButton:hover,#SchematicBottomFrame QToolBar QToolButton:hover,#EditToolLockButton::indicator:hover,#flipCustomize:hover{background-color:#5e5e5e;border-color:#5e5e5e;color:#dbdbdb}.button-tool:pressed,QToolButton:pressed,#CameraSettingsRadioButton::indicator:pressed,#ForceSquaredPixelButton:pressed,#colorSliderAddButton:pressed,#colorSliderSubButton:pressed,#SchematicBottomFrame QToolBar QToolButton:pressed,#EditToolLockButton::indicator:pressed,#flipCustomize:pressed{background-color:#191919;border-color:#141414;color:#dbdbdb}.button-tool:checked,QToolButton:checked,#CameraSettingsRadioButton::indicator:checked,#ForceSquaredPixelButton:checked,#SchematicBottomFrame QToolBar QToolButton:checked,#EditToolLockButton::indicator:checked,#flipCustomize:checked{background-color:#5385a6;border-color:#5385a6;color:#fff}.button-tool:checked:hover,QToolButton:checked:hover,#CameraSettingsRadioButton::indicator:checked:hover,#ForceSquaredPixelButton:checked:hover,#SchematicBottomFrame QToolBar QToolButton:checked:hover,#EditToolLockButton::indicator:checked:hover,#flipCustomize:checked:hover{background-color:#6c98b6;border-color:#6c98b6}.button-tool:disabled,QToolButton:disabled,#CameraSettingsRadioButton::indicator:disabled,#ForceSquaredPixelButton:disabled,#SchematicBottomFrame QToolBar QToolButton:disabled,#EditToolLockButton::indicator:disabled,#flipCustomize:disabled{color:#808080}.button-flat,PaletteViewer QToolBar QToolButton{background-color:none;border:0;border-radius:0;margin:0}.button-flat:hover,PaletteViewer QToolBar QToolButton:hover{background-color:#5e5e5e}.button-flat:pressed,PaletteViewer QToolBar QToolButton:pressed{background-color:#161616}.frame,.GroupBox,#LoadLevelFrame,#PsdSettingsGroupBox,#CleanupSettingsFrame,#OutputSettingsBox,#OutputSettingsCameraBox,#SolidLineFrame,#FunctionParametersPanel,QGroupBox{border:1 solid #161616;border-radius:2}.tab-container,#TabBarContainer{background-color:transparent;qproperty-BottomAboveLineColor:#262626;qproperty-BottomBelowLineColor:#161616}.tab-flat,#StyleEditorTabBar::tab,#PaletteTabBar::tab,#FxSettingsTabBar::tab{background-color:#262626;border-right:1 solid #161616;border-bottom:1 solid #161616;color:#8b8b8b;padding:3 4 3 4}.tab-flat:hover,#StyleEditorTabBar::tab:hover,#PaletteTabBar::tab:hover,#FxSettingsTabBar::tab:hover{background-color:#303030;color:#8b8b8b}.tab-flat:selected,#StyleEditorTabBar::tab:selected,#PaletteTabBar::tab:selected,#FxSettingsTabBar::tab:selected{background-color:#303030;color:#f4f4f4;border-bottom-color:#303030}.tab-flat:only-one,#StyleEditorTabBar::tab:only-one,#PaletteTabBar::tab:only-one,#FxSettingsTabBar::tab:only-one{margin:0}.tab-round{background-color:#262626;border-top:1 solid #161616;border-right:1 solid #161616;border-left:1 solid #161616;border-bottom:1 solid #161616;color:#8b8b8b;margin:3 -1 0 0;padding:2 7 1 7}.tab-round:hover{background-color:#303030;color:#8b8b8b}.tab-round:selected{background-color:#303030;border-top-right-radius:2;border-top-left-radius:2;border-bottom-color:#303030;color:#f4f4f4;margin:1 -1 -1 0;padding:2 7 2 7}.tab-round:only-one{margin:1 0 0 0;padding:3 7 3 7}.tab-round:last{margin-right:0;border-top-right-radius:2}.tab-round:first{border-top-left-radius:2}QWidget{background-color:#303030;color:#cecece}QWidget:disabled{color:#808080}QFrame{border:0;margin:0;padding:0}QToolTip,#helpToolTip{background-color:#fff;border:1 solid #000;color:#000;padding:1 1}#DockSeparator,QMainWindow::separator,QSplitter::handle{background-color:#0c0c0c;height:4;width:4}#TDockPlaceholder{background-color:#F77272}TPanel{background-color:#0c0c0c}#TopBar{background:#303030;border:0;border-bottom:1 solid #161616;height:21}#TopBar #EditToolLockButton{background:#303030;spacing:0}#TopBar #EditToolLockButton::indicator{background:none;border:none;height:18;margin:1 2 0 0;padding-left:0;padding-right:0}#TopBarTabContainer{background-color:#303030;margin-bottom:1}#StackedMenuBar{border:0;margin:0;padding:0}QMenuBar{background-color:#303030;border:0}QMenuBar::item{background-color:#303030;border-left:1 solid #303030;margin:0;padding:3 5}QMenuBar::item:selected{background-color:rgba(255,255,255,0.15);color:#cecece}QMenuBar::item:pressed{background-color:#5385a6;color:#fff}#TopBarTab{margin:0;padding:0}#TopBarTab::tab{background-color:#262626;border-top:1 solid #161616;border-right:1 solid #161616;color:#8b8b8b;margin:0 0 0 0;padding:2 8 3 8}#TopBarTab::tab:hover{background-color:#303030;color:#8b8b8b}#TopBarTab::tab:selected{background-color:#303030;color:#f4f4f4}#TopBarTab::tab:first{border-left:1 solid #161616}#TopBarTab::tab:last{border-right:1 solid #161616}QMenu{background-color:#303030;border:1 solid #161616;padding:2 0}QMenu::item{padding:3 28}QMenu::item:selected{background-color:#5385a6;color:#fff}QMenu::item:checked{color:#cecece}QMenu::item:checked:selected{background-color:#5385a6;color:#fff}QMenu::item:disabled{background:none;color:#808080}QMenu::item:disabled:selected{border-color:transparent}QMenu::separator{border-top:1 solid #161616;height:0;margin:2 0}QMenu::icon{border-radius:2;margin:0 0 0 3;padding:1}QMenu::icon:checked{background-color:#5385a6}QMenu::indicator{margin-left:7}TPanelTitleBar{background-color:#262626;border-color:#161616;border-style:solid;border-width:0 0 1 0;height:20;min-height:20;qproperty-TitleColor:#7d7d7d;qproperty-ActiveTitleColor:#fff;qproperty-BorderPixmap:url('none');qproperty-ActiveBorderPixmap:url('../Default/imgs/white/none');qproperty-FloatBorderPixmap:url('none');qproperty-FloatActiveBorderPixmap:url('../Default/imgs/white/none')}QAbstractScrollArea::corner{background-color:#262626}QScrollBar{background-color:#262626;border:0}QScrollBar:horizontal{height:16;margin:0}QScrollBar:vertical{margin:0;width:16}QScrollBar::handle{border:1 solid #3a3a3a;border-radius:4}QScrollBar::handle:horizontal:hover,QScrollBar::handle:vertical:hover{background-color:#4f4f4f;border-color:#4f4f4f}QScrollBar::handle:horizontal:pressed,QScrollBar::handle:vertical:pressed{background-color:#636363;border-color:#636363}QScrollBar::handle:horizontal{background-color:#3a3a3a;margin:3 16;min-width:20}QScrollBar::handle:vertical{background-color:#3a3a3a;margin:16 3;min-height:20}QScrollBar::add-line{subcontrol-origin:margin;border:0}QScrollBar::add-line:horizontal{subcontrol-position:right;background-color:#262626;margin:0;width:16}QScrollBar::add-line:vertical{subcontrol-position:bottom;background-color:#262626;margin:0;height:16}QScrollBar::sub-line{border:0;subcontrol-origin:margin}QScrollBar::sub-line:horizontal{subcontrol-position:left;background-color:#262626;margin:0;width:16}QScrollBar::sub-line:vertical{subcontrol-position:top;background-color:#262626;margin:0;height:16}QScrollBar::up-arrow:vertical{image:url('../Default/imgs/white/scroll-up.svg');image-position:center center}QScrollBar::up-arrow:vertical:pressed{margin:1 0 0 0}QScrollBar::down-arrow:vertical{image:url('../Default/imgs/white/scroll-down.svg');image-position:center center}QScrollBar::down-arrow:vertical:pressed{margin:1 0 0 0}QScrollBar::left-arrow:horizontal{image:url('../Default/imgs/white/scroll-left.svg');image-position:center center}QScrollBar::left-arrow:horizontal:pressed{margin:1 0 0 0}QScrollBar::right-arrow:horizontal{image:url('../Default/imgs/white/scroll-right.svg');image-position:center center}QScrollBar::right-arrow:horizontal:pressed{margin:1 0 0 0}QScrollBar::sub-page:horizontal,QScrollBar::add-page:horizontal,QScrollBar::sub-page:vertical,QScrollBar::add-page:vertical{background:none}QToolBar{padding:0}QToolBar::separator:horizontal{border-left:1 solid #161616;margin:0 1;width:0}QToolBar::separator:vertical{border-top:1 solid #161616;height:0;margin:1 0}QToolBar QLabel{margin-top:1}QToolBar QToolBar{border:0}QToolButton::menu-indicator{image:none}QToolButton::menu-button{border-image:none}.DvScrollWidget QPushButton,DvScrollWidget QPushButton,#ScrollLeftButton QPushButton,#ScrollRightButton QPushButton,#ScrollUpButton QPushButton,#ScrollDownButton QPushButton{background-color:#515151;border:0 solid red;border-radius:0;padding:0;max-width:16}.DvScrollWidget QPushButton:hover,DvScrollWidget QPushButton:hover,#ScrollLeftButton QPushButton:hover,#ScrollRightButton QPushButton:hover,#ScrollUpButton QPushButton:hover,#ScrollDownButton QPushButton:hover{background-color:#5e5e5e}.DvScrollWidget QPushButton:pressed,DvScrollWidget QPushButton:pressed,#ScrollLeftButton QPushButton:pressed,#ScrollRightButton QPushButton:pressed,#ScrollUpButton QPushButton:pressed,#ScrollDownButton QPushButton:pressed{background-color:#191919}#ScrollLeftButton,#ScrollRightButton,#ScrollUpButton,#ScrollDownButton{margin:0;min-width:16}#ScrollLeftButton{border-right:1 solid #161616;image:url('../Default/imgs/white/scroll-left.svg')}#ScrollRightButton{border-left:1 solid #161616;margin-left:3;image:url('../Default/imgs/white/scroll-right.svg')}#ScrollUpButton{image:url('../Default/imgs/white/scroll-up.svg')}#ScrollDownButton{image:url('../Default/imgs/white/scroll-down.svg')}#keyFrameNavigator{background:none;margin:0;padding:0}#keyFrameNavigator QToolButton{min-width:18}#keyFrameNavigator #PreviousKey{image:url('../Default/imgs/white/prevkey.svg')}#keyFrameNavigator #PreviousKey:hover{image:url('../Default/imgs/white/prevkey_over.svg')}#keyFrameNavigator #PreviousKey:disabled{image:url('../Default/imgs/white/prevkey_disabled.svg')}#keyFrameNavigator #NextKey{image:url('../Default/imgs/white/nextkey.svg')}#keyFrameNavigator #NextKey:hover{image:url('../Default/imgs/white/nextkey_over.svg')}#keyFrameNavigator #NextKey:disabled{image:url('../Default/imgs/white/nextkey_disabled.svg')}.treeview,QTreeWidget,QTreeView,#FunctionEditorTree{background-color:#262626;alternate-background-color:#2b2b2b;border:0;margin:0;outline:0}.treeview::item:selected,QTreeWidget::item:selected,QTreeView::item:selected,#FunctionEditorTree::item:selected{background-color:#5385a6;color:#fff}.treeview::branch:adjoins-item,QTreeWidget::branch:adjoins-item,QTreeView::branch:adjoins-item,#FunctionEditorTree::branch:adjoins-item{border-image:url('')}.treeview::branch:has-siblings,QTreeWidget::branch:has-siblings,QTreeView::branch:has-siblings,#FunctionEditorTree::branch:has-siblings{border-image:url('')}.treeview::branch:has-siblings:adjoins-item,QTreeWidget::branch:has-siblings:adjoins-item,QTreeView::branch:has-siblings:adjoins-item,#FunctionEditorTree::branch:has-siblings:adjoins-item{border-image:url('')}.treeview::branch:has-children:closed,QTreeWidget::branch:has-children:closed,QTreeView::branch:has-children:closed,#FunctionEditorTree::branch:has-children:closed{background:url('../Default/imgs/white/treebranch-closed.svg') no-repeat;background-position:center center;border-image:none;image:none}.treeview::branch:has-children:open,QTreeWidget::branch:has-children:open,QTreeView::branch:has-children:open,#FunctionEditorTree::branch:has-children:open{background:url('../Default/imgs/white/treebranch-open.svg') no-repeat;background-position:center center;image:none}.treeview::branch:has-children:has-siblings:closed,QTreeWidget::branch:has-children:has-siblings:closed,QTreeView::branch:has-children:has-siblings:closed,#FunctionEditorTree::branch:has-children:has-siblings:closed{background:url('../Default/imgs/white/treebranch-closed.svg') no-repeat;background-position:center center;border-image:none;image:none}.treeview::branch:has-children:has-siblings:open,QTreeWidget::branch:has-children:has-siblings:open,QTreeView::branch:has-children:has-siblings:open,#FunctionEditorTree::branch:has-children:has-siblings:open{background:url('../Default/imgs/white/treebranch-open.svg') no-repeat;background-position:center center;border-image:none;image:none}QListView{outline:0;background:#262626;alternate-background-color:#2b2b2b}#TabBarContainer{background-color:#262626}.Button,QPushButton,.ComboBox,.ComboBox:checked,QComboBox,QComboBox:checked{background-color:#515151;border:1 solid #303030;border-radius:2;color:#dbdbdb;margin:0;padding:3 15}.Button:hover,QPushButton:hover,.ComboBox:hover,#ViewerFpsSlider::sub-line:horizontal:hover,#ViewerFpsSlider::add-line:horizontal:hover,QComboBox:hover{background-color:#5e5e5e;border-color:#303030;color:#dbdbdb}.Button:pressed,QPushButton:pressed,#ViewerFpsSlider::sub-line:horizontal:pressed,#ViewerFpsSlider::add-line:horizontal:pressed{background-color:#191919;border-color:#141414;color:#dbdbdb}.Button:checked,QPushButton:checked{background-color:#191919;border-color:#141414;color:#dbdbdb}.Button:checked:hover,QPushButton:checked:hover{background-color:#1e1e1e}.Button:checked:hover:pressed,QPushButton:checked:hover:pressed{background:#191919}.Button:disabled,QPushButton:disabled,.ComboBox:disabled,#ViewerFpsSlider::sub-line:horizontal:disabled,#ViewerFpsSlider::add-line:horizontal:disabled,QComboBox:disabled{background-color:#3d3d3d;border-color:#303030;color:#808080}#PushButton_NoPadding{padding:3}.ComboBox,.ComboBox:checked,QComboBox,QComboBox:checked{padding:1 0 1 4;margin:1 0}.ComboBox::drop-down,QComboBox::drop-down{image:url('../Default/imgs/white/combo_downarrow.svg');image-position:center center;width:16}.ComboBox::drop-down:disabled,QComboBox::drop-down:disabled{image:url('../Default/imgs/white/combo_downarrow_disabled.svg')}.ComboBox QAbstractItemView,QComboBox QAbstractItemView{background-color:#303030;border:1 solid #161616;selection-background-color:#5385a6;selection-color:#fff}.LineEdit,QPlainTextEdit,QLineEdit,#TaskSheetItem,#tasksRemoveBox,#tasksAddBox{background-color:#1c1c1c;border:1 solid #3d3d3d;border-radius:2;color:#cecece;selection-background-color:#5385a6;selection-color:#fff;padding:0 0 0 1}.LineEdit:focus,QPlainTextEdit:focus,QLineEdit:focus,#TaskSheetItem:focus,#tasksRemoveBox:focus,#tasksAddBox:focus{background-color:#1c1c1c;border-color:#5385a6;color:#cecece}.LineEdit:disabled,QPlainTextEdit:disabled,QLineEdit:disabled,#TaskSheetItem:disabled,#tasksRemoveBox:disabled,#tasksAddBox:disabled{background-color:#262626;border-color:#363636;color:#808080}.CheckBox,QCheckBox{color:#cecece}.CheckBox:hover,QCheckBox:hover,.RadioButton:hover,QRadioButton:hover{color:#fff}.CheckBox:disabled,QCheckBox:disabled{color:#808080}.CheckBox::indicator,QMenu::indicator,QCheckBox::indicator,.GroupBox::indicator,QGroupBox::indicator{background-color:#1c1c1c;border:1 solid #3d3d3d;border-radius:2;height:9;padding:1;width:9}.CheckBox::indicator:hover,QMenu::indicator:hover,.CheckBox::indicator:checked:hover,QCheckBox::indicator:hover,.GroupBox::indicator:hover,QMenu::indicator:checked:hover,QCheckBox::indicator:checked:hover,.GroupBox::indicator:checked:hover,QGroupBox::indicator:hover,QGroupBox::indicator:checked:hover{background-color:#1c1c1c;border-color:#5385a6}.CheckBox::indicator:checked,QMenu::indicator:checked,QCheckBox::indicator:checked,.GroupBox::indicator:checked,QGroupBox::indicator:checked{background-color:#1c1c1c;border-color:#3d3d3d;image:url('../Default/imgs/white/checkmark.svg')}.CheckBox::indicator:checked:disabled,QMenu::indicator:checked:disabled,QCheckBox::indicator:checked:disabled,.GroupBox::indicator:checked:disabled,QGroupBox::indicator:checked:disabled{background-color:#262626;border-color:#191919;image:url('../Default/imgs/white/checkmark_disabled.svg')}.CheckBox::indicator:disabled,QMenu::indicator:disabled,QCheckBox::indicator:disabled,.GroupBox::indicator:disabled,QGroupBox::indicator:disabled{background-color:#262626;border-color:#191919}.RadioButton::indicator:unchecked,QRadioButton::indicator:unchecked,#CameraSettingsRadioButton_Small::indicator:unchecked{image:url('../Default/imgs/white/radiobutton_unchecked.svg');image-position:center center}.RadioButton::indicator:checked,QRadioButton::indicator:checked,#CameraSettingsRadioButton_Small::indicator:checked{image:url('../Default/imgs/white/radiobutton_checked.svg');image-position:center center}.GroupBox,QGroupBox{margin:6 0 0 0;padding:5 0}.GroupBox::title,QGroupBox::title{subcontrol-origin:margin;left:15;margin:-3 0 0 0;padding:0 3}.GroupBox::title:hover,QGroupBox::title:hover{color:#fff}.GroupBox::title:disabled,QGroupBox::title:disabled{color:#808080}.GroupBox::indicator,QGroupBox::indicator{subcontrol-origin:margin;margin-top:2}.GroupBox:disabled,QGroupBox:disabled{color:#808080}.Slider::groove:horizontal,QSlider::groove:horizontal{background-color:transparent;background-image:url('../Default/imgs/white/slider-groove_dark.svg');background-position:center center;background-repeat:repeat-x;margin:0;height:20;min-height:20}.Slider::groove:horizontal:disabled,QSlider::groove:horizontal:disabled{background-image:url('../Default/imgs/white/slider-groove_disabled_dark.svg')}.Slider::handle:horizontal,QSlider::handle:horizontal{width:10;margin:-2 -1;image:url('../Default/imgs/white/slider-handle.svg')}.Slider::handle:horizontal:disabled,QSlider::handle:horizontal:disabled{image:url('../Default/imgs/white/slider-handle_disabled.svg')}#IntPairField,#DoublePairField{qproperty-LightLineColor:#191919;qproperty-LightLineEdgeColor:#191919;qproperty-DarkLineColor:#191919;qproperty-MiddleLineColor:#191919;qproperty-HandleLeftPixmap:url("../Default/imgs/white/slider-handle.svg");qproperty-HandleRightPixmap:url("../Default/imgs/white/slider-handle.svg");qproperty-HandleLeftGrayPixmap:url("../Default/imgs/white/slider-handle_disabled.svg");qproperty-HandleRightGrayPixmap:url("../Default/imgs/white/slider-handle_disabled.svg")}#DirTreeView{background-color:#262626;alternate-background-color:#262626;border:1 solid #161616;border-right:0}DvItemViewerPanel{qproperty-TextColor:#cecece;qproperty-AlternateBackground:#282828;qproperty-SelectedTextColor:#fff;qproperty-FolderTextColor:#9fdaff;qproperty-SelectedItemBackground:#5385a6}#FileBrowser DvItemViewerPanel,#SceneCast DvItemViewerPanel{background-color:#303030}#FileBrowser #castFrame,#SceneCast #castFrame{border-top:1 solid #161616;border-right:1 solid #161616;border-bottom:1 solid #161616;margin:0}#FileBrowser QToolButton,#SceneCast QToolButton{padding:1}DvDirTreeView{qproperty-TextColor:#cecece;qproperty-SelectedTextColor:#fff;qproperty-SelectedItemBackground:#5385a6;qproperty-FolderTextColor:#9fdaff;qproperty-SelectedFolderTextColor:#fff;alternate-background-color:#2b2b2b;background-color:#262626;border:1 solid #161616}#FileDoesNotExistLabel{color:#f00}#SceneCast QToolBar{border-top:1 solid #161616}#SceneCast QToolButton{margin:3 1 2 1;padding:1}#CastBrowser{border:0;margin:0}#FilmStrip QComboBox{border-radius:0;border-width:0}#FilmStrip QComboBox QAbstractItemView{background-color:#303030}#CleanupSettings #CleanupSettingsFrame{margin-top:2;margin-bottom:4}#CleanupSettings QGroupBox{margin-bottom:3}ParamsPage{qproperty-TextColor:#cecece}#CameraSettingsButton{padding:2}#CameraSettingsRadioButton:hover{background:none}#CameraSettingsRadioButton::indicator{border:1 solid rgba(255,255,255,0);height:18;padding:0;width:18}#CameraSettingsRadioButton::indicator:unchecked{image:url('../Default/imgs/white/lock_off.svg')}#CameraSettingsRadioButton::indicator:checked{background-color:#C34040;border-color:#C34040;image:url('../Default/imgs/white/lock_on.svg')}#CameraSettingsRadioButton::indicator:checked:hover{background-color:#d57a7a;border-color:#d57a7a}#CameraSettingsDPI{color:#9fdaff}#CameraSettingsRadioButton_Small{padding:0}#CameraSettingsRadioButton_Small::indicator{background-color:transparent;border:0;height:21;margin:0;width:11}#ForceSquaredPixelButton{height:16;border:1 solid rgba(255,255,255,0);image:url('../Default/imgs/white/fsp_unchecked.svg');padding:2;width:16;margin:0}#ForceSquaredPixelButton:checked{image:url('../Default/imgs/white/fsp_checked.svg')}#OutputSettingsLabel{color:#9fdaff}PencilTestPopup{min-height:730px;min-width:512px}#MatchLineButton{background-color:#565656}#MatchLineButton:checked{background-color:#7d7d7d;border:2 solid #5385a6;border-radius:2}#LargeSizedText{font-size:17px}#StartupLabel{padding:3}#StartupLabel:hover{background:#4a4a4a}QStatusBar{background-color:#c0c0c0}QStatusBar::item{border:0}QStatusBar QLabel{background-color:#c0c0c0}QStatusBar #StatusBarLabel{background-color:#fff;padding:1 3}#TitleTxtLabel{color:#9fdaff}#StyleEditor QPushButton{margin:2 1;padding:0}#StyleEditor #TabBarContainer{margin-left:-4}#StyleEditor #bottomWidget{border-top:1 solid #161616;padding:3 2 8 3}#StyleEditor #bottomWidget QPushButton{padding:3 5}#StyleEditorTabBar::tab::first{border-left:1 solid #161616}#HexagonalColorWheel{qproperty-BGColor:#303030}#colorSlider::groove:horizontal{height:1;border-image:none}#colorSlider::handle:horizontal{width:8;margin:-8 -4}#colorSliderAddButton,#colorSliderSubButton{background:none;border-color:transparent;image-position:center center;min-height:16;padding:0;min-width:18}#colorSliderAddButton{image:url('../Default/imgs/white/scroll-right.svg')}#colorSliderSubButton{image:url('../Default/imgs/white/scroll-left.svg')}#PlainColorPageParts{border-bottom:1 solid #161616}#PlainColorPageParts QLineEdit{max-width:35}PaletteViewer DvScrollWidget QPushButton{border-top:0;margin-bottom:1;max-width:15;min-width:15}PaletteViewer DvScrollWidget #ScrollLeftButton{border-radius:0;margin-bottom:1;max-width:16;min-width:16}PaletteViewer DvScrollWidget #ScrollRightButton{border-radius:0;margin-left:1;margin-bottom:1;max-width:16;min-width:16}PaletteViewer QToolBar{background:none;border-bottom:1 solid #161616;padding:0;margin:0}PaletteViewer QToolBar::separator:horizontal{margin:0}PaletteViewer QToolBar QToolButton{margin:0 0 1 0;padding:1 0 2 0}#PageViewer{qproperty-TextColor:#cecece}#PaletteLockButton{border-radius:0;margin:0 0 1 1}#PaletteLockButton:checked{background-color:#C34040;border-color:#C34040}#PaletteLockButton:checked:hover{background-color:#d57a7a;border-color:#d57a7a}#WordButton{padding-right:0;padding-left:0}QDialog{background-color:#303030}QDialog #dialogButtonFrame{background-color:#282828;border-top:1 solid #161616}QDialog #dialogButtonFrame QPushButton{border-color:#282828;outline:0}QDialog #dialogButtonFrame QPushButton:focus{background-color:#5385a6;border-color:#282828;color:#f4f4f4}QDialog #dialogButtonFrame QPushButton:focus:hover{background-color:#6c98b6}QDialog #dialogButtonFrame QPushButton:focus:pressed{background-color:#191919;border-color:#141414;color:#dbdbdb}#SceneSettings QLabel{color:#9fdaff}#PreferencesPopup QListWidget{background-color:#262626;alternate-background-color:#262626;border:1 solid #161616;font-size:13px}#PreferencesPopup QListWidget::item{border:0;padding:3}#PreferencesPopup QListWidget::item:hover{color:#cecece;background-color:rgba(255,255,255,0.15)}#PreferencesPopup QListWidget::item:selected{background-color:#5385a6;color:#fff}#ShortcutTree{border:1 solid #161616}#ShortcutTree::item{padding:1 0}#ShortcutTree QScrollBar:vertical{width:16;margin-right:-1}ProjectPopup QLabel{color:#9fdaff}#GearButton{qproperty-icon:url('../Default/imgs/white/gear.svg')}#SubfolderButton{qproperty-icon:url('../Default/imgs/white/subfolder.svg');padding-left:6px;padding-right:6px}#SubcameraButton{qproperty-icon:url('../Default/imgs/white/subcamera.svg');padding-left:6px;padding-right:6px}SchematicViewer{qproperty-TextColor:#cecece;qproperty-VerticalLineColor:#090909;qproperty-LevelColumnColor:#4C6E4C;qproperty-VectorColumnColor:#7B7B4C;qproperty-ChildColumnColor:#6A526B;qproperty-FullcolorColumnColor:#657A96;qproperty-FxColumnColor:#56553C;qproperty-PaletteColumnColor:#3A655F;qproperty-MeshColumnColor:#684D86;qproperty-ReferenceColumnColor:#616161;qproperty-TableColor:#62628c;qproperty-ActiveCameraColor:#2d7dca;qproperty-OtherCameraColor:#6c797b;qproperty-GroupColor:#3b6e9c;qproperty-PegColor:#9f6e3c;qproperty-SplineColor:#6a9d1c;qproperty-ActiveOutputColor:#2d7dca;qproperty-OtherOutputColor:#6c797b;qproperty-XsheetColor:#62628c;qproperty-NormalFxColor:#6a7e96;qproperty-MacroFxColor:#815c79;qproperty-ImageAdjustFxColor:#656287;qproperty-LayerBlendingFxColor:#4f757d;qproperty-MatteFxColor:#ae7171;qproperty-SchematicPreviewButtonBgOnColor:#c8c864;qproperty-SchematicPreviewButtonOnImage:url('../Default/imgs/white/x_prev_eye_on.svg');qproperty-SchematicPreviewButtonBgOffColor:#616161;qproperty-SchematicPreviewButtonOffImage:url('../Default/imgs/white/x_prev_eye_off.svg');qproperty-SchematicCamstandButtonBgOnColor:#eb906b;qproperty-SchematicCamstandButtonOnImage:url('../Default/imgs/white/x_table_view_on.svg');qproperty-SchematicCamstandButtonTranspImage:url('../Default/imgs/white/x_table_view_transp.svg');qproperty-SchematicCamstandButtonBgOffColor:#616161;qproperty-SchematicCamstandButtonOffImage:url('../Default/imgs/white/x_table_view_off.svg')}#SchematicBottomFrame{background-color:#303030;border:0;margin:0;padding:0}#SchematicBottomFrame QToolBar::separator:horizontal{margin:0}#SchematicBottomFrame QToolBar QToolButton{padding:0;margin:2}#SchematicSceneViewer{background-color:#232323;border-bottom:1 solid #161616}#FxSettingsTabBar::tab{border-top:1 solid #161616}#FxSettingsTabBar::tab::first,#FxSettingsTabBar::tab::only-one{border-left:1 solid #161616}FxSettings QToolBar{border-top:1 solid #161616;border-right:1 solid #161616;border-left:1 solid #161616;min-height:23;padding:3 0}FxSettings QToolBar QToolBar{border:0}#FxSettingsLabel{color:#a0e680}#FxSettingsHelpButton{background-color:#80a0dc;color:#000;padding-top:0;padding-bottom:0}#FxSettingsHelpButton:hover{background-color:#a8bee7}#ScriptConsole{font-family:'Courier New',monospace;border:0;color:#000000;padding:3}#ScriptConsole QFrame{background-color:#dcdcdc}#ScriptConsole TPanelTitleBar{background-color:#262626}#TaskSheetItemLabel{color:#cecece}#Tasks QToolBar{border-bottom:1 solid #161616;margin:0;padding:0}#Tasks QToolBar QToolButton{margin:2 2 3 2}#ToolBar QToolBar{padding-left:2}#ToolOptions TPanelTitleBar{border-right:1 solid #161616;border-bottom:0}#CommandBar TPanelTitleBar{border-right:1 solid #161616;border-bottom:0}IconViewField{qproperty-ThicknessPixmap:url("../Default/imgs/white/selectiontool_thickness.svg")}#EditToolLockButton{spacing:0}#EditToolLockButton:hover{background:none}#EditToolLockButton::indicator{border:1 solid rgba(255,255,255,0);height:18;padding:0;width:18}#EditToolLockButton::indicator:unchecked{image:url('../Default/imgs/white/lock_off.svg')}#EditToolLockButton::indicator:checked{background-color:#C34040;border-color:#C34040;image:url('../Default/imgs/white/lock_on.svg')}#EditToolLockButton::indicator:checked:hover{background-color:#d57a7a;border-color:#d57a7a}PopupButton::menu-indicator{border-left:0;height:17;image:url('../Default/imgs/white/combo_downarrow.svg');width:10}PopupButton::menu-indicator:hover{image:url('../Default/imgs/white/combo_downarrow.svg')}PopupButton::menu-indicator:disabled{image:url('../Default/imgs/white/combo_downarrow_disabled.svg')}#Cap,#Join{padding:0 4 0 -8;max-width:32;min-width:32}#Cap QMenu,#Join QMenu{max-width:28;min-width:28}#Cap QMenu::item,#Join QMenu::item{max-width:28;min-width:28;padding:0}QToolBar#MediumPaddingToolBar QToolButton{padding-left:3;padding-right:3}QToolBar#WidePaddingToolBar QToolButton{padding-left:6;padding-right:6}#CommandBar{margin:0;padding:0;border:0}#CommandBar::separator:horizontal{margin-right:3;margin-left:3}#expandButton:checked{background-color:transparent;border-color:transparent;color:#cecece}#expandButton:checked:hover{background-color:#5e5e5e;border-color:#5e5e5e}#expandButton:checked:pressed{background-color:#191919;border-color:#141414}#ComboViewerPanel Toolbar{border-bottom:1 solid #161616}#ComboViewerPanel Toolbar::separator:horizontal{margin:0 0 0 2}#ComboViewerPanel Toolbar QToolButton{margin:2 0 3 2}#ComboViewerToolOptions{border-bottom:1 solid #161616}#ComboViewer #ToolBarContainer,#ViewerPanel #ToolBarContainer,FlipBook #ToolBarContainer{background-color:transparent;border-top:2 solid #161616;border-bottom:1 solid #161616;padding-right:-1}#flipCustomize{margin-left:3}#flipCustomize::menu-button{background-color:transparent;width:35}#flipCustomize::menu-arrow{image:none}QToolBar#FlipConsolePlayToolBar::separator:horizontal{margin:0 3}QToolBar#FlipConsolePlayToolBar QToolButton{margin-top:2;margin-bottom:2;height:16;padding-left:1;padding-right:1}#ViewerFpsSlider{background-color:transparent;background-image:url('../Default/imgs/white/slider-groove_dark.svg');background-position:center center;background-repeat:repeat-x;border:0;height:19;margin:0 3 0 37;max-width:300;min-width:0}#ViewerFpsSlider::sub-line:horizontal{subcontrol-origin:absolute;background-color:#515151;border:1 solid #303030;border-top-left-radius:2;border-bottom-left-radius:2;height:16;left:-33;width:14}#ViewerFpsSlider::add-line:horizontal{subcontrol-position:left;background-color:#515151;border:1 solid #303030;border-top-right-radius:2;border-bottom-right-radius:2;left:18;height:16;image-position:center center;width:13}#ViewerFpsSlider::handle::horizontal{background-color:#898989;border:1 solid #898989;border-radius:2;margin:2 0 3 0;min-width:9;width:9;max-width:9}FlipSlider{qproperty-PBHeight:15;qproperty-PBOverlay:url('../Default/imgs/white/flipslider_dark.svg');qproperty-PBColorMarginLeft:1;qproperty-PBColorMarginTop:2;qproperty-PBColorMarginRight:1;qproperty-PBColorMarginBottom:2;qproperty-PBMarker:url('../Default/imgs/white/flipmarker_dark.svg');qproperty-PBMarkerMarginLeft:3;qproperty-PBMarkerMarginRight:3;qproperty-notStartedColor:rgba(205,101,101,0.78);qproperty-startedColor:#1abc3f;qproperty-baseColor:#1c1c1c;qproperty-finishedColor:#1c1c1c}Ruler{qproperty-ParentBGColor:#303030;qproperty-ScaleColor:#cecece}#RulerToolOptionValues{color:#000}#xsheetArea,#ScrollArea{background-color:#1c1c1c;border:0}#xsheetScrollArea{border:0}#cornerWidget QToolButton{padding:0}#xsheetColumnAreaMenu_Preview{background-color:#E6E678}#xsheetColumnAreaMenu_Lock{background-color:#F5F5F5}#xsheetColumnAreaMenu_Camstand{background-color:#FFA480}#xsheetColumnAreaMenu_Preview,#xsheetColumnAreaMenu_Lock,#xsheetColumnAreaMenu_Camstand{color:#000}#noteTextEdit{color:#000}XsheetViewer{qproperty-TextColor:#cecece;qproperty-BGColor:#282828;qproperty-LightLineColor:#1f1f1f;qproperty-MarkerLineColor:#1E96C4;qproperty-VerticalLineColor:#090909;qproperty-VerticalLineHeadColor:#686868;qproperty-PreviewFrameTextColor:#9fdaff;qproperty-CurrentRowBgColor:#506082;qproperty-OnionSkinAreaBgColor:#1e1e1e;qproperty-EmptyColumnHeadColor:#444;qproperty-SelectedColumnTextColor:#E66464;qproperty-EmptyCellColor:#303030;qproperty-NotEmptyColumnColor:#383838;qproperty-SelectedEmptyCellColor:#545454;qproperty-LevelColumnColor:#4C6E4C;qproperty-LevelColumnBorderColor:#8FB38F;qproperty-SelectedLevelColumnColor:#678667;qproperty-VectorColumnColor:#7B7B4C;qproperty-VectorColumnBorderColor:#BBBB9A;qproperty-SelectedVectorColumnColor:#949466;qproperty-ChildColumnColor:#6A526B;qproperty-ChildColumnBorderColor:#B1A3B3;qproperty-SelectedChildColumnColor:#816e82;qproperty-FullcolorColumnColor:#657A96;qproperty-FullcolorColumnBorderColor:#9EB8BB;qproperty-SelectedFullcolorColumnColor:#8895a6;qproperty-FxColumnColor:#56553C;qproperty-FxColumnBorderColor:#95958A;qproperty-SelectedFxColumnColor:#6f6e56;qproperty-ReferenceColumnColor:#616161;qproperty-ReferenceColumnBorderColor:#A2A2A2;qproperty-SelectedReferenceColumnColor:#7a7a7a;qproperty-PaletteColumnColor:#3A655F;qproperty-PaletteColumnBorderColor:#86ACA7;qproperty-SelectedPaletteColumnColor:#52807a;qproperty-MeshColumnColor:#684D86;qproperty-MeshColumnBorderColor:#BA92EF;qproperty-SelectedMeshColumnColor:#82689e;qproperty-SoundTextColumnColor:#c8c8c8;qproperty-SoundTextColumnBorderColor:#8c8c8c;qproperty-SelectedSoundTextColumnColor:#e2e2e2;qproperty-SoundColumnColor:#657456;qproperty-SoundColumnBorderColor:#A0AF7D;qproperty-SelectedSoundColumnColor:#7e8b72;qproperty-SoundColumnHlColor:#34FE5E;qproperty-SoundColumnTrackColor:#B6C29D;qproperty-ColumnHeadPastelizer:#000;qproperty-SelectedColumnHead:#506082;qproperty-LightLightBGColor:#303030;qproperty-LightBGColor:#d8d8d8;qproperty-DarkBGColor:#c9c9c9;qproperty-DarkLineColor:#7e7e7e;qproperty-XsheetColumnNameBgColor:rgba(0,0,0,0);qproperty-XsheetDragBarHighlightColor:rgba(255,255,255,0.5);qproperty-XsheetPreviewButtonBgOnColor:#c8c864;qproperty-XsheetPreviewButtonOnImage:url('../Default/imgs/white/x_prev_eye_on.svg');qproperty-XsheetPreviewButtonBgOffColor:rgba(255,255,255,0);qproperty-XsheetPreviewButtonOffImage:url('../Default/imgs/white/x_prev_eye_off.svg');qproperty-XsheetCamstandButtonBgOnColor:#eb906b;qproperty-XsheetCamstandButtonOnImage:url('../Default/imgs/white/x_table_view_on.svg');qproperty-XsheetCamstandButtonTranspImage:url('../Default/imgs/white/x_table_view_transp.svg');qproperty-XsheetCamstandButtonBgOffColor:rgba(255,255,255,0);qproperty-XsheetCamstandButtonOffImage:url('../Default/imgs/white/x_table_view_off.svg');qproperty-XsheetLockButtonBgOnColor:rgba(255,255,255,0.3);qproperty-XsheetLockButtonOnImage:url('../Default/imgs/white/x_lock_on.svg');qproperty-XsheetLockButtonBgOffColor:rgba(255,255,255,0);qproperty-XsheetLockButtonOffImage:url('../Default/imgs/white/x_lock_off.svg');qproperty-XsheetConfigButtonBgColor:rgba(255,255,255,0);qproperty-XsheetConfigButtonImage:url('../Default/imgs/white/x_config.svg');qproperty-TimelinePreviewButtonBgOnColor:rgba(255,255,255,0);qproperty-TimelinePreviewButtonOnImage:url('../Default/imgs/white/timeline_toggle_on.svg');qproperty-TimelinePreviewButtonBgOffColor:rgba(255,255,255,0);qproperty-TimelinePreviewButtonOffImage:url('../Default/imgs/white/timeline_toggle_off.svg');qproperty-TimelineCamstandButtonBgOnColor:rgba(255,255,255,0);qproperty-TimelineCamstandButtonOnImage:url('../Default/imgs/white/timeline_toggle_on.svg');qproperty-TimelineCamstandButtonTranspImage:url('../Default/imgs/white/timeline_toggle_transp.svg');qproperty-TimelineCamstandButtonBgOffColor:rgba(255,255,255,0);qproperty-TimelineCamstandButtonOffImage:url('../Default/imgs/white/timeline_toggle_off.svg');qproperty-TimelineLockButtonBgOnColor:rgba(255,255,255,0);qproperty-TimelineLockButtonOnImage:url('../Default/imgs/white/timeline_toggle_on.svg');qproperty-TimelineLockButtonBgOffColor:rgba(255,255,255,0);qproperty-TimelineLockButtonOffImage:url('../Default/imgs/white/timeline_toggle_off.svg');qproperty-TimelineConfigButtonBgColor:rgba(255,255,255,0);qproperty-TimelineConfigButtonImage:url('../Default/imgs/white/timeline_config.svg');qproperty-LayerHeaderPreviewImage:url('../Default/imgs/white/layer_header_prev_eye.svg');qproperty-LayerHeaderPreviewOverImage:url('../Default/imgs/white/layer_header_prev_eye_over.svg');qproperty-LayerHeaderCamstandImage:url('../Default/imgs/white/layer_header_table_view.svg');qproperty-LayerHeaderCamstandOverImage:url('../Default/imgs/white/layer_header_table_view_over.svg');qproperty-LayerHeaderLockImage:url('../Default/imgs/white/lock_on.svg');qproperty-LayerHeaderLockOverImage:url('../Default/imgs/white/lock_on_over.svg')}#XSheetToolbar{margin:0;padding:0;border:0}#XSheetToolbar QToolButton{padding:0;margin:4 1;min-height:19;height:19}#XSheetToolbar::separator:horizontal{margin:0 4}#FunctionEditor QToolBar{border-bottom:1 solid #161616}#FunctionEditor QToolBar QToolBar{border:0}#FunctionEditor QToolBar QLabel{margin-left:5}#FunctionEditor QToolBar QToolButton{height:18}#FunctionEditorTree{border-top:1 solid #161616}FunctionTreeView{qproperty-TextColor:#cecece;qproperty-CurrentTextColor:#E66464}FunctionPanel{qproperty-BGColor:#232323;qproperty-ValueLineColor:#161616;qproperty-FrameLineColor:#161616;qproperty-OtherCurvesColor:#707070;qproperty-RulerBackground:#1b1b1b;qproperty-TextColor:#cecece;qproperty-SubColor:#000;qproperty-SelectedColor:#FFA500}SpreadsheetViewer{qproperty-LightLightBGColor:#303030;qproperty-CurrentRowBgColor:#506082;qproperty-LightLineColor:#1f1f1f;qproperty-MarkerLineColor:#1E96C4;qproperty-BGColor:#383838;qproperty-VerticalLineColor:#090909;qproperty-KeyFrameColor:#995d1d;qproperty-KeyFrameBorderColor:#c9b04b;qproperty-SelectedKeyFrameColor:#be772b;qproperty-InBetweenColor:#666250;qproperty-InBetweenBorderColor:#cdcec8;qproperty-SelectedInBetweenColor:#7d7a6c;qproperty-SelectedEmptyColor:#545454;qproperty-SelectedSceneRangeEmptyColor:#5d5d5d;qproperty-TextColor:#cecece;qproperty-ColumnHeaderBorderColor:#686868;qproperty-SelectedColumnTextColor:#E66464}#ExpressionField{background-color:#cecece;border:1 solid #1b1b1b;margin:0}#FunctionSegmentViewerLinkButton{background-image:url('../Default/imgs/white/segment_unlinked.svg');background-repeat:no-repeat}#FunctionSegmentViewerLinkButton:hover{background-repeat:no-repeat}#FunctionSegmentViewerLinkButton:checked{background-image:url('../Default/imgs/white/segment_linked.svg');background-repeat:no-repeat}#FunctionSegmentViewerLinkButton:disabled{background-image:url('../Default/imgs/white/segment_disabled.svg');background-repeat:no-repeat} \ No newline at end of file diff --git a/stuff/config/qss/Default/Default.qss b/stuff/config/qss/Default/Default.qss index 2375b0db..52c1ba8f 100644 --- a/stuff/config/qss/Default/Default.qss +++ b/stuff/config/qss/Default/Default.qss @@ -1 +1 @@ -.button-show,#LoadLevelShowButton,#CleanupSettingsShowButton,#OutputSettingsShowButton,#FxSettingsPreviewShowButton{image:url('imgs/white/plus.svg');image-position:center center;margin:0;padding:1;min-width:10;min-height:10}.button-show:checked,#LoadLevelShowButton:checked,#CleanupSettingsShowButton:checked,#OutputSettingsShowButton:checked,#FxSettingsPreviewShowButton:checked{background-color:#313131;border-color:#2c2c2c;image:url('imgs/white/minus.svg')}.button-show:checked:pressed,#LoadLevelShowButton:checked:pressed,#CleanupSettingsShowButton:checked:pressed,#OutputSettingsShowButton:checked:pressed,#FxSettingsPreviewShowButton:checked:pressed{background-color:#313131;border-color:#2c2c2c}.button-show:checked:hover,#LoadLevelShowButton:checked:hover,#CleanupSettingsShowButton:checked:hover,#OutputSettingsShowButton:checked:hover,#FxSettingsPreviewShowButton:checked:hover{background-color:#363636}.button-tool,QToolButton,#CameraSettingsRadioButton::indicator,#ForceSquaredPixelButton,#SchematicBottomFrame QToolBar QToolButton,#EditToolLockButton::indicator,#flipCustomize{background-color:rgba(255,255,255,0);border:1 solid rgba(255,255,255,0);border-radius:2;color:#f3f3f3;margin:1;padding:0}.button-tool:hover,QToolButton:hover,#CameraSettingsRadioButton::indicator:hover,#ForceSquaredPixelButton:hover,#colorSliderAddButton:hover,#colorSliderSubButton:hover,#SchematicBottomFrame QToolBar QToolButton:hover,#EditToolLockButton::indicator:hover,#flipCustomize:hover{background-color:#767676;border-color:#767676;color:#f3f3f3}.button-tool:pressed,QToolButton:pressed,#CameraSettingsRadioButton::indicator:pressed,#ForceSquaredPixelButton:pressed,#colorSliderAddButton:pressed,#colorSliderSubButton:pressed,#SchematicBottomFrame QToolBar QToolButton:pressed,#EditToolLockButton::indicator:pressed,#flipCustomize:pressed{background-color:#313131;border-color:#2c2c2c;color:#f3f3f3}.button-tool:checked,QToolButton:checked,#CameraSettingsRadioButton::indicator:checked,#ForceSquaredPixelButton:checked,#SchematicBottomFrame QToolBar QToolButton:checked,#EditToolLockButton::indicator:checked,#flipCustomize:checked{background-color:#5385a6;border-color:#5385a6;color:#fff}.button-tool:checked:hover,QToolButton:checked:hover,#CameraSettingsRadioButton::indicator:checked:hover,#ForceSquaredPixelButton:checked:hover,#SchematicBottomFrame QToolBar QToolButton:checked:hover,#EditToolLockButton::indicator:checked:hover,#flipCustomize:checked:hover{background-color:#6c98b6;border-color:#6c98b6}.button-tool:disabled,QToolButton:disabled,#CameraSettingsRadioButton::indicator:disabled,#ForceSquaredPixelButton:disabled,#SchematicBottomFrame QToolBar QToolButton:disabled,#EditToolLockButton::indicator:disabled,#flipCustomize:disabled{color:#808080}.button-flat,PaletteViewer QToolBar QToolButton{background-color:none;border:0;border-radius:0;margin:0}.button-flat:hover,PaletteViewer QToolBar QToolButton:hover{background-color:#767676}.button-flat:pressed,PaletteViewer QToolBar QToolButton:pressed{background-color:#272727}.frame,.GroupBox,#LoadLevelFrame,#PsdSettingsGroupBox,#CleanupSettingsFrame,#OutputSettingsBox,#OutputSettingsCameraBox,#SolidLineFrame,#FunctionParametersPanel,QGroupBox{border:1 solid #272727;border-radius:2}.tab-container,#TabBarContainer{background-color:transparent;qproperty-BottomAboveLineColor:#393939;qproperty-BottomBelowLineColor:#272727}.tab-flat,#StyleEditorTabBar::tab,#PaletteTabBar::tab,#FxSettingsTabBar::tab{background-color:#393939;border-right:1 solid #272727;border-bottom:1 solid #272727;color:#a1a1a1;padding:3 4 3 4}.tab-flat:hover,#StyleEditorTabBar::tab:hover,#PaletteTabBar::tab:hover,#FxSettingsTabBar::tab:hover{background-color:#484848;color:#a1a1a1}.tab-flat:selected,#StyleEditorTabBar::tab:selected,#PaletteTabBar::tab:selected,#FxSettingsTabBar::tab:selected{background-color:#484848;color:#fff;border-bottom-color:#484848}.tab-flat:only-one,#StyleEditorTabBar::tab:only-one,#PaletteTabBar::tab:only-one,#FxSettingsTabBar::tab:only-one{margin:0}.tab-round{background-color:#393939;border-top:1 solid #272727;border-right:1 solid #272727;border-left:1 solid #272727;border-bottom:1 solid #272727;color:#a1a1a1;margin:3 -1 0 0;padding:2 7 1 7}.tab-round:hover{background-color:#484848;color:#a1a1a1}.tab-round:selected{background-color:#484848;border-top-right-radius:2;border-top-left-radius:2;border-bottom-color:#484848;color:#fff;margin:1 -1 -1 0;padding:2 7 2 7}.tab-round:only-one{margin:1 0 0 0;padding:3 7 3 7}.tab-round:last{margin-right:0;border-top-right-radius:2}.tab-round:first{border-top-left-radius:2}QWidget{background-color:#484848;color:#e6e6e6}QWidget:disabled{color:#808080}QFrame{border:0;margin:0;padding:0}QToolTip,#helpToolTip{background-color:#fff;border:1 solid #000;color:#000;padding:1 1}#DockSeparator,QMainWindow::separator,QSplitter::handle{background-color:#1a1a1a;height:4;width:4}#TDockPlaceholder{background-color:#F77272}TPanel{background-color:#1a1a1a}#TopBar{background:#484848;border:0;border-bottom:1 solid #272727;height:21}#TopBar #EditToolLockButton{background:#484848;spacing:0}#TopBar #EditToolLockButton::indicator{background:none;border:none;height:18;margin:1 2 0 0;padding-left:0;padding-right:0}#TopBarTabContainer{background-color:#484848;margin-bottom:1}#StackedMenuBar{border:0;margin:0;padding:0}QMenuBar{background-color:#484848;border:0}QMenuBar::item{background-color:#484848;border-left:1 solid #484848;margin:0;padding:3 5}QMenuBar::item:selected{background-color:rgba(255,255,255,0.15);color:#e6e6e6}QMenuBar::item:pressed{background-color:#5385a6;color:#fff}#TopBarTab{margin:0;padding:0}#TopBarTab::tab{background-color:#393939;border-top:1 solid #272727;border-right:1 solid #272727;color:#a1a1a1;margin:0 0 0 0;padding:2 8 3 8}#TopBarTab::tab:hover{background-color:#484848;color:#a1a1a1}#TopBarTab::tab:selected{background-color:#484848;color:#fff}#TopBarTab::tab:first{border-left:1 solid #272727}#TopBarTab::tab:last{border-right:1 solid #272727}QMenu{background-color:#484848;border:1 solid #272727;padding:2 0}QMenu::item{padding:3 28}QMenu::item:selected{background-color:#5385a6;color:#fff}QMenu::item:checked{color:#e6e6e6}QMenu::item:checked:selected{background-color:#5385a6;color:#fff}QMenu::item:disabled{background:none;color:#808080}QMenu::item:disabled:selected{border-color:transparent}QMenu::separator{border-top:1 solid #272727;height:0;margin:2 0}QMenu::icon{border-radius:2;margin:0 0 0 3;padding:1}QMenu::icon:checked{background-color:#5385a6}QMenu::indicator{margin-left:7}TPanelTitleBar{background-color:#393939;border-color:#272727;border-style:solid;border-width:0 0 1 0;height:20;min-height:20;qproperty-TitleColor:#949494;qproperty-ActiveTitleColor:#fff;qproperty-BorderPixmap:url('none');qproperty-ActiveBorderPixmap:url('imgs/white/none');qproperty-FloatBorderPixmap:url('none');qproperty-FloatActiveBorderPixmap:url('imgs/white/none')}QAbstractScrollArea::corner{background-color:#343434}QScrollBar{background-color:#343434;border:0}QScrollBar:horizontal{height:16;margin:0}QScrollBar:vertical{margin:0;width:16}QScrollBar::handle{border:1 solid #525252;border-radius:4}QScrollBar::handle:horizontal:hover,QScrollBar::handle:vertical:hover{background-color:#676767;border-color:#676767}QScrollBar::handle:horizontal:pressed,QScrollBar::handle:vertical:pressed{background-color:#7b7b7b;border-color:#7b7b7b}QScrollBar::handle:horizontal{background-color:#525252;margin:3 16;min-width:20}QScrollBar::handle:vertical{background-color:#525252;margin:16 3;min-height:20}QScrollBar::add-line{subcontrol-origin:margin;border:0}QScrollBar::add-line:horizontal{subcontrol-position:right;background-color:#343434;margin:0;width:16}QScrollBar::add-line:vertical{subcontrol-position:bottom;background-color:#343434;margin:0;height:16}QScrollBar::sub-line{border:0;subcontrol-origin:margin}QScrollBar::sub-line:horizontal{subcontrol-position:left;background-color:#343434;margin:0;width:16}QScrollBar::sub-line:vertical{subcontrol-position:top;background-color:#343434;margin:0;height:16}QScrollBar::up-arrow:vertical{image:url('imgs/white/scroll-up.svg');image-position:center center}QScrollBar::up-arrow:vertical:pressed{margin:1 0 0 0}QScrollBar::down-arrow:vertical{image:url('imgs/white/scroll-down.svg');image-position:center center}QScrollBar::down-arrow:vertical:pressed{margin:1 0 0 0}QScrollBar::left-arrow:horizontal{image:url('imgs/white/scroll-left.svg');image-position:center center}QScrollBar::left-arrow:horizontal:pressed{margin:1 0 0 0}QScrollBar::right-arrow:horizontal{image:url('imgs/white/scroll-right.svg');image-position:center center}QScrollBar::right-arrow:horizontal:pressed{margin:1 0 0 0}QScrollBar::sub-page:horizontal,QScrollBar::add-page:horizontal,QScrollBar::sub-page:vertical,QScrollBar::add-page:vertical{background:none}QToolBar{padding:0}QToolBar::separator:horizontal{border-left:1 solid #272727;margin:0 1;width:0}QToolBar::separator:vertical{border-top:1 solid #272727;height:0;margin:1 0}QToolBar QLabel{margin-top:1}QToolBar QToolBar{border:0}QToolButton::menu-indicator{image:none}QToolButton::menu-button{border-image:none}.DvScrollWidget QPushButton,DvScrollWidget QPushButton,#ScrollLeftButton QPushButton,#ScrollRightButton QPushButton,#ScrollUpButton QPushButton,#ScrollDownButton QPushButton{background-color:#696969;border:0 solid red;border-radius:0;padding:0;max-width:16}.DvScrollWidget QPushButton:hover,DvScrollWidget QPushButton:hover,#ScrollLeftButton QPushButton:hover,#ScrollRightButton QPushButton:hover,#ScrollUpButton QPushButton:hover,#ScrollDownButton QPushButton:hover{background-color:#767676}.DvScrollWidget QPushButton:pressed,DvScrollWidget QPushButton:pressed,#ScrollLeftButton QPushButton:pressed,#ScrollRightButton QPushButton:pressed,#ScrollUpButton QPushButton:pressed,#ScrollDownButton QPushButton:pressed{background-color:#313131}#ScrollLeftButton,#ScrollRightButton,#ScrollUpButton,#ScrollDownButton{margin:0;min-width:16}#ScrollLeftButton{border-right:1 solid #272727;image:url('imgs/white/scroll-left.svg')}#ScrollRightButton{border-left:1 solid #272727;margin-left:3;image:url('imgs/white/scroll-right.svg')}#ScrollUpButton{image:url('imgs/white/scroll-up.svg')}#ScrollDownButton{image:url('imgs/white/scroll-down.svg')}#keyFrameNavigator{background:none;margin:0;padding:0}#keyFrameNavigator QToolButton{min-width:18}#keyFrameNavigator #PreviousKey{image:url('imgs/white/prevkey.svg')}#keyFrameNavigator #PreviousKey:hover{image:url('imgs/white/prevkey_over.svg')}#keyFrameNavigator #PreviousKey:disabled{image:url('imgs/white/prevkey_disabled.svg')}#keyFrameNavigator #NextKey{image:url('imgs/white/nextkey.svg')}#keyFrameNavigator #NextKey:hover{image:url('imgs/white/nextkey_over.svg')}#keyFrameNavigator #NextKey:disabled{image:url('imgs/white/nextkey_disabled.svg')}.treeview,QTreeWidget,QTreeView,#FunctionEditorTree{background-color:#343434;alternate-background-color:#393939;border:0;margin:0;outline:0}.treeview::item:selected,QTreeWidget::item:selected,QTreeView::item:selected,#FunctionEditorTree::item:selected{background-color:#5385a6;color:#fff}.treeview::branch:adjoins-item,QTreeWidget::branch:adjoins-item,QTreeView::branch:adjoins-item,#FunctionEditorTree::branch:adjoins-item{border-image:url('')}.treeview::branch:has-siblings,QTreeWidget::branch:has-siblings,QTreeView::branch:has-siblings,#FunctionEditorTree::branch:has-siblings{border-image:url('')}.treeview::branch:has-siblings:adjoins-item,QTreeWidget::branch:has-siblings:adjoins-item,QTreeView::branch:has-siblings:adjoins-item,#FunctionEditorTree::branch:has-siblings:adjoins-item{border-image:url('')}.treeview::branch:has-children:closed,QTreeWidget::branch:has-children:closed,QTreeView::branch:has-children:closed,#FunctionEditorTree::branch:has-children:closed{background:url('imgs/white/treebranch-closed.svg') no-repeat;background-position:center center;border-image:none;image:none}.treeview::branch:has-children:open,QTreeWidget::branch:has-children:open,QTreeView::branch:has-children:open,#FunctionEditorTree::branch:has-children:open{background:url('imgs/white/treebranch-open.svg') no-repeat;background-position:center center;image:none}.treeview::branch:has-children:has-siblings:closed,QTreeWidget::branch:has-children:has-siblings:closed,QTreeView::branch:has-children:has-siblings:closed,#FunctionEditorTree::branch:has-children:has-siblings:closed{background:url('imgs/white/treebranch-closed.svg') no-repeat;background-position:center center;border-image:none;image:none}.treeview::branch:has-children:has-siblings:open,QTreeWidget::branch:has-children:has-siblings:open,QTreeView::branch:has-children:has-siblings:open,#FunctionEditorTree::branch:has-children:has-siblings:open{background:url('imgs/white/treebranch-open.svg') no-repeat;background-position:center center;border-image:none;image:none}QListView{outline:0;background:#343434;alternate-background-color:#393939}#TabBarContainer{background-color:#393939}.Button,QPushButton,.ComboBox,.ComboBox:checked,QComboBox,QComboBox:checked{background-color:#696969;border:1 solid #484848;border-radius:2;color:#f3f3f3;margin:0;padding:3 15}.Button:hover,QPushButton:hover,.ComboBox:hover,#ViewerFpsSlider::sub-line:horizontal:hover,#ViewerFpsSlider::add-line:horizontal:hover,QComboBox:hover{background-color:#767676;border-color:#484848;color:#f3f3f3}.Button:pressed,QPushButton:pressed,#ViewerFpsSlider::sub-line:horizontal:pressed,#ViewerFpsSlider::add-line:horizontal:pressed{background-color:#313131;border-color:#2c2c2c;color:#f3f3f3}.Button:checked,QPushButton:checked{background-color:#313131;border-color:#2c2c2c;color:#f3f3f3}.Button:checked:hover,QPushButton:checked:hover{background-color:#363636}.Button:checked:hover:pressed,QPushButton:checked:hover:pressed{background:#313131}.Button:disabled,QPushButton:disabled,.ComboBox:disabled,#ViewerFpsSlider::sub-line:horizontal:disabled,#ViewerFpsSlider::add-line:horizontal:disabled,QComboBox:disabled{background-color:#555;border-color:#484848;color:#808080}#PushButton_NoPadding{padding:3}.ComboBox,.ComboBox:checked,QComboBox,QComboBox:checked{padding:1 0 1 4;margin:1 0}.ComboBox::drop-down,QComboBox::drop-down{image:url('imgs/white/combo_downarrow.svg');image-position:center center;width:16}.ComboBox::drop-down:disabled,QComboBox::drop-down:disabled{image:url('imgs/white/combo_downarrow_disabled.svg')}.ComboBox QAbstractItemView,QComboBox QAbstractItemView{background-color:#484848;border:1 solid #272727;selection-background-color:#5385a6;selection-color:#fff}.LineEdit,QPlainTextEdit,QLineEdit,#TaskSheetItem,#tasksRemoveBox,#tasksAddBox{background-color:#2f2f2f;border:1 solid #2c2c2c;border-radius:2;color:#e6e6e6;selection-background-color:#5385a6;selection-color:#fff;padding:0 0 0 1}.LineEdit:focus,QPlainTextEdit:focus,QLineEdit:focus,#TaskSheetItem:focus,#tasksRemoveBox:focus,#tasksAddBox:focus{background-color:#2f2f2f;border-color:#5385a6;color:#e6e6e6}.LineEdit:disabled,QPlainTextEdit:disabled,QLineEdit:disabled,#TaskSheetItem:disabled,#tasksRemoveBox:disabled,#tasksAddBox:disabled{background-color:#3b3b3b;border-color:#3a3a3a;color:#808080}.CheckBox,QCheckBox{color:#e6e6e6}.CheckBox:hover,QCheckBox:hover,.RadioButton:hover,QRadioButton:hover{color:#fff}.CheckBox:disabled,QCheckBox:disabled{color:#808080}.CheckBox::indicator,QMenu::indicator,QCheckBox::indicator,.GroupBox::indicator,QGroupBox::indicator{background-color:#2f2f2f;border:1 solid #2c2c2c;border-radius:2;height:9;padding:1;width:9}.CheckBox::indicator:hover,QMenu::indicator:hover,.CheckBox::indicator:checked:hover,QCheckBox::indicator:hover,.GroupBox::indicator:hover,QMenu::indicator:checked:hover,QCheckBox::indicator:checked:hover,.GroupBox::indicator:checked:hover,QGroupBox::indicator:hover,QGroupBox::indicator:checked:hover{background-color:#2f2f2f;border-color:#5385a6}.CheckBox::indicator:checked,QMenu::indicator:checked,QCheckBox::indicator:checked,.GroupBox::indicator:checked,QGroupBox::indicator:checked{background-color:#2f2f2f;border-color:#2c2c2c;image:url('imgs/white/checkmark.svg')}.CheckBox::indicator:checked:disabled,QMenu::indicator:checked:disabled,QCheckBox::indicator:checked:disabled,.GroupBox::indicator:checked:disabled,QGroupBox::indicator:checked:disabled{background-color:#3b3b3b;border-color:#3b3b3b;image:url('imgs/white/checkmark_disabled.svg')}.CheckBox::indicator:disabled,QMenu::indicator:disabled,QCheckBox::indicator:disabled,.GroupBox::indicator:disabled,QGroupBox::indicator:disabled{background-color:#3b3b3b;border-color:#3b3b3b}.RadioButton::indicator:unchecked,QRadioButton::indicator:unchecked,#CameraSettingsRadioButton_Small::indicator:unchecked{image:url('imgs/white/radiobutton_unchecked.svg');image-position:center center}.RadioButton::indicator:checked,QRadioButton::indicator:checked,#CameraSettingsRadioButton_Small::indicator:checked{image:url('imgs/white/radiobutton_checked.svg');image-position:center center}.GroupBox,QGroupBox{margin:6 0 0 0;padding:5 0}.GroupBox::title,QGroupBox::title{subcontrol-origin:margin;left:15;margin:-3 0 0 0;padding:0 3}.GroupBox::title:hover,QGroupBox::title:hover{color:#fff}.GroupBox::title:disabled,QGroupBox::title:disabled{color:#808080}.GroupBox::indicator,QGroupBox::indicator{subcontrol-origin:margin;margin-top:2}.GroupBox:disabled,QGroupBox:disabled{color:#808080}.Slider::groove:horizontal,QSlider::groove:horizontal{background-color:transparent;background-image:url('imgs/white/slider-groove.svg');background-position:center center;background-repeat:repeat-x;margin:0;height:20;min-height:20}.Slider::groove:horizontal:disabled,QSlider::groove:horizontal:disabled{background-image:url('imgs/white/slider-groove_disabled.svg')}.Slider::handle:horizontal,QSlider::handle:horizontal{width:10;margin:-2 -1;image:url('imgs/white/slider-handle.svg')}.Slider::handle:horizontal:disabled,QSlider::handle:horizontal:disabled{image:url('imgs/white/slider-handle_disabled.svg')}#IntPairField,#DoublePairField{qproperty-LightLineColor:#2c2c2c;qproperty-LightLineEdgeColor:#2c2c2c;qproperty-DarkLineColor:#2c2c2c;qproperty-MiddleLineColor:#2c2c2c;qproperty-HandleLeftPixmap:url("imgs/white/slider-handle.svg");qproperty-HandleRightPixmap:url("imgs/white/slider-handle.svg");qproperty-HandleLeftGrayPixmap:url("imgs/white/slider-handle_disabled.svg");qproperty-HandleRightGrayPixmap:url("imgs/white/slider-handle_disabled.svg")}#DirTreeView{background-color:#343434;alternate-background-color:#343434;border:1 solid #272727;border-right:0}DvItemViewerPanel{qproperty-TextColor:#e6e6e6;qproperty-AlternateBackground:#404040;qproperty-SelectedTextColor:#fff;qproperty-FolderTextColor:#9fdaff;qproperty-SelectedItemBackground:#5385a6}#FileBrowser DvItemViewerPanel,#SceneCast DvItemViewerPanel{background-color:#484848}#FileBrowser #castFrame,#SceneCast #castFrame{border-top:1 solid #272727;border-right:1 solid #272727;border-bottom:1 solid #272727;margin:0}#FileBrowser QToolButton,#SceneCast QToolButton{padding:1}DvDirTreeView{qproperty-TextColor:#e6e6e6;qproperty-SelectedTextColor:#fff;qproperty-SelectedItemBackground:#5385a6;qproperty-FolderTextColor:#9fdaff;qproperty-SelectedFolderTextColor:#fff;alternate-background-color:#393939;background-color:#343434;border:1 solid #272727}#FileDoesNotExistLabel{color:#f00}#SceneCast QToolBar{border-top:1 solid #272727}#SceneCast QToolButton{margin:3 1 2 1;padding:1}#CastBrowser{border:0;margin:0}#FilmStrip QComboBox{border-radius:0;border-width:0}#FilmStrip QComboBox QAbstractItemView{background-color:#484848}#CleanupSettings #CleanupSettingsFrame{margin-top:2;margin-bottom:4}#CleanupSettings QGroupBox{margin-bottom:3}ParamsPage{qproperty-TextColor:#e6e6e6}#CameraSettingsButton{padding:2}#CameraSettingsRadioButton:hover{background:none}#CameraSettingsRadioButton::indicator{border:1 solid rgba(255,255,255,0);height:18;padding:0;width:18}#CameraSettingsRadioButton::indicator:unchecked{image:url('imgs/white/lock_off.svg')}#CameraSettingsRadioButton::indicator:checked{background-color:#C34040;border-color:#C34040;image:url('imgs/white/lock_on.svg')}#CameraSettingsRadioButton::indicator:checked:hover{background-color:#d57a7a;border-color:#d57a7a}#CameraSettingsDPI{color:#9fdaff}#CameraSettingsRadioButton_Small{padding:0}#CameraSettingsRadioButton_Small::indicator{background-color:transparent;border:0;height:21;margin:0;width:11}#ForceSquaredPixelButton{height:16;border:1 solid rgba(255,255,255,0);image:url('imgs/white/fsp_unchecked.svg');padding:2;width:16;margin:0}#ForceSquaredPixelButton:checked{image:url('imgs/white/fsp_checked.svg')}#OutputSettingsLabel{color:#9fdaff}PencilTestPopup{min-height:730px;min-width:512px}#MatchLineButton{background-color:#6e6e6e}#MatchLineButton:checked{background-color:#949494;border:2 solid #5385a6;border-radius:2}#LargeSizedText{font-size:17}#StartupLabel{padding:3}#StartupLabel:hover{background:#626262}QStatusBar{background-color:#c0c0c0}QStatusBar::item{border:0}QStatusBar QLabel{background-color:#c0c0c0}QStatusBar #StatusBarLabel{background-color:#fff;padding:1 3}#TitleTxtLabel{color:#9fdaff}#StyleEditor QPushButton{margin:2 1;padding:0}#StyleEditor #TabBarContainer{margin-left:-4}#StyleEditor #bottomWidget{border-top:1 solid #272727;padding:3 2 8 3}#StyleEditor #bottomWidget QPushButton{padding:3 5}#StyleEditorTabBar::tab::first{border-left:1 solid #272727}#HexagonalColorWheel{qproperty-BGColor:#484848}#colorSlider::groove:horizontal{height:1;border-image:none}#colorSlider::handle:horizontal{width:8;margin:-8 -4}#colorSliderAddButton,#colorSliderSubButton{background:none;border-color:transparent;image-position:center center;min-height:16;padding:0;min-width:18}#colorSliderAddButton{image:url('imgs/white/scroll-right.svg')}#colorSliderSubButton{image:url('imgs/white/scroll-left.svg')}#PlainColorPageParts{border-bottom:1 solid #272727}#PlainColorPageParts QLineEdit{max-width:35}PaletteViewer DvScrollWidget QPushButton{border-top:0;margin-bottom:1;max-width:15;min-width:15}PaletteViewer DvScrollWidget #ScrollLeftButton{border-radius:0;margin-bottom:1;max-width:16;min-width:16}PaletteViewer DvScrollWidget #ScrollRightButton{border-radius:0;margin-left:1;margin-bottom:1;max-width:16;min-width:16}PaletteViewer QToolBar{background:none;border-bottom:1 solid #272727;padding:0;margin:0}PaletteViewer QToolBar::separator:horizontal{margin:0}PaletteViewer QToolBar QToolButton{margin:0 0 1 0;padding:1 0 2 0}#PageViewer{qproperty-TextColor:#e6e6e6}#PaletteLockButton{border-radius:0;margin:0 0 1 1}#PaletteLockButton:checked{background-color:#C34040;border-color:#C34040}#PaletteLockButton:checked:hover{background-color:#d57a7a;border-color:#d57a7a}#WordButton{padding-right:0;padding-left:0}QDialog{background-color:#484848}QDialog #dialogButtonFrame{background-color:#3e3e3e;border-top:1 solid #272727}QDialog #dialogButtonFrame QPushButton{border-color:#3e3e3e;outline:0}QDialog #dialogButtonFrame QPushButton:focus{background-color:#5385a6;border-color:#3e3e3e;color:#fff}QDialog #dialogButtonFrame QPushButton:focus:hover{background-color:#6c98b6}QDialog #dialogButtonFrame QPushButton:focus:pressed{background-color:#313131;border-color:#2c2c2c;color:#f3f3f3}#SceneSettings QLabel{color:#9fdaff}#PreferencesPopup QListWidget{background-color:#343434;alternate-background-color:#343434;border:1 solid #272727;font-size:13}#PreferencesPopup QListWidget::item{border:0;padding:3}#PreferencesPopup QListWidget::item:hover{color:#e6e6e6;background-color:rgba(255,255,255,0.15)}#PreferencesPopup QListWidget::item:selected{background-color:#5385a6;color:#fff}#ShortcutTree{border:1 solid #272727}#ShortcutTree::item{padding:1 0}#ShortcutTree QScrollBar:vertical{width:16;margin-right:-1}ProjectPopup QLabel{color:#9fdaff}#GearButton{qproperty-icon:url('imgs/white/gear.svg')}#SubfolderButton{qproperty-icon:url('imgs/white/subfolder.svg');padding-left:6px;padding-right:6px}#SubcameraButton{qproperty-icon:url('imgs/white/subcamera.svg');padding-left:6px;padding-right:6px}SchematicViewer{qproperty-TextColor:#e6e6e6;qproperty-VerticalLineColor:#222;qproperty-LevelColumnColor:#4C6E4C;qproperty-VectorColumnColor:#7B7B4C;qproperty-ChildColumnColor:#6A526B;qproperty-FullcolorColumnColor:#657A96;qproperty-FxColumnColor:#56553C;qproperty-PaletteColumnColor:#3A655F;qproperty-MeshColumnColor:#684D86;qproperty-ReferenceColumnColor:#616161;qproperty-TableColor:#62628c;qproperty-ActiveCameraColor:#2d7dca;qproperty-OtherCameraColor:#6c797b;qproperty-GroupColor:#3b6e9c;qproperty-PegColor:#9f6e3c;qproperty-SplineColor:#6a9d1c;qproperty-ActiveOutputColor:#2d7dca;qproperty-OtherOutputColor:#6c797b;qproperty-XsheetColor:#62628c;qproperty-NormalFxColor:#6a7e96;qproperty-MacroFxColor:#815c79;qproperty-ImageAdjustFxColor:#656287;qproperty-LayerBlendingFxColor:#4f757d;qproperty-MatteFxColor:#ae7171;qproperty-SchematicPreviewButtonBgOnColor:#c8c864;qproperty-SchematicPreviewButtonOnImage:url('imgs/white/x_prev_eye_on.svg');qproperty-SchematicPreviewButtonBgOffColor:#616161;qproperty-SchematicPreviewButtonOffImage:url('imgs/white/x_prev_eye_off.svg');qproperty-SchematicCamstandButtonBgOnColor:#eb906b;qproperty-SchematicCamstandButtonOnImage:url('imgs/white/x_table_view_on.svg');qproperty-SchematicCamstandButtonTranspImage:url('imgs/white/x_table_view_transp.svg');qproperty-SchematicCamstandButtonBgOffColor:#616161;qproperty-SchematicCamstandButtonOffImage:url('imgs/white/x_table_view_off.svg')}#SchematicBottomFrame{background-color:#484848;border:0;margin:0;padding:0}#SchematicBottomFrame QToolBar::separator:horizontal{margin:0}#SchematicBottomFrame QToolBar QToolButton{padding:0;margin:2}#SchematicSceneViewer{background-color:#3b3b3b;border-bottom:1 solid #272727}#FxSettingsTabBar::tab{border-top:1 solid #272727}#FxSettingsTabBar::tab::first,#FxSettingsTabBar::tab::only-one{border-left:1 solid #272727}FxSettings QToolBar{border-top:1 solid #272727;border-right:1 solid #272727;border-left:1 solid #272727;min-height:23;padding:3 0}FxSettings QToolBar QToolBar{border:0}#FxSettingsLabel{color:#a0e680}#FxSettingsHelpButton{background-color:#80a0dc;color:#000;padding-top:0;padding-bottom:0}#FxSettingsHelpButton:hover{background-color:#a8bee7}#ScriptConsole{font-family:'Courier New',monospace;border:0;color:#000000;padding:3}#ScriptConsole QFrame{background-color:#dcdcdc}#ScriptConsole TPanelTitleBar{background-color:#393939}#TaskSheetItemLabel{color:#e6e6e6}#Tasks QToolBar{border-bottom:1 solid #272727;margin:0;padding:0}#Tasks QToolBar QToolButton{margin:2 2 3 2}#ToolBar QToolBar{padding-left:2}#ToolOptions TPanelTitleBar{border-right:1 solid #272727;border-bottom:0}#CommandBar TPanelTitleBar{border-right:1 solid #272727;border-bottom:0}IconViewField{qproperty-ThicknessPixmap:url("imgs/white/selectiontool_thickness.svg")}#EditToolLockButton{spacing:0}#EditToolLockButton:hover{background:none}#EditToolLockButton::indicator{border:1 solid rgba(255,255,255,0);height:18;padding:0;width:18}#EditToolLockButton::indicator:unchecked{image:url('imgs/white/lock_off.svg')}#EditToolLockButton::indicator:checked{background-color:#C34040;border-color:#C34040;image:url('imgs/white/lock_on.svg')}#EditToolLockButton::indicator:checked:hover{background-color:#d57a7a;border-color:#d57a7a}PopupButton::menu-indicator{border-left:0;height:17;image:url('imgs/white/combo_downarrow.svg');width:10}PopupButton::menu-indicator:hover{image:url('imgs/white/combo_downarrow.svg')}PopupButton::menu-indicator:disabled{image:url('imgs/white/combo_downarrow_disabled.svg')}#Cap,#Join{padding:0 4 0 -8;max-width:32;min-width:32}#Cap QMenu,#Join QMenu{max-width:28;min-width:28}#Cap QMenu::item,#Join QMenu::item{max-width:28;min-width:28;padding:0}QToolBar#MediumPaddingToolBar QToolButton{padding-left:3;padding-right:3}QToolBar#WidePaddingToolBar QToolButton{padding-left:6;padding-right:6}#CommandBar{margin:0;padding:0;border:0}#CommandBar::separator:horizontal{margin-right:3;margin-left:3}#expandButton:checked{background-color:transparent;border-color:transparent;color:#e6e6e6}#expandButton:checked:hover{background-color:#767676;border-color:#767676}#expandButton:checked:pressed{background-color:#313131;border-color:#2c2c2c}#ComboViewerPanel Toolbar{border-bottom:1 solid #272727}#ComboViewerPanel Toolbar::separator:horizontal{margin:0 0 0 2}#ComboViewerPanel Toolbar QToolButton{margin:2 0 3 2}#ComboViewerToolOptions{border-bottom:1 solid #272727}#ComboViewer #ToolBarContainer,#ViewerPanel #ToolBarContainer,FlipBook #ToolBarContainer{background-color:transparent;border-top:2 solid #272727;border-bottom:1 solid #272727;padding-right:-1}#flipCustomize{margin-left:3}#flipCustomize::menu-button{background-color:transparent;width:35}#flipCustomize::menu-arrow{image:none}QToolBar#FlipConsolePlayToolBar::separator:horizontal{margin:0 3}QToolBar#FlipConsolePlayToolBar QToolButton{margin-top:2;margin-bottom:2;height:16;padding-left:1;padding-right:1}#ViewerFpsSlider{background-color:transparent;background-image:url('imgs/white/slider-groove.svg');background-position:center center;background-repeat:repeat-x;border:0;height:19;margin:0 3 0 37;max-width:300;min-width:0}#ViewerFpsSlider::sub-line:horizontal{subcontrol-origin:absolute;background-color:#696969;border:1 solid #484848;border-top-left-radius:2;border-bottom-left-radius:2;height:16;left:-33;width:14}#ViewerFpsSlider::add-line:horizontal{subcontrol-position:left;background-color:#696969;border:1 solid #484848;border-top-right-radius:2;border-bottom-right-radius:2;left:18;height:16;image-position:center center;width:13}#ViewerFpsSlider::handle::horizontal{background-color:#a1a1a1;border:1 solid #a1a1a1;border-radius:2;margin:2 0 3 0;min-width:9;width:9;max-width:9}FlipSlider{qproperty-PBHeight:15;qproperty-PBOverlay:url('imgs/white/flipslider.svg');qproperty-PBColorMarginLeft:1;qproperty-PBColorMarginTop:2;qproperty-PBColorMarginRight:1;qproperty-PBColorMarginBottom:2;qproperty-PBMarker:url('imgs/white/flipmarker.svg');qproperty-PBMarkerMarginLeft:3;qproperty-PBMarkerMarginRight:3;qproperty-notStartedColor:rgba(205,101,101,0.78);qproperty-startedColor:#1abc3f;qproperty-baseColor:#2f2f2f;qproperty-finishedColor:#2f2f2f}Ruler{qproperty-ParentBGColor:#484848;qproperty-ScaleColor:#e6e6e6}#RulerToolOptionValues{color:#000}#xsheetArea,#ScrollArea{background-color:#343434;border:0}#xsheetScrollArea{border:0}#cornerWidget QToolButton{padding:0}#xsheetColumnAreaMenu_Preview{background-color:#E6E678}#xsheetColumnAreaMenu_Lock{background-color:#F5F5F5}#xsheetColumnAreaMenu_Camstand{background-color:#FFA480}#xsheetColumnAreaMenu_Preview,#xsheetColumnAreaMenu_Lock,#xsheetColumnAreaMenu_Camstand{color:#000}#noteTextEdit{color:#000}XsheetViewer{qproperty-TextColor:#e6e6e6;qproperty-BGColor:#3b3b3b;qproperty-LightLineColor:#2c2c2c;qproperty-MarkerLineColor:#1E96C4;qproperty-VerticalLineColor:#222;qproperty-VerticalLineHeadColor:#808080;qproperty-PreviewFrameTextColor:#9fdaff;qproperty-CurrentRowBgColor:#506082;qproperty-OnionSkinAreaBgColor:#363636;qproperty-EmptyColumnHeadColor:#626262;qproperty-SelectedColumnTextColor:#E66464;qproperty-EmptyCellColor:#404040;qproperty-NotEmptyColumnColor:#484848;qproperty-SelectedEmptyCellColor:#6c6c6c;qproperty-LevelColumnColor:#4C6E4C;qproperty-LevelColumnBorderColor:#8FB38F;qproperty-SelectedLevelColumnColor:#678667;qproperty-VectorColumnColor:#7B7B4C;qproperty-VectorColumnBorderColor:#BBBB9A;qproperty-SelectedVectorColumnColor:#949466;qproperty-ChildColumnColor:#6A526B;qproperty-ChildColumnBorderColor:#B1A3B3;qproperty-SelectedChildColumnColor:#816e82;qproperty-FullcolorColumnColor:#657A96;qproperty-FullcolorColumnBorderColor:#9EB8BB;qproperty-SelectedFullcolorColumnColor:#8895a6;qproperty-FxColumnColor:#56553C;qproperty-FxColumnBorderColor:#95958A;qproperty-SelectedFxColumnColor:#6f6e56;qproperty-ReferenceColumnColor:#616161;qproperty-ReferenceColumnBorderColor:#A2A2A2;qproperty-SelectedReferenceColumnColor:#7a7a7a;qproperty-PaletteColumnColor:#3A655F;qproperty-PaletteColumnBorderColor:#86ACA7;qproperty-SelectedPaletteColumnColor:#52807a;qproperty-MeshColumnColor:#684D86;qproperty-MeshColumnBorderColor:#BA92EF;qproperty-SelectedMeshColumnColor:#82689e;qproperty-SoundTextColumnColor:#c8c8c8;qproperty-SoundTextColumnBorderColor:#8c8c8c;qproperty-SelectedSoundTextColumnColor:#e2e2e2;qproperty-SoundColumnColor:#657456;qproperty-SoundColumnBorderColor:#A0AF7D;qproperty-SelectedSoundColumnColor:#7e8b72;qproperty-SoundColumnHlColor:#34FE5E;qproperty-SoundColumnTrackColor:#B6C29D;qproperty-ColumnHeadPastelizer:#000;qproperty-SelectedColumnHead:#506082;qproperty-LightLightBGColor:#404040;qproperty-LightBGColor:#f0f0f0;qproperty-DarkBGColor:#e1e1e1;qproperty-DarkLineColor:#969696;qproperty-XsheetColumnNameBgColor:rgba(0,0,0,0);qproperty-XsheetDragBarHighlightColor:rgba(255,255,255,0.5);qproperty-XsheetPreviewButtonBgOnColor:#c8c864;qproperty-XsheetPreviewButtonOnImage:url('imgs/white/x_prev_eye_on.svg');qproperty-XsheetPreviewButtonBgOffColor:rgba(255,255,255,0);qproperty-XsheetPreviewButtonOffImage:url('imgs/white/x_prev_eye_off.svg');qproperty-XsheetCamstandButtonBgOnColor:#eb906b;qproperty-XsheetCamstandButtonOnImage:url('imgs/white/x_table_view_on.svg');qproperty-XsheetCamstandButtonTranspImage:url('imgs/white/x_table_view_transp.svg');qproperty-XsheetCamstandButtonBgOffColor:rgba(255,255,255,0);qproperty-XsheetCamstandButtonOffImage:url('imgs/white/x_table_view_off.svg');qproperty-XsheetLockButtonBgOnColor:rgba(255,255,255,0.3);qproperty-XsheetLockButtonOnImage:url('imgs/white/x_lock_on.svg');qproperty-XsheetLockButtonBgOffColor:rgba(255,255,255,0);qproperty-XsheetLockButtonOffImage:url('imgs/white/x_lock_off.svg');qproperty-XsheetConfigButtonBgColor:rgba(255,255,255,0);qproperty-XsheetConfigButtonImage:url('imgs/white/x_config.svg');qproperty-TimelinePreviewButtonBgOnColor:rgba(255,255,255,0);qproperty-TimelinePreviewButtonOnImage:url('imgs/white/timeline_toggle_on.svg');qproperty-TimelinePreviewButtonBgOffColor:rgba(255,255,255,0);qproperty-TimelinePreviewButtonOffImage:url('imgs/white/timeline_toggle_off.svg');qproperty-TimelineCamstandButtonBgOnColor:rgba(255,255,255,0);qproperty-TimelineCamstandButtonOnImage:url('imgs/white/timeline_toggle_on.svg');qproperty-TimelineCamstandButtonTranspImage:url('imgs/white/timeline_toggle_transp.svg');qproperty-TimelineCamstandButtonBgOffColor:rgba(255,255,255,0);qproperty-TimelineCamstandButtonOffImage:url('imgs/white/timeline_toggle_off.svg');qproperty-TimelineLockButtonBgOnColor:rgba(255,255,255,0);qproperty-TimelineLockButtonOnImage:url('imgs/white/timeline_toggle_on.svg');qproperty-TimelineLockButtonBgOffColor:rgba(255,255,255,0);qproperty-TimelineLockButtonOffImage:url('imgs/white/timeline_toggle_off.svg');qproperty-TimelineConfigButtonBgColor:rgba(255,255,255,0);qproperty-TimelineConfigButtonImage:url('imgs/white/timeline_config.svg');qproperty-LayerHeaderPreviewImage:url('imgs/white/layer_header_prev_eye.svg');qproperty-LayerHeaderPreviewOverImage:url('imgs/white/layer_header_prev_eye_over.svg');qproperty-LayerHeaderCamstandImage:url('imgs/white/layer_header_table_view.svg');qproperty-LayerHeaderCamstandOverImage:url('imgs/white/layer_header_table_view_over.svg');qproperty-LayerHeaderLockImage:url('imgs/white/lock_on.svg');qproperty-LayerHeaderLockOverImage:url('imgs/white/lock_on_over.svg')}#XSheetToolbar{margin:0;padding:0;border:0}#XSheetToolbar QToolButton{padding:0;margin:4 1;min-height:19;height:19}#XSheetToolbar::separator:horizontal{margin:0 4}#FunctionEditor QToolBar{border-bottom:1 solid #272727}#FunctionEditor QToolBar QToolBar{border:0}#FunctionEditor QToolBar QLabel{margin-left:5}#FunctionEditor QToolBar QToolButton{height:18}#FunctionEditorTree{border-top:1 solid #272727}FunctionTreeView{qproperty-TextColor:#e6e6e6;qproperty-CurrentTextColor:#E66464}FunctionPanel{qproperty-BGColor:#3b3b3b;qproperty-ValueLineColor:#2f2f2f;qproperty-FrameLineColor:#2f2f2f;qproperty-OtherCurvesColor:#888;qproperty-RulerBackground:#333;qproperty-TextColor:#e6e6e6;qproperty-SubColor:#000;qproperty-SelectedColor:#FFA500}SpreadsheetViewer{qproperty-LightLightBGColor:#404040;qproperty-CurrentRowBgColor:#506082;qproperty-LightLineColor:#2c2c2c;qproperty-MarkerLineColor:#1E96C4;qproperty-BGColor:#484848;qproperty-VerticalLineColor:#222;qproperty-KeyFrameColor:#995d1d;qproperty-KeyFrameBorderColor:#c9b04b;qproperty-SelectedKeyFrameColor:#be772b;qproperty-InBetweenColor:#666250;qproperty-InBetweenBorderColor:#cdcec8;qproperty-SelectedInBetweenColor:#7d7a6c;qproperty-SelectedEmptyColor:#6c6c6c;qproperty-SelectedSceneRangeEmptyColor:#757575;qproperty-TextColor:#e6e6e6;qproperty-ColumnHeaderBorderColor:#808080;qproperty-SelectedColumnTextColor:#E66464}#ExpressionField{background-color:#e6e6e6;border:1 solid #333;margin:0}#FunctionSegmentViewerLinkButton{background-image:url('imgs/white/segment_unlinked.svg');background-repeat:no-repeat}#FunctionSegmentViewerLinkButton:hover{background-repeat:no-repeat}#FunctionSegmentViewerLinkButton:checked{background-image:url('imgs/white/segment_linked.svg');background-repeat:no-repeat}#FunctionSegmentViewerLinkButton:disabled{background-image:url('imgs/white/segment_disabled.svg');background-repeat:no-repeat} \ No newline at end of file +.button-show,#LoadLevelShowButton,#CleanupSettingsShowButton,#OutputSettingsShowButton,#FxSettingsPreviewShowButton{image:url('imgs/white/plus.svg');image-position:center center;margin:0;padding:1;min-width:10;min-height:10}.button-show:checked,#LoadLevelShowButton:checked,#CleanupSettingsShowButton:checked,#OutputSettingsShowButton:checked,#FxSettingsPreviewShowButton:checked{background-color:#313131;border-color:#2c2c2c;image:url('imgs/white/minus.svg')}.button-show:checked:pressed,#LoadLevelShowButton:checked:pressed,#CleanupSettingsShowButton:checked:pressed,#OutputSettingsShowButton:checked:pressed,#FxSettingsPreviewShowButton:checked:pressed{background-color:#313131;border-color:#2c2c2c}.button-show:checked:hover,#LoadLevelShowButton:checked:hover,#CleanupSettingsShowButton:checked:hover,#OutputSettingsShowButton:checked:hover,#FxSettingsPreviewShowButton:checked:hover{background-color:#363636}.button-tool,QToolButton,#CameraSettingsRadioButton::indicator,#ForceSquaredPixelButton,#SchematicBottomFrame QToolBar QToolButton,#EditToolLockButton::indicator,#flipCustomize{background-color:rgba(255,255,255,0);border:1 solid rgba(255,255,255,0);border-radius:2;color:#f3f3f3;margin:1;padding:0}.button-tool:hover,QToolButton:hover,#CameraSettingsRadioButton::indicator:hover,#ForceSquaredPixelButton:hover,#colorSliderAddButton:hover,#colorSliderSubButton:hover,#SchematicBottomFrame QToolBar QToolButton:hover,#EditToolLockButton::indicator:hover,#flipCustomize:hover{background-color:#767676;border-color:#767676;color:#f3f3f3}.button-tool:pressed,QToolButton:pressed,#CameraSettingsRadioButton::indicator:pressed,#ForceSquaredPixelButton:pressed,#colorSliderAddButton:pressed,#colorSliderSubButton:pressed,#SchematicBottomFrame QToolBar QToolButton:pressed,#EditToolLockButton::indicator:pressed,#flipCustomize:pressed{background-color:#313131;border-color:#2c2c2c;color:#f3f3f3}.button-tool:checked,QToolButton:checked,#CameraSettingsRadioButton::indicator:checked,#ForceSquaredPixelButton:checked,#SchematicBottomFrame QToolBar QToolButton:checked,#EditToolLockButton::indicator:checked,#flipCustomize:checked{background-color:#5385a6;border-color:#5385a6;color:#fff}.button-tool:checked:hover,QToolButton:checked:hover,#CameraSettingsRadioButton::indicator:checked:hover,#ForceSquaredPixelButton:checked:hover,#SchematicBottomFrame QToolBar QToolButton:checked:hover,#EditToolLockButton::indicator:checked:hover,#flipCustomize:checked:hover{background-color:#6c98b6;border-color:#6c98b6}.button-tool:disabled,QToolButton:disabled,#CameraSettingsRadioButton::indicator:disabled,#ForceSquaredPixelButton:disabled,#SchematicBottomFrame QToolBar QToolButton:disabled,#EditToolLockButton::indicator:disabled,#flipCustomize:disabled{color:#808080}.button-flat,PaletteViewer QToolBar QToolButton{background-color:none;border:0;border-radius:0;margin:0}.button-flat:hover,PaletteViewer QToolBar QToolButton:hover{background-color:#767676}.button-flat:pressed,PaletteViewer QToolBar QToolButton:pressed{background-color:#272727}.frame,.GroupBox,#LoadLevelFrame,#PsdSettingsGroupBox,#CleanupSettingsFrame,#OutputSettingsBox,#OutputSettingsCameraBox,#SolidLineFrame,#FunctionParametersPanel,QGroupBox{border:1 solid #272727;border-radius:2}.tab-container,#TabBarContainer{background-color:transparent;qproperty-BottomAboveLineColor:#393939;qproperty-BottomBelowLineColor:#272727}.tab-flat,#StyleEditorTabBar::tab,#PaletteTabBar::tab,#FxSettingsTabBar::tab{background-color:#393939;border-right:1 solid #272727;border-bottom:1 solid #272727;color:#a1a1a1;padding:3 4 3 4}.tab-flat:hover,#StyleEditorTabBar::tab:hover,#PaletteTabBar::tab:hover,#FxSettingsTabBar::tab:hover{background-color:#484848;color:#a1a1a1}.tab-flat:selected,#StyleEditorTabBar::tab:selected,#PaletteTabBar::tab:selected,#FxSettingsTabBar::tab:selected{background-color:#484848;color:#fff;border-bottom-color:#484848}.tab-flat:only-one,#StyleEditorTabBar::tab:only-one,#PaletteTabBar::tab:only-one,#FxSettingsTabBar::tab:only-one{margin:0}.tab-round{background-color:#393939;border-top:1 solid #272727;border-right:1 solid #272727;border-left:1 solid #272727;border-bottom:1 solid #272727;color:#a1a1a1;margin:3 -1 0 0;padding:2 7 1 7}.tab-round:hover{background-color:#484848;color:#a1a1a1}.tab-round:selected{background-color:#484848;border-top-right-radius:2;border-top-left-radius:2;border-bottom-color:#484848;color:#fff;margin:1 -1 -1 0;padding:2 7 2 7}.tab-round:only-one{margin:1 0 0 0;padding:3 7 3 7}.tab-round:last{margin-right:0;border-top-right-radius:2}.tab-round:first{border-top-left-radius:2}QWidget{background-color:#484848;color:#e6e6e6}QWidget:disabled{color:#808080}QFrame{border:0;margin:0;padding:0}QToolTip,#helpToolTip{background-color:#fff;border:1 solid #000;color:#000;padding:1 1}#DockSeparator,QMainWindow::separator,QSplitter::handle{background-color:#1a1a1a;height:4;width:4}#TDockPlaceholder{background-color:#F77272}TPanel{background-color:#1a1a1a}#TopBar{background:#484848;border:0;border-bottom:1 solid #272727;height:21}#TopBar #EditToolLockButton{background:#484848;spacing:0}#TopBar #EditToolLockButton::indicator{background:none;border:none;height:18;margin:1 2 0 0;padding-left:0;padding-right:0}#TopBarTabContainer{background-color:#484848;margin-bottom:1}#StackedMenuBar{border:0;margin:0;padding:0}QMenuBar{background-color:#484848;border:0}QMenuBar::item{background-color:#484848;border-left:1 solid #484848;margin:0;padding:3 5}QMenuBar::item:selected{background-color:rgba(255,255,255,0.15);color:#e6e6e6}QMenuBar::item:pressed{background-color:#5385a6;color:#fff}#TopBarTab{margin:0;padding:0}#TopBarTab::tab{background-color:#393939;border-top:1 solid #272727;border-right:1 solid #272727;color:#a1a1a1;margin:0 0 0 0;padding:2 8 3 8}#TopBarTab::tab:hover{background-color:#484848;color:#a1a1a1}#TopBarTab::tab:selected{background-color:#484848;color:#fff}#TopBarTab::tab:first{border-left:1 solid #272727}#TopBarTab::tab:last{border-right:1 solid #272727}QMenu{background-color:#484848;border:1 solid #272727;padding:2 0}QMenu::item{padding:3 28}QMenu::item:selected{background-color:#5385a6;color:#fff}QMenu::item:checked{color:#e6e6e6}QMenu::item:checked:selected{background-color:#5385a6;color:#fff}QMenu::item:disabled{background:none;color:#808080}QMenu::item:disabled:selected{border-color:transparent}QMenu::separator{border-top:1 solid #272727;height:0;margin:2 0}QMenu::icon{border-radius:2;margin:0 0 0 3;padding:1}QMenu::icon:checked{background-color:#5385a6}QMenu::indicator{margin-left:7}TPanelTitleBar{background-color:#393939;border-color:#272727;border-style:solid;border-width:0 0 1 0;height:20;min-height:20;qproperty-TitleColor:#949494;qproperty-ActiveTitleColor:#fff;qproperty-BorderPixmap:url('none');qproperty-ActiveBorderPixmap:url('imgs/white/none');qproperty-FloatBorderPixmap:url('none');qproperty-FloatActiveBorderPixmap:url('imgs/white/none')}QAbstractScrollArea::corner{background-color:#343434}QScrollBar{background-color:#343434;border:0}QScrollBar:horizontal{height:16;margin:0}QScrollBar:vertical{margin:0;width:16}QScrollBar::handle{border:1 solid #525252;border-radius:4}QScrollBar::handle:horizontal:hover,QScrollBar::handle:vertical:hover{background-color:#676767;border-color:#676767}QScrollBar::handle:horizontal:pressed,QScrollBar::handle:vertical:pressed{background-color:#7b7b7b;border-color:#7b7b7b}QScrollBar::handle:horizontal{background-color:#525252;margin:3 16;min-width:20}QScrollBar::handle:vertical{background-color:#525252;margin:16 3;min-height:20}QScrollBar::add-line{subcontrol-origin:margin;border:0}QScrollBar::add-line:horizontal{subcontrol-position:right;background-color:#343434;margin:0;width:16}QScrollBar::add-line:vertical{subcontrol-position:bottom;background-color:#343434;margin:0;height:16}QScrollBar::sub-line{border:0;subcontrol-origin:margin}QScrollBar::sub-line:horizontal{subcontrol-position:left;background-color:#343434;margin:0;width:16}QScrollBar::sub-line:vertical{subcontrol-position:top;background-color:#343434;margin:0;height:16}QScrollBar::up-arrow:vertical{image:url('imgs/white/scroll-up.svg');image-position:center center}QScrollBar::up-arrow:vertical:pressed{margin:1 0 0 0}QScrollBar::down-arrow:vertical{image:url('imgs/white/scroll-down.svg');image-position:center center}QScrollBar::down-arrow:vertical:pressed{margin:1 0 0 0}QScrollBar::left-arrow:horizontal{image:url('imgs/white/scroll-left.svg');image-position:center center}QScrollBar::left-arrow:horizontal:pressed{margin:1 0 0 0}QScrollBar::right-arrow:horizontal{image:url('imgs/white/scroll-right.svg');image-position:center center}QScrollBar::right-arrow:horizontal:pressed{margin:1 0 0 0}QScrollBar::sub-page:horizontal,QScrollBar::add-page:horizontal,QScrollBar::sub-page:vertical,QScrollBar::add-page:vertical{background:none}QToolBar{padding:0}QToolBar::separator:horizontal{border-left:1 solid #272727;margin:0 1;width:0}QToolBar::separator:vertical{border-top:1 solid #272727;height:0;margin:1 0}QToolBar QLabel{margin-top:1}QToolBar QToolBar{border:0}QToolButton::menu-indicator{image:none}QToolButton::menu-button{border-image:none}.DvScrollWidget QPushButton,DvScrollWidget QPushButton,#ScrollLeftButton QPushButton,#ScrollRightButton QPushButton,#ScrollUpButton QPushButton,#ScrollDownButton QPushButton{background-color:#696969;border:0 solid red;border-radius:0;padding:0;max-width:16}.DvScrollWidget QPushButton:hover,DvScrollWidget QPushButton:hover,#ScrollLeftButton QPushButton:hover,#ScrollRightButton QPushButton:hover,#ScrollUpButton QPushButton:hover,#ScrollDownButton QPushButton:hover{background-color:#767676}.DvScrollWidget QPushButton:pressed,DvScrollWidget QPushButton:pressed,#ScrollLeftButton QPushButton:pressed,#ScrollRightButton QPushButton:pressed,#ScrollUpButton QPushButton:pressed,#ScrollDownButton QPushButton:pressed{background-color:#313131}#ScrollLeftButton,#ScrollRightButton,#ScrollUpButton,#ScrollDownButton{margin:0;min-width:16}#ScrollLeftButton{border-right:1 solid #272727;image:url('imgs/white/scroll-left.svg')}#ScrollRightButton{border-left:1 solid #272727;margin-left:3;image:url('imgs/white/scroll-right.svg')}#ScrollUpButton{image:url('imgs/white/scroll-up.svg')}#ScrollDownButton{image:url('imgs/white/scroll-down.svg')}#keyFrameNavigator{background:none;margin:0;padding:0}#keyFrameNavigator QToolButton{min-width:18}#keyFrameNavigator #PreviousKey{image:url('imgs/white/prevkey.svg')}#keyFrameNavigator #PreviousKey:hover{image:url('imgs/white/prevkey_over.svg')}#keyFrameNavigator #PreviousKey:disabled{image:url('imgs/white/prevkey_disabled.svg')}#keyFrameNavigator #NextKey{image:url('imgs/white/nextkey.svg')}#keyFrameNavigator #NextKey:hover{image:url('imgs/white/nextkey_over.svg')}#keyFrameNavigator #NextKey:disabled{image:url('imgs/white/nextkey_disabled.svg')}.treeview,QTreeWidget,QTreeView,#FunctionEditorTree{background-color:#343434;alternate-background-color:#393939;border:0;margin:0;outline:0}.treeview::item:selected,QTreeWidget::item:selected,QTreeView::item:selected,#FunctionEditorTree::item:selected{background-color:#5385a6;color:#fff}.treeview::branch:adjoins-item,QTreeWidget::branch:adjoins-item,QTreeView::branch:adjoins-item,#FunctionEditorTree::branch:adjoins-item{border-image:url('')}.treeview::branch:has-siblings,QTreeWidget::branch:has-siblings,QTreeView::branch:has-siblings,#FunctionEditorTree::branch:has-siblings{border-image:url('')}.treeview::branch:has-siblings:adjoins-item,QTreeWidget::branch:has-siblings:adjoins-item,QTreeView::branch:has-siblings:adjoins-item,#FunctionEditorTree::branch:has-siblings:adjoins-item{border-image:url('')}.treeview::branch:has-children:closed,QTreeWidget::branch:has-children:closed,QTreeView::branch:has-children:closed,#FunctionEditorTree::branch:has-children:closed{background:url('imgs/white/treebranch-closed.svg') no-repeat;background-position:center center;border-image:none;image:none}.treeview::branch:has-children:open,QTreeWidget::branch:has-children:open,QTreeView::branch:has-children:open,#FunctionEditorTree::branch:has-children:open{background:url('imgs/white/treebranch-open.svg') no-repeat;background-position:center center;image:none}.treeview::branch:has-children:has-siblings:closed,QTreeWidget::branch:has-children:has-siblings:closed,QTreeView::branch:has-children:has-siblings:closed,#FunctionEditorTree::branch:has-children:has-siblings:closed{background:url('imgs/white/treebranch-closed.svg') no-repeat;background-position:center center;border-image:none;image:none}.treeview::branch:has-children:has-siblings:open,QTreeWidget::branch:has-children:has-siblings:open,QTreeView::branch:has-children:has-siblings:open,#FunctionEditorTree::branch:has-children:has-siblings:open{background:url('imgs/white/treebranch-open.svg') no-repeat;background-position:center center;border-image:none;image:none}QListView{outline:0;background:#343434;alternate-background-color:#393939}#TabBarContainer{background-color:#393939}.Button,QPushButton,.ComboBox,.ComboBox:checked,QComboBox,QComboBox:checked{background-color:#696969;border:1 solid #484848;border-radius:2;color:#f3f3f3;margin:0;padding:3 15}.Button:hover,QPushButton:hover,.ComboBox:hover,#ViewerFpsSlider::sub-line:horizontal:hover,#ViewerFpsSlider::add-line:horizontal:hover,QComboBox:hover{background-color:#767676;border-color:#484848;color:#f3f3f3}.Button:pressed,QPushButton:pressed,#ViewerFpsSlider::sub-line:horizontal:pressed,#ViewerFpsSlider::add-line:horizontal:pressed{background-color:#313131;border-color:#2c2c2c;color:#f3f3f3}.Button:checked,QPushButton:checked{background-color:#313131;border-color:#2c2c2c;color:#f3f3f3}.Button:checked:hover,QPushButton:checked:hover{background-color:#363636}.Button:checked:hover:pressed,QPushButton:checked:hover:pressed{background:#313131}.Button:disabled,QPushButton:disabled,.ComboBox:disabled,#ViewerFpsSlider::sub-line:horizontal:disabled,#ViewerFpsSlider::add-line:horizontal:disabled,QComboBox:disabled{background-color:#555;border-color:#484848;color:#808080}#PushButton_NoPadding{padding:3}.ComboBox,.ComboBox:checked,QComboBox,QComboBox:checked{padding:1 0 1 4;margin:1 0}.ComboBox::drop-down,QComboBox::drop-down{image:url('imgs/white/combo_downarrow.svg');image-position:center center;width:16}.ComboBox::drop-down:disabled,QComboBox::drop-down:disabled{image:url('imgs/white/combo_downarrow_disabled.svg')}.ComboBox QAbstractItemView,QComboBox QAbstractItemView{background-color:#484848;border:1 solid #272727;selection-background-color:#5385a6;selection-color:#fff}.LineEdit,QPlainTextEdit,QLineEdit,#TaskSheetItem,#tasksRemoveBox,#tasksAddBox{background-color:#2f2f2f;border:1 solid #2c2c2c;border-radius:2;color:#e6e6e6;selection-background-color:#5385a6;selection-color:#fff;padding:0 0 0 1}.LineEdit:focus,QPlainTextEdit:focus,QLineEdit:focus,#TaskSheetItem:focus,#tasksRemoveBox:focus,#tasksAddBox:focus{background-color:#2f2f2f;border-color:#5385a6;color:#e6e6e6}.LineEdit:disabled,QPlainTextEdit:disabled,QLineEdit:disabled,#TaskSheetItem:disabled,#tasksRemoveBox:disabled,#tasksAddBox:disabled{background-color:#3b3b3b;border-color:#3a3a3a;color:#808080}.CheckBox,QCheckBox{color:#e6e6e6}.CheckBox:hover,QCheckBox:hover,.RadioButton:hover,QRadioButton:hover{color:#fff}.CheckBox:disabled,QCheckBox:disabled{color:#808080}.CheckBox::indicator,QMenu::indicator,QCheckBox::indicator,.GroupBox::indicator,QGroupBox::indicator{background-color:#2f2f2f;border:1 solid #2c2c2c;border-radius:2;height:9;padding:1;width:9}.CheckBox::indicator:hover,QMenu::indicator:hover,.CheckBox::indicator:checked:hover,QCheckBox::indicator:hover,.GroupBox::indicator:hover,QMenu::indicator:checked:hover,QCheckBox::indicator:checked:hover,.GroupBox::indicator:checked:hover,QGroupBox::indicator:hover,QGroupBox::indicator:checked:hover{background-color:#2f2f2f;border-color:#5385a6}.CheckBox::indicator:checked,QMenu::indicator:checked,QCheckBox::indicator:checked,.GroupBox::indicator:checked,QGroupBox::indicator:checked{background-color:#2f2f2f;border-color:#2c2c2c;image:url('imgs/white/checkmark.svg')}.CheckBox::indicator:checked:disabled,QMenu::indicator:checked:disabled,QCheckBox::indicator:checked:disabled,.GroupBox::indicator:checked:disabled,QGroupBox::indicator:checked:disabled{background-color:#3b3b3b;border-color:#3b3b3b;image:url('imgs/white/checkmark_disabled.svg')}.CheckBox::indicator:disabled,QMenu::indicator:disabled,QCheckBox::indicator:disabled,.GroupBox::indicator:disabled,QGroupBox::indicator:disabled{background-color:#3b3b3b;border-color:#3b3b3b}.RadioButton::indicator:unchecked,QRadioButton::indicator:unchecked,#CameraSettingsRadioButton_Small::indicator:unchecked{image:url('imgs/white/radiobutton_unchecked.svg');image-position:center center}.RadioButton::indicator:checked,QRadioButton::indicator:checked,#CameraSettingsRadioButton_Small::indicator:checked{image:url('imgs/white/radiobutton_checked.svg');image-position:center center}.GroupBox,QGroupBox{margin:6 0 0 0;padding:5 0}.GroupBox::title,QGroupBox::title{subcontrol-origin:margin;left:15;margin:-3 0 0 0;padding:0 3}.GroupBox::title:hover,QGroupBox::title:hover{color:#fff}.GroupBox::title:disabled,QGroupBox::title:disabled{color:#808080}.GroupBox::indicator,QGroupBox::indicator{subcontrol-origin:margin;margin-top:2}.GroupBox:disabled,QGroupBox:disabled{color:#808080}.Slider::groove:horizontal,QSlider::groove:horizontal{background-color:transparent;background-image:url('imgs/white/slider-groove.svg');background-position:center center;background-repeat:repeat-x;margin:0;height:20;min-height:20}.Slider::groove:horizontal:disabled,QSlider::groove:horizontal:disabled{background-image:url('imgs/white/slider-groove_disabled.svg')}.Slider::handle:horizontal,QSlider::handle:horizontal{width:10;margin:-2 -1;image:url('imgs/white/slider-handle.svg')}.Slider::handle:horizontal:disabled,QSlider::handle:horizontal:disabled{image:url('imgs/white/slider-handle_disabled.svg')}#IntPairField,#DoublePairField{qproperty-LightLineColor:#2c2c2c;qproperty-LightLineEdgeColor:#2c2c2c;qproperty-DarkLineColor:#2c2c2c;qproperty-MiddleLineColor:#2c2c2c;qproperty-HandleLeftPixmap:url("imgs/white/slider-handle.svg");qproperty-HandleRightPixmap:url("imgs/white/slider-handle.svg");qproperty-HandleLeftGrayPixmap:url("imgs/white/slider-handle_disabled.svg");qproperty-HandleRightGrayPixmap:url("imgs/white/slider-handle_disabled.svg")}#DirTreeView{background-color:#343434;alternate-background-color:#343434;border:1 solid #272727;border-right:0}DvItemViewerPanel{qproperty-TextColor:#e6e6e6;qproperty-AlternateBackground:#404040;qproperty-SelectedTextColor:#fff;qproperty-FolderTextColor:#9fdaff;qproperty-SelectedItemBackground:#5385a6}#FileBrowser DvItemViewerPanel,#SceneCast DvItemViewerPanel{background-color:#484848}#FileBrowser #castFrame,#SceneCast #castFrame{border-top:1 solid #272727;border-right:1 solid #272727;border-bottom:1 solid #272727;margin:0}#FileBrowser QToolButton,#SceneCast QToolButton{padding:1}DvDirTreeView{qproperty-TextColor:#e6e6e6;qproperty-SelectedTextColor:#fff;qproperty-SelectedItemBackground:#5385a6;qproperty-FolderTextColor:#9fdaff;qproperty-SelectedFolderTextColor:#fff;alternate-background-color:#393939;background-color:#343434;border:1 solid #272727}#FileDoesNotExistLabel{color:#f00}#SceneCast QToolBar{border-top:1 solid #272727}#SceneCast QToolButton{margin:3 1 2 1;padding:1}#CastBrowser{border:0;margin:0}#FilmStrip QComboBox{border-radius:0;border-width:0}#FilmStrip QComboBox QAbstractItemView{background-color:#484848}#CleanupSettings #CleanupSettingsFrame{margin-top:2;margin-bottom:4}#CleanupSettings QGroupBox{margin-bottom:3}ParamsPage{qproperty-TextColor:#e6e6e6}#CameraSettingsButton{padding:2}#CameraSettingsRadioButton:hover{background:none}#CameraSettingsRadioButton::indicator{border:1 solid rgba(255,255,255,0);height:18;padding:0;width:18}#CameraSettingsRadioButton::indicator:unchecked{image:url('imgs/white/lock_off.svg')}#CameraSettingsRadioButton::indicator:checked{background-color:#C34040;border-color:#C34040;image:url('imgs/white/lock_on.svg')}#CameraSettingsRadioButton::indicator:checked:hover{background-color:#d57a7a;border-color:#d57a7a}#CameraSettingsDPI{color:#9fdaff}#CameraSettingsRadioButton_Small{padding:0}#CameraSettingsRadioButton_Small::indicator{background-color:transparent;border:0;height:21;margin:0;width:11}#ForceSquaredPixelButton{height:16;border:1 solid rgba(255,255,255,0);image:url('imgs/white/fsp_unchecked.svg');padding:2;width:16;margin:0}#ForceSquaredPixelButton:checked{image:url('imgs/white/fsp_checked.svg')}#OutputSettingsLabel{color:#9fdaff}PencilTestPopup{min-height:730px;min-width:512px}#MatchLineButton{background-color:#6e6e6e}#MatchLineButton:checked{background-color:#949494;border:2 solid #5385a6;border-radius:2}#LargeSizedText{font-size:17px}#StartupLabel{padding:3}#StartupLabel:hover{background:#626262}QStatusBar{background-color:#c0c0c0}QStatusBar::item{border:0}QStatusBar QLabel{background-color:#c0c0c0}QStatusBar #StatusBarLabel{background-color:#fff;padding:1 3}#TitleTxtLabel{color:#9fdaff}#StyleEditor QPushButton{margin:2 1;padding:0}#StyleEditor #TabBarContainer{margin-left:-4}#StyleEditor #bottomWidget{border-top:1 solid #272727;padding:3 2 8 3}#StyleEditor #bottomWidget QPushButton{padding:3 5}#StyleEditorTabBar::tab::first{border-left:1 solid #272727}#HexagonalColorWheel{qproperty-BGColor:#484848}#colorSlider::groove:horizontal{height:1;border-image:none}#colorSlider::handle:horizontal{width:8;margin:-8 -4}#colorSliderAddButton,#colorSliderSubButton{background:none;border-color:transparent;image-position:center center;min-height:16;padding:0;min-width:18}#colorSliderAddButton{image:url('imgs/white/scroll-right.svg')}#colorSliderSubButton{image:url('imgs/white/scroll-left.svg')}#PlainColorPageParts{border-bottom:1 solid #272727}#PlainColorPageParts QLineEdit{max-width:35}PaletteViewer DvScrollWidget QPushButton{border-top:0;margin-bottom:1;max-width:15;min-width:15}PaletteViewer DvScrollWidget #ScrollLeftButton{border-radius:0;margin-bottom:1;max-width:16;min-width:16}PaletteViewer DvScrollWidget #ScrollRightButton{border-radius:0;margin-left:1;margin-bottom:1;max-width:16;min-width:16}PaletteViewer QToolBar{background:none;border-bottom:1 solid #272727;padding:0;margin:0}PaletteViewer QToolBar::separator:horizontal{margin:0}PaletteViewer QToolBar QToolButton{margin:0 0 1 0;padding:1 0 2 0}#PageViewer{qproperty-TextColor:#e6e6e6}#PaletteLockButton{border-radius:0;margin:0 0 1 1}#PaletteLockButton:checked{background-color:#C34040;border-color:#C34040}#PaletteLockButton:checked:hover{background-color:#d57a7a;border-color:#d57a7a}#WordButton{padding-right:0;padding-left:0}QDialog{background-color:#484848}QDialog #dialogButtonFrame{background-color:#3e3e3e;border-top:1 solid #272727}QDialog #dialogButtonFrame QPushButton{border-color:#3e3e3e;outline:0}QDialog #dialogButtonFrame QPushButton:focus{background-color:#5385a6;border-color:#3e3e3e;color:#fff}QDialog #dialogButtonFrame QPushButton:focus:hover{background-color:#6c98b6}QDialog #dialogButtonFrame QPushButton:focus:pressed{background-color:#313131;border-color:#2c2c2c;color:#f3f3f3}#SceneSettings QLabel{color:#9fdaff}#PreferencesPopup QListWidget{background-color:#343434;alternate-background-color:#343434;border:1 solid #272727;font-size:13px}#PreferencesPopup QListWidget::item{border:0;padding:3}#PreferencesPopup QListWidget::item:hover{color:#e6e6e6;background-color:rgba(255,255,255,0.15)}#PreferencesPopup QListWidget::item:selected{background-color:#5385a6;color:#fff}#ShortcutTree{border:1 solid #272727}#ShortcutTree::item{padding:1 0}#ShortcutTree QScrollBar:vertical{width:16;margin-right:-1}ProjectPopup QLabel{color:#9fdaff}#GearButton{qproperty-icon:url('imgs/white/gear.svg')}#SubfolderButton{qproperty-icon:url('imgs/white/subfolder.svg');padding-left:6px;padding-right:6px}#SubcameraButton{qproperty-icon:url('imgs/white/subcamera.svg');padding-left:6px;padding-right:6px}SchematicViewer{qproperty-TextColor:#e6e6e6;qproperty-VerticalLineColor:#222;qproperty-LevelColumnColor:#4C6E4C;qproperty-VectorColumnColor:#7B7B4C;qproperty-ChildColumnColor:#6A526B;qproperty-FullcolorColumnColor:#657A96;qproperty-FxColumnColor:#56553C;qproperty-PaletteColumnColor:#3A655F;qproperty-MeshColumnColor:#684D86;qproperty-ReferenceColumnColor:#616161;qproperty-TableColor:#62628c;qproperty-ActiveCameraColor:#2d7dca;qproperty-OtherCameraColor:#6c797b;qproperty-GroupColor:#3b6e9c;qproperty-PegColor:#9f6e3c;qproperty-SplineColor:#6a9d1c;qproperty-ActiveOutputColor:#2d7dca;qproperty-OtherOutputColor:#6c797b;qproperty-XsheetColor:#62628c;qproperty-NormalFxColor:#6a7e96;qproperty-MacroFxColor:#815c79;qproperty-ImageAdjustFxColor:#656287;qproperty-LayerBlendingFxColor:#4f757d;qproperty-MatteFxColor:#ae7171;qproperty-SchematicPreviewButtonBgOnColor:#c8c864;qproperty-SchematicPreviewButtonOnImage:url('imgs/white/x_prev_eye_on.svg');qproperty-SchematicPreviewButtonBgOffColor:#616161;qproperty-SchematicPreviewButtonOffImage:url('imgs/white/x_prev_eye_off.svg');qproperty-SchematicCamstandButtonBgOnColor:#eb906b;qproperty-SchematicCamstandButtonOnImage:url('imgs/white/x_table_view_on.svg');qproperty-SchematicCamstandButtonTranspImage:url('imgs/white/x_table_view_transp.svg');qproperty-SchematicCamstandButtonBgOffColor:#616161;qproperty-SchematicCamstandButtonOffImage:url('imgs/white/x_table_view_off.svg')}#SchematicBottomFrame{background-color:#484848;border:0;margin:0;padding:0}#SchematicBottomFrame QToolBar::separator:horizontal{margin:0}#SchematicBottomFrame QToolBar QToolButton{padding:0;margin:2}#SchematicSceneViewer{background-color:#3b3b3b;border-bottom:1 solid #272727}#FxSettingsTabBar::tab{border-top:1 solid #272727}#FxSettingsTabBar::tab::first,#FxSettingsTabBar::tab::only-one{border-left:1 solid #272727}FxSettings QToolBar{border-top:1 solid #272727;border-right:1 solid #272727;border-left:1 solid #272727;min-height:23;padding:3 0}FxSettings QToolBar QToolBar{border:0}#FxSettingsLabel{color:#a0e680}#FxSettingsHelpButton{background-color:#80a0dc;color:#000;padding-top:0;padding-bottom:0}#FxSettingsHelpButton:hover{background-color:#a8bee7}#ScriptConsole{font-family:'Courier New',monospace;border:0;color:#000000;padding:3}#ScriptConsole QFrame{background-color:#dcdcdc}#ScriptConsole TPanelTitleBar{background-color:#393939}#TaskSheetItemLabel{color:#e6e6e6}#Tasks QToolBar{border-bottom:1 solid #272727;margin:0;padding:0}#Tasks QToolBar QToolButton{margin:2 2 3 2}#ToolBar QToolBar{padding-left:2}#ToolOptions TPanelTitleBar{border-right:1 solid #272727;border-bottom:0}#CommandBar TPanelTitleBar{border-right:1 solid #272727;border-bottom:0}IconViewField{qproperty-ThicknessPixmap:url("imgs/white/selectiontool_thickness.svg")}#EditToolLockButton{spacing:0}#EditToolLockButton:hover{background:none}#EditToolLockButton::indicator{border:1 solid rgba(255,255,255,0);height:18;padding:0;width:18}#EditToolLockButton::indicator:unchecked{image:url('imgs/white/lock_off.svg')}#EditToolLockButton::indicator:checked{background-color:#C34040;border-color:#C34040;image:url('imgs/white/lock_on.svg')}#EditToolLockButton::indicator:checked:hover{background-color:#d57a7a;border-color:#d57a7a}PopupButton::menu-indicator{border-left:0;height:17;image:url('imgs/white/combo_downarrow.svg');width:10}PopupButton::menu-indicator:hover{image:url('imgs/white/combo_downarrow.svg')}PopupButton::menu-indicator:disabled{image:url('imgs/white/combo_downarrow_disabled.svg')}#Cap,#Join{padding:0 4 0 -8;max-width:32;min-width:32}#Cap QMenu,#Join QMenu{max-width:28;min-width:28}#Cap QMenu::item,#Join QMenu::item{max-width:28;min-width:28;padding:0}QToolBar#MediumPaddingToolBar QToolButton{padding-left:3;padding-right:3}QToolBar#WidePaddingToolBar QToolButton{padding-left:6;padding-right:6}#CommandBar{margin:0;padding:0;border:0}#CommandBar::separator:horizontal{margin-right:3;margin-left:3}#expandButton:checked{background-color:transparent;border-color:transparent;color:#e6e6e6}#expandButton:checked:hover{background-color:#767676;border-color:#767676}#expandButton:checked:pressed{background-color:#313131;border-color:#2c2c2c}#ComboViewerPanel Toolbar{border-bottom:1 solid #272727}#ComboViewerPanel Toolbar::separator:horizontal{margin:0 0 0 2}#ComboViewerPanel Toolbar QToolButton{margin:2 0 3 2}#ComboViewerToolOptions{border-bottom:1 solid #272727}#ComboViewer #ToolBarContainer,#ViewerPanel #ToolBarContainer,FlipBook #ToolBarContainer{background-color:transparent;border-top:2 solid #272727;border-bottom:1 solid #272727;padding-right:-1}#flipCustomize{margin-left:3}#flipCustomize::menu-button{background-color:transparent;width:35}#flipCustomize::menu-arrow{image:none}QToolBar#FlipConsolePlayToolBar::separator:horizontal{margin:0 3}QToolBar#FlipConsolePlayToolBar QToolButton{margin-top:2;margin-bottom:2;height:16;padding-left:1;padding-right:1}#ViewerFpsSlider{background-color:transparent;background-image:url('imgs/white/slider-groove.svg');background-position:center center;background-repeat:repeat-x;border:0;height:19;margin:0 3 0 37;max-width:300;min-width:0}#ViewerFpsSlider::sub-line:horizontal{subcontrol-origin:absolute;background-color:#696969;border:1 solid #484848;border-top-left-radius:2;border-bottom-left-radius:2;height:16;left:-33;width:14}#ViewerFpsSlider::add-line:horizontal{subcontrol-position:left;background-color:#696969;border:1 solid #484848;border-top-right-radius:2;border-bottom-right-radius:2;left:18;height:16;image-position:center center;width:13}#ViewerFpsSlider::handle::horizontal{background-color:#a1a1a1;border:1 solid #a1a1a1;border-radius:2;margin:2 0 3 0;min-width:9;width:9;max-width:9}FlipSlider{qproperty-PBHeight:15;qproperty-PBOverlay:url('imgs/white/flipslider.svg');qproperty-PBColorMarginLeft:1;qproperty-PBColorMarginTop:2;qproperty-PBColorMarginRight:1;qproperty-PBColorMarginBottom:2;qproperty-PBMarker:url('imgs/white/flipmarker.svg');qproperty-PBMarkerMarginLeft:3;qproperty-PBMarkerMarginRight:3;qproperty-notStartedColor:rgba(205,101,101,0.78);qproperty-startedColor:#1abc3f;qproperty-baseColor:#2f2f2f;qproperty-finishedColor:#2f2f2f}Ruler{qproperty-ParentBGColor:#484848;qproperty-ScaleColor:#e6e6e6}#RulerToolOptionValues{color:#000}#xsheetArea,#ScrollArea{background-color:#343434;border:0}#xsheetScrollArea{border:0}#cornerWidget QToolButton{padding:0}#xsheetColumnAreaMenu_Preview{background-color:#E6E678}#xsheetColumnAreaMenu_Lock{background-color:#F5F5F5}#xsheetColumnAreaMenu_Camstand{background-color:#FFA480}#xsheetColumnAreaMenu_Preview,#xsheetColumnAreaMenu_Lock,#xsheetColumnAreaMenu_Camstand{color:#000}#noteTextEdit{color:#000}XsheetViewer{qproperty-TextColor:#e6e6e6;qproperty-BGColor:#3b3b3b;qproperty-LightLineColor:#2c2c2c;qproperty-MarkerLineColor:#1E96C4;qproperty-VerticalLineColor:#222;qproperty-VerticalLineHeadColor:#808080;qproperty-PreviewFrameTextColor:#9fdaff;qproperty-CurrentRowBgColor:#506082;qproperty-OnionSkinAreaBgColor:#363636;qproperty-EmptyColumnHeadColor:#626262;qproperty-SelectedColumnTextColor:#E66464;qproperty-EmptyCellColor:#404040;qproperty-NotEmptyColumnColor:#484848;qproperty-SelectedEmptyCellColor:#6c6c6c;qproperty-LevelColumnColor:#4C6E4C;qproperty-LevelColumnBorderColor:#8FB38F;qproperty-SelectedLevelColumnColor:#678667;qproperty-VectorColumnColor:#7B7B4C;qproperty-VectorColumnBorderColor:#BBBB9A;qproperty-SelectedVectorColumnColor:#949466;qproperty-ChildColumnColor:#6A526B;qproperty-ChildColumnBorderColor:#B1A3B3;qproperty-SelectedChildColumnColor:#816e82;qproperty-FullcolorColumnColor:#657A96;qproperty-FullcolorColumnBorderColor:#9EB8BB;qproperty-SelectedFullcolorColumnColor:#8895a6;qproperty-FxColumnColor:#56553C;qproperty-FxColumnBorderColor:#95958A;qproperty-SelectedFxColumnColor:#6f6e56;qproperty-ReferenceColumnColor:#616161;qproperty-ReferenceColumnBorderColor:#A2A2A2;qproperty-SelectedReferenceColumnColor:#7a7a7a;qproperty-PaletteColumnColor:#3A655F;qproperty-PaletteColumnBorderColor:#86ACA7;qproperty-SelectedPaletteColumnColor:#52807a;qproperty-MeshColumnColor:#684D86;qproperty-MeshColumnBorderColor:#BA92EF;qproperty-SelectedMeshColumnColor:#82689e;qproperty-SoundTextColumnColor:#c8c8c8;qproperty-SoundTextColumnBorderColor:#8c8c8c;qproperty-SelectedSoundTextColumnColor:#e2e2e2;qproperty-SoundColumnColor:#657456;qproperty-SoundColumnBorderColor:#A0AF7D;qproperty-SelectedSoundColumnColor:#7e8b72;qproperty-SoundColumnHlColor:#34FE5E;qproperty-SoundColumnTrackColor:#B6C29D;qproperty-ColumnHeadPastelizer:#000;qproperty-SelectedColumnHead:#506082;qproperty-LightLightBGColor:#404040;qproperty-LightBGColor:#f0f0f0;qproperty-DarkBGColor:#e1e1e1;qproperty-DarkLineColor:#969696;qproperty-XsheetColumnNameBgColor:rgba(0,0,0,0);qproperty-XsheetDragBarHighlightColor:rgba(255,255,255,0.5);qproperty-XsheetPreviewButtonBgOnColor:#c8c864;qproperty-XsheetPreviewButtonOnImage:url('imgs/white/x_prev_eye_on.svg');qproperty-XsheetPreviewButtonBgOffColor:rgba(255,255,255,0);qproperty-XsheetPreviewButtonOffImage:url('imgs/white/x_prev_eye_off.svg');qproperty-XsheetCamstandButtonBgOnColor:#eb906b;qproperty-XsheetCamstandButtonOnImage:url('imgs/white/x_table_view_on.svg');qproperty-XsheetCamstandButtonTranspImage:url('imgs/white/x_table_view_transp.svg');qproperty-XsheetCamstandButtonBgOffColor:rgba(255,255,255,0);qproperty-XsheetCamstandButtonOffImage:url('imgs/white/x_table_view_off.svg');qproperty-XsheetLockButtonBgOnColor:rgba(255,255,255,0.3);qproperty-XsheetLockButtonOnImage:url('imgs/white/x_lock_on.svg');qproperty-XsheetLockButtonBgOffColor:rgba(255,255,255,0);qproperty-XsheetLockButtonOffImage:url('imgs/white/x_lock_off.svg');qproperty-XsheetConfigButtonBgColor:rgba(255,255,255,0);qproperty-XsheetConfigButtonImage:url('imgs/white/x_config.svg');qproperty-TimelinePreviewButtonBgOnColor:rgba(255,255,255,0);qproperty-TimelinePreviewButtonOnImage:url('imgs/white/timeline_toggle_on.svg');qproperty-TimelinePreviewButtonBgOffColor:rgba(255,255,255,0);qproperty-TimelinePreviewButtonOffImage:url('imgs/white/timeline_toggle_off.svg');qproperty-TimelineCamstandButtonBgOnColor:rgba(255,255,255,0);qproperty-TimelineCamstandButtonOnImage:url('imgs/white/timeline_toggle_on.svg');qproperty-TimelineCamstandButtonTranspImage:url('imgs/white/timeline_toggle_transp.svg');qproperty-TimelineCamstandButtonBgOffColor:rgba(255,255,255,0);qproperty-TimelineCamstandButtonOffImage:url('imgs/white/timeline_toggle_off.svg');qproperty-TimelineLockButtonBgOnColor:rgba(255,255,255,0);qproperty-TimelineLockButtonOnImage:url('imgs/white/timeline_toggle_on.svg');qproperty-TimelineLockButtonBgOffColor:rgba(255,255,255,0);qproperty-TimelineLockButtonOffImage:url('imgs/white/timeline_toggle_off.svg');qproperty-TimelineConfigButtonBgColor:rgba(255,255,255,0);qproperty-TimelineConfigButtonImage:url('imgs/white/timeline_config.svg');qproperty-LayerHeaderPreviewImage:url('imgs/white/layer_header_prev_eye.svg');qproperty-LayerHeaderPreviewOverImage:url('imgs/white/layer_header_prev_eye_over.svg');qproperty-LayerHeaderCamstandImage:url('imgs/white/layer_header_table_view.svg');qproperty-LayerHeaderCamstandOverImage:url('imgs/white/layer_header_table_view_over.svg');qproperty-LayerHeaderLockImage:url('imgs/white/lock_on.svg');qproperty-LayerHeaderLockOverImage:url('imgs/white/lock_on_over.svg')}#XSheetToolbar{margin:0;padding:0;border:0}#XSheetToolbar QToolButton{padding:0;margin:4 1;min-height:19;height:19}#XSheetToolbar::separator:horizontal{margin:0 4}#FunctionEditor QToolBar{border-bottom:1 solid #272727}#FunctionEditor QToolBar QToolBar{border:0}#FunctionEditor QToolBar QLabel{margin-left:5}#FunctionEditor QToolBar QToolButton{height:18}#FunctionEditorTree{border-top:1 solid #272727}FunctionTreeView{qproperty-TextColor:#e6e6e6;qproperty-CurrentTextColor:#E66464}FunctionPanel{qproperty-BGColor:#3b3b3b;qproperty-ValueLineColor:#2f2f2f;qproperty-FrameLineColor:#2f2f2f;qproperty-OtherCurvesColor:#888;qproperty-RulerBackground:#333;qproperty-TextColor:#e6e6e6;qproperty-SubColor:#000;qproperty-SelectedColor:#FFA500}SpreadsheetViewer{qproperty-LightLightBGColor:#404040;qproperty-CurrentRowBgColor:#506082;qproperty-LightLineColor:#2c2c2c;qproperty-MarkerLineColor:#1E96C4;qproperty-BGColor:#484848;qproperty-VerticalLineColor:#222;qproperty-KeyFrameColor:#995d1d;qproperty-KeyFrameBorderColor:#c9b04b;qproperty-SelectedKeyFrameColor:#be772b;qproperty-InBetweenColor:#666250;qproperty-InBetweenBorderColor:#cdcec8;qproperty-SelectedInBetweenColor:#7d7a6c;qproperty-SelectedEmptyColor:#6c6c6c;qproperty-SelectedSceneRangeEmptyColor:#757575;qproperty-TextColor:#e6e6e6;qproperty-ColumnHeaderBorderColor:#808080;qproperty-SelectedColumnTextColor:#E66464}#ExpressionField{background-color:#e6e6e6;border:1 solid #333;margin:0}#FunctionSegmentViewerLinkButton{background-image:url('imgs/white/segment_unlinked.svg');background-repeat:no-repeat}#FunctionSegmentViewerLinkButton:hover{background-repeat:no-repeat}#FunctionSegmentViewerLinkButton:checked{background-image:url('imgs/white/segment_linked.svg');background-repeat:no-repeat}#FunctionSegmentViewerLinkButton:disabled{background-image:url('imgs/white/segment_disabled.svg');background-repeat:no-repeat} \ No newline at end of file diff --git a/stuff/config/qss/Default/less/layouts/misc.less b/stuff/config/qss/Default/less/layouts/misc.less index a349c51e..d1fb1b9a 100644 --- a/stuff/config/qss/Default/less/layouts/misc.less +++ b/stuff/config/qss/Default/less/layouts/misc.less @@ -22,7 +22,7 @@ PencilTestPopup { } #LargeSizedText { - font-size: 17; + font-size: 17px; } /* ----------------------------------------------------------------------------- diff --git a/stuff/config/qss/Default/less/layouts/popups.less b/stuff/config/qss/Default/less/layouts/popups.less index 49197b1a..0d952199 100644 --- a/stuff/config/qss/Default/less/layouts/popups.less +++ b/stuff/config/qss/Default/less/layouts/popups.less @@ -46,7 +46,7 @@ QDialog { background-color: @prefs-tree-bg-color; alternate-background-color: @prefs-tree-bg-color; border: 1 solid @accent; - font-size: 13; + font-size: 13px; &::item { border: 0; // remove indent on hover padding: 3; diff --git a/stuff/config/qss/Light/Light.qss b/stuff/config/qss/Light/Light.qss index a69b8ca4..2db62bbc 100644 --- a/stuff/config/qss/Light/Light.qss +++ b/stuff/config/qss/Light/Light.qss @@ -1 +1 @@ -.button-show,#LoadLevelShowButton,#CleanupSettingsShowButton,#OutputSettingsShowButton,#FxSettingsPreviewShowButton{image:url('../Default/imgs/black/plus.svg');image-position:center center;margin:0;padding:1;min-width:10;min-height:10}.button-show:checked,#LoadLevelShowButton:checked,#CleanupSettingsShowButton:checked,#OutputSettingsShowButton:checked,#FxSettingsPreviewShowButton:checked{background-color:#5a5a5a;border-color:#454545;image:url('../Default/imgs/black/minus.svg')}.button-show:checked:pressed,#LoadLevelShowButton:checked:pressed,#CleanupSettingsShowButton:checked:pressed,#OutputSettingsShowButton:checked:pressed,#FxSettingsPreviewShowButton:checked:pressed{background-color:#e1e1e1;border-color:#525252}.button-show:checked:hover,#LoadLevelShowButton:checked:hover,#CleanupSettingsShowButton:checked:hover,#OutputSettingsShowButton:checked:hover,#FxSettingsPreviewShowButton:checked:hover{background-color:#5f5f5f}.button-tool,QToolButton,#CameraSettingsRadioButton::indicator,#ForceSquaredPixelButton,#SchematicBottomFrame QToolBar QToolButton,#EditToolLockButton::indicator,#flipCustomize{background-color:rgba(255,255,255,0);border:1 solid rgba(255,255,255,0);border-radius:2;color:#000;margin:1;padding:0}.button-tool:hover,QToolButton:hover,#CameraSettingsRadioButton::indicator:hover,#ForceSquaredPixelButton:hover,#colorSliderAddButton:hover,#colorSliderSubButton:hover,#SchematicBottomFrame QToolBar QToolButton:hover,#EditToolLockButton::indicator:hover,#flipCustomize:hover{background-color:#bbb;border-color:#525252;color:#000}.button-tool:pressed,QToolButton:pressed,#CameraSettingsRadioButton::indicator:pressed,#ForceSquaredPixelButton:pressed,#colorSliderAddButton:pressed,#colorSliderSubButton:pressed,#SchematicBottomFrame QToolBar QToolButton:pressed,#EditToolLockButton::indicator:pressed,#flipCustomize:pressed{background-color:#e1e1e1;border-color:#525252;color:#000}.button-tool:checked,QToolButton:checked,#CameraSettingsRadioButton::indicator:checked,#ForceSquaredPixelButton:checked,#SchematicBottomFrame QToolBar QToolButton:checked,#EditToolLockButton::indicator:checked,#flipCustomize:checked{background-color:#5a5a5a;border-color:#454545;color:#c0c0c0}.button-tool:checked:hover,QToolButton:checked:hover,#CameraSettingsRadioButton::indicator:checked:hover,#ForceSquaredPixelButton:checked:hover,#SchematicBottomFrame QToolBar QToolButton:checked:hover,#EditToolLockButton::indicator:checked:hover,#flipCustomize:checked:hover{background-color:#6e6e6e;border-color:#454545}.button-tool:disabled,QToolButton:disabled,#CameraSettingsRadioButton::indicator:disabled,#ForceSquaredPixelButton:disabled,#SchematicBottomFrame QToolBar QToolButton:disabled,#EditToolLockButton::indicator:disabled,#flipCustomize:disabled{color:rgba(0,0,0,0.466)}.button-flat,PaletteViewer QToolBar QToolButton{background-color:none;border:0;border-radius:0;margin:0}.button-flat:hover,PaletteViewer QToolBar QToolButton:hover{background-color:#bbb}.button-flat:pressed,PaletteViewer QToolBar QToolButton:pressed{background-color:#404040}.frame,.GroupBox,#LoadLevelFrame,#PsdSettingsGroupBox,#CleanupSettingsFrame,#OutputSettingsBox,#OutputSettingsCameraBox,#SolidLineFrame,#FunctionParametersPanel,QGroupBox{border:1 solid #404040;border-radius:2}.tab-container,#TabBarContainer{background-color:transparent;qproperty-BottomAboveLineColor:#6c6c6c;qproperty-BottomBelowLineColor:#404040}.tab-flat,#StyleEditorTabBar::tab,#PaletteTabBar::tab,#FxSettingsTabBar::tab{background-color:#5a5a5a;border-right:1 solid #404040;border-bottom:1 solid #404040;color:#c0c0c0;padding:3 4 3 4}.tab-flat:hover,#StyleEditorTabBar::tab:hover,#PaletteTabBar::tab:hover,#FxSettingsTabBar::tab:hover{background-color:#6e6e6e;color:#fff}.tab-flat:selected,#StyleEditorTabBar::tab:selected,#PaletteTabBar::tab:selected,#FxSettingsTabBar::tab:selected{background-color:#808080;color:#000;border-bottom-color:#808080}.tab-flat:only-one,#StyleEditorTabBar::tab:only-one,#PaletteTabBar::tab:only-one,#FxSettingsTabBar::tab:only-one{margin:0}.tab-round{background-color:#5a5a5a;border-top:1 solid #404040;border-right:1 solid #404040;border-left:1 solid #404040;border-bottom:1 solid #404040;color:#c0c0c0;margin:3 -1 0 0;padding:2 7 1 7}.tab-round:hover{background-color:#6e6e6e;color:#fff}.tab-round:selected{background-color:#808080;border-top-right-radius:2;border-top-left-radius:2;border-bottom-color:#808080;color:#000;margin:1 -1 -1 0;padding:2 7 2 7}.tab-round:only-one{margin:1 0 0 0;padding:3 7 3 7}.tab-round:last{margin-right:0;border-top-right-radius:2}.tab-round:first{border-top-left-radius:2}QWidget{background-color:#808080;color:#000}QWidget:disabled{color:rgba(0,0,0,0.466)}QFrame{border:0;margin:0;padding:0}QToolTip,#helpToolTip{background-color:#fff;border:1 solid #000;color:#000;padding:1 1}#DockSeparator,QMainWindow::separator,QSplitter::handle{background-color:#272727;height:4;width:4}#TDockPlaceholder{background-color:#F77272}TPanel{background-color:#272727}#TopBar{background:#808080;border:0;border-bottom:1 solid #404040;height:21}#TopBar #EditToolLockButton{background:#808080;spacing:0}#TopBar #EditToolLockButton::indicator{background:none;border:none;height:18;margin:1 2 0 0;padding-left:0;padding-right:0}#TopBarTabContainer{background-color:#808080;margin-bottom:1}#StackedMenuBar{border:0;margin:0;padding:0}QMenuBar{background-color:#808080;border:0}QMenuBar::item{background-color:#808080;border-left:1 solid #808080;margin:0;padding:3 5}QMenuBar::item:selected{background-color:#9f9f9f;color:#000}QMenuBar::item:pressed{background-color:#225baf;color:#FFFFFF}#TopBarTab{margin:0;padding:0}#TopBarTab::tab{background-color:#5a5a5a;border-top:1 solid #404040;border-right:1 solid #404040;color:#afafaf;margin:0 0 0 0;padding:2 8 3 8}#TopBarTab::tab:hover{background-color:#6e6e6e;color:#fff}#TopBarTab::tab:selected{background-color:#9a9a9a;color:#000}#TopBarTab::tab:first{border-left:1 solid #404040}#TopBarTab::tab:last{border-right:1 solid #404040}QMenu{background-color:#949494;border:1 solid #404040;padding:2 0}QMenu::item{padding:3 28}QMenu::item:selected{background-color:#225baf;color:#FFFFFF}QMenu::item:checked{color:#000}QMenu::item:checked:selected{background-color:#225baf;color:#FFFFFF}QMenu::item:disabled{background:none;color:rgba(0,0,0,0.466)}QMenu::item:disabled:selected{border-color:transparent}QMenu::separator{border-top:1 solid #6e6e6e;height:0;margin:2 0}QMenu::icon{border-radius:2;margin:0 0 0 3;padding:1}QMenu::icon:checked{background-color:#225baf}QMenu::indicator{margin-left:7}TPanelTitleBar{background-color:#5a5a5a;border-color:#404040;border-style:solid;border-width:0 0 1 0;height:20;min-height:20;qproperty-TitleColor:#c0c0c0;qproperty-ActiveTitleColor:#fff;qproperty-BorderPixmap:url('none');qproperty-ActiveBorderPixmap:url('../Default/imgs/black/none');qproperty-FloatBorderPixmap:url('none');qproperty-FloatActiveBorderPixmap:url('../Default/imgs/black/none')}QAbstractScrollArea::corner{background-color:#6e6e6e}QScrollBar{background-color:#6e6e6e;border:0}QScrollBar:horizontal{height:16;margin:0}QScrollBar:vertical{margin:0;width:16}QScrollBar::handle{border:1 solid #555;border-radius:2}QScrollBar::handle:horizontal:hover,QScrollBar::handle:vertical:hover{background-color:#b3b3b3;border-color:#404040}QScrollBar::handle:horizontal:pressed,QScrollBar::handle:vertical:pressed{background-color:#c7c7c7;border-color:#404040}QScrollBar::handle:horizontal{background-color:#9f9f9f;margin:2 16;min-width:20}QScrollBar::handle:vertical{background-color:#9f9f9f;margin:16 2;min-height:20}QScrollBar::add-line{subcontrol-origin:margin;border:0}QScrollBar::add-line:horizontal{subcontrol-position:right;background-color:#6e6e6e;margin:0;width:16}QScrollBar::add-line:vertical{subcontrol-position:bottom;background-color:#6e6e6e;margin:0;height:16}QScrollBar::sub-line{border:0;subcontrol-origin:margin}QScrollBar::sub-line:horizontal{subcontrol-position:left;background-color:#6e6e6e;margin:0;width:16}QScrollBar::sub-line:vertical{subcontrol-position:top;background-color:#6e6e6e;margin:0;height:16}QScrollBar::up-arrow:vertical{image:url('../Default/imgs/black/scroll-up.svg');image-position:center center}QScrollBar::up-arrow:vertical:pressed{margin:1 0 0 0}QScrollBar::down-arrow:vertical{image:url('../Default/imgs/black/scroll-down.svg');image-position:center center}QScrollBar::down-arrow:vertical:pressed{margin:1 0 0 0}QScrollBar::left-arrow:horizontal{image:url('../Default/imgs/black/scroll-left.svg');image-position:center center}QScrollBar::left-arrow:horizontal:pressed{margin:1 0 0 0}QScrollBar::right-arrow:horizontal{image:url('../Default/imgs/black/scroll-right.svg');image-position:center center}QScrollBar::right-arrow:horizontal:pressed{margin:1 0 0 0}QScrollBar::sub-page:horizontal,QScrollBar::add-page:horizontal,QScrollBar::sub-page:vertical,QScrollBar::add-page:vertical{background:none}QToolBar{padding:0}QToolBar::separator:horizontal{border-left:1 solid #404040;margin:0 1;width:0}QToolBar::separator:vertical{border-top:1 solid #404040;height:0;margin:1 0}QToolBar QLabel{margin-top:1}QToolBar QToolBar{border:0}QToolButton::menu-indicator{image:none}QToolButton::menu-button{border-image:none}.DvScrollWidget QPushButton,DvScrollWidget QPushButton,#ScrollLeftButton QPushButton,#ScrollRightButton QPushButton,#ScrollUpButton QPushButton,#ScrollDownButton QPushButton{background-color:#a6a6a6;border:0 solid red;border-radius:0;padding:0;max-width:16}.DvScrollWidget QPushButton:hover,DvScrollWidget QPushButton:hover,#ScrollLeftButton QPushButton:hover,#ScrollRightButton QPushButton:hover,#ScrollUpButton QPushButton:hover,#ScrollDownButton QPushButton:hover{background-color:#bbb}.DvScrollWidget QPushButton:pressed,DvScrollWidget QPushButton:pressed,#ScrollLeftButton QPushButton:pressed,#ScrollRightButton QPushButton:pressed,#ScrollUpButton QPushButton:pressed,#ScrollDownButton QPushButton:pressed{background-color:#e1e1e1}#ScrollLeftButton,#ScrollRightButton,#ScrollUpButton,#ScrollDownButton{margin:0;min-width:16}#ScrollLeftButton{border-right:1 solid #404040;image:url('../Default/imgs/black/scroll-left.svg')}#ScrollRightButton{border-left:1 solid #404040;margin-left:3;image:url('../Default/imgs/black/scroll-right.svg')}#ScrollUpButton{image:url('../Default/imgs/black/scroll-up.svg')}#ScrollDownButton{image:url('../Default/imgs/black/scroll-down.svg')}#keyFrameNavigator{background:none;margin:0;padding:0}#keyFrameNavigator QToolButton{min-width:18}#keyFrameNavigator #PreviousKey{image:url('../Default/imgs/black/prevkey.svg')}#keyFrameNavigator #PreviousKey:hover{image:url('../Default/imgs/black/prevkey_over.svg')}#keyFrameNavigator #PreviousKey:disabled{image:url('../Default/imgs/black/prevkey_disabled.svg')}#keyFrameNavigator #NextKey{image:url('../Default/imgs/black/nextkey.svg')}#keyFrameNavigator #NextKey:hover{image:url('../Default/imgs/black/nextkey_over.svg')}#keyFrameNavigator #NextKey:disabled{image:url('../Default/imgs/black/nextkey_disabled.svg')}.treeview,QTreeWidget,QTreeView,#FunctionEditorTree{background-color:#949494;alternate-background-color:#8a8a8a;border:0;margin:0;outline:0}.treeview::item:selected,QTreeWidget::item:selected,QTreeView::item:selected,#FunctionEditorTree::item:selected{background-color:#225baf;color:#FFFFFF}.treeview::branch:adjoins-item,QTreeWidget::branch:adjoins-item,QTreeView::branch:adjoins-item,#FunctionEditorTree::branch:adjoins-item{border-image:url('')}.treeview::branch:has-siblings,QTreeWidget::branch:has-siblings,QTreeView::branch:has-siblings,#FunctionEditorTree::branch:has-siblings{border-image:url('')}.treeview::branch:has-siblings:adjoins-item,QTreeWidget::branch:has-siblings:adjoins-item,QTreeView::branch:has-siblings:adjoins-item,#FunctionEditorTree::branch:has-siblings:adjoins-item{border-image:url('')}.treeview::branch:has-children:closed,QTreeWidget::branch:has-children:closed,QTreeView::branch:has-children:closed,#FunctionEditorTree::branch:has-children:closed{background:url('../Default/imgs/black/treebranch-closed.svg') no-repeat;background-position:center center;border-image:none;image:none}.treeview::branch:has-children:open,QTreeWidget::branch:has-children:open,QTreeView::branch:has-children:open,#FunctionEditorTree::branch:has-children:open{background:url('../Default/imgs/black/treebranch-open.svg') no-repeat;background-position:center center;image:none}.treeview::branch:has-children:has-siblings:closed,QTreeWidget::branch:has-children:has-siblings:closed,QTreeView::branch:has-children:has-siblings:closed,#FunctionEditorTree::branch:has-children:has-siblings:closed{background:url('../Default/imgs/black/treebranch-closed.svg') no-repeat;background-position:center center;border-image:none;image:none}.treeview::branch:has-children:has-siblings:open,QTreeWidget::branch:has-children:has-siblings:open,QTreeView::branch:has-children:has-siblings:open,#FunctionEditorTree::branch:has-children:has-siblings:open{background:url('../Default/imgs/black/treebranch-open.svg') no-repeat;background-position:center center;border-image:none;image:none}QListView{outline:0;background:#949494;alternate-background-color:#8a8a8a}#TabBarContainer{background-color:#6c6c6c}.Button,QPushButton,.ComboBox,.ComboBox:checked,QComboBox,QComboBox:checked{background-color:#a6a6a6;border:1 solid #525252;border-radius:2;color:#000;margin:0;padding:3 15}.Button:hover,QPushButton:hover,.ComboBox:hover,#ViewerFpsSlider::sub-line:horizontal:hover,#ViewerFpsSlider::add-line:horizontal:hover,QComboBox:hover{background-color:#bbb;border-color:#525252;color:#000}.Button:pressed,QPushButton:pressed,#ViewerFpsSlider::sub-line:horizontal:pressed,#ViewerFpsSlider::add-line:horizontal:pressed{background-color:#e1e1e1;border-color:#525252;color:#000}.Button:checked,QPushButton:checked{background-color:#5a5a5a;border-color:#454545;color:#c0c0c0}.Button:checked:hover,QPushButton:checked:hover{background-color:#5f5f5f}.Button:checked:hover:pressed,QPushButton:checked:hover:pressed{background:#5a5a5a}.Button:disabled,QPushButton:disabled,.ComboBox:disabled,#ViewerFpsSlider::sub-line:horizontal:disabled,#ViewerFpsSlider::add-line:horizontal:disabled,QComboBox:disabled{background-color:#8d8d8d;border-color:#737373;color:rgba(0,0,0,0.466)}#PushButton_NoPadding{padding:3}.ComboBox,.ComboBox:checked,QComboBox,QComboBox:checked{padding:1 0 1 4;margin:1 0}.ComboBox::drop-down,QComboBox::drop-down{image:url('../Default/imgs/black/combo_downarrow.svg');image-position:center center;width:16}.ComboBox::drop-down:disabled,QComboBox::drop-down:disabled{image:url('../Default/imgs/black/combo_downarrow_disabled.svg')}.ComboBox QAbstractItemView,QComboBox QAbstractItemView{background-color:#949494;border:1 solid #404040;selection-background-color:#225baf;selection-color:#FFFFFF}.LineEdit,QPlainTextEdit,QLineEdit,#TaskSheetItem,#tasksRemoveBox,#tasksAddBox{background-color:#e6e6e6;border:1 solid #525252;border-radius:2;color:#000;selection-background-color:#225baf;selection-color:#FFFFFF;padding:0 0 0 1}.LineEdit:focus,QPlainTextEdit:focus,QLineEdit:focus,#TaskSheetItem:focus,#tasksRemoveBox:focus,#tasksAddBox:focus{background-color:#e6e6e6;border-color:#525252;color:#000}.LineEdit:disabled,QPlainTextEdit:disabled,QLineEdit:disabled,#TaskSheetItem:disabled,#tasksRemoveBox:disabled,#tasksAddBox:disabled{background-color:#9a9a9a;border-color:#696969;color:rgba(0,0,0,0.466)}.CheckBox,QCheckBox{color:#000}.CheckBox:hover,QCheckBox:hover,.RadioButton:hover,QRadioButton:hover{color:#fff}.CheckBox:disabled,QCheckBox:disabled{color:rgba(0,0,0,0.466)}.CheckBox::indicator,QMenu::indicator,QCheckBox::indicator,.GroupBox::indicator,QGroupBox::indicator{background-color:#cdcdcd;border:1 solid #525252;border-radius:2;height:9;padding:1;width:9}.CheckBox::indicator:hover,QMenu::indicator:hover,.CheckBox::indicator:checked:hover,QCheckBox::indicator:hover,.GroupBox::indicator:hover,QMenu::indicator:checked:hover,QCheckBox::indicator:checked:hover,.GroupBox::indicator:checked:hover,QGroupBox::indicator:hover,QGroupBox::indicator:checked:hover{background-color:#e6e6e6;border-color:#525252}.CheckBox::indicator:checked,QMenu::indicator:checked,QCheckBox::indicator:checked,.GroupBox::indicator:checked,QGroupBox::indicator:checked{background-color:#cdcdcd;border-color:#525252;image:url('../Default/imgs/black/checkmark.svg')}.CheckBox::indicator:checked:disabled,QMenu::indicator:checked:disabled,QCheckBox::indicator:checked:disabled,.GroupBox::indicator:checked:disabled,QGroupBox::indicator:checked:disabled{background-color:#8d8d8d;border-color:#737373;image:url('../Default/imgs/black/checkmark_disabled.svg')}.CheckBox::indicator:disabled,QMenu::indicator:disabled,QCheckBox::indicator:disabled,.GroupBox::indicator:disabled,QGroupBox::indicator:disabled{background-color:#8d8d8d;border-color:#737373}.RadioButton::indicator:unchecked,QRadioButton::indicator:unchecked,#CameraSettingsRadioButton_Small::indicator:unchecked{image:url('../Default/imgs/black/radiobutton_unchecked.svg');image-position:center center}.RadioButton::indicator:checked,QRadioButton::indicator:checked,#CameraSettingsRadioButton_Small::indicator:checked{image:url('../Default/imgs/black/radiobutton_checked.svg');image-position:center center}.GroupBox,QGroupBox{margin:6 0 0 0;padding:5 0}.GroupBox::title,QGroupBox::title{subcontrol-origin:margin;left:15;margin:-3 0 0 0;padding:0 3}.GroupBox::title:hover,QGroupBox::title:hover{color:#fff}.GroupBox::title:disabled,QGroupBox::title:disabled{color:rgba(0,0,0,0.466)}.GroupBox::indicator,QGroupBox::indicator{subcontrol-origin:margin;margin-top:2}.GroupBox:disabled,QGroupBox:disabled{color:rgba(0,0,0,0.466)}.Slider::groove:horizontal,QSlider::groove:horizontal{background-color:transparent;background-image:url('../Default/imgs/black/slider-groove.svg');background-position:center center;background-repeat:repeat-x;margin:0;height:20;min-height:20}.Slider::groove:horizontal:disabled,QSlider::groove:horizontal:disabled{background-image:url('../Default/imgs/black/slider-groove_disabled.svg')}.Slider::handle:horizontal,QSlider::handle:horizontal{width:10;margin:-2 0;image:url('../Default/imgs/black/slider-handle.svg')}.Slider::handle:horizontal:disabled,QSlider::handle:horizontal:disabled{image:url('../Default/imgs/black/slider-handle_disabled.svg')}#IntPairField,#DoublePairField{qproperty-LightLineColor:#484848;qproperty-LightLineEdgeColor:#484848;qproperty-DarkLineColor:#484848;qproperty-MiddleLineColor:#484848;qproperty-HandleLeftPixmap:url("../Default/imgs/black/slider-handle.svg");qproperty-HandleRightPixmap:url("../Default/imgs/black/slider-handle.svg");qproperty-HandleLeftGrayPixmap:url("../Default/imgs/black/slider-handle_disabled.svg");qproperty-HandleRightGrayPixmap:url("../Default/imgs/black/slider-handle_disabled.svg")}#DirTreeView{background-color:#949494;alternate-background-color:#949494;border:1 solid #404040;border-right:0}DvItemViewerPanel{qproperty-TextColor:#000;qproperty-AlternateBackground:#8a8a8a;qproperty-SelectedTextColor:#FFFFFF;qproperty-FolderTextColor:#071b9b;qproperty-SelectedItemBackground:#225baf}#FileBrowser DvItemViewerPanel,#SceneCast DvItemViewerPanel{background-color:#949494}#FileBrowser #castFrame,#SceneCast #castFrame{border-top:1 solid #404040;border-right:1 solid #404040;border-bottom:1 solid #404040;margin:0}#FileBrowser QToolButton,#SceneCast QToolButton{padding:1}DvDirTreeView{qproperty-TextColor:#000;qproperty-SelectedTextColor:#FFFFFF;qproperty-SelectedItemBackground:#225baf;qproperty-FolderTextColor:#071b9b;qproperty-SelectedFolderTextColor:#FFFFFF;alternate-background-color:#8a8a8a;background-color:#949494;border:1 solid #404040}#FileDoesNotExistLabel{color:#f00}#SceneCast QToolBar{border-top:1 solid #404040}#SceneCast QToolButton{margin:3 1 2 1;padding:1}#CastBrowser{border:0;margin:0}#FilmStrip QComboBox{border-radius:0;border-width:0}#FilmStrip QComboBox QAbstractItemView{background-color:#949494}#CleanupSettings #CleanupSettingsFrame{margin-top:2;margin-bottom:4}#CleanupSettings QGroupBox{margin-bottom:3}ParamsPage{qproperty-TextColor:#000}#CameraSettingsButton{padding:2}#CameraSettingsRadioButton:hover{background:none}#CameraSettingsRadioButton::indicator{border:1 solid rgba(255,255,255,0);height:18;padding:0;width:18}#CameraSettingsRadioButton::indicator:unchecked{image:url('../Default/imgs/black/lock_off.svg')}#CameraSettingsRadioButton::indicator:checked{background-color:#C34040;border-color:#772626;image:url('../Default/imgs/black/lock_on.svg')}#CameraSettingsRadioButton::indicator:checked:hover{background-color:#d57a7a;border-color:#772626}#CameraSettingsDPI{color:#000}#CameraSettingsRadioButton_Small{padding:0}#CameraSettingsRadioButton_Small::indicator{background-color:transparent;border:0;height:21;margin:0;width:11}#ForceSquaredPixelButton{height:16;border:1 solid rgba(255,255,255,0);image:url('../Default/imgs/black/fsp_unchecked.svg');padding:2;width:16;margin:0}#ForceSquaredPixelButton:checked{image:url('../Default/imgs/black/fsp_checked.svg')}#OutputSettingsLabel{color:#000}PencilTestPopup{min-height:730px;min-width:512px}#MatchLineButton{background-color:#a6a6a6}#MatchLineButton:checked{background-color:#cdcdcd;border:2 solid #225baf;border-radius:2}#LargeSizedText{font-size:17}#StartupLabel{padding:3}#StartupLabel:hover{background:#9a9a9a}QStatusBar{background-color:#c0c0c0}QStatusBar::item{border:0}QStatusBar QLabel{background-color:#c0c0c0}QStatusBar #StatusBarLabel{background-color:#fff;padding:1 3}#TitleTxtLabel{color:#000}#StyleEditor QPushButton{margin:2 1;padding:0}#StyleEditor #TabBarContainer{margin-left:-4}#StyleEditor #bottomWidget{border-top:1 solid #404040;padding:3 2 8 3}#StyleEditor #bottomWidget QPushButton{padding:3 5}#StyleEditorTabBar::tab::first{border-left:1 solid #404040}#HexagonalColorWheel{qproperty-BGColor:#808080}#colorSlider::groove:horizontal{height:1;border-image:none}#colorSlider::handle:horizontal{width:8;margin:-8 -4}#colorSliderAddButton,#colorSliderSubButton{background:none;border-color:transparent;image-position:center center;min-height:16;padding:0;min-width:18}#colorSliderAddButton{image:url('../Default/imgs/black/scroll-right.svg')}#colorSliderSubButton{image:url('../Default/imgs/black/scroll-left.svg')}#PlainColorPageParts{border-bottom:1 solid #404040}#PlainColorPageParts QLineEdit{max-width:35}PaletteViewer DvScrollWidget QPushButton{border-top:0;margin-bottom:1;max-width:15;min-width:15}PaletteViewer DvScrollWidget #ScrollLeftButton{border-radius:0;margin-bottom:1;max-width:16;min-width:16}PaletteViewer DvScrollWidget #ScrollRightButton{border-radius:0;margin-left:1;margin-bottom:1;max-width:16;min-width:16}PaletteViewer QToolBar{background:none;border-bottom:1 solid #404040;padding:0;margin:0}PaletteViewer QToolBar::separator:horizontal{margin:0}PaletteViewer QToolBar QToolButton{margin:0 0 1 0;padding:1 0 2 0}#PageViewer{qproperty-TextColor:#000}#PaletteLockButton{border-radius:0;margin:0 0 1 1}#PaletteLockButton:checked{background-color:#C34040;border-color:#772626}#PaletteLockButton:checked:hover{background-color:#d57a7a;border-color:#772626}#WordButton{padding-right:0;padding-left:0}QDialog{background-color:#808080}QDialog #dialogButtonFrame{background-color:#767676;border-top:1 solid #404040}QDialog #dialogButtonFrame QPushButton{border-color:#525252;outline:0}QDialog #dialogButtonFrame QPushButton:focus{background-color:#B5C0D0;border-color:#485971;color:#000}QDialog #dialogButtonFrame QPushButton:focus:hover{background-color:#ced5e0}QDialog #dialogButtonFrame QPushButton:focus:pressed{background-color:#e1e1e1;border-color:#525252;color:#000}#SceneSettings QLabel{color:#000}#PreferencesPopup QListWidget{background-color:#949494;alternate-background-color:#949494;border:1 solid #404040;font-size:13}#PreferencesPopup QListWidget::item{border:0;padding:3}#PreferencesPopup QListWidget::item:hover{background-color:#9f9f9f;color:#000;background-color:#a9a9a9}#PreferencesPopup QListWidget::item:selected{background-color:#225baf;color:#FFFFFF}#ShortcutTree{border:1 solid #404040}#ShortcutTree::item{padding:1 0}#ShortcutTree QScrollBar:vertical{width:16;margin-right:-1}ProjectPopup QLabel{color:#000}#GearButton{qproperty-icon:url('../Default/imgs/black/gear.svg')}#SubfolderButton{qproperty-icon:url('../Default/imgs/black/subfolder.svg');padding-left:6px;padding-right:6px}#SubcameraButton{qproperty-icon:url('../Default/imgs/black/subcamera.svg');padding-left:6px;padding-right:6px}SchematicViewer{qproperty-TextColor:#000;qproperty-VerticalLineColor:#646464;qproperty-LevelColumnColor:#76b776;qproperty-VectorColumnColor:#c0c07a;qproperty-ChildColumnColor:#d69adb;qproperty-FullcolorColumnColor:#8bbdc1;qproperty-FxColumnColor:#82815d;qproperty-PaletteColumnColor:#2aab9a;qproperty-MeshColumnColor:#ac78d4;qproperty-ReferenceColumnColor:#ababab;qproperty-TableColor:#a4a4bf;qproperty-ActiveCameraColor:#6ba5de;qproperty-OtherCameraColor:#8f9c9e;qproperty-GroupColor:#6698c6;qproperty-PegColor:#be8a56;qproperty-SplineColor:#7bb821;qproperty-ActiveOutputColor:#6ba5de;qproperty-OtherOutputColor:#8f9c9e;qproperty-XsheetColor:#a4a4bf;qproperty-NormalFxColor:#8d9caf;qproperty-MacroFxColor:#ae8ca5;qproperty-ImageAdjustFxColor:#9c9ab4;qproperty-LayerBlendingFxColor:#709ba5;qproperty-MatteFxColor:#ba8585;qproperty-SchematicPreviewButtonBgOnColor:#c8c864;qproperty-SchematicPreviewButtonOnImage:url('../Default/imgs/black/x_prev_eye_on.svg');qproperty-SchematicPreviewButtonBgOffColor:#ababab;qproperty-SchematicPreviewButtonOffImage:url('../Default/imgs/black/x_prev_eye_off.svg');qproperty-SchematicCamstandButtonBgOnColor:#eb906b;qproperty-SchematicCamstandButtonOnImage:url('../Default/imgs/black/x_table_view_on.svg');qproperty-SchematicCamstandButtonTranspImage:url('../Default/imgs/black/x_table_view_transp.svg');qproperty-SchematicCamstandButtonBgOffColor:#ababab;qproperty-SchematicCamstandButtonOffImage:url('../Default/imgs/black/x_table_view_off.svg')}#SchematicBottomFrame{background-color:#808080;border:0;margin:0;padding:0}#SchematicBottomFrame QToolBar::separator:horizontal{margin:0}#SchematicBottomFrame QToolBar QToolButton{padding:0;margin:2}#SchematicSceneViewer{background-color:#737373;border-bottom:1 solid #404040}#FxSettingsTabBar::tab{border-top:1 solid #404040}#FxSettingsTabBar::tab::first,#FxSettingsTabBar::tab::only-one{border-left:1 solid #404040}FxSettings QToolBar{border-top:1 solid #404040;border-right:1 solid #404040;border-left:1 solid #404040;min-height:23;padding:3 0}FxSettings QToolBar QToolBar{border:0}#FxSettingsLabel{color:#000}#FxSettingsHelpButton{background-color:#80a0dc;color:#000;padding-top:0;padding-bottom:0}#FxSettingsHelpButton:hover{background-color:#a8bee7}#ScriptConsole{font-family:'Courier New',monospace;border:0;color:#000000;padding:3}#ScriptConsole QFrame{background-color:#dcdcdc}#ScriptConsole TPanelTitleBar{background-color:#5a5a5a}#TaskSheetItemLabel{color:#000}#Tasks QToolBar{border-bottom:1 solid #404040;margin:0;padding:0}#Tasks QToolBar QToolButton{margin:2 2 3 2}#ToolBar QToolBar{padding-left:2}#ToolOptions TPanelTitleBar{border-right:1 solid #404040;border-bottom:0}#CommandBar TPanelTitleBar{border-right:1 solid #404040;border-bottom:0}IconViewField{qproperty-ThicknessPixmap:url("../Default/imgs/black/selectiontool_thickness.svg")}#EditToolLockButton{spacing:0}#EditToolLockButton:hover{background:none}#EditToolLockButton::indicator{border:1 solid rgba(255,255,255,0);height:18;padding:0;width:18}#EditToolLockButton::indicator:unchecked{image:url('../Default/imgs/black/lock_off.svg')}#EditToolLockButton::indicator:checked{background-color:#C34040;border-color:#772626;image:url('../Default/imgs/black/lock_on.svg')}#EditToolLockButton::indicator:checked:hover{background-color:#d57a7a;border-color:#772626}PopupButton::menu-indicator{border-left:0;height:17;image:url('../Default/imgs/black/combo_downarrow.svg');width:10}PopupButton::menu-indicator:hover{image:url('../Default/imgs/black/combo_downarrow.svg')}PopupButton::menu-indicator:disabled{image:url('../Default/imgs/black/combo_downarrow_disabled.svg')}#Cap,#Join{padding:0 4 0 -8;max-width:32;min-width:32}#Cap QMenu,#Join QMenu{max-width:28;min-width:28}#Cap QMenu::item,#Join QMenu::item{max-width:28;min-width:28;padding:0}QToolBar#MediumPaddingToolBar QToolButton{padding-left:3;padding-right:3}QToolBar#WidePaddingToolBar QToolButton{padding-left:6;padding-right:6}#CommandBar{margin:0;padding:0;border:0}#CommandBar::separator:horizontal{margin-right:3;margin-left:3}#expandButton:checked{background-color:transparent;border-color:transparent;color:#000}#expandButton:checked:hover{background-color:#bbb;border-color:#525252}#expandButton:checked:pressed{background-color:#e1e1e1;border-color:#525252}#ComboViewerPanel Toolbar{border-bottom:1 solid #404040}#ComboViewerPanel Toolbar::separator:horizontal{margin:0 0 0 2}#ComboViewerPanel Toolbar QToolButton{margin:2 0 3 2}#ComboViewerToolOptions{border-bottom:1 solid #404040}#ComboViewer #ToolBarContainer,#ViewerPanel #ToolBarContainer,FlipBook #ToolBarContainer{background-color:transparent;border-top:2 solid #404040;border-bottom:1 solid #404040;padding-right:-1}#flipCustomize{margin-left:3}#flipCustomize::menu-button{background-color:transparent;width:35}#flipCustomize::menu-arrow{image:none}QToolBar#FlipConsolePlayToolBar::separator:horizontal{margin:0 3}QToolBar#FlipConsolePlayToolBar QToolButton{margin-top:2;margin-bottom:2;height:16;padding-left:1;padding-right:1}#ViewerFpsSlider{background-color:transparent;background-image:url('../Default/imgs/black/slider-groove.svg');background-position:center center;background-repeat:repeat-x;border:0;height:19;margin:0 3 0 37;max-width:300;min-width:0}#ViewerFpsSlider::sub-line:horizontal{subcontrol-origin:absolute;background-color:#a6a6a6;border:1 solid #525252;border-top-left-radius:2;border-bottom-left-radius:2;height:16;left:-33;width:14}#ViewerFpsSlider::add-line:horizontal{subcontrol-position:left;background-color:#a6a6a6;border:1 solid #525252;border-top-right-radius:2;border-bottom-right-radius:2;left:18;height:16;image-position:center center;width:13}#ViewerFpsSlider::handle::horizontal{background-color:#a6a6a6;border:1 solid #404040;border-radius:2;margin:2 0 3 0;min-width:9;width:9;max-width:9}FlipSlider{qproperty-PBHeight:15;qproperty-PBOverlay:url('../Default/imgs/black/flipslider.svg');qproperty-PBColorMarginLeft:1;qproperty-PBColorMarginTop:2;qproperty-PBColorMarginRight:1;qproperty-PBColorMarginBottom:2;qproperty-PBMarker:url('../Default/imgs/black/flipmarker.svg');qproperty-PBMarkerMarginLeft:3;qproperty-PBMarkerMarginRight:3;qproperty-notStartedColor:#8b2525;qproperty-startedColor:#00a808;qproperty-baseColor:#676767;qproperty-finishedColor:#676767}Ruler{qproperty-ParentBGColor:#c0c0c0;qproperty-ScaleColor:#000}#RulerToolOptionValues{color:#000}#xsheetArea,#ScrollArea{background-color:#6c6c6c;border:0}#xsheetScrollArea{border:0}#cornerWidget QToolButton{padding:0}#xsheetColumnAreaMenu_Preview{background-color:#E6E678}#xsheetColumnAreaMenu_Lock{background-color:#F5F5F5}#xsheetColumnAreaMenu_Camstand{background-color:#FFA480}#xsheetColumnAreaMenu_Preview,#xsheetColumnAreaMenu_Lock,#xsheetColumnAreaMenu_Camstand{color:#000}#noteTextEdit{color:#000}XsheetViewer{qproperty-TextColor:#000;qproperty-BGColor:#929292;qproperty-LightLineColor:#616161;qproperty-MarkerLineColor:#000;qproperty-VerticalLineColor:#646464;qproperty-VerticalLineHeadColor:#393939;qproperty-PreviewFrameTextColor:#000eb6;qproperty-CurrentRowBgColor:#B5C0D0;qproperty-OnionSkinAreaBgColor:#858585;qproperty-EmptyColumnHeadColor:#808080;qproperty-SelectedColumnTextColor:#9e0000;qproperty-EmptyCellColor:#7c7c7c;qproperty-NotEmptyColumnColor:#8a8a8a;qproperty-SelectedEmptyCellColor:#b3b3b3;qproperty-LevelColumnColor:#76b776;qproperty-LevelColumnBorderColor:#496549;qproperty-SelectedLevelColumnColor:#9bc59b;qproperty-VectorColumnColor:#c0c07a;qproperty-VectorColumnBorderColor:#71714a;qproperty-SelectedVectorColumnColor:#cdcda0;qproperty-ChildColumnColor:#d69adb;qproperty-ChildColumnBorderColor:#9c53a3;qproperty-SelectedChildColumnColor:#e3c2e6;qproperty-FullcolorColumnColor:#8bbdc1;qproperty-FullcolorColumnBorderColor:#577476;qproperty-SelectedFullcolorColumnColor:#afcdd0;qproperty-FxColumnColor:#82815d;qproperty-FxColumnBorderColor:#404039;qproperty-SelectedFxColumnColor:#97967b;qproperty-ReferenceColumnColor:#ababab;qproperty-ReferenceColumnBorderColor:#6b6b6b;qproperty-SelectedReferenceColumnColor:#c4c4c4;qproperty-PaletteColumnColor:#2aab9a;qproperty-PaletteColumnBorderColor:#173e39;qproperty-SelectedPaletteColumnColor:#40c8b6;qproperty-MeshColumnColor:#ac78d4;qproperty-MeshColumnBorderColor:#6b418c;qproperty-SelectedMeshColumnColor:#c3a2dd;qproperty-SoundTextColumnColor:#c8c8c8;qproperty-SoundTextColumnBorderColor:#8c8c8c;qproperty-SelectedSoundTextColumnColor:#e2e2e2;qproperty-SoundColumnColor:#acba82;qproperty-SoundColumnBorderColor:#656b51;qproperty-SelectedSoundColumnColor:#c0c9a6;qproperty-SoundColumnHlColor:#f5ffe6;qproperty-SoundColumnTrackColor:#5a642d;qproperty-ColumnHeadPastelizer:#fff;qproperty-SelectedColumnHead:#bed2f0;qproperty-LightLightBGColor:#808080;qproperty-LightBGColor:#f0f0f0;qproperty-DarkBGColor:#e1e1e1;qproperty-DarkLineColor:#969696;qproperty-XsheetColumnNameBgColor:rgba(0,0,0,0);qproperty-XsheetDragBarHighlightColor:rgba(255,255,255,0.5);qproperty-XsheetPreviewButtonBgOnColor:#c8c864;qproperty-XsheetPreviewButtonOnImage:url('../Default/imgs/black/x_prev_eye_on.svg');qproperty-XsheetPreviewButtonBgOffColor:rgba(255,255,255,0);qproperty-XsheetPreviewButtonOffImage:url('../Default/imgs/black/x_prev_eye_off.svg');qproperty-XsheetCamstandButtonBgOnColor:#eb906b;qproperty-XsheetCamstandButtonOnImage:url('../Default/imgs/black/x_table_view_on.svg');qproperty-XsheetCamstandButtonTranspImage:url('../Default/imgs/black/x_table_view_transp.svg');qproperty-XsheetCamstandButtonBgOffColor:rgba(255,255,255,0);qproperty-XsheetCamstandButtonOffImage:url('../Default/imgs/black/x_table_view_off.svg');qproperty-XsheetLockButtonBgOnColor:rgba(255,255,255,0.3);qproperty-XsheetLockButtonOnImage:url('../Default/imgs/black/x_lock_on.svg');qproperty-XsheetLockButtonBgOffColor:rgba(255,255,255,0);qproperty-XsheetLockButtonOffImage:url('../Default/imgs/black/x_lock_off.svg');qproperty-XsheetConfigButtonBgColor:rgba(255,255,255,0);qproperty-XsheetConfigButtonImage:url('../Default/imgs/black/x_config.svg');qproperty-TimelinePreviewButtonBgOnColor:rgba(255,255,255,0);qproperty-TimelinePreviewButtonOnImage:url('../Default/imgs/black/timeline_toggle_on.svg');qproperty-TimelinePreviewButtonBgOffColor:rgba(255,255,255,0);qproperty-TimelinePreviewButtonOffImage:url('../Default/imgs/black/timeline_toggle_off.svg');qproperty-TimelineCamstandButtonBgOnColor:rgba(255,255,255,0);qproperty-TimelineCamstandButtonOnImage:url('../Default/imgs/black/timeline_toggle_on.svg');qproperty-TimelineCamstandButtonTranspImage:url('../Default/imgs/black/timeline_toggle_transp.svg');qproperty-TimelineCamstandButtonBgOffColor:rgba(255,255,255,0);qproperty-TimelineCamstandButtonOffImage:url('../Default/imgs/black/timeline_toggle_off.svg');qproperty-TimelineLockButtonBgOnColor:rgba(255,255,255,0);qproperty-TimelineLockButtonOnImage:url('../Default/imgs/black/timeline_toggle_on.svg');qproperty-TimelineLockButtonBgOffColor:rgba(255,255,255,0);qproperty-TimelineLockButtonOffImage:url('../Default/imgs/black/timeline_toggle_off.svg');qproperty-TimelineConfigButtonBgColor:rgba(255,255,255,0);qproperty-TimelineConfigButtonImage:url('../Default/imgs/black/timeline_config.svg');qproperty-LayerHeaderPreviewImage:url('../Default/imgs/black/layer_header_prev_eye.svg');qproperty-LayerHeaderPreviewOverImage:url('../Default/imgs/black/layer_header_prev_eye_over.svg');qproperty-LayerHeaderCamstandImage:url('../Default/imgs/black/layer_header_table_view.svg');qproperty-LayerHeaderCamstandOverImage:url('../Default/imgs/black/layer_header_table_view_over.svg');qproperty-LayerHeaderLockImage:url('../Default/imgs/black/lock_on.svg');qproperty-LayerHeaderLockOverImage:url('../Default/imgs/black/lock_on_over.svg')}#XSheetToolbar{margin:0;padding:0;border:0}#XSheetToolbar QToolButton{padding:0;margin:4 1;min-height:19;height:19}#XSheetToolbar::separator:horizontal{margin:0 4}#FunctionEditor QToolBar{border-bottom:1 solid #404040}#FunctionEditor QToolBar QToolBar{border:0}#FunctionEditor QToolBar QLabel{margin-left:5}#FunctionEditor QToolBar QToolButton{height:18}#FunctionEditorTree{border-top:1 solid #404040}FunctionTreeView{qproperty-TextColor:#000;qproperty-CurrentTextColor:#a70000}FunctionPanel{qproperty-BGColor:#5a5a5a;qproperty-ValueLineColor:#4d4d4d;qproperty-FrameLineColor:#4d4d4d;qproperty-OtherCurvesColor:#c5c5c5;qproperty-RulerBackground:#676767;qproperty-TextColor:#000;qproperty-SubColor:#fff;qproperty-SelectedColor:#fcae06}SpreadsheetViewer{qproperty-LightLightBGColor:#808080;qproperty-CurrentRowBgColor:#B5C0D0;qproperty-LightLineColor:#616161;qproperty-MarkerLineColor:#000;qproperty-BGColor:#8a8a8a;qproperty-VerticalLineColor:#646464;qproperty-KeyFrameColor:#db8b36;qproperty-KeyFrameBorderColor:#7b4a16;qproperty-SelectedKeyFrameColor:#dea466;qproperty-InBetweenColor:#c2c2b0;qproperty-InBetweenBorderColor:#636356;qproperty-SelectedInBetweenColor:#d6d6cf;qproperty-SelectedEmptyColor:#b3b3b3;qproperty-SelectedSceneRangeEmptyColor:#d2d2d2;qproperty-TextColor:#000;qproperty-ColumnHeaderBorderColor:#393939;qproperty-SelectedColumnTextColor:#9e0000}#ExpressionField{background-color:#fff;border:1 solid #6b6b6b;margin:0}#FunctionSegmentViewerLinkButton{background-image:url('../Default/imgs/black/segment_unlinked.svg');background-repeat:no-repeat}#FunctionSegmentViewerLinkButton:hover{background-repeat:no-repeat}#FunctionSegmentViewerLinkButton:checked{background-image:url('../Default/imgs/black/segment_linked.svg');background-repeat:no-repeat}#FunctionSegmentViewerLinkButton:disabled{background-image:url('../Default/imgs/black/segment_disabled.svg');background-repeat:no-repeat} \ No newline at end of file +.button-show,#LoadLevelShowButton,#CleanupSettingsShowButton,#OutputSettingsShowButton,#FxSettingsPreviewShowButton{image:url('../Default/imgs/black/plus.svg');image-position:center center;margin:0;padding:1;min-width:10;min-height:10}.button-show:checked,#LoadLevelShowButton:checked,#CleanupSettingsShowButton:checked,#OutputSettingsShowButton:checked,#FxSettingsPreviewShowButton:checked{background-color:#5a5a5a;border-color:#454545;image:url('../Default/imgs/black/minus.svg')}.button-show:checked:pressed,#LoadLevelShowButton:checked:pressed,#CleanupSettingsShowButton:checked:pressed,#OutputSettingsShowButton:checked:pressed,#FxSettingsPreviewShowButton:checked:pressed{background-color:#e1e1e1;border-color:#525252}.button-show:checked:hover,#LoadLevelShowButton:checked:hover,#CleanupSettingsShowButton:checked:hover,#OutputSettingsShowButton:checked:hover,#FxSettingsPreviewShowButton:checked:hover{background-color:#5f5f5f}.button-tool,QToolButton,#CameraSettingsRadioButton::indicator,#ForceSquaredPixelButton,#SchematicBottomFrame QToolBar QToolButton,#EditToolLockButton::indicator,#flipCustomize{background-color:rgba(255,255,255,0);border:1 solid rgba(255,255,255,0);border-radius:2;color:#000;margin:1;padding:0}.button-tool:hover,QToolButton:hover,#CameraSettingsRadioButton::indicator:hover,#ForceSquaredPixelButton:hover,#colorSliderAddButton:hover,#colorSliderSubButton:hover,#SchematicBottomFrame QToolBar QToolButton:hover,#EditToolLockButton::indicator:hover,#flipCustomize:hover{background-color:#bbb;border-color:#525252;color:#000}.button-tool:pressed,QToolButton:pressed,#CameraSettingsRadioButton::indicator:pressed,#ForceSquaredPixelButton:pressed,#colorSliderAddButton:pressed,#colorSliderSubButton:pressed,#SchematicBottomFrame QToolBar QToolButton:pressed,#EditToolLockButton::indicator:pressed,#flipCustomize:pressed{background-color:#e1e1e1;border-color:#525252;color:#000}.button-tool:checked,QToolButton:checked,#CameraSettingsRadioButton::indicator:checked,#ForceSquaredPixelButton:checked,#SchematicBottomFrame QToolBar QToolButton:checked,#EditToolLockButton::indicator:checked,#flipCustomize:checked{background-color:#5a5a5a;border-color:#454545;color:#c0c0c0}.button-tool:checked:hover,QToolButton:checked:hover,#CameraSettingsRadioButton::indicator:checked:hover,#ForceSquaredPixelButton:checked:hover,#SchematicBottomFrame QToolBar QToolButton:checked:hover,#EditToolLockButton::indicator:checked:hover,#flipCustomize:checked:hover{background-color:#6e6e6e;border-color:#454545}.button-tool:disabled,QToolButton:disabled,#CameraSettingsRadioButton::indicator:disabled,#ForceSquaredPixelButton:disabled,#SchematicBottomFrame QToolBar QToolButton:disabled,#EditToolLockButton::indicator:disabled,#flipCustomize:disabled{color:rgba(0,0,0,0.466)}.button-flat,PaletteViewer QToolBar QToolButton{background-color:none;border:0;border-radius:0;margin:0}.button-flat:hover,PaletteViewer QToolBar QToolButton:hover{background-color:#bbb}.button-flat:pressed,PaletteViewer QToolBar QToolButton:pressed{background-color:#404040}.frame,.GroupBox,#LoadLevelFrame,#PsdSettingsGroupBox,#CleanupSettingsFrame,#OutputSettingsBox,#OutputSettingsCameraBox,#SolidLineFrame,#FunctionParametersPanel,QGroupBox{border:1 solid #404040;border-radius:2}.tab-container,#TabBarContainer{background-color:transparent;qproperty-BottomAboveLineColor:#6c6c6c;qproperty-BottomBelowLineColor:#404040}.tab-flat,#StyleEditorTabBar::tab,#PaletteTabBar::tab,#FxSettingsTabBar::tab{background-color:#5a5a5a;border-right:1 solid #404040;border-bottom:1 solid #404040;color:#c0c0c0;padding:3 4 3 4}.tab-flat:hover,#StyleEditorTabBar::tab:hover,#PaletteTabBar::tab:hover,#FxSettingsTabBar::tab:hover{background-color:#6e6e6e;color:#fff}.tab-flat:selected,#StyleEditorTabBar::tab:selected,#PaletteTabBar::tab:selected,#FxSettingsTabBar::tab:selected{background-color:#808080;color:#000;border-bottom-color:#808080}.tab-flat:only-one,#StyleEditorTabBar::tab:only-one,#PaletteTabBar::tab:only-one,#FxSettingsTabBar::tab:only-one{margin:0}.tab-round{background-color:#5a5a5a;border-top:1 solid #404040;border-right:1 solid #404040;border-left:1 solid #404040;border-bottom:1 solid #404040;color:#c0c0c0;margin:3 -1 0 0;padding:2 7 1 7}.tab-round:hover{background-color:#6e6e6e;color:#fff}.tab-round:selected{background-color:#808080;border-top-right-radius:2;border-top-left-radius:2;border-bottom-color:#808080;color:#000;margin:1 -1 -1 0;padding:2 7 2 7}.tab-round:only-one{margin:1 0 0 0;padding:3 7 3 7}.tab-round:last{margin-right:0;border-top-right-radius:2}.tab-round:first{border-top-left-radius:2}QWidget{background-color:#808080;color:#000}QWidget:disabled{color:rgba(0,0,0,0.466)}QFrame{border:0;margin:0;padding:0}QToolTip,#helpToolTip{background-color:#fff;border:1 solid #000;color:#000;padding:1 1}#DockSeparator,QMainWindow::separator,QSplitter::handle{background-color:#272727;height:4;width:4}#TDockPlaceholder{background-color:#F77272}TPanel{background-color:#272727}#TopBar{background:#808080;border:0;border-bottom:1 solid #404040;height:21}#TopBar #EditToolLockButton{background:#808080;spacing:0}#TopBar #EditToolLockButton::indicator{background:none;border:none;height:18;margin:1 2 0 0;padding-left:0;padding-right:0}#TopBarTabContainer{background-color:#808080;margin-bottom:1}#StackedMenuBar{border:0;margin:0;padding:0}QMenuBar{background-color:#808080;border:0}QMenuBar::item{background-color:#808080;border-left:1 solid #808080;margin:0;padding:3 5}QMenuBar::item:selected{background-color:#9f9f9f;color:#000}QMenuBar::item:pressed{background-color:#225baf;color:#FFFFFF}#TopBarTab{margin:0;padding:0}#TopBarTab::tab{background-color:#5a5a5a;border-top:1 solid #404040;border-right:1 solid #404040;color:#afafaf;margin:0 0 0 0;padding:2 8 3 8}#TopBarTab::tab:hover{background-color:#6e6e6e;color:#fff}#TopBarTab::tab:selected{background-color:#9a9a9a;color:#000}#TopBarTab::tab:first{border-left:1 solid #404040}#TopBarTab::tab:last{border-right:1 solid #404040}QMenu{background-color:#949494;border:1 solid #404040;padding:2 0}QMenu::item{padding:3 28}QMenu::item:selected{background-color:#225baf;color:#FFFFFF}QMenu::item:checked{color:#000}QMenu::item:checked:selected{background-color:#225baf;color:#FFFFFF}QMenu::item:disabled{background:none;color:rgba(0,0,0,0.466)}QMenu::item:disabled:selected{border-color:transparent}QMenu::separator{border-top:1 solid #6e6e6e;height:0;margin:2 0}QMenu::icon{border-radius:2;margin:0 0 0 3;padding:1}QMenu::icon:checked{background-color:#225baf}QMenu::indicator{margin-left:7}TPanelTitleBar{background-color:#5a5a5a;border-color:#404040;border-style:solid;border-width:0 0 1 0;height:20;min-height:20;qproperty-TitleColor:#c0c0c0;qproperty-ActiveTitleColor:#fff;qproperty-BorderPixmap:url('none');qproperty-ActiveBorderPixmap:url('../Default/imgs/black/none');qproperty-FloatBorderPixmap:url('none');qproperty-FloatActiveBorderPixmap:url('../Default/imgs/black/none')}QAbstractScrollArea::corner{background-color:#6e6e6e}QScrollBar{background-color:#6e6e6e;border:0}QScrollBar:horizontal{height:16;margin:0}QScrollBar:vertical{margin:0;width:16}QScrollBar::handle{border:1 solid #555;border-radius:2}QScrollBar::handle:horizontal:hover,QScrollBar::handle:vertical:hover{background-color:#b3b3b3;border-color:#404040}QScrollBar::handle:horizontal:pressed,QScrollBar::handle:vertical:pressed{background-color:#c7c7c7;border-color:#404040}QScrollBar::handle:horizontal{background-color:#9f9f9f;margin:2 16;min-width:20}QScrollBar::handle:vertical{background-color:#9f9f9f;margin:16 2;min-height:20}QScrollBar::add-line{subcontrol-origin:margin;border:0}QScrollBar::add-line:horizontal{subcontrol-position:right;background-color:#6e6e6e;margin:0;width:16}QScrollBar::add-line:vertical{subcontrol-position:bottom;background-color:#6e6e6e;margin:0;height:16}QScrollBar::sub-line{border:0;subcontrol-origin:margin}QScrollBar::sub-line:horizontal{subcontrol-position:left;background-color:#6e6e6e;margin:0;width:16}QScrollBar::sub-line:vertical{subcontrol-position:top;background-color:#6e6e6e;margin:0;height:16}QScrollBar::up-arrow:vertical{image:url('../Default/imgs/black/scroll-up.svg');image-position:center center}QScrollBar::up-arrow:vertical:pressed{margin:1 0 0 0}QScrollBar::down-arrow:vertical{image:url('../Default/imgs/black/scroll-down.svg');image-position:center center}QScrollBar::down-arrow:vertical:pressed{margin:1 0 0 0}QScrollBar::left-arrow:horizontal{image:url('../Default/imgs/black/scroll-left.svg');image-position:center center}QScrollBar::left-arrow:horizontal:pressed{margin:1 0 0 0}QScrollBar::right-arrow:horizontal{image:url('../Default/imgs/black/scroll-right.svg');image-position:center center}QScrollBar::right-arrow:horizontal:pressed{margin:1 0 0 0}QScrollBar::sub-page:horizontal,QScrollBar::add-page:horizontal,QScrollBar::sub-page:vertical,QScrollBar::add-page:vertical{background:none}QToolBar{padding:0}QToolBar::separator:horizontal{border-left:1 solid #404040;margin:0 1;width:0}QToolBar::separator:vertical{border-top:1 solid #404040;height:0;margin:1 0}QToolBar QLabel{margin-top:1}QToolBar QToolBar{border:0}QToolButton::menu-indicator{image:none}QToolButton::menu-button{border-image:none}.DvScrollWidget QPushButton,DvScrollWidget QPushButton,#ScrollLeftButton QPushButton,#ScrollRightButton QPushButton,#ScrollUpButton QPushButton,#ScrollDownButton QPushButton{background-color:#a6a6a6;border:0 solid red;border-radius:0;padding:0;max-width:16}.DvScrollWidget QPushButton:hover,DvScrollWidget QPushButton:hover,#ScrollLeftButton QPushButton:hover,#ScrollRightButton QPushButton:hover,#ScrollUpButton QPushButton:hover,#ScrollDownButton QPushButton:hover{background-color:#bbb}.DvScrollWidget QPushButton:pressed,DvScrollWidget QPushButton:pressed,#ScrollLeftButton QPushButton:pressed,#ScrollRightButton QPushButton:pressed,#ScrollUpButton QPushButton:pressed,#ScrollDownButton QPushButton:pressed{background-color:#e1e1e1}#ScrollLeftButton,#ScrollRightButton,#ScrollUpButton,#ScrollDownButton{margin:0;min-width:16}#ScrollLeftButton{border-right:1 solid #404040;image:url('../Default/imgs/black/scroll-left.svg')}#ScrollRightButton{border-left:1 solid #404040;margin-left:3;image:url('../Default/imgs/black/scroll-right.svg')}#ScrollUpButton{image:url('../Default/imgs/black/scroll-up.svg')}#ScrollDownButton{image:url('../Default/imgs/black/scroll-down.svg')}#keyFrameNavigator{background:none;margin:0;padding:0}#keyFrameNavigator QToolButton{min-width:18}#keyFrameNavigator #PreviousKey{image:url('../Default/imgs/black/prevkey.svg')}#keyFrameNavigator #PreviousKey:hover{image:url('../Default/imgs/black/prevkey_over.svg')}#keyFrameNavigator #PreviousKey:disabled{image:url('../Default/imgs/black/prevkey_disabled.svg')}#keyFrameNavigator #NextKey{image:url('../Default/imgs/black/nextkey.svg')}#keyFrameNavigator #NextKey:hover{image:url('../Default/imgs/black/nextkey_over.svg')}#keyFrameNavigator #NextKey:disabled{image:url('../Default/imgs/black/nextkey_disabled.svg')}.treeview,QTreeWidget,QTreeView,#FunctionEditorTree{background-color:#949494;alternate-background-color:#8a8a8a;border:0;margin:0;outline:0}.treeview::item:selected,QTreeWidget::item:selected,QTreeView::item:selected,#FunctionEditorTree::item:selected{background-color:#225baf;color:#FFFFFF}.treeview::branch:adjoins-item,QTreeWidget::branch:adjoins-item,QTreeView::branch:adjoins-item,#FunctionEditorTree::branch:adjoins-item{border-image:url('')}.treeview::branch:has-siblings,QTreeWidget::branch:has-siblings,QTreeView::branch:has-siblings,#FunctionEditorTree::branch:has-siblings{border-image:url('')}.treeview::branch:has-siblings:adjoins-item,QTreeWidget::branch:has-siblings:adjoins-item,QTreeView::branch:has-siblings:adjoins-item,#FunctionEditorTree::branch:has-siblings:adjoins-item{border-image:url('')}.treeview::branch:has-children:closed,QTreeWidget::branch:has-children:closed,QTreeView::branch:has-children:closed,#FunctionEditorTree::branch:has-children:closed{background:url('../Default/imgs/black/treebranch-closed.svg') no-repeat;background-position:center center;border-image:none;image:none}.treeview::branch:has-children:open,QTreeWidget::branch:has-children:open,QTreeView::branch:has-children:open,#FunctionEditorTree::branch:has-children:open{background:url('../Default/imgs/black/treebranch-open.svg') no-repeat;background-position:center center;image:none}.treeview::branch:has-children:has-siblings:closed,QTreeWidget::branch:has-children:has-siblings:closed,QTreeView::branch:has-children:has-siblings:closed,#FunctionEditorTree::branch:has-children:has-siblings:closed{background:url('../Default/imgs/black/treebranch-closed.svg') no-repeat;background-position:center center;border-image:none;image:none}.treeview::branch:has-children:has-siblings:open,QTreeWidget::branch:has-children:has-siblings:open,QTreeView::branch:has-children:has-siblings:open,#FunctionEditorTree::branch:has-children:has-siblings:open{background:url('../Default/imgs/black/treebranch-open.svg') no-repeat;background-position:center center;border-image:none;image:none}QListView{outline:0;background:#949494;alternate-background-color:#8a8a8a}#TabBarContainer{background-color:#6c6c6c}.Button,QPushButton,.ComboBox,.ComboBox:checked,QComboBox,QComboBox:checked{background-color:#a6a6a6;border:1 solid #525252;border-radius:2;color:#000;margin:0;padding:3 15}.Button:hover,QPushButton:hover,.ComboBox:hover,#ViewerFpsSlider::sub-line:horizontal:hover,#ViewerFpsSlider::add-line:horizontal:hover,QComboBox:hover{background-color:#bbb;border-color:#525252;color:#000}.Button:pressed,QPushButton:pressed,#ViewerFpsSlider::sub-line:horizontal:pressed,#ViewerFpsSlider::add-line:horizontal:pressed{background-color:#e1e1e1;border-color:#525252;color:#000}.Button:checked,QPushButton:checked{background-color:#5a5a5a;border-color:#454545;color:#c0c0c0}.Button:checked:hover,QPushButton:checked:hover{background-color:#5f5f5f}.Button:checked:hover:pressed,QPushButton:checked:hover:pressed{background:#5a5a5a}.Button:disabled,QPushButton:disabled,.ComboBox:disabled,#ViewerFpsSlider::sub-line:horizontal:disabled,#ViewerFpsSlider::add-line:horizontal:disabled,QComboBox:disabled{background-color:#8d8d8d;border-color:#737373;color:rgba(0,0,0,0.466)}#PushButton_NoPadding{padding:3}.ComboBox,.ComboBox:checked,QComboBox,QComboBox:checked{padding:1 0 1 4;margin:1 0}.ComboBox::drop-down,QComboBox::drop-down{image:url('../Default/imgs/black/combo_downarrow.svg');image-position:center center;width:16}.ComboBox::drop-down:disabled,QComboBox::drop-down:disabled{image:url('../Default/imgs/black/combo_downarrow_disabled.svg')}.ComboBox QAbstractItemView,QComboBox QAbstractItemView{background-color:#949494;border:1 solid #404040;selection-background-color:#225baf;selection-color:#FFFFFF}.LineEdit,QPlainTextEdit,QLineEdit,#TaskSheetItem,#tasksRemoveBox,#tasksAddBox{background-color:#e6e6e6;border:1 solid #525252;border-radius:2;color:#000;selection-background-color:#225baf;selection-color:#FFFFFF;padding:0 0 0 1}.LineEdit:focus,QPlainTextEdit:focus,QLineEdit:focus,#TaskSheetItem:focus,#tasksRemoveBox:focus,#tasksAddBox:focus{background-color:#e6e6e6;border-color:#525252;color:#000}.LineEdit:disabled,QPlainTextEdit:disabled,QLineEdit:disabled,#TaskSheetItem:disabled,#tasksRemoveBox:disabled,#tasksAddBox:disabled{background-color:#9a9a9a;border-color:#696969;color:rgba(0,0,0,0.466)}.CheckBox,QCheckBox{color:#000}.CheckBox:hover,QCheckBox:hover,.RadioButton:hover,QRadioButton:hover{color:#fff}.CheckBox:disabled,QCheckBox:disabled{color:rgba(0,0,0,0.466)}.CheckBox::indicator,QMenu::indicator,QCheckBox::indicator,.GroupBox::indicator,QGroupBox::indicator{background-color:#cdcdcd;border:1 solid #525252;border-radius:2;height:9;padding:1;width:9}.CheckBox::indicator:hover,QMenu::indicator:hover,.CheckBox::indicator:checked:hover,QCheckBox::indicator:hover,.GroupBox::indicator:hover,QMenu::indicator:checked:hover,QCheckBox::indicator:checked:hover,.GroupBox::indicator:checked:hover,QGroupBox::indicator:hover,QGroupBox::indicator:checked:hover{background-color:#e6e6e6;border-color:#525252}.CheckBox::indicator:checked,QMenu::indicator:checked,QCheckBox::indicator:checked,.GroupBox::indicator:checked,QGroupBox::indicator:checked{background-color:#cdcdcd;border-color:#525252;image:url('../Default/imgs/black/checkmark.svg')}.CheckBox::indicator:checked:disabled,QMenu::indicator:checked:disabled,QCheckBox::indicator:checked:disabled,.GroupBox::indicator:checked:disabled,QGroupBox::indicator:checked:disabled{background-color:#8d8d8d;border-color:#737373;image:url('../Default/imgs/black/checkmark_disabled.svg')}.CheckBox::indicator:disabled,QMenu::indicator:disabled,QCheckBox::indicator:disabled,.GroupBox::indicator:disabled,QGroupBox::indicator:disabled{background-color:#8d8d8d;border-color:#737373}.RadioButton::indicator:unchecked,QRadioButton::indicator:unchecked,#CameraSettingsRadioButton_Small::indicator:unchecked{image:url('../Default/imgs/black/radiobutton_unchecked.svg');image-position:center center}.RadioButton::indicator:checked,QRadioButton::indicator:checked,#CameraSettingsRadioButton_Small::indicator:checked{image:url('../Default/imgs/black/radiobutton_checked.svg');image-position:center center}.GroupBox,QGroupBox{margin:6 0 0 0;padding:5 0}.GroupBox::title,QGroupBox::title{subcontrol-origin:margin;left:15;margin:-3 0 0 0;padding:0 3}.GroupBox::title:hover,QGroupBox::title:hover{color:#fff}.GroupBox::title:disabled,QGroupBox::title:disabled{color:rgba(0,0,0,0.466)}.GroupBox::indicator,QGroupBox::indicator{subcontrol-origin:margin;margin-top:2}.GroupBox:disabled,QGroupBox:disabled{color:rgba(0,0,0,0.466)}.Slider::groove:horizontal,QSlider::groove:horizontal{background-color:transparent;background-image:url('../Default/imgs/black/slider-groove.svg');background-position:center center;background-repeat:repeat-x;margin:0;height:20;min-height:20}.Slider::groove:horizontal:disabled,QSlider::groove:horizontal:disabled{background-image:url('../Default/imgs/black/slider-groove_disabled.svg')}.Slider::handle:horizontal,QSlider::handle:horizontal{width:10;margin:-2 0;image:url('../Default/imgs/black/slider-handle.svg')}.Slider::handle:horizontal:disabled,QSlider::handle:horizontal:disabled{image:url('../Default/imgs/black/slider-handle_disabled.svg')}#IntPairField,#DoublePairField{qproperty-LightLineColor:#484848;qproperty-LightLineEdgeColor:#484848;qproperty-DarkLineColor:#484848;qproperty-MiddleLineColor:#484848;qproperty-HandleLeftPixmap:url("../Default/imgs/black/slider-handle.svg");qproperty-HandleRightPixmap:url("../Default/imgs/black/slider-handle.svg");qproperty-HandleLeftGrayPixmap:url("../Default/imgs/black/slider-handle_disabled.svg");qproperty-HandleRightGrayPixmap:url("../Default/imgs/black/slider-handle_disabled.svg")}#DirTreeView{background-color:#949494;alternate-background-color:#949494;border:1 solid #404040;border-right:0}DvItemViewerPanel{qproperty-TextColor:#000;qproperty-AlternateBackground:#8a8a8a;qproperty-SelectedTextColor:#FFFFFF;qproperty-FolderTextColor:#071b9b;qproperty-SelectedItemBackground:#225baf}#FileBrowser DvItemViewerPanel,#SceneCast DvItemViewerPanel{background-color:#949494}#FileBrowser #castFrame,#SceneCast #castFrame{border-top:1 solid #404040;border-right:1 solid #404040;border-bottom:1 solid #404040;margin:0}#FileBrowser QToolButton,#SceneCast QToolButton{padding:1}DvDirTreeView{qproperty-TextColor:#000;qproperty-SelectedTextColor:#FFFFFF;qproperty-SelectedItemBackground:#225baf;qproperty-FolderTextColor:#071b9b;qproperty-SelectedFolderTextColor:#FFFFFF;alternate-background-color:#8a8a8a;background-color:#949494;border:1 solid #404040}#FileDoesNotExistLabel{color:#f00}#SceneCast QToolBar{border-top:1 solid #404040}#SceneCast QToolButton{margin:3 1 2 1;padding:1}#CastBrowser{border:0;margin:0}#FilmStrip QComboBox{border-radius:0;border-width:0}#FilmStrip QComboBox QAbstractItemView{background-color:#949494}#CleanupSettings #CleanupSettingsFrame{margin-top:2;margin-bottom:4}#CleanupSettings QGroupBox{margin-bottom:3}ParamsPage{qproperty-TextColor:#000}#CameraSettingsButton{padding:2}#CameraSettingsRadioButton:hover{background:none}#CameraSettingsRadioButton::indicator{border:1 solid rgba(255,255,255,0);height:18;padding:0;width:18}#CameraSettingsRadioButton::indicator:unchecked{image:url('../Default/imgs/black/lock_off.svg')}#CameraSettingsRadioButton::indicator:checked{background-color:#C34040;border-color:#772626;image:url('../Default/imgs/black/lock_on.svg')}#CameraSettingsRadioButton::indicator:checked:hover{background-color:#d57a7a;border-color:#772626}#CameraSettingsDPI{color:#000}#CameraSettingsRadioButton_Small{padding:0}#CameraSettingsRadioButton_Small::indicator{background-color:transparent;border:0;height:21;margin:0;width:11}#ForceSquaredPixelButton{height:16;border:1 solid rgba(255,255,255,0);image:url('../Default/imgs/black/fsp_unchecked.svg');padding:2;width:16;margin:0}#ForceSquaredPixelButton:checked{image:url('../Default/imgs/black/fsp_checked.svg')}#OutputSettingsLabel{color:#000}PencilTestPopup{min-height:730px;min-width:512px}#MatchLineButton{background-color:#a6a6a6}#MatchLineButton:checked{background-color:#cdcdcd;border:2 solid #225baf;border-radius:2}#LargeSizedText{font-size:17px}#StartupLabel{padding:3}#StartupLabel:hover{background:#9a9a9a}QStatusBar{background-color:#c0c0c0}QStatusBar::item{border:0}QStatusBar QLabel{background-color:#c0c0c0}QStatusBar #StatusBarLabel{background-color:#fff;padding:1 3}#TitleTxtLabel{color:#000}#StyleEditor QPushButton{margin:2 1;padding:0}#StyleEditor #TabBarContainer{margin-left:-4}#StyleEditor #bottomWidget{border-top:1 solid #404040;padding:3 2 8 3}#StyleEditor #bottomWidget QPushButton{padding:3 5}#StyleEditorTabBar::tab::first{border-left:1 solid #404040}#HexagonalColorWheel{qproperty-BGColor:#808080}#colorSlider::groove:horizontal{height:1;border-image:none}#colorSlider::handle:horizontal{width:8;margin:-8 -4}#colorSliderAddButton,#colorSliderSubButton{background:none;border-color:transparent;image-position:center center;min-height:16;padding:0;min-width:18}#colorSliderAddButton{image:url('../Default/imgs/black/scroll-right.svg')}#colorSliderSubButton{image:url('../Default/imgs/black/scroll-left.svg')}#PlainColorPageParts{border-bottom:1 solid #404040}#PlainColorPageParts QLineEdit{max-width:35}PaletteViewer DvScrollWidget QPushButton{border-top:0;margin-bottom:1;max-width:15;min-width:15}PaletteViewer DvScrollWidget #ScrollLeftButton{border-radius:0;margin-bottom:1;max-width:16;min-width:16}PaletteViewer DvScrollWidget #ScrollRightButton{border-radius:0;margin-left:1;margin-bottom:1;max-width:16;min-width:16}PaletteViewer QToolBar{background:none;border-bottom:1 solid #404040;padding:0;margin:0}PaletteViewer QToolBar::separator:horizontal{margin:0}PaletteViewer QToolBar QToolButton{margin:0 0 1 0;padding:1 0 2 0}#PageViewer{qproperty-TextColor:#000}#PaletteLockButton{border-radius:0;margin:0 0 1 1}#PaletteLockButton:checked{background-color:#C34040;border-color:#772626}#PaletteLockButton:checked:hover{background-color:#d57a7a;border-color:#772626}#WordButton{padding-right:0;padding-left:0}QDialog{background-color:#808080}QDialog #dialogButtonFrame{background-color:#767676;border-top:1 solid #404040}QDialog #dialogButtonFrame QPushButton{border-color:#525252;outline:0}QDialog #dialogButtonFrame QPushButton:focus{background-color:#B5C0D0;border-color:#485971;color:#000}QDialog #dialogButtonFrame QPushButton:focus:hover{background-color:#ced5e0}QDialog #dialogButtonFrame QPushButton:focus:pressed{background-color:#e1e1e1;border-color:#525252;color:#000}#SceneSettings QLabel{color:#000}#PreferencesPopup QListWidget{background-color:#949494;alternate-background-color:#949494;border:1 solid #404040;font-size:13px}#PreferencesPopup QListWidget::item{border:0;padding:3}#PreferencesPopup QListWidget::item:hover{background-color:#9f9f9f;color:#000;background-color:#a9a9a9}#PreferencesPopup QListWidget::item:selected{background-color:#225baf;color:#FFFFFF}#ShortcutTree{border:1 solid #404040}#ShortcutTree::item{padding:1 0}#ShortcutTree QScrollBar:vertical{width:16;margin-right:-1}ProjectPopup QLabel{color:#000}#GearButton{qproperty-icon:url('../Default/imgs/black/gear.svg')}#SubfolderButton{qproperty-icon:url('../Default/imgs/black/subfolder.svg');padding-left:6px;padding-right:6px}#SubcameraButton{qproperty-icon:url('../Default/imgs/black/subcamera.svg');padding-left:6px;padding-right:6px}SchematicViewer{qproperty-TextColor:#000;qproperty-VerticalLineColor:#646464;qproperty-LevelColumnColor:#76b776;qproperty-VectorColumnColor:#c0c07a;qproperty-ChildColumnColor:#d69adb;qproperty-FullcolorColumnColor:#8bbdc1;qproperty-FxColumnColor:#82815d;qproperty-PaletteColumnColor:#2aab9a;qproperty-MeshColumnColor:#ac78d4;qproperty-ReferenceColumnColor:#ababab;qproperty-TableColor:#a4a4bf;qproperty-ActiveCameraColor:#6ba5de;qproperty-OtherCameraColor:#8f9c9e;qproperty-GroupColor:#6698c6;qproperty-PegColor:#be8a56;qproperty-SplineColor:#7bb821;qproperty-ActiveOutputColor:#6ba5de;qproperty-OtherOutputColor:#8f9c9e;qproperty-XsheetColor:#a4a4bf;qproperty-NormalFxColor:#8d9caf;qproperty-MacroFxColor:#ae8ca5;qproperty-ImageAdjustFxColor:#9c9ab4;qproperty-LayerBlendingFxColor:#709ba5;qproperty-MatteFxColor:#ba8585;qproperty-SchematicPreviewButtonBgOnColor:#c8c864;qproperty-SchematicPreviewButtonOnImage:url('../Default/imgs/black/x_prev_eye_on.svg');qproperty-SchematicPreviewButtonBgOffColor:#ababab;qproperty-SchematicPreviewButtonOffImage:url('../Default/imgs/black/x_prev_eye_off.svg');qproperty-SchematicCamstandButtonBgOnColor:#eb906b;qproperty-SchematicCamstandButtonOnImage:url('../Default/imgs/black/x_table_view_on.svg');qproperty-SchematicCamstandButtonTranspImage:url('../Default/imgs/black/x_table_view_transp.svg');qproperty-SchematicCamstandButtonBgOffColor:#ababab;qproperty-SchematicCamstandButtonOffImage:url('../Default/imgs/black/x_table_view_off.svg')}#SchematicBottomFrame{background-color:#808080;border:0;margin:0;padding:0}#SchematicBottomFrame QToolBar::separator:horizontal{margin:0}#SchematicBottomFrame QToolBar QToolButton{padding:0;margin:2}#SchematicSceneViewer{background-color:#737373;border-bottom:1 solid #404040}#FxSettingsTabBar::tab{border-top:1 solid #404040}#FxSettingsTabBar::tab::first,#FxSettingsTabBar::tab::only-one{border-left:1 solid #404040}FxSettings QToolBar{border-top:1 solid #404040;border-right:1 solid #404040;border-left:1 solid #404040;min-height:23;padding:3 0}FxSettings QToolBar QToolBar{border:0}#FxSettingsLabel{color:#000}#FxSettingsHelpButton{background-color:#80a0dc;color:#000;padding-top:0;padding-bottom:0}#FxSettingsHelpButton:hover{background-color:#a8bee7}#ScriptConsole{font-family:'Courier New',monospace;border:0;color:#000000;padding:3}#ScriptConsole QFrame{background-color:#dcdcdc}#ScriptConsole TPanelTitleBar{background-color:#5a5a5a}#TaskSheetItemLabel{color:#000}#Tasks QToolBar{border-bottom:1 solid #404040;margin:0;padding:0}#Tasks QToolBar QToolButton{margin:2 2 3 2}#ToolBar QToolBar{padding-left:2}#ToolOptions TPanelTitleBar{border-right:1 solid #404040;border-bottom:0}#CommandBar TPanelTitleBar{border-right:1 solid #404040;border-bottom:0}IconViewField{qproperty-ThicknessPixmap:url("../Default/imgs/black/selectiontool_thickness.svg")}#EditToolLockButton{spacing:0}#EditToolLockButton:hover{background:none}#EditToolLockButton::indicator{border:1 solid rgba(255,255,255,0);height:18;padding:0;width:18}#EditToolLockButton::indicator:unchecked{image:url('../Default/imgs/black/lock_off.svg')}#EditToolLockButton::indicator:checked{background-color:#C34040;border-color:#772626;image:url('../Default/imgs/black/lock_on.svg')}#EditToolLockButton::indicator:checked:hover{background-color:#d57a7a;border-color:#772626}PopupButton::menu-indicator{border-left:0;height:17;image:url('../Default/imgs/black/combo_downarrow.svg');width:10}PopupButton::menu-indicator:hover{image:url('../Default/imgs/black/combo_downarrow.svg')}PopupButton::menu-indicator:disabled{image:url('../Default/imgs/black/combo_downarrow_disabled.svg')}#Cap,#Join{padding:0 4 0 -8;max-width:32;min-width:32}#Cap QMenu,#Join QMenu{max-width:28;min-width:28}#Cap QMenu::item,#Join QMenu::item{max-width:28;min-width:28;padding:0}QToolBar#MediumPaddingToolBar QToolButton{padding-left:3;padding-right:3}QToolBar#WidePaddingToolBar QToolButton{padding-left:6;padding-right:6}#CommandBar{margin:0;padding:0;border:0}#CommandBar::separator:horizontal{margin-right:3;margin-left:3}#expandButton:checked{background-color:transparent;border-color:transparent;color:#000}#expandButton:checked:hover{background-color:#bbb;border-color:#525252}#expandButton:checked:pressed{background-color:#e1e1e1;border-color:#525252}#ComboViewerPanel Toolbar{border-bottom:1 solid #404040}#ComboViewerPanel Toolbar::separator:horizontal{margin:0 0 0 2}#ComboViewerPanel Toolbar QToolButton{margin:2 0 3 2}#ComboViewerToolOptions{border-bottom:1 solid #404040}#ComboViewer #ToolBarContainer,#ViewerPanel #ToolBarContainer,FlipBook #ToolBarContainer{background-color:transparent;border-top:2 solid #404040;border-bottom:1 solid #404040;padding-right:-1}#flipCustomize{margin-left:3}#flipCustomize::menu-button{background-color:transparent;width:35}#flipCustomize::menu-arrow{image:none}QToolBar#FlipConsolePlayToolBar::separator:horizontal{margin:0 3}QToolBar#FlipConsolePlayToolBar QToolButton{margin-top:2;margin-bottom:2;height:16;padding-left:1;padding-right:1}#ViewerFpsSlider{background-color:transparent;background-image:url('../Default/imgs/black/slider-groove.svg');background-position:center center;background-repeat:repeat-x;border:0;height:19;margin:0 3 0 37;max-width:300;min-width:0}#ViewerFpsSlider::sub-line:horizontal{subcontrol-origin:absolute;background-color:#a6a6a6;border:1 solid #525252;border-top-left-radius:2;border-bottom-left-radius:2;height:16;left:-33;width:14}#ViewerFpsSlider::add-line:horizontal{subcontrol-position:left;background-color:#a6a6a6;border:1 solid #525252;border-top-right-radius:2;border-bottom-right-radius:2;left:18;height:16;image-position:center center;width:13}#ViewerFpsSlider::handle::horizontal{background-color:#a6a6a6;border:1 solid #404040;border-radius:2;margin:2 0 3 0;min-width:9;width:9;max-width:9}FlipSlider{qproperty-PBHeight:15;qproperty-PBOverlay:url('../Default/imgs/black/flipslider.svg');qproperty-PBColorMarginLeft:1;qproperty-PBColorMarginTop:2;qproperty-PBColorMarginRight:1;qproperty-PBColorMarginBottom:2;qproperty-PBMarker:url('../Default/imgs/black/flipmarker.svg');qproperty-PBMarkerMarginLeft:3;qproperty-PBMarkerMarginRight:3;qproperty-notStartedColor:#8b2525;qproperty-startedColor:#00a808;qproperty-baseColor:#676767;qproperty-finishedColor:#676767}Ruler{qproperty-ParentBGColor:#c0c0c0;qproperty-ScaleColor:#000}#RulerToolOptionValues{color:#000}#xsheetArea,#ScrollArea{background-color:#6c6c6c;border:0}#xsheetScrollArea{border:0}#cornerWidget QToolButton{padding:0}#xsheetColumnAreaMenu_Preview{background-color:#E6E678}#xsheetColumnAreaMenu_Lock{background-color:#F5F5F5}#xsheetColumnAreaMenu_Camstand{background-color:#FFA480}#xsheetColumnAreaMenu_Preview,#xsheetColumnAreaMenu_Lock,#xsheetColumnAreaMenu_Camstand{color:#000}#noteTextEdit{color:#000}XsheetViewer{qproperty-TextColor:#000;qproperty-BGColor:#929292;qproperty-LightLineColor:#616161;qproperty-MarkerLineColor:#000;qproperty-VerticalLineColor:#646464;qproperty-VerticalLineHeadColor:#393939;qproperty-PreviewFrameTextColor:#000eb6;qproperty-CurrentRowBgColor:#B5C0D0;qproperty-OnionSkinAreaBgColor:#858585;qproperty-EmptyColumnHeadColor:#808080;qproperty-SelectedColumnTextColor:#9e0000;qproperty-EmptyCellColor:#7c7c7c;qproperty-NotEmptyColumnColor:#8a8a8a;qproperty-SelectedEmptyCellColor:#b3b3b3;qproperty-LevelColumnColor:#76b776;qproperty-LevelColumnBorderColor:#496549;qproperty-SelectedLevelColumnColor:#9bc59b;qproperty-VectorColumnColor:#c0c07a;qproperty-VectorColumnBorderColor:#71714a;qproperty-SelectedVectorColumnColor:#cdcda0;qproperty-ChildColumnColor:#d69adb;qproperty-ChildColumnBorderColor:#9c53a3;qproperty-SelectedChildColumnColor:#e3c2e6;qproperty-FullcolorColumnColor:#8bbdc1;qproperty-FullcolorColumnBorderColor:#577476;qproperty-SelectedFullcolorColumnColor:#afcdd0;qproperty-FxColumnColor:#82815d;qproperty-FxColumnBorderColor:#404039;qproperty-SelectedFxColumnColor:#97967b;qproperty-ReferenceColumnColor:#ababab;qproperty-ReferenceColumnBorderColor:#6b6b6b;qproperty-SelectedReferenceColumnColor:#c4c4c4;qproperty-PaletteColumnColor:#2aab9a;qproperty-PaletteColumnBorderColor:#173e39;qproperty-SelectedPaletteColumnColor:#40c8b6;qproperty-MeshColumnColor:#ac78d4;qproperty-MeshColumnBorderColor:#6b418c;qproperty-SelectedMeshColumnColor:#c3a2dd;qproperty-SoundTextColumnColor:#c8c8c8;qproperty-SoundTextColumnBorderColor:#8c8c8c;qproperty-SelectedSoundTextColumnColor:#e2e2e2;qproperty-SoundColumnColor:#acba82;qproperty-SoundColumnBorderColor:#656b51;qproperty-SelectedSoundColumnColor:#c0c9a6;qproperty-SoundColumnHlColor:#f5ffe6;qproperty-SoundColumnTrackColor:#5a642d;qproperty-ColumnHeadPastelizer:#fff;qproperty-SelectedColumnHead:#bed2f0;qproperty-LightLightBGColor:#808080;qproperty-LightBGColor:#f0f0f0;qproperty-DarkBGColor:#e1e1e1;qproperty-DarkLineColor:#969696;qproperty-XsheetColumnNameBgColor:rgba(0,0,0,0);qproperty-XsheetDragBarHighlightColor:rgba(255,255,255,0.5);qproperty-XsheetPreviewButtonBgOnColor:#c8c864;qproperty-XsheetPreviewButtonOnImage:url('../Default/imgs/black/x_prev_eye_on.svg');qproperty-XsheetPreviewButtonBgOffColor:rgba(255,255,255,0);qproperty-XsheetPreviewButtonOffImage:url('../Default/imgs/black/x_prev_eye_off.svg');qproperty-XsheetCamstandButtonBgOnColor:#eb906b;qproperty-XsheetCamstandButtonOnImage:url('../Default/imgs/black/x_table_view_on.svg');qproperty-XsheetCamstandButtonTranspImage:url('../Default/imgs/black/x_table_view_transp.svg');qproperty-XsheetCamstandButtonBgOffColor:rgba(255,255,255,0);qproperty-XsheetCamstandButtonOffImage:url('../Default/imgs/black/x_table_view_off.svg');qproperty-XsheetLockButtonBgOnColor:rgba(255,255,255,0.3);qproperty-XsheetLockButtonOnImage:url('../Default/imgs/black/x_lock_on.svg');qproperty-XsheetLockButtonBgOffColor:rgba(255,255,255,0);qproperty-XsheetLockButtonOffImage:url('../Default/imgs/black/x_lock_off.svg');qproperty-XsheetConfigButtonBgColor:rgba(255,255,255,0);qproperty-XsheetConfigButtonImage:url('../Default/imgs/black/x_config.svg');qproperty-TimelinePreviewButtonBgOnColor:rgba(255,255,255,0);qproperty-TimelinePreviewButtonOnImage:url('../Default/imgs/black/timeline_toggle_on.svg');qproperty-TimelinePreviewButtonBgOffColor:rgba(255,255,255,0);qproperty-TimelinePreviewButtonOffImage:url('../Default/imgs/black/timeline_toggle_off.svg');qproperty-TimelineCamstandButtonBgOnColor:rgba(255,255,255,0);qproperty-TimelineCamstandButtonOnImage:url('../Default/imgs/black/timeline_toggle_on.svg');qproperty-TimelineCamstandButtonTranspImage:url('../Default/imgs/black/timeline_toggle_transp.svg');qproperty-TimelineCamstandButtonBgOffColor:rgba(255,255,255,0);qproperty-TimelineCamstandButtonOffImage:url('../Default/imgs/black/timeline_toggle_off.svg');qproperty-TimelineLockButtonBgOnColor:rgba(255,255,255,0);qproperty-TimelineLockButtonOnImage:url('../Default/imgs/black/timeline_toggle_on.svg');qproperty-TimelineLockButtonBgOffColor:rgba(255,255,255,0);qproperty-TimelineLockButtonOffImage:url('../Default/imgs/black/timeline_toggle_off.svg');qproperty-TimelineConfigButtonBgColor:rgba(255,255,255,0);qproperty-TimelineConfigButtonImage:url('../Default/imgs/black/timeline_config.svg');qproperty-LayerHeaderPreviewImage:url('../Default/imgs/black/layer_header_prev_eye.svg');qproperty-LayerHeaderPreviewOverImage:url('../Default/imgs/black/layer_header_prev_eye_over.svg');qproperty-LayerHeaderCamstandImage:url('../Default/imgs/black/layer_header_table_view.svg');qproperty-LayerHeaderCamstandOverImage:url('../Default/imgs/black/layer_header_table_view_over.svg');qproperty-LayerHeaderLockImage:url('../Default/imgs/black/lock_on.svg');qproperty-LayerHeaderLockOverImage:url('../Default/imgs/black/lock_on_over.svg')}#XSheetToolbar{margin:0;padding:0;border:0}#XSheetToolbar QToolButton{padding:0;margin:4 1;min-height:19;height:19}#XSheetToolbar::separator:horizontal{margin:0 4}#FunctionEditor QToolBar{border-bottom:1 solid #404040}#FunctionEditor QToolBar QToolBar{border:0}#FunctionEditor QToolBar QLabel{margin-left:5}#FunctionEditor QToolBar QToolButton{height:18}#FunctionEditorTree{border-top:1 solid #404040}FunctionTreeView{qproperty-TextColor:#000;qproperty-CurrentTextColor:#a70000}FunctionPanel{qproperty-BGColor:#5a5a5a;qproperty-ValueLineColor:#4d4d4d;qproperty-FrameLineColor:#4d4d4d;qproperty-OtherCurvesColor:#c5c5c5;qproperty-RulerBackground:#676767;qproperty-TextColor:#000;qproperty-SubColor:#fff;qproperty-SelectedColor:#fcae06}SpreadsheetViewer{qproperty-LightLightBGColor:#808080;qproperty-CurrentRowBgColor:#B5C0D0;qproperty-LightLineColor:#616161;qproperty-MarkerLineColor:#000;qproperty-BGColor:#8a8a8a;qproperty-VerticalLineColor:#646464;qproperty-KeyFrameColor:#db8b36;qproperty-KeyFrameBorderColor:#7b4a16;qproperty-SelectedKeyFrameColor:#dea466;qproperty-InBetweenColor:#c2c2b0;qproperty-InBetweenBorderColor:#636356;qproperty-SelectedInBetweenColor:#d6d6cf;qproperty-SelectedEmptyColor:#b3b3b3;qproperty-SelectedSceneRangeEmptyColor:#d2d2d2;qproperty-TextColor:#000;qproperty-ColumnHeaderBorderColor:#393939;qproperty-SelectedColumnTextColor:#9e0000}#ExpressionField{background-color:#fff;border:1 solid #6b6b6b;margin:0}#FunctionSegmentViewerLinkButton{background-image:url('../Default/imgs/black/segment_unlinked.svg');background-repeat:no-repeat}#FunctionSegmentViewerLinkButton:hover{background-repeat:no-repeat}#FunctionSegmentViewerLinkButton:checked{background-image:url('../Default/imgs/black/segment_linked.svg');background-repeat:no-repeat}#FunctionSegmentViewerLinkButton:disabled{background-image:url('../Default/imgs/black/segment_disabled.svg');background-repeat:no-repeat} \ No newline at end of file diff --git a/toonz/sources/CMakeLists.txt b/toonz/sources/CMakeLists.txt index fe1d8b75..d9b0c34c 100644 --- a/toonz/sources/CMakeLists.txt +++ b/toonz/sources/CMakeLists.txt @@ -203,7 +203,7 @@ elseif(BUILD_ENV_UNIXLIKE) find_package(Qt5Widgets) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpermissive -lstdc++ -std=c++11") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lstdc++ -std=c++11") endif() add_definitions( diff --git a/toonz/sources/common/expressions/ttokenizer.cpp b/toonz/sources/common/expressions/ttokenizer.cpp index 1c39fe16..d6b23723 100644 --- a/toonz/sources/common/expressions/ttokenizer.cpp +++ b/toonz/sources/common/expressions/ttokenizer.cpp @@ -101,8 +101,7 @@ void Tokenizer::setBuffer(std::string buffer) { const std::string ss[] = {"==", "!=", ">=", "<=", "||", "&&"}; - const int m = tArrayCount(ss); - if (std::find(ss, ss + m, token) != ss + m) + if (std::find(std::begin(ss), std::end(ss), token) != std::end(ss)) i += 2; else token = std::string(1, s[i++]); @@ -167,4 +166,4 @@ Token Tokenizer::getTokenFromPos(int pos) const { //=================================================================== -} // TSyntax +} // namespace TSyntax diff --git a/toonz/sources/common/tfx/tmacrofx.cpp b/toonz/sources/common/tfx/tmacrofx.cpp index c643533b..27595457 100644 --- a/toonz/sources/common/tfx/tmacrofx.cpp +++ b/toonz/sources/common/tfx/tmacrofx.cpp @@ -492,6 +492,9 @@ void TMacroFx::loadData(TIStream &is) { m_fxs.push_back(fx); } } + // collecting params just after loading nodes since they may need on + // loading "super" tag in case it is linked with another macro fx + collectParams(this); } else if (tagName == "ports") { int i = 0; while (is.matchTag(tagName)) { @@ -533,7 +536,6 @@ void TMacroFx::loadData(TIStream &is) { throw TException("unexpected tag " + tagName); is.closeChild(); } - collectParams(this); } //-------------------------------------------------- diff --git a/toonz/sources/common/tfx/tpassivecachemanager.cpp b/toonz/sources/common/tfx/tpassivecachemanager.cpp index 26f427b5..c2db7110 100644 --- a/toonz/sources/common/tfx/tpassivecachemanager.cpp +++ b/toonz/sources/common/tfx/tpassivecachemanager.cpp @@ -312,21 +312,6 @@ public: return result; } - Iterator find(const RowKey &r, const ColKey &c) { - Iterator result(this); - result.m_rowIt = m_table.find(r); - if (result.m_rowIt == m_table.end()) return; - result.m_it = result.m_rowIt->second.find(c); - if (result.m_it == result.m_rowIt->second.end()) - result.m_rowIt = m_table.end(); - return result; - } - - Iterator erase(const RowKey &r, const ColKey &c) { - Iterator it(find(r, c)); - return erase(it); - } - Iterator erase(const Iterator &it) { Iterator result(it); Row &row = it.m_rowIt->second; diff --git a/toonz/sources/common/tiio/tiio_jpg_exif.cpp b/toonz/sources/common/tiio/tiio_jpg_exif.cpp index c7613dd8..36774b84 100644 --- a/toonz/sources/common/tiio/tiio_jpg_exif.cpp +++ b/toonz/sources/common/tiio/tiio_jpg_exif.cpp @@ -135,7 +135,7 @@ const int TAG_IMAGE_UNIQUE_ID = 0xA420; typedef struct { unsigned short Tag; - char *Desc; + const char *Desc; } TagTable_t; const TagTable_t TagTable[] = { @@ -253,7 +253,7 @@ const int TAG_TABLE_SIZE = (sizeof(TagTable) / sizeof(TagTable_t)); const int TRUE = 1; const int FALSE = 0; -} +} // namespace //-------------------------------------------------------------------------- // Convert a 16 bit unsigned value from file's native byte order @@ -633,7 +633,7 @@ void JpgExifReader::ProcessExifDir(unsigned char *DirStart, break; case FMT_UNDEFINED: - // Undefined is typically an ascii string. + // Undefined is typically an ascii string. case FMT_STRING: // String arrays printed without function call (different from int @@ -683,7 +683,7 @@ void JpgExifReader::ProcessExifDir(unsigned char *DirStart, case TAG_DATETIME_ORIGINAL: // If we get a DATETIME_ORIGINAL, we use that one. strncpy(ImageInfo.DateTime, (char *)ValuePtr, 19); - // Fallthru... + // Fallthru... case TAG_DATETIME_DIGITIZED: case TAG_DATETIME: @@ -737,7 +737,7 @@ void JpgExifReader::ProcessExifDir(unsigned char *DirStart, // Copy the comment { - int msiz = ExifLength - (ValuePtr - OffsetBase); + int msiz = ExifLength - (ValuePtr - OffsetBase); if (msiz > ByteCount) msiz = ByteCount; if (msiz > MAX_COMMENT_SIZE - 1) msiz = MAX_COMMENT_SIZE - 1; if (msiz > 5 && memcmp(ValuePtr, "ASCII", 5) == 0) { diff --git a/toonz/sources/common/tparam/tspectrumparam.cpp b/toonz/sources/common/tparam/tspectrumparam.cpp index b3f0a828..f0d502dd 100644 --- a/toonz/sources/common/tparam/tspectrumparam.cpp +++ b/toonz/sources/common/tparam/tspectrumparam.cpp @@ -126,11 +126,11 @@ void TSpectrumParam::removeObserver(TParamObserver *obs) { //--------------------------------------------------------- -TSpectrumParam::TSpectrumParam(int keyCount, TSpectrum::ColorKey keys[]) +TSpectrumParam::TSpectrumParam(std::vector const &keys) : m_imp(new TSpectrumParamImp(this)) { - for (int i = 0; i < keyCount; i++) { - double v = keys[i].first; - TPixel32 pix = keys[i].second; + for (auto const &key : keys) { + double v = key.first; + TPixel32 pix = key.second; TDoubleParamP dp(v); TPixelParamP pp(pix); pp->enableMatte(m_imp->m_isMatteEnabled); diff --git a/toonz/sources/common/tvrender/tglregions.cpp b/toonz/sources/common/tvrender/tglregions.cpp index 8ae91396..86a4073a 100644 --- a/toonz/sources/common/tvrender/tglregions.cpp +++ b/toonz/sources/common/tvrender/tglregions.cpp @@ -135,7 +135,7 @@ void drawControlPoints(const TVectorRenderData &rd, TStroke *stroke, //----------------------------------------------------------------------------- -void drawArrows(TStroke *stroke, bool onlyFirstPoint) { +static void drawArrows(TStroke *stroke, bool onlyFirstPoint) { double length = stroke->getLength(0.0, 1.0); int points = length / 20; if (points < 2) points += 1; @@ -179,7 +179,8 @@ void drawArrows(TStroke *stroke, bool onlyFirstPoint) { //----------------------------------------------------------------------------- // Used for Guided Drawing -void drawFirstControlPoint(const TVectorRenderData &rd, TStroke *stroke) { +static void drawFirstControlPoint(const TVectorRenderData &rd, + TStroke *stroke) { TPointD p = stroke->getPoint(0.0); double length = stroke->getLength(0.0, 1.0); int msecs = QTime::currentTime().msec(); @@ -276,8 +277,8 @@ void tglDraw(const TVectorRenderData &rd, TRegion *r, bool pushAttribs) { } else { visible = false; for (j = 0; j < colorCount && !visible; j++) { - TPixel32 color = style->getColorParamValue(j); - if (rd.m_cf) color = (*(rd.m_cf))(color); + TPixel32 color = style->getColorParamValue(j); + if (rd.m_cf) color = (*(rd.m_cf))(color); if (color.m != 0) visible = true; } } @@ -434,7 +435,7 @@ bool isOThick(const TStroke *s) { if (s->getControlPoint(i).thick != 0) return false; return true; } -} +} // namespace void tglDraw(const TVectorRenderData &rd, const TStroke *s, bool pushAttribs) { assert(s); @@ -554,8 +555,8 @@ static void tglDoDraw(const TVectorRenderData &rd, TRegion *r) { else { visible = false; for (int j = 0; j < colorCount && !visible; j++) { - TPixel32 color = style->getColorParamValue(j); - if (rd.m_cf) color = (*(rd.m_cf))(color); + TPixel32 color = style->getColorParamValue(j); + if (rd.m_cf) color = (*(rd.m_cf))(color); if (color.m != 0) visible = true; } } @@ -584,8 +585,8 @@ static bool tglDoDraw(const TVectorRenderData &rd, const TStroke *s) { else { visible = false; for (int j = 0; j < style->getColorParamCount() && !visible; j++) { - TPixel32 color = style->getColorParamValue(j); - if (rd.m_cf) color = (*(rd.m_cf))(color); + TPixel32 color = style->getColorParamValue(j); + if (rd.m_cf) color = (*(rd.m_cf))(color); if (color.m != 0) visible = true; } } @@ -676,7 +677,7 @@ rdRegions.m_alphaChannel = rdRegions.m_antiAliasing = false;*/ } } } -} +} // namespace //------------------------------------------------------------------------------------ diff --git a/toonz/sources/common/tvrender/tpalette.cpp b/toonz/sources/common/tvrender/tpalette.cpp index fd5735a1..e9fc009d 100644 --- a/toonz/sources/common/tvrender/tpalette.cpp +++ b/toonz/sources/common/tvrender/tpalette.cpp @@ -193,7 +193,8 @@ TPalette::TPalette() , m_mutex(QMutex::Recursive) , m_isLocked(false) , m_askOverwriteFlag(false) - , m_shortcutScopeIndex(0) { + , m_shortcutScopeIndex(0) + , m_currentStyleId(1) { QString tempName(QObject::tr("colors")); std::wstring pageName = tempName.toStdWString(); Page *page = addPage(pageName); diff --git a/toonz/sources/common/twain/ttwain_stateX.c b/toonz/sources/common/twain/ttwain_stateX.c index 8295d7a4..75c820d5 100644 --- a/toonz/sources/common/twain/ttwain_stateX.c +++ b/toonz/sources/common/twain/ttwain_stateX.c @@ -4,6 +4,8 @@ extern "C" { #endif +#include "ttwain_statePD.h" + int TTWAIN_LoadSourceManagerPD(void) { return 0; } int TTWAIN_UnloadSourceManagerPD(void) { return 1; } diff --git a/toonz/sources/include/tcommon.h b/toonz/sources/include/tcommon.h index d08803a1..9ab7690d 100644 --- a/toonz/sources/include/tcommon.h +++ b/toonz/sources/include/tcommon.h @@ -168,8 +168,6 @@ inline std::ostream &operator<<(std::ostream &out, const std::string &s) { return out << s.c_str(); } -#define tArrayCount(ARRAY) (sizeof(ARRAY) / sizeof(ARRAY[0])) - const std::string styleNameEasyInputWordsFileName = "stylename_easyinput.ini"; #endif //__T_COMMON_INCLUDED diff --git a/toonz/sources/include/tfxattributes.h b/toonz/sources/include/tfxattributes.h index 224a9442..92245cb8 100644 --- a/toonz/sources/include/tfxattributes.h +++ b/toonz/sources/include/tfxattributes.h @@ -5,6 +5,7 @@ #include "tgeometry.h" #include +#include #undef DVAPI #undef DVVAR diff --git a/toonz/sources/include/tools/tooloptions.h b/toonz/sources/include/tools/tooloptions.h index c5b503d0..d1ee09ad 100644 --- a/toonz/sources/include/tools/tooloptions.h +++ b/toonz/sources/include/tools/tooloptions.h @@ -474,6 +474,21 @@ protected slots: void onColorModeChanged(int); }; +//============================================================================= +// +// FullColorFillToolOptionsBox +// +//============================================================================= + +class FullColorFillToolOptionsBox final : public ToolOptionsBox { + Q_OBJECT + +public: + FullColorFillToolOptionsBox(QWidget *parent, TTool *tool, + TPaletteHandle *pltHandle, + ToolHandle *toolHandle); +}; + //============================================================================= // // FillToolOptionsBox @@ -700,6 +715,48 @@ protected slots: void updateColors(); }; +//============================================================================= +// +// ZoomToolOptionsBox +// +//============================================================================= + +class ZoomToolOptionsBox final : public ToolOptionsBox { + Q_OBJECT + +public: + ZoomToolOptionsBox(QWidget *parent, TTool *tool, TPaletteHandle *pltHandle, + ToolHandle *toolHandle); +}; + +//============================================================================= +// +// RotateToolOptionsBox +// +//============================================================================= + +class RotateToolOptionsBox final : public ToolOptionsBox { + Q_OBJECT + +public: + RotateToolOptionsBox(QWidget *parent, TTool *tool, TPaletteHandle *pltHandle, + ToolHandle *toolHandle); +}; + +//============================================================================= +// +// HandToolOptionsBox +// +//============================================================================= + +class HandToolOptionsBox final : public ToolOptionsBox { + Q_OBJECT + +public: + HandToolOptionsBox(QWidget *parent, TTool *tool, TPaletteHandle *pltHandle, + ToolHandle *toolHandle); +}; + //----------------------------------------------------------------------------- class DVAPI ToolOptions final : public QFrame { diff --git a/toonz/sources/include/toonz/doubleparamcmd.h b/toonz/sources/include/toonz/doubleparamcmd.h index acbea51a..99f15a85 100644 --- a/toonz/sources/include/toonz/doubleparamcmd.h +++ b/toonz/sources/include/toonz/doubleparamcmd.h @@ -18,6 +18,7 @@ #endif class KeyframesUndo; +class TSceneHandle; class DVAPI KeyframeSetter { TDoubleParamP m_param; @@ -101,7 +102,8 @@ public: } static void removeKeyframeAt(TDoubleParam *curve, double frame); - static void enableCycle(TDoubleParam *curve, bool enabled); + static void enableCycle(TDoubleParam *curve, bool enabled, + TSceneHandle *sceneHandle = nullptr); }; #endif diff --git a/toonz/sources/include/toonz/fill.h b/toonz/sources/include/toonz/fill.h index 5a4eece2..2d62faf4 100644 --- a/toonz/sources/include/toonz/fill.h +++ b/toonz/sources/include/toonz/fill.h @@ -81,6 +81,9 @@ void DVAPI rectFillInk(const TRasterCM32P &ras, const TRect &r, int color); void DVAPI fillautoInks(TRasterCM32P &r, TRect &rect, const TRasterCM32P &rbefore, TPalette *plt); +void DVAPI fullColorFill(const TRaster32P &ras, const FillParameters ¶ms, + TTileSaverFullColor *saver = 0); + //============================================================================= //! The class AreaFiller allows to fill a raster area, delimited by rect or //! spline. diff --git a/toonz/sources/include/toonz/tapplication.h b/toonz/sources/include/toonz/tapplication.h index 33863762..0948e3cd 100644 --- a/toonz/sources/include/toonz/tapplication.h +++ b/toonz/sources/include/toonz/tapplication.h @@ -49,7 +49,8 @@ public: // Current Palette (PaletteController) methods virtual TColorStyle *getCurrentLevelStyle() const = 0; virtual int getCurrentLevelStyleIndex() const = 0; - virtual void setCurrentLevelStyleIndex(int index) = 0; + virtual void setCurrentLevelStyleIndex(int index, + bool forceUpdate = false) = 0; }; #endif // TAPPLICATION_H diff --git a/toonz/sources/include/toonz/tpalettehandle.h b/toonz/sources/include/toonz/tpalettehandle.h index 30539ff0..5539e361 100644 --- a/toonz/sources/include/toonz/tpalettehandle.h +++ b/toonz/sources/include/toonz/tpalettehandle.h @@ -44,7 +44,7 @@ public: TColorStyle *getStyle() const; - void setPalette(TPalette *palette, int styleIndex = 1); + void setPalette(TPalette *palette, int styleIndex = -1); void setStyleIndex(int index, bool forceEmit = false); diff --git a/toonz/sources/include/toonz/ttileset.h b/toonz/sources/include/toonz/ttileset.h index e5dfac93..c2cefcd6 100644 --- a/toonz/sources/include/toonz/ttileset.h +++ b/toonz/sources/include/toonz/ttileset.h @@ -146,6 +146,7 @@ public: void add(const TRasterP &ras, TRect rect) override; const Tile *getTile(int index) const; + Tile *editTile(int index) const; TTileSetFullColor *clone() const override; }; diff --git a/toonz/sources/include/toonzqt/dvdialog.h b/toonz/sources/include/toonzqt/dvdialog.h index 8f1f49c4..f745ca6b 100644 --- a/toonz/sources/include/toonzqt/dvdialog.h +++ b/toonz/sources/include/toonzqt/dvdialog.h @@ -170,7 +170,6 @@ protected: class DVAPI Dialog : public QDialog { Q_OBJECT - static QSettings *m_settings; // If the dialog has button then is modal too. bool m_hasButton; QString m_name; @@ -183,7 +182,6 @@ protected: QHBoxLayout *m_buttonLayout; QList m_labelList; void resizeEvent(QResizeEvent *e) override; - void moveEvent(QMoveEvent *e) override; public: QVBoxLayout *m_topLayout; diff --git a/toonz/sources/include/toonzqt/functionsegmentviewer.h b/toonz/sources/include/toonzqt/functionsegmentviewer.h index 59afd79f..c05ddcba 100644 --- a/toonz/sources/include/toonzqt/functionsegmentviewer.h +++ b/toonz/sources/include/toonzqt/functionsegmentviewer.h @@ -3,6 +3,7 @@ #ifndef FUNCTION_SEGMENT_VIEWER_H #define FUNCTION_SEGMENT_VIEWER_H +#include #include #include @@ -31,7 +32,7 @@ namespace DVGui { class MeasuredDoubleLineEdit; class ExpressionField; class FileField; -} +} // namespace DVGui //----------------------------------------------------------------------------- @@ -51,8 +52,8 @@ class FunctionSegmentViewer final : public QFrame, public TParamObserver { DVGui::LineEdit *m_stepFld; QStackedWidget *m_parametersPanel; - FunctionSegmentPage *m_pages[9]; - int m_typeId[9]; + std::array m_pages; + std::array m_typeId; FunctionSheet *m_sheet; TXsheetHandle *m_xshHandle; diff --git a/toonz/sources/include/toonzqt/functionsheet.h b/toonz/sources/include/toonzqt/functionsheet.h index 5eabfc59..7bf4c0d8 100644 --- a/toonz/sources/include/toonzqt/functionsheet.h +++ b/toonz/sources/include/toonzqt/functionsheet.h @@ -124,6 +124,11 @@ public: int getColumnIndexByCurve(TDoubleParam *param) const; bool anyWidgetHasFocus(); + // Obtains a pointer to the stage object containing the + // parameter of specified column. Returns nullptr for + // fx parameter columns. + TStageObject *getStageObject(int column); + protected: void showEvent(QShowEvent *e) override; void hideEvent(QHideEvent *e) override; diff --git a/toonz/sources/include/toonzqt/functiontreeviewer.h b/toonz/sources/include/toonzqt/functiontreeviewer.h index 39967928..4fe23775 100644 --- a/toonz/sources/include/toonzqt/functiontreeviewer.h +++ b/toonz/sources/include/toonzqt/functiontreeviewer.h @@ -336,6 +336,31 @@ public: void refresh() override; }; +//============================================================================= + +class StageObjectChannelGroup final : public FunctionTreeModel::ChannelGroup { +public: + TStageObject *m_stageObject; //!< (not owned) Referenced stage object + FunctionTreeModel::ChannelGroup + *m_plasticGroup; //!< (not owned) Eventual plastic channels group + +public: + StageObjectChannelGroup(TStageObject *pegbar); + ~StageObjectChannelGroup(); + + QString getShortName() const override; + QString getLongName() const override; + + QString getIdName() const override; + + void *getInternalPointer() const override { + return static_cast(m_stageObject); + } + + TStageObject *getStageObject() const { return m_stageObject; } + QVariant data(int role) const override; +}; + //***************************************************************************************** // FunctionTreeView declaration //***************************************************************************************** diff --git a/toonz/sources/include/toonzqt/functionviewer.h b/toonz/sources/include/toonzqt/functionviewer.h index 413ab58e..632cb1eb 100644 --- a/toonz/sources/include/toonzqt/functionviewer.h +++ b/toonz/sources/include/toonzqt/functionviewer.h @@ -120,6 +120,8 @@ public: void clearFocusColumnsAndGraph(); bool columnsOrGraphHasFocus(); void setSceneHandle(TSceneHandle *sceneHandle); + TSceneHandle *getSceneHandle() const { return m_sceneHandle; } + // SaveLoadQSettings virtual void save(QSettings &settings) const override; virtual void load(QSettings &settings) override; diff --git a/toonz/sources/include/toonzqt/fxschematicnode.h b/toonz/sources/include/toonzqt/fxschematicnode.h index f0d7a7af..15385236 100644 --- a/toonz/sources/include/toonzqt/fxschematicnode.h +++ b/toonz/sources/include/toonzqt/fxschematicnode.h @@ -365,6 +365,7 @@ public: protected: void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *me) override; + void mousePressEvent(QGraphicsSceneMouseEvent *me) override; }; //***************************************************** @@ -384,6 +385,7 @@ public: protected: void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *me) override; + void mousePressEvent(QGraphicsSceneMouseEvent *me) override; }; //***************************************************** @@ -408,6 +410,7 @@ public: protected: void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *me) override; + void mousePressEvent(QGraphicsSceneMouseEvent *me) override; protected slots: @@ -441,6 +444,7 @@ public: protected: void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *me) override; + void mousePressEvent(QGraphicsSceneMouseEvent *me) override; protected slots: @@ -479,6 +483,7 @@ public: protected: void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *me) override; + void mousePressEvent(QGraphicsSceneMouseEvent *me) override; private: void renameObject(const TStageObjectId &id, std::string name); @@ -517,6 +522,7 @@ public: protected: void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *me) override; + void mousePressEvent(QGraphicsSceneMouseEvent *me) override; protected slots: @@ -575,6 +581,7 @@ public: protected: void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *me) override; + void mousePressEvent(QGraphicsSceneMouseEvent *me) override; QPointF computePos() const; protected slots: diff --git a/toonz/sources/include/toonzqt/fxsettings.h b/toonz/sources/include/toonzqt/fxsettings.h index 64386c0a..5fa06196 100644 --- a/toonz/sources/include/toonzqt/fxsettings.h +++ b/toonz/sources/include/toonzqt/fxsettings.h @@ -190,6 +190,7 @@ class DVAPI ParamViewer final : public QFrame { Q_OBJECT TFxP m_fx; + TFxP m_actualFx; QStackedWidget *m_tablePageSet; QMap m_tableFxIndex; @@ -253,6 +254,7 @@ class DVAPI FxSettings final : public QSplitter { bool m_isCameraModeView; int m_container_height; + int m_container_width; public: FxSettings(QWidget *parent, const TPixel32 &checkCol1, diff --git a/toonz/sources/include/toonzqt/imageutils.h b/toonz/sources/include/toonzqt/imageutils.h index 863e0880..ce355d90 100644 --- a/toonz/sources/include/toonzqt/imageutils.h +++ b/toonz/sources/include/toonzqt/imageutils.h @@ -101,7 +101,7 @@ void DVAPI convert( false /*-- ConvertPopup での指定に合わせて、[レベル名].[フレーム番号].[拡張子]のうち、 [レベル名]と[フレーム番号]の間のドットを消す。 --*/ - ); //!< Converts a saved level to fullcolor, and saves the result. +); //!< Converts a saved level to fullcolor, and saves the result. void DVAPI convertNaa2Tlv( const TFilePath &source, //!< Level path to convert from. @@ -124,7 +124,7 @@ void DVAPI convertOldLevel2Tlv( const TFrameId &to, //!< Last source frame to convert. FrameTaskNotifier *frameNotifier //!< Observer class for frame success notifications. - ); +); double DVAPI getQuantizedZoomFactor(double zf, bool forward); @@ -140,8 +140,9 @@ void DVAPI assignFillingInformation(TVectorImage &vi, const std::vector ®s); void DVAPI getStrokeStyleInformationInArea( - const TVectorImageP &vi, std::vector> - &strokesInfo, // pair:strokeIndex, styleIndex + const TVectorImageP &vi, + std::vector> + &strokesInfo, // pair:strokeIndex, styleIndex const TRectD &area); //********************************************************************************************* @@ -221,7 +222,7 @@ public: protected: virtual bool zoom( bool zoomin, - bool resetZoom) = 0; //!< Handler for zoom commands. Required. + bool resetView) = 0; //!< Handler for zoom commands. Required. virtual bool fit() { return false; } //!< Handler for 'fit to image' commands. @@ -234,6 +235,15 @@ protected: virtual bool setFlipY() { return false; } //!< Handler for 'flip viewer horizontally' commands. + virtual bool resetZoom() { + return false; + } //!< Handler for 'reset zoom' commands. + virtual bool resetRotation() { + return false; + } //!< Handler for 'reset rotation' commands. + virtual bool resetPosition() { + return false; + } //!< Handler for 'reset position' commands. virtual bool toggleFullScreen( bool quit = false) //! Handler for 'toggle fullscreen' commands. { diff --git a/toonz/sources/include/toonzqt/menubarcommand.h b/toonz/sources/include/toonzqt/menubarcommand.h index eb30a072..a89fd7a6 100644 --- a/toonz/sources/include/toonzqt/menubarcommand.h +++ b/toonz/sources/include/toonzqt/menubarcommand.h @@ -60,7 +60,8 @@ enum CommandType { ToolModifierCommandType, ZoomCommandType, MiscCommandType, - MenuCommandType + MenuCommandType, + VisualizationButtonCommandType }; //----------------------------------------------------------------------------- diff --git a/toonz/sources/include/toonzqt/paletteviewer.h b/toonz/sources/include/toonzqt/paletteviewer.h index a42a069b..10c6abf9 100644 --- a/toonz/sources/include/toonzqt/paletteviewer.h +++ b/toonz/sources/include/toonzqt/paletteviewer.h @@ -162,6 +162,8 @@ protected slots: void onNameDisplayMode(QAction *); void setIsLocked(bool lock); + + void onSwitchToPage(int pageIndex); }; #endif // PALETTEVIEWER_H diff --git a/toonz/sources/include/toonzqt/paletteviewergui.h b/toonz/sources/include/toonzqt/paletteviewergui.h index 5e03c6de..505054c2 100644 --- a/toonz/sources/include/toonzqt/paletteviewergui.h +++ b/toonz/sources/include/toonzqt/paletteviewergui.h @@ -211,6 +211,7 @@ private: signals: void changeWindowTitleSignal(); + void switchToPage(int); }; //**************************************************************************** diff --git a/toonz/sources/include/toonzqt/planeviewer.h b/toonz/sources/include/toonzqt/planeviewer.h index f8c27a2d..d1c87444 100644 --- a/toonz/sources/include/toonzqt/planeviewer.h +++ b/toonz/sources/include/toonzqt/planeviewer.h @@ -13,6 +13,7 @@ // Qt includes #include +#include #undef DVAPI #undef DVVAR @@ -30,6 +31,8 @@ class TRasterImageP; class TToonzImageP; class TVectorImageP; +class QTouchEvent; +class QGestureEvent; //---------------------------------------------------------------------------- @@ -61,6 +64,18 @@ obsolete class until the shader fx being overhauled. 2016/6/22 Shun */ class DVAPI PlaneViewer : public GLWidgetForHighDpi { + Q_OBJECT + bool m_touchActive = false; + bool m_gestureActive = false; + QTouchDevice::DeviceType m_touchDevice = QTouchDevice::TouchScreen; + bool m_zooming = false; + bool m_panning = false; + double m_scaleFactor; // used for zoom gesture + + bool m_stylusUsed = false; + + bool m_firstDraw; + public: PlaneViewer(QWidget *parent); @@ -99,8 +114,6 @@ public: TAffine &viewAff() { return m_aff; } const TAffine &viewAff() const { return m_aff; } - void resetView(); - void zoomIn(); void zoomOut(); @@ -123,6 +136,11 @@ public: TRaster32P rasterBuffer(); void flushRasterBuffer(); +public slots: + + void resetView(); + void fitView(); + protected: int m_xpos, m_ypos; //!< Mouse position on mouse operations. TAffine m_aff; //!< Affine transform from world to widget coords. @@ -135,13 +153,25 @@ protected: double m_zoomRange[2]; //!< Viewport zoom range (default: [-1024, 1024]). + TRect m_imageBounds; + + double m_dpiX, m_dpiY; + protected: + virtual void contextMenuEvent(QContextMenuEvent *event) override; virtual void mouseMoveEvent(QMouseEvent *event) override; virtual void mousePressEvent(QMouseEvent *event) override; + virtual void mouseReleaseEvent(QMouseEvent *event) override; virtual void wheelEvent(QWheelEvent *event) override; virtual void keyPressEvent(QKeyEvent *event) override; virtual void hideEvent(QHideEvent *event) override; + virtual void mouseDoubleClickEvent(QMouseEvent *event) override; + virtual void tabletEvent(QTabletEvent *e) override; + void touchEvent(QTouchEvent *e, int type); + void gestureEvent(QGestureEvent *e); + virtual bool event(QEvent *e) override; + void initializeGL() override final; void resizeGL(int width, int height) override final; @@ -150,6 +180,7 @@ private: bool m_firstResize; int m_width; int m_height; + QPointF m_firstPanPoint; }; #endif // PLANE_VIEWER_H diff --git a/toonz/sources/include/toonzqt/schematicviewer.h b/toonz/sources/include/toonzqt/schematicviewer.h index 071af6a6..52c6a169 100644 --- a/toonz/sources/include/toonzqt/schematicviewer.h +++ b/toonz/sources/include/toonzqt/schematicviewer.h @@ -106,7 +106,7 @@ public: SchematicSceneViewer(QWidget *parent); ~SchematicSceneViewer(); - void zoomQt(bool zoomin, bool resetZoom); + void zoomQt(bool zoomin, bool resetView); QPointF getOldScenePos() { return m_oldScenePos; } @@ -120,10 +120,13 @@ protected: protected slots: - void fitScene(); void centerOnCurrent(); void reorderScene(); + +public slots: + void normalizeScene(); + void fitScene(); private: Qt::MouseButton m_buttonState; diff --git a/toonz/sources/include/toonzqt/swatchviewer.h b/toonz/sources/include/toonzqt/swatchviewer.h index d772d369..f6115bc5 100644 --- a/toonz/sources/include/toonzqt/swatchviewer.h +++ b/toonz/sources/include/toonzqt/swatchviewer.h @@ -16,6 +16,8 @@ #include "tthread.h" #include "trop.h" +#include + using namespace TThread; #undef DVAPI @@ -28,6 +30,13 @@ using namespace TThread; #define DVVAR DV_IMPORT_VAR #endif +//----------------------------------------------------------------------------- + +// Forward declarations + +class QTouchEvent; +class QGestureEvent; + //============================================================================= class DVAPI BgPainter { @@ -113,6 +122,7 @@ class DVAPI SwatchViewer final : public QWidget { TPointD m_pointPosDelta; bool m_enabled; + bool m_firstEnabled; int m_frame; TThread::Executor m_executor; TThread::Mutex m_mutex; @@ -129,6 +139,15 @@ class DVAPI SwatchViewer final : public QWidget { bool m_computing; + bool m_touchActive = false; + bool m_gestureActive = false; + QTouchDevice::DeviceType m_touchDevice = QTouchDevice::TouchScreen; + bool m_zooming = false; + bool m_panning = false; + double m_scaleFactor; // used for zoom gesture + + bool m_stylusUsed = false; + friend class ContentRender; public: @@ -179,6 +198,8 @@ public slots: void setEnable(bool enabled); void updateSize(const QSize &size); void setBgPainter(TPixel32 color1, TPixel32 color2 = TPixel32()); + void resetView(); + void fitView(); protected: void computeContent(); @@ -186,6 +207,7 @@ protected: TPointD win2world(const TPoint &p) const; void zoom(const TPoint &pos, double factor); void zoom(bool forward, bool reset); + void pan(const TPoint &delta); void updateRaster(); @@ -194,6 +216,7 @@ protected: void setAff(const TAffine &aff); + void contextMenuEvent(QContextMenuEvent *event) override; void paintEvent(QPaintEvent *event) override; void mousePressEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; @@ -203,6 +226,15 @@ protected: void resizeEvent(QResizeEvent *event) override; void hideEvent(QHideEvent *event) override; + void mouseDoubleClickEvent(QMouseEvent *event) override; + void tabletEvent(QTabletEvent *e) override; + void touchEvent(QTouchEvent *e, int type); + void gestureEvent(QGestureEvent *e); + bool event(QEvent *e) override; + +private: + QPointF m_firstPanPoint; + signals: void pointPositionChanged(int index, const TPointD &p); }; diff --git a/toonz/sources/include/toonzqt/viewcommandids.h b/toonz/sources/include/toonzqt/viewcommandids.h index 36eee9c0..c8a8b3af 100644 --- a/toonz/sources/include/toonzqt/viewcommandids.h +++ b/toonz/sources/include/toonzqt/viewcommandids.h @@ -3,6 +3,7 @@ #ifndef VIEWCOMMANDIDS_H #define VIEWCOMMANDIDS_H +#define V_ViewReset "T_ViewReset" #define V_ZoomIn "T_Zoomin" // Can't change prefix due to retrocompatibility #define V_ZoomOut "T_Zoomout" #define V_ZoomReset "T_ZoomReset" @@ -11,5 +12,17 @@ #define V_ActualPixelSize "T_ActualPixelSize" #define V_FlipX "T_FlipX" #define V_FlipY "T_FlipY" +#define V_RotateReset "T_RotateReset" +#define V_PositionReset "T_PositionReset" + +// folloing command ids are for command bar +#define VB_ViewReset "VB_ViewReset" +#define VB_ZoomFit "VB_ZoomFit" +#define VB_ZoomReset "VB_ZoomReset" +#define VB_RotateReset "VB_RotateReset" +#define VB_PositionReset "VB_PositionReset" +#define VB_ActualPixelSize "VB_ActualPixelSize" +#define VB_FlipX "VB_FlipX" +#define VB_FlipY "VB_FlipY" #endif // VIEWCOMMANDIDS_H diff --git a/toonz/sources/include/tpalette.h b/toonz/sources/include/tpalette.h index 63c41e70..0e776687 100644 --- a/toonz/sources/include/tpalette.h +++ b/toonz/sources/include/tpalette.h @@ -132,13 +132,13 @@ public: //! \return The insertion index in the page, or \p -1 on failure int addStyle(int styleId); //!< Adds the specified style Id to the page (at //! the \a back - //! of the page). - /*! -\warning The supplied style must have been allocated with \a new. -\warning Style ownership is surrendered to the palette. -\return The insertion index in the page, or \p -1 on failure. - In case of failure, the supplied style is \a deleted. -*/ + //! of the page). + /*! + \warning The supplied style must have been allocated with \a new. + \warning Style ownership is surrendered to the palette. + \return The insertion index in the page, or \p -1 on failure. + In case of failure, the supplied style is \a deleted. + */ int addStyle(TColorStyle *style); //!< Adds the specified style to the //! palette, and assigns it //! to this page. @@ -214,6 +214,8 @@ private: int m_shortcutScopeIndex; + int m_currentStyleId; + public: TPalette(); ~TPalette(); @@ -425,6 +427,9 @@ between RGBA color components. void nextShortcutScope(bool invert); + void setCurrentStyleId(int id) { m_currentStyleId = id; } + int getCurrentStyleId() const { return m_currentStyleId; } + public: // Deprecated functions diff --git a/toonz/sources/include/tspectrumparam.h b/toonz/sources/include/tspectrumparam.h index 3cac6df8..8eed363e 100644 --- a/toonz/sources/include/tspectrumparam.h +++ b/toonz/sources/include/tspectrumparam.h @@ -42,7 +42,7 @@ class DVAPI TSpectrumParam final : public TParam { public: TSpectrumParam(); - TSpectrumParam(int keyCount, TSpectrum::ColorKey keys[]); + TSpectrumParam(std::vector const &keys); TSpectrumParam(const TSpectrumParam &); ~TSpectrumParam(); @@ -102,9 +102,9 @@ class DVAPI TSpectrumParamP final : public TDerivedSmartPointerT { public: TSpectrumParamP() {} - TSpectrumParamP(int keyCount, TSpectrum::ColorKey keys[]) + TSpectrumParamP(std::vector const &keys) : TDerivedSmartPointerT( - new TSpectrumParam(keyCount, keys)) {} + new TSpectrumParam(keys)) {} TSpectrumParamP(TSpectrumParam *p) : TDerivedSmartPointerT(p) {} TSpectrumParamP(const TParamP &p) diff --git a/toonz/sources/stdfx/cloudsfx.cpp b/toonz/sources/stdfx/cloudsfx.cpp index 3196622e..0fe2b003 100644 --- a/toonz/sources/stdfx/cloudsfx.cpp +++ b/toonz/sources/stdfx/cloudsfx.cpp @@ -28,10 +28,10 @@ public: bindParam(this, "min", m_min); bindParam(this, "max", m_max); bindParam(this, "evolution", m_evol); - TSpectrum::ColorKey colors[] = { + std::vector colors = { TSpectrum::ColorKey(0, TPixel32::White), TSpectrum::ColorKey(1, TPixel32::Transparent)}; - m_colors = TSpectrumParamP(tArrayCount(colors), colors); + m_colors = TSpectrumParamP(colors); bindParam(this, "colors", m_colors); m_size->setValueRange(0, 200); m_min->setValueRange(0, 1.0); @@ -57,15 +57,15 @@ public: //================================================================== void CloudsFx::doCompute(TTile &tile, double frame, const TRenderSettings &ri) { - double scale = sqrt(fabs(ri.m_affine.det())); - int type = m_type->getValue(); - double min = m_min->getValue(frame); - double max = m_max->getValue(frame); - double evolution = m_evol->getValue(frame); - double size = m_size->getValue(frame) / ri.m_shrinkX; - size = fabs(size); + double scale = sqrt(fabs(ri.m_affine.det())); + int type = m_type->getValue(); + double min = m_min->getValue(frame); + double max = m_max->getValue(frame); + double evolution = m_evol->getValue(frame); + double size = m_size->getValue(frame) / ri.m_shrinkX; + size = fabs(size); if (size < 0.01) size = 0.01; - TPointD pos = tile.m_pos; + TPointD pos = tile.m_pos; doClouds(tile.getRaster(), m_colors, pos, evolution, size, min, max, type, scale, frame); diff --git a/toonz/sources/stdfx/diamondgradientfx.cpp b/toonz/sources/stdfx/diamondgradientfx.cpp index 03d544ca..72f4f71b 100644 --- a/toonz/sources/stdfx/diamondgradientfx.cpp +++ b/toonz/sources/stdfx/diamondgradientfx.cpp @@ -13,13 +13,14 @@ class DiamondGradientFx final : public TStandardZeraryFx { public: DiamondGradientFx() : m_size(100.0) { - TSpectrum::ColorKey colors[] = {TSpectrum::ColorKey(0, TPixel32::White), - TSpectrum::ColorKey(0.2, TPixel32::Yellow), - TSpectrum::ColorKey(0.4, TPixel32::Blue), - TSpectrum::ColorKey(0.6, TPixel32::Green), - TSpectrum::ColorKey(0.8, TPixel32::Magenta), - TSpectrum::ColorKey(1, TPixel32::Red)}; - m_colors = TSpectrumParamP(tArrayCount(colors), colors); + std::vector colors = { + TSpectrum::ColorKey(0, TPixel32::White), + TSpectrum::ColorKey(0.2, TPixel32::Yellow), + TSpectrum::ColorKey(0.4, TPixel32::Blue), + TSpectrum::ColorKey(0.6, TPixel32::Green), + TSpectrum::ColorKey(0.8, TPixel32::Magenta), + TSpectrum::ColorKey(1, TPixel32::Red)}; + m_colors = TSpectrumParamP(colors); m_size->setMeasureName("fxLength"); bindParam(this, "colors", m_colors); bindParam(this, "size", m_size); diff --git a/toonz/sources/stdfx/igs_line_blur.cpp b/toonz/sources/stdfx/igs_line_blur.cpp index ac9fc9d9..68bac496 100644 --- a/toonz/sources/stdfx/igs_line_blur.cpp +++ b/toonz/sources/stdfx/igs_line_blur.cpp @@ -25,14 +25,16 @@ typedef int int32_t; extern "C" { #endif +/* extern void pri_funct_cv_start(int32_t i32_ys); extern void pri_funct_cv_run(int32_t i32_y); extern void pri_funct_cv_end(void); extern void pri_funct_set_cp_title(const char *cp_title); -extern void pri_funct_msg_ttvr(const char *fmt, ...); -extern void pri_funct_msg_vr(const char *fmt, ...); -extern void pri_funct_err_bttvr(const char *fmt, ...); +extern void pri_funct_msg_ttvr(const char* fmt, ...); +extern void pri_funct_msg_vr(const char* fmt, ...); +extern void pri_funct_err_bttvr(const char* fmt, ...); +*/ #ifdef __cplusplus } @@ -1046,7 +1048,7 @@ double calculator_geometry::get_d_radian(double d_xv, double d_yv) { } /* 第2象限 (第1象限に置き換えて... 0 <= angle < 90) */ else if ((d_xv <= 0.0) && (0.0 < d_yv)) { - d_radian = atan(-d_xv / d_yv) + M_PI_2; + d_radian = atan(-d_xv / d_yv) + M_PI / 2.0; } /* 第3象限 (第1象限に置き換えて... 0 <= angle < 90) */ else if ((d_xv < 0.0) && (d_yv <= 0.0)) { @@ -1054,7 +1056,7 @@ double calculator_geometry::get_d_radian(double d_xv, double d_yv) { } /* 第4象限 (第1象限に置き換えて... 0 <= angle < 90) */ else if ((0.0 <= d_xv) && (d_yv < 0.0)) { - d_radian = atan(d_xv / -d_yv) + M_PI + M_PI_2; + d_radian = atan(d_xv / -d_yv) + M_PI + M_PI / 2.0; } return d_radian; } @@ -1712,11 +1714,10 @@ int pixel_line_node::expand_line(pixel_point_root *clp_pixel_point_root) { /* 始点が端点ならば先へ伸ばす */ i32_body_point_count = this->_i32_point_count; if (NULL == clp_one->get_clp_link_near(1)) { /* 2点目がないなら端点 */ - if (OK != - this->_expand_line_from_one(clp_pixel_point_root, i32_body_point_count, - this->get_clp_link_one(), - this->get_clp_link_another(), - d_radian_one)) { + if (OK != this->_expand_line_from_one( + clp_pixel_point_root, i32_body_point_count, + this->get_clp_link_one(), this->get_clp_link_another(), + d_radian_one)) { pri_funct_err_bttvr( "Error : this->_expand_line_from_one(-) returns NULL."); return NG; @@ -1725,11 +1726,10 @@ int pixel_line_node::expand_line(pixel_point_root *clp_pixel_point_root) { /* 終点が端点ならば先へ伸ばす */ if (NULL == clp_another->get_clp_link_near(1)) { /* 2点目がないなら端点 */ - if (OK != - this->_expand_line_from_another( - clp_pixel_point_root, i32_body_point_count, - this->get_clp_link_one(), this->get_clp_link_another(), - d_radian_another)) { + if (OK != this->_expand_line_from_another( + clp_pixel_point_root, i32_body_point_count, + this->get_clp_link_one(), this->get_clp_link_another(), + d_radian_another)) { pri_funct_err_bttvr( "Error : this->_expand_line_from_another(-) returns NULL."); return NG; @@ -4176,7 +4176,7 @@ void pixel_select_curve_blur_root::exec(double d_xp, double d_yp, if ((M_PI / 2.0 < d_radius) && (d_radius < M_PI * 3.0 / 2.0)) { clp_start_point = clp_line->get_next_point_by_count(clp_near_point, i32_blur_count / 2); - i_reverse_sw = true; + i_reverse_sw = true; } } @@ -5484,7 +5484,7 @@ void igs_line_blur_brush_curve_point_put_image_template_( const int width // no_margin , const int channels, T *image_top // no_margin - ) { +) { for (int zz = 0; zz < channels; ++zz) { image_top[yp * channels * width + xp * channels + zz] = static_cast(dp_pixel[zz]); @@ -5502,7 +5502,7 @@ void igs_line_blur_brush_curve_point_put_image_( const int width // no_margin , const int channels, const int bits, void *out // no_margin - ) { +) { if ((xp < 0) && (width <= xp) && (yp < 0) && (height <= yp)) { throw std::domain_error( "Error : igs::line_blur::_brush_curve_point_put_image(-)"); @@ -5624,8 +5624,7 @@ int igs_line_blur_brush_curve_blur_subpixel_( } int igs_line_blur_brush_curve_blur_all_( - bool mv_sw, bool pv_sw, bool cv_sw, - brush_curve_blur &cl_brush_curve_blur, + bool mv_sw, bool pv_sw, bool cv_sw, brush_curve_blur &cl_brush_curve_blur, pixel_select_curve_blur_root &cl_pixel_select_curve_blur_root, pixel_line_root &cl_pixel_line_root @@ -5637,7 +5636,7 @@ int igs_line_blur_brush_curve_blur_all_( const int width // no_margin , const int channels, const int bits, void *out // no_margin - ) { +) { /* 処理ごとのメッセージ */ if (mv_sw) { std::cout << "igs::line_blur::_brush_curve_blur_all()" << std::endl; @@ -5797,7 +5796,7 @@ void igs_line_blur_brush_smudge_put_image_( const int width // no_margin , const int channels, const int bits, void *out // no_margin - ) { +) { /* 画像上に置いたブラシの範囲 */ double x1, y1, x2, y2; cl_brush_smudge_circle.get_dp_area(d_xp, d_yp, &x1, &y1, &x2, &y2); @@ -5953,7 +5952,7 @@ void igs_line_blur_brush_smudge_all_( const int width // no_margin , const int channels, const int bits, void *out // no_margin - ) { +) { /* 処理ごとのメッセージ */ if (mv_sw) { std::cout << "igs::line_expand::_brush_smudge_all()" << std::endl; @@ -6082,7 +6081,7 @@ void igs_line_blur_image_get_(const bool mv_sw, const bool cv_sw, pri_funct_cv_end(); } } -} +} // namespace #include #include @@ -6099,7 +6098,8 @@ void igs::line_blur::convert( , const int width // no_margin , - const int channels, const int bits + const int channels, + const int bits /* Action */ , @@ -6138,7 +6138,7 @@ void igs::line_blur::convert( const bool debug_save_sw /* false=OFF */ , const int brush_action /* 0 =Curve Blur ,1=Smudge Brush */ - ) { +) { /* --- 動作クラスコンストラクション --- */ thinnest_ui16_image cl_thinnest_ui16_image; pixel_point_root cl_pixel_point_root; @@ -6253,11 +6253,10 @@ void igs::line_blur::convert( /****** ベクトルリスト処理 start ******/ /* 細線化した画像をリストにする */ - if (OK != - cl_pixel_point_root.alloc_mem_and_list_node( - cl_thinnest_ui16_image.get_i32_xs(), - cl_thinnest_ui16_image.get_i32_ys(), - cl_thinnest_ui16_image.get_ui16p_src_channel())) { + if (OK != cl_pixel_point_root.alloc_mem_and_list_node( + cl_thinnest_ui16_image.get_i32_xs(), + cl_thinnest_ui16_image.get_i32_ys(), + cl_thinnest_ui16_image.get_ui16p_src_channel())) { throw std::domain_error( "Error : cl_pixel_point_root.alloc_mem_and_list_node() returns NG"); } @@ -6281,9 +6280,8 @@ void igs::line_blur::convert( throw std::domain_error( "Error : cl_pixel_line_root.save_another_point(-) returns NG"); } - if (OK != - cl_pixel_line_root.save_not_include(&(cl_pixel_point_root), - "tmp11_not_include.txt")) { + if (OK != cl_pixel_line_root.save_not_include(&(cl_pixel_point_root), + "tmp11_not_include.txt")) { throw std::domain_error( "Error : cl_pixel_line_root.save_not_include(-) returns NG"); } @@ -6335,15 +6333,13 @@ void igs::line_blur::convert( throw std::domain_error( "Error : cl_pixel_line_root.save_expand_lines(-) returns NG"); } - if (OK != - cl_pixel_line_root.save_one_expand_point( - "tmp16_one_expand_point.txt")) { + if (OK != cl_pixel_line_root.save_one_expand_point( + "tmp16_one_expand_point.txt")) { throw std::domain_error( "Error : cl_pixel_line_root.save_one_expand_point(-) returns NG"); } - if (OK != - cl_pixel_line_root.save_another_expand_point( - "tmp17_another_expand_point.txt")) { + if (OK != cl_pixel_line_root.save_another_expand_point( + "tmp17_another_expand_point.txt")) { throw std::domain_error( "Error : cl_pixel_line_root.save_another_expand_point(-) returns NG"); } diff --git a/toonz/sources/stdfx/igs_line_blur.h b/toonz/sources/stdfx/igs_line_blur.h index f857754f..a04e98c3 100644 --- a/toonz/sources/stdfx/igs_line_blur.h +++ b/toonz/sources/stdfx/igs_line_blur.h @@ -1,5 +1,3 @@ -#pragma once - #ifndef igs_line_blur_h #define igs_line_blur_h @@ -20,7 +18,8 @@ IGS_LINE_BLUR_EXPORT void convert( , const int width // no_margin , - const int channels, const int bits + const int channels, + const int bits /* Action Geometry */ , @@ -59,8 +58,8 @@ IGS_LINE_BLUR_EXPORT void convert( const bool debug_save_sw /* false=OFF */ , const int brush_action /* 0 =Curve Blur ,1=Smudge Brush */ - ); -} +); } +} // namespace igs #endif /* !igs_line_blur_h */ diff --git a/toonz/sources/stdfx/ino_line_blur.cpp b/toonz/sources/stdfx/ino_line_blur.cpp index 6df56756..f005ae43 100644 --- a/toonz/sources/stdfx/ino_line_blur.cpp +++ b/toonz/sources/stdfx/ino_line_blur.cpp @@ -20,7 +20,8 @@ IGS_LINE_BLUR_EXPORT void convert( , const int width // no_margin , - const int channels, const int bits + const int channels, + const int bits /* Action Geometry */ , @@ -59,9 +60,9 @@ IGS_LINE_BLUR_EXPORT void convert( const bool debug_save_sw /* false=OFF */ , const int brush_action /* 0 =Curve Blur ,1=Smudge Brush */ - ); -} +); } +} // namespace igs #endif /* !igs_line_blur_h */ @@ -93,14 +94,14 @@ extern "C" { #endif /* -extern void pri_funct_cv_start( int32_t i32_ys ); -extern void pri_funct_cv_run( int32_t i32_y ); -extern void pri_funct_cv_end( void ); +extern void pri_funct_cv_start(int32_t i32_ys); +extern void pri_funct_cv_run(int32_t i32_y); +extern void pri_funct_cv_end(void); -extern void pri_funct_set_cp_title(const char *cp_title ); -extern void pri_funct_msg_ttvr( const char* fmt, ...); -extern void pri_funct_msg_vr( const char* fmt, ...); -extern void pri_funct_err_bttvr( const char* fmt, ...); +extern void pri_funct_set_cp_title(const char *cp_title); +extern void pri_funct_msg_ttvr(const char* fmt, ...); +extern void pri_funct_msg_vr(const char* fmt, ...); +extern void pri_funct_err_bttvr(const char* fmt, ...); */ #ifdef __cplusplus @@ -253,6 +254,7 @@ void pri_funct_err_bttvr(const char *fmt, ...) { #ifndef _list_node_h_ #define _list_node_h_ + #include class list_node { @@ -761,9 +763,9 @@ public: void mem_free(void); private: - int _i_mv_sw, /* Method Verbose */ - _i_pv_sw, /* Parameter Verbose */ - _i_cv_sw; /* Counter Verbose */ + bool _i_mv_sw; /* Method Verbose */ + bool _i_pv_sw; /* Parameter Verbose */ + bool _i_cv_sw; /* Counter Verbose */ int32_t _i32_size_by_pixel, _i32_subpixel_divide; double _d_ratio; @@ -1780,11 +1782,10 @@ int pixel_line_node::expand_line(pixel_point_root *clp_pixel_point_root) { /* 始点が端点ならば先へ伸ばす */ i32_body_point_count = this->_i32_point_count; if (NULL == clp_one->get_clp_link_near(1)) { /* 2点目がないなら端点 */ - if (OK != - this->_expand_line_from_one(clp_pixel_point_root, i32_body_point_count, - this->get_clp_link_one(), - this->get_clp_link_another(), - d_radian_one)) { + if (OK != this->_expand_line_from_one( + clp_pixel_point_root, i32_body_point_count, + this->get_clp_link_one(), this->get_clp_link_another(), + d_radian_one)) { pri_funct_err_bttvr( "Error : this->_expand_line_from_one(-) returns NULL."); return NG; @@ -1793,11 +1794,10 @@ int pixel_line_node::expand_line(pixel_point_root *clp_pixel_point_root) { /* 終点が端点ならば先へ伸ばす */ if (NULL == clp_another->get_clp_link_near(1)) { /* 2点目がないなら端点 */ - if (OK != - this->_expand_line_from_another( - clp_pixel_point_root, i32_body_point_count, - this->get_clp_link_one(), this->get_clp_link_another(), - d_radian_another)) { + if (OK != this->_expand_line_from_another( + clp_pixel_point_root, i32_body_point_count, + this->get_clp_link_one(), this->get_clp_link_another(), + d_radian_another)) { pri_funct_err_bttvr( "Error : this->_expand_line_from_another(-) returns NULL."); return NG; @@ -4244,7 +4244,7 @@ void pixel_select_curve_blur_root::exec(double d_xp, double d_yp, if ((M_PI / 2.0 < d_radius) && (d_radius < M_PI * 3.0 / 2.0)) { clp_start_point = clp_line->get_next_point_by_count(clp_near_point, i32_blur_count / 2); - i_reverse_sw = true; + i_reverse_sw = true; } } @@ -5208,15 +5208,15 @@ int thinnest_ui16_image::exec05_thin(void) { /* メモリ開放 */ void thinnest_ui16_image::mem_free(void) { #if 0 - if (NULL != this->_ui16p_channel[0]) { - if (this->_i_mv_sw) { - pri_funct_msg_ttvr( "thinnest_ui16_image::mem_free()" ); - } + if (NULL != this->_ui16p_channel[0]) { + if (this->_i_mv_sw) { + pri_funct_msg_ttvr( "thinnest_ui16_image::mem_free()" ); + } - free( this->_ui16p_channel[0]);/* ここで落ちる2014-5-16 */ - this->_ui16p_channel[0] = NULL; - this->_ui16p_channel[1] = NULL; - } + free( this->_ui16p_channel[0]);/* ここで落ちる2014-5-16 */ + this->_ui16p_channel[0] = NULL; + this->_ui16p_channel[1] = NULL; + } #endif if (NULL != this->memory_free_this_) { if (this->_i_mv_sw) { @@ -5552,7 +5552,7 @@ void igs_line_blur_brush_curve_point_put_image_template_( const int width // no_margin , const int channels, T *image_top // no_margin - ) { +) { for (int zz = 0; zz < channels; ++zz) { image_top[yp * channels * width + xp * channels + zz] = static_cast(dp_pixel[zz]); @@ -5570,7 +5570,7 @@ void igs_line_blur_brush_curve_point_put_image_( const int width // no_margin , const int channels, const int bits, void *out // no_margin - ) { +) { if ((xp < 0) && (width <= xp) && (yp < 0) && (height <= yp)) { throw std::domain_error( "Error : igs::line_blur::_brush_curve_point_put_image(-)"); @@ -5692,8 +5692,7 @@ int igs_line_blur_brush_curve_blur_subpixel_( } int igs_line_blur_brush_curve_blur_all_( - bool mv_sw, bool pv_sw, bool cv_sw, - brush_curve_blur &cl_brush_curve_blur, + bool mv_sw, bool pv_sw, bool cv_sw, brush_curve_blur &cl_brush_curve_blur, pixel_select_curve_blur_root &cl_pixel_select_curve_blur_root, pixel_line_root &cl_pixel_line_root @@ -5705,7 +5704,7 @@ int igs_line_blur_brush_curve_blur_all_( const int width // no_margin , const int channels, const int bits, void *out // no_margin - ) { +) { /* 処理ごとのメッセージ */ if (mv_sw) { std::cout << "igs::line_blur::_brush_curve_blur_all()" << std::endl; @@ -5865,7 +5864,7 @@ void igs_line_blur_brush_smudge_put_image_( const int width // no_margin , const int channels, const int bits, void *out // no_margin - ) { +) { /* 画像上に置いたブラシの範囲 */ double x1, y1, x2, y2; cl_brush_smudge_circle.get_dp_area(d_xp, d_yp, &x1, &y1, &x2, &y2); @@ -6021,7 +6020,7 @@ void igs_line_blur_brush_smudge_all_( const int width // no_margin , const int channels, const int bits, void *out // no_margin - ) { +) { /* 処理ごとのメッセージ */ if (mv_sw) { std::cout << "igs::line_expand::_brush_smudge_all()" << std::endl; @@ -6150,11 +6149,10 @@ void igs_line_blur_image_get_(const bool mv_sw, const bool cv_sw, pri_funct_cv_end(); } } -} +} // namespace #include #include - #include "igs_line_blur.h" // "thinnest_ui16_image.h" "pixel_point_root.h" "pixel_line_root.h" "brush_curve_blur.h" "brush_smudge_circle.h" "pixel_select_same_way.h" "pixel_select_curve_blur.h" "igs_line_blur.h" void igs::line_blur::convert( @@ -6168,7 +6166,8 @@ void igs::line_blur::convert( , const int width // no_margin , - const int channels, const int bits + const int channels, + const int bits /* Action */ , @@ -6207,7 +6206,7 @@ void igs::line_blur::convert( const bool debug_save_sw /* false=OFF */ , const int brush_action /* 0 =Curve Blur ,1=Smudge Brush */ - ) { +) { /* --- 動作クラスコンストラクション --- */ thinnest_ui16_image cl_thinnest_ui16_image; pixel_point_root cl_pixel_point_root; @@ -6322,11 +6321,10 @@ void igs::line_blur::convert( /****** ベクトルリスト処理 start ******/ /* 細線化した画像をリストにする */ - if (OK != - cl_pixel_point_root.alloc_mem_and_list_node( - cl_thinnest_ui16_image.get_i32_xs(), - cl_thinnest_ui16_image.get_i32_ys(), - cl_thinnest_ui16_image.get_ui16p_src_channel())) { + if (OK != cl_pixel_point_root.alloc_mem_and_list_node( + cl_thinnest_ui16_image.get_i32_xs(), + cl_thinnest_ui16_image.get_i32_ys(), + cl_thinnest_ui16_image.get_ui16p_src_channel())) { throw std::domain_error( "Error : cl_pixel_point_root.alloc_mem_and_list_node() returns NG"); } @@ -6350,9 +6348,8 @@ void igs::line_blur::convert( throw std::domain_error( "Error : cl_pixel_line_root.save_another_point(-) returns NG"); } - if (OK != - cl_pixel_line_root.save_not_include(&(cl_pixel_point_root), - "tmp11_not_include.txt")) { + if (OK != cl_pixel_line_root.save_not_include(&(cl_pixel_point_root), + "tmp11_not_include.txt")) { throw std::domain_error( "Error : cl_pixel_line_root.save_not_include(-) returns NG"); } @@ -6404,15 +6401,13 @@ void igs::line_blur::convert( throw std::domain_error( "Error : cl_pixel_line_root.save_expand_lines(-) returns NG"); } - if (OK != - cl_pixel_line_root.save_one_expand_point( - "tmp16_one_expand_point.txt")) { + if (OK != cl_pixel_line_root.save_one_expand_point( + "tmp16_one_expand_point.txt")) { throw std::domain_error( "Error : cl_pixel_line_root.save_one_expand_point(-) returns NG"); } - if (OK != - cl_pixel_line_root.save_another_expand_point( - "tmp17_another_expand_point.txt")) { + if (OK != cl_pixel_line_root.save_another_expand_point( + "tmp17_another_expand_point.txt")) { throw std::domain_error( "Error : cl_pixel_line_root.save_another_expand_point(-) returns NG"); } @@ -6459,70 +6454,57 @@ void igs::line_blur::convert( cl_thinnest_ui16_image.mem_free(); } -//===================== - +/*------------------------------------------------------------------*/ #include /* std::ostringstream */ #include "tfxparam.h" #include "stdfx.h" #include "tfxattributes.h" - #include "ino_common.h" #include "igs_line_blur.h" -//------------------------------------------------------------ + class ino_line_blur final : public TStandardRasterFx { FX_PLUGIN_DECLARATION(ino_line_blur) + TRasterFxPort m_input; - TIntEnumParamP m_b_action_mode; - TDoubleParamP m_b_blur_count; TDoubleParamP m_b_blur_power; TIntEnumParamP m_b_blur_subpixel; TDoubleParamP m_b_blur_near_ref; TDoubleParamP m_b_blur_near_len; - TDoubleParamP m_v_smooth_retry; TDoubleParamP m_v_near_ref; TDoubleParamP m_v_near_len; - TDoubleParamP m_b_smudge_thick; TDoubleParamP m_b_smudge_remain; public: ino_line_blur() : m_b_action_mode(new TIntEnumParam(0, "Blur")) - , m_b_blur_count(51) , m_b_blur_power(1.0) , m_b_blur_subpixel(new TIntEnumParam()) , m_b_blur_near_ref(5) , m_b_blur_near_len(160) - , m_v_smooth_retry(100) , m_v_near_ref(4) , m_v_near_len(160) - , m_b_smudge_thick(7) , m_b_smudge_remain(0.85) { addInputPort("Source", this->m_input); - bindParam(this, "action_mode", this->m_b_action_mode); - bindParam(this, "blur_count", this->m_b_blur_count); bindParam(this, "blur_power", this->m_b_blur_power); bindParam(this, "blur_subpixel", this->m_b_blur_subpixel); bindParam(this, "blur_near_ref", this->m_b_blur_near_ref); bindParam(this, "blur_near_len", this->m_b_blur_near_len); - bindParam(this, "vector_smooth_retry", this->m_v_smooth_retry); bindParam(this, "vector_near_ref", this->m_v_near_ref); bindParam(this, "vector_near_len", this->m_v_near_len); - bindParam(this, "smudge_thick", this->m_b_smudge_thick); bindParam(this, "smudge_remain", this->m_b_smudge_remain); this->m_b_action_mode->addItem(1, "Smudge"); - this->m_b_blur_count->setValueRange(1, 100); this->m_b_blur_power->setValueRange(0.1, 10.0); this->m_b_blur_subpixel->addItem(1, "1"); @@ -6532,27 +6514,41 @@ public: this->m_b_blur_subpixel->setValue(2); this->m_b_blur_near_ref->setValueRange(1, 100); this->m_b_blur_near_len->setValueRange(1, 1000); - this->m_v_smooth_retry->setValueRange(1, 1000); this->m_v_near_ref->setValueRange(1, 100); this->m_v_near_len->setValueRange(1, 1000); - - // this->m_b_smudge_thick->setMeasureName("fxLength"); this->m_b_smudge_thick->setValueRange(1, 100); this->m_b_smudge_remain->setValueRange(0.0, 1.0); } - //------------------------------------------------------------ + double get_render_real_radius(const double frame, const TAffine affine) { + double rad = this->m_b_blur_count->getValue(frame); + /*--- 単位について考察必要 ---*/ + // rad *= ino::pixel_per_mm(); + /*--- Geometryを反映させる ---*/ + // TAffine aff(affine); + return rad; + } + void get_render_enlarge(const double frame, const TAffine affine, + TRectD &bBox) { + const int margin = + static_cast(ceil(this->get_render_real_radius(frame, affine))); + if (0 < margin) { + bBox = bBox.enlarge(static_cast(margin)); + } + } bool doGetBBox(double frame, TRectD &bBox, const TRenderSettings &info) { if (false == this->m_input.isConnected()) { bBox = TRectD(); return false; } const bool ret = this->m_input->doGetBBox(frame, bBox, info); + this->get_render_enlarge(frame, info.m_affine, bBox); return ret; } int getMemoryRequirement(const TRectD &rect, double frame, const TRenderSettings &info) { TRectD bBox(rect); + this->get_render_enlarge(frame, info.m_affine, bBox); return TRasterFx::memorySize(bBox, info.m_bpp); } void transform(double frame, int port, const TRectD &rectOnOutput, @@ -6560,6 +6556,7 @@ public: TRenderSettings &infoOnInput) { rectOnInput = rectOnOutput; infoOnInput = infoOnOutput; + this->get_render_enlarge(frame, infoOnOutput.m_affine, rectOnInput); } bool canHandle(const TRenderSettings &info, double frame) { // return true;/* geometry処理済の画像に加工することになる */ @@ -6567,36 +6564,23 @@ public: } void doCompute(TTile &tile, double frame, const TRenderSettings &rend_sets); }; + FX_PLUGIN_IDENTIFIER(ino_line_blur, "inoLineBlurFx"); -//------------------------------------------------------------ + namespace { -void fx_(const TRasterP in_ras // with margin +void fx_(const TRasterP in_ras // no margin , TRasterP out_ras // no margin - - , - const int action_mode - - , - const int blur_count, const double blur_power, const int blur_subpixel, - const int blur_near_ref, const int blur_near_len - - , - const int vector_smooth_retry, const int vector_near_ref, - const int vector_near_len - , + const int action_mode, const int blur_count, const double blur_power, + const int blur_subpixel, const int blur_near_ref, + const int blur_near_len, const int vector_smooth_retry, + const int vector_near_ref, const int vector_near_len, const int smudge_thick, const double smudge_remain) { - TRasterGR8P out_buffer(out_ras->getLy(), - out_ras->getLx() * ino::channels() * - ((TRaster64P)in_ras ? sizeof(unsigned short) - : sizeof(unsigned char))); - out_buffer->lock(); igs::line_blur::convert( in_ras->getRawData() // const void *in_no_margin (BGRA) , - out_buffer->getRawData() // void *out_no_margin (BGRA) - + out_ras->getRawData() // void *out_no_margin (BGRA) , in_ras->getLy() // const int height_no_margin , @@ -6605,18 +6589,10 @@ void fx_(const TRasterP in_ras // with margin ino::channels() // const int channels , ino::bits(in_ras) // const int bits - , - blur_count, blur_power, blur_subpixel, blur_near_ref, blur_near_len - - , - smudge_thick, smudge_remain - - , - vector_smooth_retry, vector_near_ref, vector_near_len - - , - false /* bool mv_sw false=OFF */ + blur_count, blur_power, blur_subpixel, blur_near_ref, blur_near_len, + smudge_thick, smudge_remain, vector_smooth_retry, vector_near_ref, + vector_near_len, false /* bool mv_sw false=OFF */ , false /* bool pv_sw false=OFF */ , @@ -6627,130 +6603,72 @@ void fx_(const TRasterP in_ras // with margin false /* bool debug_save_sw false=OFF */ , action_mode); - ino::arr_to_ras(out_buffer->getRawData(), ino::channels(), out_ras, 0); - out_buffer->unlock(); } -} -//------------------------------------------------------------ -void ino_line_blur::doCompute(TTile &tile, double frame, - const TRenderSettings &rend_sets) { - /*------ 接続していなければ処理しない ----------------------*/ +} // namespace + +void ino_line_blur::doCompute( + TTile &tile /* 注意:doGetBBox(-)が返す範囲の画像 */ + , + double frame, const TRenderSettings &rend_sets) { + /*--- 接続していなければ処理しない -------------------------*/ if (!this->m_input.isConnected()) { tile.getRaster()->clear(); /* 塗りつぶしクリア */ return; } - /*------ サポートしていないPixelタイプはエラーを投げる -----*/ + /*--- サポートしていないPixelタイプはエラーを投げる --------*/ if (!((TRaster32P)tile.getRaster()) && !((TRaster64P)tile.getRaster())) { throw TRopException("unsupported input pixel type"); } - - /*------ パラメータを得る ------*/ - const int action_mode = this->m_b_action_mode->getValue(); - - const int blur_count = this->m_b_blur_count->getValue(frame); - const double blur_power = this->m_b_blur_power->getValue(frame); - const int blur_subpixel = this->m_b_blur_subpixel->getValue(); - const int blur_near_ref = this->m_b_blur_near_ref->getValue(frame); - const int blur_near_len = this->m_b_blur_near_len->getValue(frame); - + /*--- パラメータを得る -------------------------------------*/ + const int action_mode = this->m_b_action_mode->getValue(); + const int blur_count = this->m_b_blur_count->getValue(frame); + const double blur_power = this->m_b_blur_power->getValue(frame); + const int blur_subpixel = this->m_b_blur_subpixel->getValue(); + const int blur_near_ref = this->m_b_blur_near_ref->getValue(frame); + const int blur_near_len = this->m_b_blur_near_len->getValue(frame); const int vector_smooth_retry = this->m_v_smooth_retry->getValue(frame); const int vector_near_ref = this->m_v_near_ref->getValue(frame); const int vector_near_len = this->m_v_near_len->getValue(frame); - - const int smudge_thick = this->m_b_smudge_thick->getValue(frame); - const double smudge_remain = this->m_b_smudge_remain->getValue(frame); - - /*------ 表示の範囲を得る ----------------------------------*/ + const int smudge_thick = this->m_b_smudge_thick->getValue(frame); + const double smudge_remain = this->m_b_smudge_remain->getValue(frame); + /*--- 表示の範囲を得る -------------------------------------*/ TRectD bBox = TRectD(tile.m_pos /* Render画像上(Pixel単位)の位置 */ , TDimensionD(/* Render画像上(Pixel単位)のサイズ */ tile.getRaster()->getLx(), tile.getRaster()->getLy())); - - /* ------ marginなし画像生成 ------------------------------ */ - TTile enlarge_tile; + /*--- doGetBBox(-)が返す範囲の画像を生成 -------------------*/ + TTile in_tile; this->m_input->allocateAndCompute( - enlarge_tile, bBox.getP00(), + in_tile, bBox.getP00(), TDimensionI(/* Pixel単位に四捨五入 */ static_cast(bBox.getLx() + 0.5), static_cast(bBox.getLy() + 0.5)), tile.getRaster(), frame, rend_sets); - - /* ------ 保存すべき画像メモリを塗りつぶしクリア ---------- */ - tile.getRaster()->clear(); /* 塗りつぶしクリア */ - - /* ------ (app_begin)log記憶 ------------------------------ */ - const bool log_sw = ino::log_enable_sw(); - - if (log_sw) { - std::ostringstream os; - os << "params" - - << " action_mode " << action_mode - - << " blur_count " << blur_count << " blur_power " << blur_power - << " blur_subpixel " << blur_subpixel << " blur_near_ref " - << blur_near_ref << " blur_near_len " << blur_near_len - - << " vector_smooth_retry " << vector_smooth_retry - << " vector_near_ref " << vector_near_ref << " vector_near_len " - << vector_near_len - - << " smudge_thick " << smudge_thick << " smudge_remain " - << smudge_remain - - << " tile" - << " pos " << tile.m_pos << " w " << tile.getRaster()->getLx() << " h " - << tile.getRaster()->getLy() << " in_tile" - << " w " << enlarge_tile.getRaster()->getLx() << " h " - << enlarge_tile.getRaster()->getLy() << " pixbits " - << ino::pixel_bits(tile.getRaster()) << " frame " << frame - << " m_affine " << rend_sets.m_affine; - } - /* ------ fx処理 ------------------------------------------ */ + /*--- 保存すべき画像メモリを塗りつぶしクリア ---------------*/ + tile.getRaster()->clear(); + /*--- 画像処理 ---------------------------------------------*/ try { tile.getRaster()->lock(); - fx_(enlarge_tile.getRaster() // in with margin + fx_(in_tile.getRaster() // in no margin , - tile.getRaster() // out with no margin - - , - action_mode - - , - blur_count, blur_power, blur_subpixel, blur_near_ref, blur_near_len - - , - vector_smooth_retry, vector_near_ref, vector_near_len - + tile.getRaster() // out no margin , + action_mode, blur_count, blur_power, blur_subpixel, blur_near_ref, + blur_near_len, vector_smooth_retry, vector_near_ref, vector_near_len, smudge_thick, smudge_remain); tile.getRaster()->unlock(); } - /* ------ error処理 --------------------------------------- */ + /*--- error処理 --------------------------------------------*/ catch (std::bad_alloc &e) { tile.getRaster()->unlock(); - if (log_sw) { - std::string str("std::bad_alloc <"); - str += e.what(); - str += '>'; - } throw; } catch (std::exception &e) { tile.getRaster()->unlock(); - if (log_sw) { - std::string str("exception <"); - str += e.what(); - str += '>'; - } throw; } catch (...) { tile.getRaster()->unlock(); - if (log_sw) { - std::string str("other exception"); - } throw; } } - #endif diff --git a/toonz/sources/stdfx/iwa_particlesfx.cpp b/toonz/sources/stdfx/iwa_particlesfx.cpp index 0db33d97..c217ed05 100644 --- a/toonz/sources/stdfx/iwa_particlesfx.cpp +++ b/toonz/sources/stdfx/iwa_particlesfx.cpp @@ -250,18 +250,20 @@ Iwa_TiledParticlesFx::Iwa_TiledParticlesFx() animation_val->addItem(ANIM_SR_CYCLE, "Column Swing - Random Start"); bindParam(this, "step", step_val); step_val->setValueRange(1, (std::numeric_limits::max)()); - TSpectrum::ColorKey colors[] = {TSpectrum::ColorKey(0, TPixel32::Red), - TSpectrum::ColorKey(1, TPixel32::Red)}; - gencol_val = TSpectrumParamP(tArrayCount(colors), colors); + std::vector colors = { + TSpectrum::ColorKey(0, TPixel32::Red), + TSpectrum::ColorKey(1, TPixel32::Red)}; + gencol_val = TSpectrumParamP(colors); bindParam(this, "birth_color", gencol_val); bindParam(this, "birth_color_ctrl", gencol_ctrl_val); bindParam(this, "birth_color_spread", gencol_spread_val); gencol_spread_val->setValueRange(0.0, (std::numeric_limits::max)()); bindParam(this, "birth_color_fade", genfadecol_val); genfadecol_val->setValueRange(0.0, 100.0); - TSpectrum::ColorKey colors1[] = {TSpectrum::ColorKey(0, TPixel32::Green), - TSpectrum::ColorKey(1, TPixel32::Green)}; - fincol_val = TSpectrumParamP(tArrayCount(colors1), colors1); + std::vector colors1 = { + TSpectrum::ColorKey(0, TPixel32::Green), + TSpectrum::ColorKey(1, TPixel32::Green)}; + fincol_val = TSpectrumParamP(colors1); bindParam(this, "fadein_color", fincol_val); bindParam(this, "fadein_color_ctrl", fincol_ctrl_val); bindParam(this, "fadein_color_spread", fincol_spread_val); @@ -270,9 +272,10 @@ Iwa_TiledParticlesFx::Iwa_TiledParticlesFx() finrangecol_val->setValueRange(0.0, (std::numeric_limits::max)()); bindParam(this, "fadein_color_fade", finfadecol_val); finfadecol_val->setValueRange(0.0, 100.0); - TSpectrum::ColorKey colors2[] = {TSpectrum::ColorKey(0, TPixel32::Blue), - TSpectrum::ColorKey(1, TPixel32::Blue)}; - foutcol_val = TSpectrumParamP(tArrayCount(colors2), colors2); + std::vector colors2 = { + TSpectrum::ColorKey(0, TPixel32::Blue), + TSpectrum::ColorKey(1, TPixel32::Blue)}; + foutcol_val = TSpectrumParamP(colors2); bindParam(this, "fadeout_color", foutcol_val); bindParam(this, "fadeout_color_ctrl", foutcol_ctrl_val); bindParam(this, "fadeout_color_spread", foutcol_spread_val); diff --git a/toonz/sources/stdfx/linearwavefx.cpp b/toonz/sources/stdfx/linearwavefx.cpp index 0fbba0c2..2d801c1e 100644 --- a/toonz/sources/stdfx/linearwavefx.cpp +++ b/toonz/sources/stdfx/linearwavefx.cpp @@ -195,11 +195,11 @@ public: TRasterP rasIn = tileIn.getRaster(); // Compute the warper tile - TSpectrum::ColorKey colors[] = {TSpectrum::ColorKey(0, TPixel32::White), - TSpectrum::ColorKey(0.5, TPixel32::Black), - TSpectrum::ColorKey(1, TPixel32::White)}; - - TSpectrumParamP wavecolors = TSpectrumParamP(tArrayCount(colors), colors); + std::vector colors = { + TSpectrum::ColorKey(0, TPixel32::White), + TSpectrum::ColorKey(0.5, TPixel32::Black), + TSpectrum::ColorKey(1, TPixel32::White)}; + TSpectrumParamP wavecolors = TSpectrumParamP(colors); // Build the multiradial warperInfo.m_affine = warperInfo.m_affine * TRotation(angle); diff --git a/toonz/sources/stdfx/multitonefx.cpp b/toonz/sources/stdfx/multitonefx.cpp index 89202f4c..185ee140 100644 --- a/toonz/sources/stdfx/multitonefx.cpp +++ b/toonz/sources/stdfx/multitonefx.cpp @@ -12,10 +12,11 @@ class MultiToneFx final : public TStandardRasterFx { public: MultiToneFx() { - TSpectrum::ColorKey colors[] = {TSpectrum::ColorKey(0, TPixel32::White), - TSpectrum::ColorKey(0.5, TPixel32::Yellow), - TSpectrum::ColorKey(1, TPixel32::Red)}; - m_colors = TSpectrumParamP(tArrayCount(colors), colors); + std::vector colors = { + TSpectrum::ColorKey(0, TPixel32::White), + TSpectrum::ColorKey(0.5, TPixel32::Yellow), + TSpectrum::ColorKey(1, TPixel32::Red)}; + m_colors = TSpectrumParamP(colors); bool ret = m_colors->isKeyframe(0); bindParam(this, "colors", m_colors); diff --git a/toonz/sources/stdfx/particlesfx.cpp b/toonz/sources/stdfx/particlesfx.cpp index 31e8743f..bcd8a88a 100644 --- a/toonz/sources/stdfx/particlesfx.cpp +++ b/toonz/sources/stdfx/particlesfx.cpp @@ -228,18 +228,20 @@ ParticlesFx::ParticlesFx() animation_val->addItem(ANIM_SR_CYCLE, "Column Swing - Random Start"); bindParam(this, "step", step_val); step_val->setValueRange(1, (std::numeric_limits::max)()); - TSpectrum::ColorKey colors[] = {TSpectrum::ColorKey(0, TPixel32::Red), - TSpectrum::ColorKey(1, TPixel32::Red)}; - gencol_val = TSpectrumParamP(tArrayCount(colors), colors); + std::vector colors = { + TSpectrum::ColorKey(0, TPixel32::Red), + TSpectrum::ColorKey(1, TPixel32::Red)}; + gencol_val = TSpectrumParamP(colors); bindParam(this, "birth_color", gencol_val); bindParam(this, "birth_color_ctrl", gencol_ctrl_val); bindParam(this, "birth_color_spread", gencol_spread_val); gencol_spread_val->setValueRange(0.0, (std::numeric_limits::max)()); bindParam(this, "birth_color_fade", genfadecol_val); genfadecol_val->setValueRange(0.0, 100.0); - TSpectrum::ColorKey colors1[] = {TSpectrum::ColorKey(0, TPixel32::Green), - TSpectrum::ColorKey(1, TPixel32::Green)}; - fincol_val = TSpectrumParamP(tArrayCount(colors1), colors1); + std::vector colors1 = { + TSpectrum::ColorKey(0, TPixel32::Green), + TSpectrum::ColorKey(1, TPixel32::Green)}; + fincol_val = TSpectrumParamP(colors1); bindParam(this, "fadein_color", fincol_val); bindParam(this, "fadein_color_ctrl", fincol_ctrl_val); bindParam(this, "fadein_color_spread", fincol_spread_val); @@ -248,9 +250,10 @@ ParticlesFx::ParticlesFx() finrangecol_val->setValueRange(0.0, (std::numeric_limits::max)()); bindParam(this, "fadein_color_fade", finfadecol_val); finfadecol_val->setValueRange(0.0, 100.0); - TSpectrum::ColorKey colors2[] = {TSpectrum::ColorKey(0, TPixel32::Blue), - TSpectrum::ColorKey(1, TPixel32::Blue)}; - foutcol_val = TSpectrumParamP(tArrayCount(colors2), colors2); + std::vector colors2 = { + TSpectrum::ColorKey(0, TPixel32::Blue), + TSpectrum::ColorKey(1, TPixel32::Blue)}; + foutcol_val = TSpectrumParamP(colors2); bindParam(this, "fadeout_color", foutcol_val); bindParam(this, "fadeout_color_ctrl", foutcol_ctrl_val); bindParam(this, "fadeout_color_spread", foutcol_spread_val); diff --git a/toonz/sources/stdfx/randomwavefx.cpp b/toonz/sources/stdfx/randomwavefx.cpp index 37e8c901..1f6fdef6 100644 --- a/toonz/sources/stdfx/randomwavefx.cpp +++ b/toonz/sources/stdfx/randomwavefx.cpp @@ -191,10 +191,10 @@ public: TRasterP rasIn = tileIn.getRaster(); // Compute the warper tile - TSpectrum::ColorKey colors[] = {TSpectrum::ColorKey(0, TPixel32::White), - TSpectrum::ColorKey(1, TPixel32::Black)}; - - TSpectrumParamP cloudscolors = TSpectrumParamP(tArrayCount(colors), colors); + std::vector colors = { + TSpectrum::ColorKey(0, TPixel32::White), + TSpectrum::ColorKey(1, TPixel32::Black)}; + TSpectrumParamP cloudscolors = TSpectrumParamP(colors); // Build the warper warperInfo.m_affine = warperInfo.m_affine; diff --git a/toonz/sources/stdfx/ripplefx.cpp b/toonz/sources/stdfx/ripplefx.cpp index 126503d2..843281b0 100644 --- a/toonz/sources/stdfx/ripplefx.cpp +++ b/toonz/sources/stdfx/ripplefx.cpp @@ -197,11 +197,11 @@ public: TRasterP rasIn = tileIn.getRaster(); // Compute the warper tile - TSpectrum::ColorKey colors[] = {TSpectrum::ColorKey(0, TPixel32::White), - TSpectrum::ColorKey(0.5, TPixel32::Black), - TSpectrum::ColorKey(1, TPixel32::White)}; - - TSpectrumParamP ripplecolors = TSpectrumParamP(tArrayCount(colors), colors); + std::vector colors = { + TSpectrum::ColorKey(0, TPixel32::White), + TSpectrum::ColorKey(0.5, TPixel32::Black), + TSpectrum::ColorKey(1, TPixel32::White)}; + TSpectrumParamP ripplecolors = TSpectrumParamP(colors); // Build the multiradial warperInfo.m_affine = warperInfo.m_affine * TTranslation(center) * diff --git a/toonz/sources/stdfx/squaregradientfx.cpp b/toonz/sources/stdfx/squaregradientfx.cpp index be4bd481..e40f6f53 100644 --- a/toonz/sources/stdfx/squaregradientfx.cpp +++ b/toonz/sources/stdfx/squaregradientfx.cpp @@ -17,11 +17,11 @@ class SquareGradientFx final : public TStandardZeraryFx { public: SquareGradientFx() : m_size(200.0) { m_size->setMeasureName("fxLength"); - TSpectrum::ColorKey colors[] = { + std::vector colors = { TSpectrum::ColorKey(0, TPixel32::White), // TSpectrum::ColorKey(0.5,TPixel32::Yellow), TSpectrum::ColorKey(1, TPixel32::Red)}; - m_colors = TSpectrumParamP(tArrayCount(colors), colors); + m_colors = TSpectrumParamP(colors); bindParam(this, "colors", m_colors); bindParam(this, "size", m_size); m_size->setValueRange(0, std::numeric_limits::max()); diff --git a/toonz/sources/stdfx/stdfx.cpp b/toonz/sources/stdfx/stdfx.cpp index 343d6763..cd8499bd 100644 --- a/toonz/sources/stdfx/stdfx.cpp +++ b/toonz/sources/stdfx/stdfx.cpp @@ -89,13 +89,13 @@ TPixel32 colors[] = { TPixel32::Yellow, transparent}; */ - TSpectrum::ColorKey colors[] = {TSpectrum::ColorKey(0, TPixel32::Magenta), - TSpectrum::ColorKey(0.25, TPixel32::Black), - TSpectrum::ColorKey(0.5, TPixel32::Red), - TSpectrum::ColorKey(0.75, TPixel32::Yellow), - TSpectrum::ColorKey(1, transparent)}; - - m_spectrum = TSpectrumParamP(tArrayCount(colors), colors); + std::vector colors = { + TSpectrum::ColorKey(0, TPixel32::Magenta), + TSpectrum::ColorKey(0.25, TPixel32::Black), + TSpectrum::ColorKey(0.5, TPixel32::Red), + TSpectrum::ColorKey(0.75, TPixel32::Yellow), + TSpectrum::ColorKey(1, transparent)}; + m_spectrum = TSpectrumParamP(colors); bindParam(this, "colors", m_spectrum); bindParam(this, "freq", m_freq); @@ -128,7 +128,7 @@ void doComputeT(TRasterPT raster, TPointD posTrasf, const TAffine &aff, TPointD posAux = posTrasf; T *pix = raster->pixels(y); for (int x = 0; x < raster->getLx(); x++) { - double ang = 0.0; + double ang = 0.0; if (posAux.x != 0 || posAux.y != 0) ang = atan2(posAux.y, posAux.x); double r = sqrt(posAux.x * posAux.x + posAux.y * posAux.y); double v = 0.5 * (1 + sin(r * freq + ang + phase)); @@ -141,7 +141,7 @@ void doComputeT(TRasterPT raster, TPointD posTrasf, const TAffine &aff, } raster->unlock(); } -} +} // namespace //================================================================== @@ -184,11 +184,12 @@ public: , m_wave_phase(0.0) // args, "Cycle") // , m_colors (0) //args, "Colors") { - TSpectrum::ColorKey colors[] = {TSpectrum::ColorKey(0, TPixel32::White), - TSpectrum::ColorKey(0.33, TPixel32::Yellow), - TSpectrum::ColorKey(0.66, TPixel32::Red), - TSpectrum::ColorKey(1, TPixel32::White)}; - m_colors = TSpectrumParamP(tArrayCount(colors), colors); + std::vector colors = { + TSpectrum::ColorKey(0, TPixel32::White), + TSpectrum::ColorKey(0.33, TPixel32::Yellow), + TSpectrum::ColorKey(0.66, TPixel32::Red), + TSpectrum::ColorKey(1, TPixel32::White)}; + m_colors = TSpectrumParamP(colors); bindParam(this, "period", m_period); bindParam(this, "count", m_count); @@ -303,13 +304,13 @@ void doComputeT(TRasterPT ras, TPointD posTrasf, T *endPix = pix + ras->getLx(); while (pix < endPix) { if (w_amplitude) shift = w_amplitude * sin(w_freq * posAux.y + w_phase); - double radius = posAux.x + shift; - double t = 1; + double radius = posAux.x + shift; + double t = 1; if (fabs(radius) < maxRadius) { t = (radius + maxRadius + cycle) * freq; t -= floor(t); } else if (radius < 0) - t = 0; + t = 0; double polinomfactor = (-2 * t + 3) * (t * t); // pos.x += 1.0; *pix++ = spectrum.getPremultipliedValue(polinomfactor); @@ -321,7 +322,7 @@ void doComputeT(TRasterPT ras, TPointD posTrasf, } ras->unlock(); } -} +} // namespace //================================================================== @@ -337,10 +338,10 @@ void LinearGradientFx::doCompute(TTile &tile, double frame, double w_phase = m_wave_phase->getValue(frame); w_freq *= 0.01 * M_PI_180; - TSpectrum::ColorKey colors[] = { + std::vector colors = { TSpectrum::ColorKey(0, m_color1->getValue(frame)), TSpectrum::ColorKey(1, m_color2->getValue(frame))}; - TSpectrumParamP m_colors = TSpectrumParamP(tArrayCount(colors), colors); + TSpectrumParamP m_colors = TSpectrumParamP(colors); TAffine aff = ri.m_affine.inv(); TPointD posTrasf = aff * tile.m_pos; @@ -465,12 +466,12 @@ public: // , m_colors (0) //args, "Colors") { m_period->setMeasureName("fxLength"); - TSpectrum::ColorKey colors[] = {TSpectrum::ColorKey(0, TPixel32::White), - TSpectrum::ColorKey(0.33, TPixel32::Yellow), - TSpectrum::ColorKey(0.66, TPixel32::Red), - TSpectrum::ColorKey(1, TPixel32::White)}; - - m_colors = TSpectrumParamP(tArrayCount(colors), colors); + std::vector colors = { + TSpectrum::ColorKey(0, TPixel32::White), + TSpectrum::ColorKey(0.33, TPixel32::Yellow), + TSpectrum::ColorKey(0.66, TPixel32::Red), + TSpectrum::ColorKey(1, TPixel32::White)}; + m_colors = TSpectrumParamP(colors); bindParam(this, "period", m_period); bindParam(this, "count", m_count); @@ -532,12 +533,12 @@ void RadialGradientFx::doCompute(TTile &tile, double frame, if (innerperiod < period) inner = innerperiod / period; else - inner = 1 - TConsts::epsilon; - TSpectrum::ColorKey colors[] = { + inner = 1 - TConsts::epsilon; + std::vector colors = { TSpectrum::ColorKey(0, m_color1->getValue(frame)), TSpectrum::ColorKey(inner, m_color1->getValue(frame)), TSpectrum::ColorKey(1, m_color2->getValue(frame))}; - TSpectrumParamP m_colors = TSpectrumParamP(tArrayCount(colors), colors); + TSpectrumParamP m_colors = TSpectrumParamP(colors); TAffine aff = ri.m_affine.inv(); TPointD posTrasf = aff * tile.m_pos; multiRadial(tile.getRaster(), posTrasf, m_colors, period, count, cycle, aff, @@ -631,7 +632,7 @@ void doComputeT(TRasterPT raster, TPointD posTrasf, const TAffine &aff, } if (result > 1) result = 1; if (result < 0) result = 0; - *pix++ = blend(T::Black, pixelColor, result); + *pix++ = blend(T::Black, pixelColor, result); posAux.x += aff.a11; posAux.y += aff.a21; } @@ -640,7 +641,7 @@ void doComputeT(TRasterPT raster, TPointD posTrasf, const TAffine &aff, } raster->unlock(); } -} +} // namespace //================================================================== diff --git a/toonz/sources/stdfx/test_boxfx.cpp b/toonz/sources/stdfx/test_boxfx.cpp index 2ef96072..2a40e09a 100644 --- a/toonz/sources/stdfx/test_boxfx.cpp +++ b/toonz/sources/stdfx/test_boxfx.cpp @@ -43,10 +43,11 @@ public: bindParam(this, "int", m_int); bindParam(this, "range", m_range); bindParam(this, "bool", m_bool); - TSpectrum::ColorKey colors[] = {TSpectrum::ColorKey(0, TPixel32::White), - TSpectrum::ColorKey(0.5, TPixel32::Yellow), - TSpectrum::ColorKey(1, TPixel32::Red)}; - m_colors = TSpectrumParamP(tArrayCount(colors), colors); + std::vector colors = { + TSpectrum::ColorKey(0, TPixel32::White), + TSpectrum::ColorKey(0.5, TPixel32::Yellow), + TSpectrum::ColorKey(1, TPixel32::Red)}; + m_colors = TSpectrumParamP(colors); bindParam(this, "spectrum", m_colors); bindParam(this, "string", m_string); addInputPort("Source", m_input); diff --git a/toonz/sources/tconverter/tconverter.cpp b/toonz/sources/tconverter/tconverter.cpp index ede0a425..3a597c66 100644 --- a/toonz/sources/tconverter/tconverter.cpp +++ b/toonz/sources/tconverter/tconverter.cpp @@ -29,6 +29,10 @@ #include "tvectorrenderdata.h" #include "tofflinegl.h" +#if defined(LINUX) +#include +#endif + using namespace std; using namespace TCli; @@ -355,6 +359,10 @@ void convert(const TFilePath &source, const TFilePath &dest, //------------------------------------------------------------------------ int main(int argc, char *argv[]) { +#if defined(LINUX) + QGuiApplication app(argc, argv); +#endif + TEnv::setRootVarName(rootVarName); TEnv::setSystemVarPrefix(systemVarPrefix); TFilePath fp = TEnv::getStuffDir(); diff --git a/toonz/sources/tnztools/CMakeLists.txt b/toonz/sources/tnztools/CMakeLists.txt index bfef22e3..62ae7a2d 100644 --- a/toonz/sources/tnztools/CMakeLists.txt +++ b/toonz/sources/tnztools/CMakeLists.txt @@ -3,6 +3,7 @@ set(MOC_HEADERS edittoolgadgets.h filltool.h fullcolorbrushtool.h + fullcolorfilltool.h plastictool.h skeletonsubtools.h tooloptionscontrols.h @@ -58,6 +59,7 @@ set(SOURCES filltool.cpp fullcolorbrushtool.cpp fullcolorerasertool.cpp + fullcolorfilltool.cpp geometrictool.cpp hooktool.cpp hookselection.cpp diff --git a/toonz/sources/tnztools/fullcolorbrushtool.cpp b/toonz/sources/tnztools/fullcolorbrushtool.cpp index fde2213d..1f421a5f 100644 --- a/toonz/sources/tnztools/fullcolorbrushtool.cpp +++ b/toonz/sources/tnztools/fullcolorbrushtool.cpp @@ -143,6 +143,9 @@ FullColorBrushTool::FullColorBrushTool(std::string name) m_prop.bind(m_preset); m_preset.setId("BrushPreset"); + m_modifierEraser.setId("RasterEraser"); + m_modifierLockAlpha.setId("LockAlpha"); + m_pressure.setId("PressureSensitivity"); m_brushTimer.start(); } diff --git a/toonz/sources/tnztools/fullcolorfilltool.cpp b/toonz/sources/tnztools/fullcolorfilltool.cpp new file mode 100644 index 00000000..5c53980c --- /dev/null +++ b/toonz/sources/tnztools/fullcolorfilltool.cpp @@ -0,0 +1,223 @@ +#include "fullcolorfilltool.h" + +#include "toonz/stage2.h" +#include "tools/cursors.h" +#include "toonz/txshlevelhandle.h" +#include "toonz/trasterimageutils.h" +#include "toonz/ttileset.h" +#include "toonz/ttilesaver.h" +#include "toonz/levelproperties.h" +#include "toonz/preferences.h" +#include "toonz/txsheethandle.h" + +#include "tools/toolhandle.h" +#include "tools/toolutils.h" + +#include "tenv.h" +#include "tpalette.h" +#include "tsystem.h" + +using namespace ToolUtils; + +TEnv::IntVar FullColorMinFillDepth("InknpaintFullColorMinFillDepth", 4); +TEnv::IntVar FullColorMaxFillDepth("InknpaintFullColorMaxFillDepth", 12); + +namespace { + +//============================================================================= +// FullColorFillUndo +//----------------------------------------------------------------------------- + +class FullColorFillUndo final : public TFullColorRasterUndo { + FillParameters m_params; + bool m_saveboxOnly; + +public: + FullColorFillUndo(TTileSetFullColor *tileSet, const FillParameters ¶ms, + TXshSimpleLevel *sl, const TFrameId &fid, bool saveboxOnly) + : TFullColorRasterUndo(tileSet, sl, fid, false, false, 0) + , m_params(params) + , m_saveboxOnly(saveboxOnly) {} + + void redo() const override { + TRasterImageP image = getImage(); + if (!image) return; + TRaster32P r; + if (m_saveboxOnly) { + TRectD temp = image->getBBox(); + TRect ttemp = convert(temp); + r = image->getRaster()->extract(ttemp); + } else + r = image->getRaster(); + + fullColorFill(r, m_params); + + TTool::Application *app = TTool::getApplication(); + if (app) { + app->getCurrentXsheet()->notifyXsheetChanged(); + notifyImageChanged(); + } + } + + int getSize() const override { + return sizeof(*this) + TFullColorRasterUndo::getSize(); + } + + QString getToolName() override { + return QString("Fill Tool : %1") + .arg(QString::fromStdWString(m_params.m_fillType)); + } + int getHistoryType() override { return HistoryType::FillTool; } +}; + +//============================================================================= +// doFill +//----------------------------------------------------------------------------- + +void doFill(const TImageP &img, const TPointD &pos, FillParameters ¶ms, + bool isShiftFill, TXshSimpleLevel *sl, const TFrameId &fid) { + TTool::Application *app = TTool::getApplication(); + if (!app || !sl) return; + + if (TRasterImageP ri = TRasterImageP(img)) { + TPoint offs(0, 0); + TRaster32P ras = ri->getRaster(); + // only accept 32bpp images for now + if (!ras.getPointer() || ras->isEmpty()) return; + + ras->lock(); + + TTileSetFullColor *tileSet = new TTileSetFullColor(ras->getSize()); + TTileSaverFullColor tileSaver(ras, tileSet); + TDimension imageSize = ras->getSize(); + TPointD p(imageSize.lx % 2 ? 0.0 : 0.5, imageSize.ly % 2 ? 0.0 : 0.5); + + /*-- params.m_p = convert(pos-p)ł́A}CiXWłꂪ --*/ + TPointD tmp_p = pos - p; + params.m_p = TPoint((int)floor(tmp_p.x + 0.5), (int)floor(tmp_p.y + 0.5)); + + params.m_p += ras->getCenter(); + params.m_p -= offs; + params.m_shiftFill = isShiftFill; + + TRect rasRect(ras->getSize()); + if (!rasRect.contains(params.m_p)) { + ras->unlock(); + return; + } + + fullColorFill(ras, params, &tileSaver); + + if (tileSaver.getTileSet()->getTileCount() != 0) { + static int count = 0; + TSystem::outputDebug("RASTERFILL" + std::to_string(count++) + "\n"); + if (offs != TPoint()) + for (int i = 0; i < tileSet->getTileCount(); i++) { + TTileSet::Tile *t = tileSet->editTile(i); + t->m_rasterBounds = t->m_rasterBounds + offs; + } + TUndoManager::manager()->add( + new FullColorFillUndo(tileSet, params, sl, fid, + Preferences::instance()->getFillOnlySavebox())); + } + + sl->getProperties()->setDirtyFlag(true); + + ras->unlock(); + } + + TTool *t = app->getCurrentTool()->getTool(); + if (t) t->notifyImageChanged(); +} +}; + +//============================================================================= +// FullColorFillTool +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- + +FullColorFillTool::FullColorFillTool() + : TTool("T_Fill"), m_fillDepth("Fill Depth", 0, 15, 4, 12) { + bind(TTool::RasterImage); + m_prop.bind(m_fillDepth); +} + +void FullColorFillTool::updateTranslation() { + m_fillDepth.setQStringName(tr("Fill Depth")); +} + +FillParameters FullColorFillTool::getFillParameters() const { + FillParameters params; + int styleId = TTool::getApplication()->getCurrentLevelStyleIndex(); + params.m_styleId = styleId; + params.m_minFillDepth = (int)m_fillDepth.getValue().first; + params.m_maxFillDepth = (int)m_fillDepth.getValue().second; + + if (m_level) params.m_palette = m_level->getPalette(); + return params; +} + +void FullColorFillTool::leftButtonDown(const TPointD &pos, + const TMouseEvent &e) { + m_clickPoint = pos; + TXshLevel *xl = TTool::getApplication()->getCurrentLevel()->getLevel(); + m_level = xl ? xl->getSimpleLevel() : 0; + FillParameters params = getFillParameters(); + doFill(getImage(true), pos, params, e.isShiftPressed(), m_level.getPointer(), + getCurrentFid()); + invalidate(); +} + +void FullColorFillTool::leftButtonDrag(const TPointD &pos, + const TMouseEvent &e) { + FillParameters params = getFillParameters(); + if (m_clickPoint == pos) return; + if (!m_level || !params.m_palette) return; + TImageP img = getImage(true); + TPixel32 fillColor = + params.m_palette->getStyle(params.m_styleId)->getMainColor(); + if (TRasterImageP ri = img) { + TRaster32P ras = ri->getRaster(); + if (!ras) return; + TPointD center = ras->getCenterD(); + TPoint ipos = convert(pos + center); + if (!ras->getBounds().contains(ipos)) return; + TPixel32 pix = ras->pixels(ipos.y)[ipos.x]; + if (pix == fillColor) { + invalidate(); + return; + } + } else + return; + doFill(img, pos, params, e.isShiftPressed(), m_level.getPointer(), + getCurrentFid()); + invalidate(); +} + +bool FullColorFillTool::onPropertyChanged(std::string propertyName) { + // Fill Depth + if (propertyName == m_fillDepth.getName()) { + FullColorMinFillDepth = (int)m_fillDepth.getValue().first; + FullColorMaxFillDepth = (int)m_fillDepth.getValue().second; + } + return true; +} + +void FullColorFillTool::onActivate() { + static bool firstTime = true; + if (firstTime) { + m_fillDepth.setValue(TDoublePairProperty::Value(FullColorMinFillDepth, + FullColorMaxFillDepth)); + firstTime = false; + } +} + +int FullColorFillTool::getCursorId() const { + int ret = ToolCursor::FillCursor; + if (ToonzCheck::instance()->getChecks() & ToonzCheck::eBlackBg) + ret = ret | ToolCursor::Ex_Negate; + return ret; +} + +FullColorFillTool FullColorRasterFillTool; \ No newline at end of file diff --git a/toonz/sources/tnztools/fullcolorfilltool.h b/toonz/sources/tnztools/fullcolorfilltool.h new file mode 100644 index 00000000..1dd979cc --- /dev/null +++ b/toonz/sources/tnztools/fullcolorfilltool.h @@ -0,0 +1,45 @@ +#pragma once + +#ifndef FULLCOLORFILLTOOL_H +#define FULLCOLORFILLTOOL_H + +// TnzCore includes +#include "tproperty.h" + +// TnzTools includes +#include "tools/tool.h" +#include "toonz/fill.h" +#include "toonz/txshsimplelevel.h" + +#include +#include + +class FullColorFillTool final : public QObject, public TTool { + Q_DECLARE_TR_FUNCTIONS(FullColorFillTool) + + TXshSimpleLevelP m_level; + TDoublePairProperty m_fillDepth; + TPropertyGroup m_prop; + TPointD m_clickPoint; + +public: + FullColorFillTool(); + + ToolType getToolType() const override { return TTool::LevelWriteTool; } + + void updateTranslation() override; + + TPropertyGroup *getProperties(int targetType) override { return &m_prop; } + + FillParameters getFillParameters() const; + + void leftButtonDown(const TPointD &pos, const TMouseEvent &e) override; + void leftButtonDrag(const TPointD &pos, const TMouseEvent &e) override; + + bool onPropertyChanged(std::string propertyName) override; + + void onActivate() override; + int getCursorId() const override; +}; + +#endif // FULLCOLORFILLTOOL_H \ No newline at end of file diff --git a/toonz/sources/tnztools/paintbrushtool.cpp b/toonz/sources/tnztools/paintbrushtool.cpp index ebf5ca98..d6008706 100644 --- a/toonz/sources/tnztools/paintbrushtool.cpp +++ b/toonz/sources/tnztools/paintbrushtool.cpp @@ -401,18 +401,11 @@ bool PaintBrushTool::onPropertyChanged(std::string propertyName) { // Selective else if (propertyName == m_onlyEmptyAreas.getName()) { - if (m_onlyEmptyAreas.getValue() && m_colorType.getValue() == LINES) { - m_colorType.setValue(AREAS); - PaintBrushColorType = ::to_string(m_colorType.getValue()); - } PaintBrushSelective = (int)(m_onlyEmptyAreas.getValue()); } // Areas, Lines etc. else if (propertyName == m_colorType.getName()) { - if (m_colorType.getValue() == LINES) { - PaintBrushSelective = (int)(m_onlyEmptyAreas.getValue()); - } PaintBrushColorType = ::to_string(m_colorType.getValue()); /*--- ColorModelのCursor更新のためにSIGNALを出す ---*/ TTool::getApplication()->getCurrentTool()->notifyToolChanged(); @@ -428,7 +421,7 @@ void PaintBrushTool::leftButtonDown(const TPointD &pos, const TMouseEvent &e) { TImageP image(getImage(true)); if (m_colorType.getValue() == LINES) m_colorTypeBrush = INK; if (m_colorType.getValue() == AREAS) m_colorTypeBrush = PAINT; - if (m_colorType.getValue() == ALL) m_colorTypeBrush = INKNPAINT; + if (m_colorType.getValue() == ALL) m_colorTypeBrush = INKNPAINT; if (TToonzImageP ti = image) { TRasterCM32P ras = ti->getRaster(); @@ -534,7 +527,7 @@ void PaintBrushTool::onDeactivate() { //----------------------------------------------------------------------------- /*! * 描画中にツールが切り替わった場合に備え、onDeactivateでもMouseReleaseと同じ終了処理を行う -*/ + */ void PaintBrushTool::finishBrush() { if (TToonzImageP ti = (TToonzImageP)getImage(true)) { if (m_rasterTrack) { diff --git a/toonz/sources/tnztools/stylepickertool.cpp b/toonz/sources/tnztools/stylepickertool.cpp index b8b7d771..fc5fe813 100644 --- a/toonz/sources/tnztools/stylepickertool.cpp +++ b/toonz/sources/tnztools/stylepickertool.cpp @@ -63,14 +63,15 @@ StylePickerTool::StylePickerTool() void StylePickerTool::leftButtonDown(const TPointD &pos, const TMouseEvent &e) { m_oldStyleId = m_currentStyleId = getApplication()->getCurrentLevelStyleIndex(); - pick(pos, e); + pick(pos, e, false); } void StylePickerTool::leftButtonDrag(const TPointD &pos, const TMouseEvent &e) { pick(pos, e); } -void StylePickerTool::pick(const TPointD &pos, const TMouseEvent &e) { +void StylePickerTool::pick(const TPointD &pos, const TMouseEvent &e, + bool isDragging) { // Area = 0, Line = 1, All = 2 int modeValue = m_colorType.getIndex(); @@ -132,7 +133,8 @@ void StylePickerTool::pick(const TPointD &pos, const TMouseEvent &e) { ->getSelection() ->selectNone(); /*-- StyleIdの移動 --*/ - getApplication()->setCurrentLevelStyleIndex(superPicked_StyleId); + getApplication()->setCurrentLevelStyleIndex(superPicked_StyleId, + !isDragging); return; } } @@ -181,7 +183,12 @@ void StylePickerTool::pick(const TPointD &pos, const TMouseEvent &e) { if (styleSelection) styleSelection->selectNone(); } - getApplication()->setCurrentLevelStyleIndex(styleId); + // When clicking and switching between studio palette and level palette, the + // signal broadcastColorStyleSwitched is not emitted if the picked style is + // previously selected one. + // Therefore here I set the "forceEmit" flag to true in order to emit the + // signal whenever the picking with mouse press. + getApplication()->setCurrentLevelStyleIndex(styleId, !isDragging); } void StylePickerTool::mouseMove(const TPointD &pos, const TMouseEvent &e) { diff --git a/toonz/sources/tnztools/stylepickertool.h b/toonz/sources/tnztools/stylepickertool.h index de3fb68f..65a46c7a 100644 --- a/toonz/sources/tnztools/stylepickertool.h +++ b/toonz/sources/tnztools/stylepickertool.h @@ -36,7 +36,7 @@ public: void leftButtonDrag(const TPointD &pos, const TMouseEvent &e) override; - void pick(const TPointD &pos, const TMouseEvent &e); + void pick(const TPointD &pos, const TMouseEvent &e, bool isDragging = true); void mouseMove(const TPointD &pos, const TMouseEvent &e) override; diff --git a/toonz/sources/tnztools/tooloptions.cpp b/toonz/sources/tnztools/tooloptions.cpp index 3a0a997e..6702f936 100644 --- a/toonz/sources/tnztools/tooloptions.cpp +++ b/toonz/sources/tnztools/tooloptions.cpp @@ -25,6 +25,7 @@ #include "toonzqt/gutil.h" #include "toonzqt/dvscrollwidget.h" #include "toonzqt/lutcalibrator.h" +#include "toonzqt/viewcommandids.h" // TnzLib includes #include "toonz/tobjecthandle.h" @@ -124,7 +125,8 @@ ToolOptionsBox::ToolOptionsBox(QWidget *parent, bool isScrollable) ToolOptionsBox::~ToolOptionsBox() { std::for_each(m_controls.begin(), m_controls.end(), std::default_delete()); - std::for_each(m_labels.begin(), m_labels.end(), std::default_delete()); + std::for_each(m_labels.begin(), m_labels.end(), + std::default_delete()); } //----------------------------------------------------------------------------- @@ -217,6 +219,17 @@ void ToolOptionControlBuilder::visit(TDoubleProperty *p) { control->addAction(a); QObject::connect(a, SIGNAL(triggered()), control, SLOT(decrease())); } + if (p->getName() == "ModifierSize") { + QAction *a; + a = cm->getAction("A_IncreaseMaxBrushThickness"); + control->addAction(a); + QObject::connect(a, SIGNAL(triggered()), control, + SLOT(increaseFractional())); + a = cm->getAction("A_DecreaseMaxBrushThickness"); + control->addAction(a); + QObject::connect(a, SIGNAL(triggered()), control, + SLOT(decreaseFractional())); + } if (p->getName() == "Hardness:") { QAction *a; a = cm->getAction("A_IncreaseBrushHardness"); @@ -522,7 +535,7 @@ ArrowToolOptionsBox::ArrowToolOptionsBox( m_nsPosField = new PegbarChannelField(m_tool, TStageObject::T_Y, "field", frameHandle, objHandle, xshHandle, this); - m_zField = new PegbarChannelField(m_tool, TStageObject::T_Z, "field", + m_zField = new PegbarChannelField(m_tool, TStageObject::T_Z, "field", frameHandle, objHandle, xshHandle, this); m_noScaleZField = new NoScaleField(m_tool, "field"); @@ -653,7 +666,7 @@ ArrowToolOptionsBox::ArrowToolOptionsBox( m_zField->setPrecision(4); m_noScaleZField->setPrecision(4); - bool splined = isCurrentObjectSplined(); + bool splined = isCurrentObjectSplined(); if (splined != m_splined) m_splined = splined; setSplined(m_splined); @@ -1051,7 +1064,7 @@ void ArrowToolOptionsBox::onStageObjectChange() { updateStatus(); } //----------------------------------------------------------------------------- /*! update the object list in combobox -*/ + */ void ArrowToolOptionsBox::updateStageObjectComboItems() { // clear items m_currentStageObjectCombo->clear(); @@ -1080,7 +1093,7 @@ void ArrowToolOptionsBox::updateStageObjectComboItems() { //------------------------------------------------------------------------------ /*! syncronize the current item in the combobox to the selected stage object -*/ + */ void ArrowToolOptionsBox::syncCurrentStageObjectComboItem() { TStageObjectId curObjId = m_objHandle->getObjectId(); @@ -1103,7 +1116,7 @@ void ArrowToolOptionsBox::syncCurrentStageObjectComboItem() { //------------------------------------------------------------------------------ /*!change the current stage object when user changes it via combobox by hand -*/ + */ void ArrowToolOptionsBox::onCurrentStageObjectComboActivated(int index) { int code = m_currentStageObjectCombo->itemData(index).toInt(); TStageObjectId id; @@ -1281,7 +1294,7 @@ SelectionToolOptionsBox::SelectionToolOptionsBox(QWidget *parent, TTool *tool, // assert(ret); bool ret = connect(m_scaleXField, SIGNAL(valueChange(bool)), SLOT(onScaleXValueChanged(bool))); - ret = ret && connect(m_scaleYField, SIGNAL(valueChange(bool)), + ret = ret && connect(m_scaleYField, SIGNAL(valueChange(bool)), SLOT(onScaleYValueChanged(bool))); if (m_setSaveboxCheckbox) ret = ret && connect(m_setSaveboxCheckbox, SIGNAL(toggled(bool)), @@ -1609,7 +1622,7 @@ PaintbrushToolOptionsBox::PaintbrushToolOptionsBox(QWidget *parent, TTool *tool, dynamic_cast(m_controls.value("Selective")); if (m_colorMode->getProperty()->getValue() == L"Lines") - m_selectiveMode->setEnabled(false); + m_selectiveMode->setVisible(false); bool ret = connect(m_colorMode, SIGNAL(currentIndexChanged(int)), this, SLOT(onColorModeChanged(int))); @@ -1629,7 +1642,26 @@ void PaintbrushToolOptionsBox::updateStatus() { void PaintbrushToolOptionsBox::onColorModeChanged(int index) { const TEnumProperty::Range &range = m_colorMode->getProperty()->getRange(); bool enabled = range[index] != L"Lines"; - m_selectiveMode->setEnabled(enabled); + m_selectiveMode->setVisible(enabled); +} + +//============================================================================= +// +// FullColorFillToolOptionsBox +// +//============================================================================= + +FullColorFillToolOptionsBox::FullColorFillToolOptionsBox( + QWidget *parent, TTool *tool, TPaletteHandle *pltHandle, + ToolHandle *toolHandle) + : ToolOptionsBox(parent) { + TPropertyGroup *props = tool->getProperties(0); + assert(props->getPropertyCount() > 0); + + ToolOptionControlBuilder builder(this, tool, pltHandle, toolHandle); + if (tool && tool->getProperties(0)) tool->getProperties(0)->accept(builder); + + m_layout->addStretch(0); } //============================================================================= @@ -1673,11 +1705,11 @@ FillToolOptionsBox::FillToolOptionsBox(QWidget *parent, TTool *tool, bool ret = connect(m_colorMode, SIGNAL(currentIndexChanged(int)), this, SLOT(onColorModeChanged(int))); - ret = ret && connect(m_toolType, SIGNAL(currentIndexChanged(int)), this, + ret = ret && connect(m_toolType, SIGNAL(currentIndexChanged(int)), this, SLOT(onToolTypeChanged(int))); - ret = ret && connect(m_onionMode, SIGNAL(toggled(bool)), this, + ret = ret && connect(m_onionMode, SIGNAL(toggled(bool)), this, SLOT(onOnionModeToggled(bool))); - ret = ret && connect(m_multiFrameMode, SIGNAL(toggled(bool)), this, + ret = ret && connect(m_multiFrameMode, SIGNAL(toggled(bool)), this, SLOT(onMultiFrameModeToggled(bool))); assert(ret); if (m_colorMode->getProperty()->getValue() == L"Lines") { @@ -2276,9 +2308,9 @@ TapeToolOptionsBox::TapeToolOptionsBox(QWidget *parent, TTool *tool, bool ret = connect(m_typeMode, SIGNAL(currentIndexChanged(int)), this, SLOT(onToolTypeChanged(int))); - ret = ret && connect(m_toolMode, SIGNAL(currentIndexChanged(int)), this, + ret = ret && connect(m_toolMode, SIGNAL(currentIndexChanged(int)), this, SLOT(onToolModeChanged(int))); - ret = ret && connect(m_joinStrokesMode, SIGNAL(toggled(bool)), this, + ret = ret && connect(m_joinStrokesMode, SIGNAL(toggled(bool)), this, SLOT(onJoinStrokesModeChanged())); assert(ret); } @@ -2326,7 +2358,7 @@ void TapeToolOptionsBox::onJoinStrokesModeChanged() { //----------------------------------------------------------------------------- /*! Label with background color -*/ + */ class RGBLabel final : public QWidget { QColor m_color; @@ -2365,10 +2397,11 @@ protected: p.setPen(Qt::black); p.setBrush(Qt::NoBrush); - p.drawText(rect(), Qt::AlignCenter, QString("R:%1 G:%2 B:%3") - .arg(m_color.red()) - .arg(m_color.green()) - .arg(m_color.blue())); + p.drawText(rect(), Qt::AlignCenter, + QString("R:%1 G:%2 B:%3") + .arg(m_color.red()) + .arg(m_color.green()) + .arg(m_color.blue())); } }; @@ -2636,6 +2669,74 @@ void ShiftTraceToolOptionBox::onAfterRadioBtnClicked() { stTool->setCurrentGhostIndex(1); } +//============================================================================= +// ZoomToolOptionBox +//----------------------------------------------------------------------------- + +ZoomToolOptionsBox::ZoomToolOptionsBox(QWidget *parent, TTool *tool, + TPaletteHandle *pltHandle, + ToolHandle *toolHandle) + : ToolOptionsBox(parent) { + setFrameStyle(QFrame::StyledPanel); + setFixedHeight(26); + + QAction *resetZoomAction = CommandManager::instance()->getAction(V_ZoomReset); + + QPushButton *button = new QPushButton(tr("Reset Zoom")); + button->setFixedHeight(20); + button->addAction(resetZoomAction); + connect(button, SIGNAL(clicked()), resetZoomAction, SLOT(trigger())); + + m_layout->addStretch(1); + m_layout->addWidget(button, 0); +} + +//============================================================================= +// RotateToolOptionBox +//----------------------------------------------------------------------------- + +RotateToolOptionsBox::RotateToolOptionsBox(QWidget *parent, TTool *tool, + TPaletteHandle *pltHandle, + ToolHandle *toolHandle) + : ToolOptionsBox(parent) { + setFrameStyle(QFrame::StyledPanel); + setFixedHeight(26); + + QAction *resetRotationAction = + CommandManager::instance()->getAction(V_RotateReset); + + QPushButton *button = new QPushButton(tr("Reset Rotation")); + button->setFixedHeight(20); + button->addAction(resetRotationAction); + connect(button, SIGNAL(clicked()), resetRotationAction, SLOT(trigger())); + + m_layout->addStretch(1); + m_layout->addWidget(button, 0); +} + +//============================================================================= +// HandToolOptionBox +//----------------------------------------------------------------------------- + +HandToolOptionsBox::HandToolOptionsBox(QWidget *parent, TTool *tool, + TPaletteHandle *pltHandle, + ToolHandle *toolHandle) + : ToolOptionsBox(parent) { + setFrameStyle(QFrame::StyledPanel); + setFixedHeight(26); + + QAction *resetPositionAction = + CommandManager::instance()->getAction(V_PositionReset); + + QPushButton *button = new QPushButton(tr("Reset Position")); + button->setFixedHeight(20); + button->addAction(resetPositionAction); + connect(button, SIGNAL(clicked()), resetPositionAction, SLOT(trigger())); + + m_layout->addStretch(1); + m_layout->addWidget(button, 0); +} + //============================================================================= // ToolOptions //----------------------------------------------------------------------------- @@ -2711,7 +2812,7 @@ void ToolOptions::onToolSwitched() { TTool *tool = app->getCurrentTool()->getTool(); if (tool) { // c'e' un tool corrente - ToolOptionsBox *panel = 0; + ToolOptionsBox *panel = 0; std::map::iterator it = m_panels.find(tool); if (it == m_panels.end()) { // ... senza panel associato @@ -2727,9 +2828,13 @@ void ToolOptions::onToolSwitched() { panel = new TypeToolOptionsBox(0, tool, currPalette, currTool); else if (tool->getName() == T_PaintBrush) panel = new PaintbrushToolOptionsBox(0, tool, currPalette, currTool); - else if (tool->getName() == T_Fill) - panel = new FillToolOptionsBox(0, tool, currPalette, currTool); - else if (tool->getName() == T_Eraser) + else if (tool->getName() == T_Fill) { + if (tool->getTargetType() & TTool::RasterImage) + panel = + new FullColorFillToolOptionsBox(0, tool, currPalette, currTool); + else + panel = new FillToolOptionsBox(0, tool, currPalette, currTool); + } else if (tool->getName() == T_Eraser) panel = new EraserToolOptionsBox(0, tool, currPalette, currTool); else if (tool->getName() == T_Tape) panel = new TapeToolOptionsBox(0, tool, currPalette, currTool); @@ -2746,6 +2851,12 @@ void ToolOptions::onToolSwitched() { app->getPaletteController()); else if (tool->getName() == "T_ShiftTrace") panel = new ShiftTraceToolOptionBox(this, tool); + else if (tool->getName() == T_Zoom) + panel = new ZoomToolOptionsBox(0, tool, currPalette, currTool); + else if (tool->getName() == T_Rotate) + panel = new RotateToolOptionsBox(0, tool, currPalette, currTool); + else if (tool->getName() == T_Hand) + panel = new HandToolOptionsBox(0, tool, currPalette, currTool); else panel = tool->createOptionsBox(); // Only this line should remain out // of that if/else monstrosity diff --git a/toonz/sources/tnztools/tooloptionscontrols.cpp b/toonz/sources/tnztools/tooloptionscontrols.cpp index bee24dc2..24f64bb7 100644 --- a/toonz/sources/tnztools/tooloptionscontrols.cpp +++ b/toonz/sources/tnztools/tooloptionscontrols.cpp @@ -192,7 +192,7 @@ void ToolOptionSlider::onValueChanged(bool isDragging) { //----------------------------------------------------------------------------- -void ToolOptionSlider::increase() { +void ToolOptionSlider::increase(double step) { if (m_toolHandle && m_toolHandle->getTool() != m_tool) return; // active only if the belonging combo-viewer is visible if (!isInVisibleViewer(this)) return; @@ -201,7 +201,7 @@ void ToolOptionSlider::increase() { double minValue, maxValue; getRange(minValue, maxValue); - value += 1; + value += step; if (value > maxValue) value = maxValue; setValue(value); @@ -213,7 +213,11 @@ void ToolOptionSlider::increase() { //----------------------------------------------------------------------------- -void ToolOptionSlider::decrease() { +void ToolOptionSlider::increaseFractional() { increase(0.06); } + +//----------------------------------------------------------------------------- + +void ToolOptionSlider::decrease(double step) { if (m_toolHandle && m_toolHandle->getTool() != m_tool) return; // active only if the belonging combo-viewer is visible if (!isInVisibleViewer(this)) return; @@ -222,7 +226,7 @@ void ToolOptionSlider::decrease() { double minValue, maxValue; getRange(minValue, maxValue); - value -= 1; + value -= step; if (value < minValue) value = minValue; setValue(value); @@ -232,6 +236,10 @@ void ToolOptionSlider::decrease() { repaint(); } +//----------------------------------------------------------------------------- + +void ToolOptionSlider::decreaseFractional() { decrease(0.06); } + //============================================================================= ToolOptionPairSlider::ToolOptionPairSlider(TTool *tool, diff --git a/toonz/sources/tnztools/tooloptionscontrols.h b/toonz/sources/tnztools/tooloptionscontrols.h index 6af4bbc9..6698552a 100644 --- a/toonz/sources/tnztools/tooloptionscontrols.h +++ b/toonz/sources/tnztools/tooloptionscontrols.h @@ -119,8 +119,10 @@ public: protected slots: void onValueChanged(bool isDragging); - void increase(); - void decrease(); + void increase(double step = 1.0); + void decrease(double step = 1.0); + void increaseFractional(); + void decreaseFractional(); }; //----------------------------------------------------------------------------- diff --git a/toonz/sources/toonz/colormodelviewer.cpp b/toonz/sources/toonz/colormodelviewer.cpp index 9bd20292..5323e933 100644 --- a/toonz/sources/toonz/colormodelviewer.cpp +++ b/toonz/sources/toonz/colormodelviewer.cpp @@ -244,7 +244,7 @@ void ColorModelViewer::contextMenuEvent(QContextMenuEvent *event) { menu.addSeparator(); QString shortcut = QString::fromStdString( - CommandManager::instance()->getShortcutFromId(V_ZoomReset)); + CommandManager::instance()->getShortcutFromId(V_ViewReset)); QAction *reset = menu.addAction(tr("Reset View") + "\t " + shortcut); connect(reset, SIGNAL(triggered()), m_imageViewer, SLOT(resetView())); diff --git a/toonz/sources/toonz/columnselection.cpp b/toonz/sources/toonz/columnselection.cpp index 4bd705e4..78b90caa 100644 --- a/toonz/sources/toonz/columnselection.cpp +++ b/toonz/sources/toonz/columnselection.cpp @@ -130,7 +130,8 @@ void TColumnSelection::explodeChild() { static bool canMergeColumns(int column, int mColumn, bool forMatchlines) { TXsheet *xsh = TApp::instance()->getCurrentXsheet()->getXsheet(); - if (xsh->getColumn(column)->isLocked()) return false; + if (!xsh || !xsh->getColumn(column) || xsh->getColumn(column)->isLocked()) + return false; int start, end; xsh->getCellRange(column, start, end); diff --git a/toonz/sources/toonz/comboviewerpane.cpp b/toonz/sources/toonz/comboviewerpane.cpp index f0c4a5d6..1c6a1ef4 100644 --- a/toonz/sources/toonz/comboviewerpane.cpp +++ b/toonz/sources/toonz/comboviewerpane.cpp @@ -29,6 +29,7 @@ #include "toonz/palettecontroller.h" #include "toonz/toonzfolders.h" #include "toonz/preferences.h" +#include "toonz/tproject.h" // TnzQt includes #include "toonzqt/menubarcommand.h" @@ -616,11 +617,13 @@ void ComboViewerPanel::changeWindowTitle() { // if the frame type is "scene editing" if (app->getCurrentFrame()->isEditingScene()) { - QString sceneName = QString::fromStdWString(scene->getSceneName()); + TProject *project = scene->getProject(); + QString projectName = QString::fromStdString(project->getName().getName()); + QString sceneName = QString::fromStdWString(scene->getSceneName()); if (sceneName.isEmpty()) sceneName = tr("Untitled"); - if (app->getCurrentScene()->getDirtyFlag()) sceneName += QString(" *"); - name = tr("Scene: ") + sceneName; + if (app->getCurrentScene()->getDirtyFlag()) sceneName += QString("*"); + name = tr("Scene: ") + sceneName + tr(" :: Project: ") + projectName; if (frame >= 0) name = name + tr(" :: Frame: ") + tr(std::to_string(frame + 1).c_str()); diff --git a/toonz/sources/toonz/commandbarpopup.cpp b/toonz/sources/toonz/commandbarpopup.cpp index 8d0a9032..1197c771 100644 --- a/toonz/sources/toonz/commandbarpopup.cpp +++ b/toonz/sources/toonz/commandbarpopup.cpp @@ -316,7 +316,7 @@ CommandBarListTree::CommandBarListTree(QWidget* parent) : QTreeWidget(parent) { addFolder(ShortcutTree::tr("Right-click Menu Commands"), RightClickMenuCommandType); addFolder(ShortcutTree::tr("Tool Modifiers"), ToolModifierCommandType); - addFolder(ShortcutTree::tr("Visualization"), ZoomCommandType); + addFolder(ShortcutTree::tr("Visualization"), VisualizationButtonCommandType); addFolder(ShortcutTree::tr("Misc"), MiscCommandType); addFolder(ShortcutTree::tr("RGBA Channels"), RGBACommandType); diff --git a/toonz/sources/toonz/filmstripcommand.cpp b/toonz/sources/toonz/filmstripcommand.cpp index 1dfc5240..da4bc849 100644 --- a/toonz/sources/toonz/filmstripcommand.cpp +++ b/toonz/sources/toonz/filmstripcommand.cpp @@ -70,9 +70,8 @@ void doUpdateXSheet(TXshSimpleLevel *sl, std::vector oldFids, cells[i].m_level->getType() == CHILD_XSHLEVEL) { TXshChildLevel *level = cells[i].m_level->getChildLevel(); // make sure we haven't already checked the level - if (level && - std::find(childLevels.begin(), childLevels.end(), level) == - childLevels.end()) { + if (level && std::find(childLevels.begin(), childLevels.end(), + level) == childLevels.end()) { childLevels.push_back(level); TXsheet *subXsh = level->getXsheet(); doUpdateXSheet(sl, oldFids, newFids, subXsh, childLevels); @@ -101,8 +100,8 @@ void doUpdateXSheet(TXshSimpleLevel *sl, std::vector oldFids, //----------------------------------------------------------------------------- -void updateXSheet(TXshSimpleLevel *sl, std::vector oldFids, - std::vector newFids) { +static void updateXSheet(TXshSimpleLevel *sl, std::vector oldFids, + std::vector newFids) { std::vector childLevels; TXsheet *xsh = TApp::instance()->getCurrentScene()->getScene()->getTopXsheet(); @@ -145,7 +144,7 @@ void makeSpaceForFids(TXshSimpleLevel *sl, if (Preferences::instance()->isSyncLevelRenumberWithXsheetEnabled()) updateXSheet(sl, oldFids, fids); sl->renumber(fids); - sl->setDirtyFlag(true); + sl->setDirtyFlag(true); } } @@ -250,10 +249,10 @@ bool pasteAreasWithoutUndo(const QMimeData *data, TXshSimpleLevel *sl, affine *= sc; int i; TRectD boxD; - if (rects.size() > 0) boxD = rects[0]; + if (rects.size() > 0) boxD = rects[0]; if (strokes.size() > 0) boxD = strokes[0].getBBox(); for (i = 0; i < rects.size(); i++) boxD += rects[i]; - for (i = 0; i < strokes.size(); i++) boxD += strokes[i].getBBox(); + for (i = 0; i < strokes.size(); i++) boxD += strokes[i].getBBox(); boxD = affine * boxD; TRect box = ToonzImageUtils::convertWorldToRaster(boxD, ti); TPoint pos = box.getP00(); @@ -309,10 +308,10 @@ bool pasteAreasWithoutUndo(const QMimeData *data, TXshSimpleLevel *sl, affine *= sc; int i; TRectD boxD; - if (rects.size() > 0) boxD = rects[0]; + if (rects.size() > 0) boxD = rects[0]; if (strokes.size() > 0) boxD = strokes[0].getBBox(); for (i = 0; i < rects.size(); i++) boxD += rects[i]; - for (i = 0; i < strokes.size(); i++) boxD += strokes[i].getBBox(); + for (i = 0; i < strokes.size(); i++) boxD += strokes[i].getBBox(); boxD = affine * boxD; TRect box = TRasterImageUtils::convertWorldToRaster(boxD, ri); TPoint pos = box.getP00(); @@ -604,13 +603,13 @@ public: int i; TRectD boxD; - if (rects.size() > 0) boxD = rects[0]; + if (rects.size() > 0) boxD = rects[0]; if (strokes.size() > 0) boxD = strokes[0].getBBox(); for (i = 0; i < rects.size(); i++) boxD += rects[i]; - for (i = 0; i < strokes.size(); i++) boxD += strokes[i].getBBox(); - boxD = affine * boxD; - TRect box = ToonzImageUtils::convertWorldToRaster(boxD, ti); - TPoint pos = box.getP00(); + for (i = 0; i < strokes.size(); i++) boxD += strokes[i].getBBox(); + boxD = affine * boxD; + TRect box = ToonzImageUtils::convertWorldToRaster(boxD, ti); + TPoint pos = box.getP00(); TRasterCM32P app = ras; TRop::over(ti->getRaster(), app, pos, affine); ToolUtils::updateSaveBox(m_level, *it); @@ -639,13 +638,13 @@ public: affine *= sc; int i; TRectD boxD; - if (rects.size() > 0) boxD = rects[0]; + if (rects.size() > 0) boxD = rects[0]; if (strokes.size() > 0) boxD = strokes[0].getBBox(); for (i = 0; i < rects.size(); i++) boxD += rects[i]; - for (i = 0; i < strokes.size(); i++) boxD += strokes[i].getBBox(); - boxD = affine * boxD; - TRect box = TRasterImageUtils::convertWorldToRaster(boxD, ri); - TPoint pos = box.getP00(); + for (i = 0; i < strokes.size(); i++) boxD += strokes[i].getBBox(); + boxD = affine * boxD; + TRect box = TRasterImageUtils::convertWorldToRaster(boxD, ri); + TPoint pos = box.getP00(); TRasterCM32P app = ras; if (app) TRop::over(ri->getRaster(), app, ri->getPalette(), pos, affine); @@ -985,7 +984,7 @@ public: updateXSheet(m_sl.getPointer(), newFrames, m_oldLevelFrameId); } m_sl->renumber(m_oldLevelFrameId); - m_sl->setDirtyFlag(true); + m_sl->setDirtyFlag(true); TApp::instance() ->getPaletteController() ->getCurrentLevelPalette() @@ -1309,8 +1308,8 @@ public: m_level->renumber(fids); TSelection *selection = TSelection::getCurrent(); if (selection) selection->selectNone(); - m_level->setDirtyFlag(true); - TApp::instance()->getCurrentLevel()->notifyLevelChange(); + m_level->setDirtyFlag(true); + TApp::instance()->getCurrentLevel()->notifyLevelChange(); } void undo() const override { std::vector fids; @@ -1725,7 +1724,7 @@ public: // TImageCache::instance()->add("UndoInsertEmptyFrames"+QString::number((UINT)this), // img); TImageCache::instance()->add( - "UndoInsertEmptyFrames" + QString::number((uintptr_t) this), img); + "UndoInsertEmptyFrames" + QString::number((uintptr_t)this), img); } } m_updateXSheet = @@ -1735,7 +1734,7 @@ public: ~UndoInsertEmptyFrames() { // TImageCache::instance()->remove("UndoInsertEmptyFrames"+QString::number((UINT)this)); TImageCache::instance()->remove("UndoInsertEmptyFrames" + - QString::number((uintptr_t) this)); + QString::number((uintptr_t)this)); } void undo() const override { @@ -1747,7 +1746,7 @@ public: updateXSheet(m_level.getPointer(), newFrames, m_oldFrames); } m_level->renumber(m_oldFrames); - m_level->setDirtyFlag(true); + m_level->setDirtyFlag(true); TApp::instance()->getCurrentLevel()->notifyLevelChange(); } @@ -1762,7 +1761,7 @@ public: // (TToonzImageP)TImageCache::instance()->get("UndoInsertEmptyFrames"+QString::number((UINT)this), // true); TToonzImageP image = (TToonzImageP)TImageCache::instance()->get( - "UndoInsertEmptyFrames" + QString::number((uintptr_t) this), true); + "UndoInsertEmptyFrames" + QString::number((uintptr_t)this), true); if (!image) return; for (it = m_frames.begin(); it != m_frames.end(); ++it) m_level->setFrame(*it, image); @@ -2039,7 +2038,7 @@ public: m_level->renumber(m_oldFrames); TSelection *selection = TSelection::getCurrent(); if (selection) selection->selectNone(); - m_level->setDirtyFlag(true); + m_level->setDirtyFlag(true); TApp::instance()->getCurrentLevel()->notifyLevelChange(); } void redo() const override { @@ -2205,7 +2204,7 @@ public: updateXSheet(m_level.getPointer(), newFrames, m_oldFrames); } m_level->renumber(m_oldFrames); - m_level->setDirtyFlag(true); + m_level->setDirtyFlag(true); TApp::instance()->getCurrentLevel()->notifyLevelChange(); } void redo() const override { diff --git a/toonz/sources/toonz/floatingpanelcommand.cpp b/toonz/sources/toonz/floatingpanelcommand.cpp index 2e25ca08..26e2f201 100644 --- a/toonz/sources/toonz/floatingpanelcommand.cpp +++ b/toonz/sources/toonz/floatingpanelcommand.cpp @@ -137,6 +137,7 @@ TPanel *OpenFloatingPanel::getOrOpenFloatingPanel( QString::fromStdString(panelType)); if (!panel) return 0; // it should never happen // panel->setWindowTitle(QObject::tr(m_title.toStdString().c_str())); + panel->restoreFloatingPanelState(); panel->setFloating(true); panel->show(); panel->raise(); diff --git a/toonz/sources/toonz/fxparameditorpopup.cpp b/toonz/sources/toonz/fxparameditorpopup.cpp index ef0385e1..0ff3a2b8 100644 --- a/toonz/sources/toonz/fxparameditorpopup.cpp +++ b/toonz/sources/toonz/fxparameditorpopup.cpp @@ -59,6 +59,7 @@ FxParamEditorPopup::FxParamEditorPopup() } //============================================================================= - +/* OpenPopupCommandHandler openFxParamEditorPopup( MI_FxParamEditor); +*/ \ No newline at end of file diff --git a/toonz/sources/toonz/imageviewer.cpp b/toonz/sources/toonz/imageviewer.cpp index c0b2f356..9a924e5e 100644 --- a/toonz/sources/toonz/imageviewer.cpp +++ b/toonz/sources/toonz/imageviewer.cpp @@ -39,6 +39,7 @@ #include #include #include +#include //=================================================================================== @@ -118,8 +119,8 @@ class FlipZoomer final : public ImageUtils::ShortcutZoomer { public: FlipZoomer(ImageViewer *parent) : ShortcutZoomer(parent) {} - bool zoom(bool zoomin, bool resetZoom) override { - static_cast(getWidget())->zoomQt(zoomin, resetZoom); + bool zoom(bool zoomin, bool resetView) override { + static_cast(getWidget())->zoomQt(zoomin, resetView); return true; } @@ -128,6 +129,11 @@ public: return true; } + bool resetZoom() override { + static_cast(getWidget())->resetZoom(); + return true; + } + bool toggleFullScreen(bool quit) override { if (ImageUtils::FullScreenWidget *fsWidget = dynamic_cast( @@ -218,7 +224,8 @@ ImageViewer::ImageViewer(QWidget *parent, FlipBook *flipbook, , m_isColorModel(false) , m_histogramPopup(0) , m_isRemakingPreviewFx(false) - , m_rectRGBPick(false) { + , m_rectRGBPick(false) + , m_firstImage(true) { m_visualSettings.m_sceneProperties = TApp::instance()->getCurrentScene()->getScene()->getProperties(); m_visualSettings.m_drawExternalBG = true; @@ -227,6 +234,11 @@ ImageViewer::ImageViewer(QWidget *parent, FlipBook *flipbook, setMouseTracking(true); + setAttribute(Qt::WA_AcceptTouchEvents); + grabGesture(Qt::SwipeGesture); + grabGesture(Qt::PanGesture); + grabGesture(Qt::PinchGesture); + if (m_isHistogramEnable) m_histogramPopup = new HistogramPopup(tr("Flipbook Histogram")); @@ -237,8 +249,6 @@ ImageViewer::ImageViewer(QWidget *parent, FlipBook *flipbook, //----------------------------------------------------------------------------- void ImageViewer::contextMenuEvent(QContextMenuEvent *event) { - if (!m_flipbook) return; - QAction *action; if (m_isColorModel) { @@ -248,56 +258,59 @@ void ImageViewer::contextMenuEvent(QContextMenuEvent *event) { QMenu *menu = new QMenu(this); - if (m_flipbook->getPreviewedFx()) { - if (!(windowState() & Qt::WindowFullScreen)) { - action = menu->addAction(tr("Clone Preview")); + if (m_flipbook) { + if (m_flipbook->getPreviewedFx()) { + if (!(windowState() & Qt::WindowFullScreen)) { + action = menu->addAction(tr("Clone Preview")); + action->setShortcut(QKeySequence( + CommandManager::instance()->getKeyFromId(MI_ClonePreview))); + connect(action, SIGNAL(triggered()), m_flipbook, SLOT(clonePreview())); + } + + if (m_flipbook->isFreezed()) { + action = menu->addAction(tr("Unfreeze Preview")); + action->setShortcut(QKeySequence( + CommandManager::instance()->getKeyFromId(MI_FreezePreview))); + connect(action, SIGNAL(triggered()), m_flipbook, + SLOT(unfreezePreview())); + } else { + action = menu->addAction(tr("Freeze Preview")); + action->setShortcut(QKeySequence( + CommandManager::instance()->getKeyFromId(MI_FreezePreview))); + connect(action, SIGNAL(triggered()), m_flipbook, SLOT(freezePreview())); + } + + action = menu->addAction(tr("Regenerate Preview")); action->setShortcut(QKeySequence( - CommandManager::instance()->getKeyFromId(MI_ClonePreview))); - connect(action, SIGNAL(triggered()), m_flipbook, SLOT(clonePreview())); + CommandManager::instance()->getKeyFromId(MI_RegeneratePreview))); + connect(action, SIGNAL(triggered()), m_flipbook, SLOT(regenerate())); + + action = menu->addAction(tr("Regenerate Frame Preview")); + action->setShortcut(QKeySequence( + CommandManager::instance()->getKeyFromId(MI_RegenerateFramePr))); + connect(action, SIGNAL(triggered()), m_flipbook, SLOT(regenerateFrame())); + + menu->addSeparator(); } - if (m_flipbook->isFreezed()) { - action = menu->addAction(tr("Unfreeze Preview")); - action->setShortcut(QKeySequence( - CommandManager::instance()->getKeyFromId(MI_FreezePreview))); - connect(action, SIGNAL(triggered()), m_flipbook, SLOT(unfreezePreview())); - } else { - action = menu->addAction(tr("Freeze Preview")); - action->setShortcut(QKeySequence( - CommandManager::instance()->getKeyFromId(MI_FreezePreview))); - connect(action, SIGNAL(triggered()), m_flipbook, SLOT(freezePreview())); + action = menu->addAction(tr("Load / Append Images")); + connect(action, SIGNAL(triggered()), m_flipbook, SLOT(loadImages())); + + // history of the loaded paths of flipbook + action = CommandManager::instance()->getAction(MI_LoadRecentImage); + menu->addAction(action); + action->setParent(m_flipbook); + + if (m_flipbook->isSavable()) { + action = menu->addAction(tr("Save Images")); + connect(action, SIGNAL(triggered()), m_flipbook, SLOT(saveImages())); } - - action = menu->addAction(tr("Regenerate Preview")); - action->setShortcut(QKeySequence( - CommandManager::instance()->getKeyFromId(MI_RegeneratePreview))); - connect(action, SIGNAL(triggered()), m_flipbook, SLOT(regenerate())); - - action = menu->addAction(tr("Regenerate Frame Preview")); - action->setShortcut(QKeySequence( - CommandManager::instance()->getKeyFromId(MI_RegenerateFramePr))); - connect(action, SIGNAL(triggered()), m_flipbook, SLOT(regenerateFrame())); - menu->addSeparator(); } - action = menu->addAction(tr("Load / Append Images")); - connect(action, SIGNAL(triggered()), m_flipbook, SLOT(loadImages())); - - // history of the loaded paths of flipbook - action = CommandManager::instance()->getAction(MI_LoadRecentImage); - menu->addAction(action); - action->setParent(m_flipbook); - - if (m_flipbook->isSavable()) { - action = menu->addAction(tr("Save Images")); - connect(action, SIGNAL(triggered()), m_flipbook, SLOT(saveImages())); - } - menu->addSeparator(); - QAction *reset = menu->addAction(tr("Reset View")); reset->setShortcut( - QKeySequence(CommandManager::instance()->getKeyFromId(V_ZoomReset))); + QKeySequence(CommandManager::instance()->getKeyFromId(V_ViewReset))); connect(reset, SIGNAL(triggered()), SLOT(resetView())); QAction *fit = menu->addAction(tr("Fit To Window")); @@ -305,42 +318,45 @@ void ImageViewer::contextMenuEvent(QContextMenuEvent *event) { QKeySequence(CommandManager::instance()->getKeyFromId(V_ZoomFit))); connect(fit, SIGNAL(triggered()), SLOT(fitView())); + if (m_flipbook) { #ifdef _WIN32 + if (ImageUtils::FullScreenWidget *fsWidget = + dynamic_cast(parentWidget())) { + bool isFullScreen = (fsWidget->windowState() & Qt::WindowFullScreen) != 0; - if (ImageUtils::FullScreenWidget *fsWidget = - dynamic_cast(parentWidget())) { - bool isFullScreen = (fsWidget->windowState() & Qt::WindowFullScreen) != 0; + action = menu->addAction(isFullScreen ? tr("Exit Full Screen Mode") + : tr("Full Screen Mode")); - action = menu->addAction(isFullScreen ? tr("Exit Full Screen Mode") - : tr("Full Screen Mode")); - - action->setShortcut(QKeySequence( - CommandManager::instance()->getKeyFromId(V_ShowHideFullScreen))); - connect(action, SIGNAL(triggered()), fsWidget, SLOT(toggleFullScreen())); - } + action->setShortcut(QKeySequence( + CommandManager::instance()->getKeyFromId(V_ShowHideFullScreen))); + connect(action, SIGNAL(triggered()), fsWidget, SLOT(toggleFullScreen())); + } #endif - bool addedSep = false; + bool addedSep = false; - if (m_isHistogramEnable && - visibleRegion().contains(event->pos() * getDevPixRatio())) { - menu->addSeparator(); - addedSep = true; - action = menu->addAction(tr("Show Histogram")); - connect(action, SIGNAL(triggered()), SLOT(showHistogram())); - } + if (m_isHistogramEnable && + visibleRegion().contains(event->pos() * getDevPixRatio())) { + menu->addSeparator(); + addedSep = true; + action = menu->addAction(tr("Show Histogram")); + connect(action, SIGNAL(triggered()), SLOT(showHistogram())); + } - if (m_visualSettings.m_doCompare) { - if (!addedSep) menu->addSeparator(); - action = menu->addAction(tr("Swap Compared Images")); - connect(action, SIGNAL(triggered()), SLOT(swapCompared())); + if (m_visualSettings.m_doCompare) { + if (!addedSep) menu->addSeparator(); + action = menu->addAction(tr("Swap Compared Images")); + connect(action, SIGNAL(triggered()), SLOT(swapCompared())); + } } menu->exec(event->globalPos()); - action = CommandManager::instance()->getAction(MI_LoadRecentImage); - action->setParent(0); + if (m_flipbook) { + action = CommandManager::instance()->getAction(MI_LoadRecentImage); + action->setParent(0); + } delete menu; update(); @@ -372,10 +388,19 @@ ImageViewer::~ImageViewer() { //----------------------------------------------------------------------------- /*! Set current image to \b image and update. If Histogram is visible set its * image. -*/ + */ void ImageViewer::setImage(TImageP image) { m_image = image; + if (m_image && m_firstImage) { + m_firstImage = false; + fitView(); + // when the viewer size is large enough, limit the zoom ratio to 100% so + // that the image is shown in actual pixel size without jaggies due to + // resampling. + if (fabs(m_viewAff.det()) > 1.0) resetView(); + } + if (m_isHistogramEnable && m_histogramPopup->isVisible()) m_histogramPopup->setImage(image); if (!isColorModel()) @@ -557,7 +582,7 @@ void ImageViewer::paintGL() { } else if (m_draggingZoomSelection || m_rectRGBPick) { fromPos = TPoint(m_pressedMousePos.x - width() * 0.5, height() * 0.5 - m_pressedMousePos.y); - toPos = TPoint(m_pos.x() - width() * 0.5, height() * 0.5 - m_pos.y()); + toPos = TPoint(m_pos.x() - width() * 0.5, height() * 0.5 - m_pos.y()); } if (fromPos != TPoint() || toPos != TPoint()) { if (m_rectRGBPick) { @@ -596,7 +621,7 @@ void ImageViewer::paintGL() { //------------------------------------------------------------------------------ /*! Add to current trasformation matrix a \b delta traslation. -*/ + */ void ImageViewer::panQt(const QPoint &delta) { if (delta == QPoint()) return; @@ -660,6 +685,14 @@ void ImageViewer::zoomQt(bool forward, bool reset) { //----------------------------------------------------------------------------- +void ImageViewer::resetZoom() { + double oldZoomScale = sqrt(m_viewAff.det()); + setViewAff(TScale(1.0 / oldZoomScale) * m_viewAff); + update(); +} + +//----------------------------------------------------------------------------- + void ImageViewer::dragCompare(const QPoint &dp) { if (m_compareSettings.m_dragCompareX) m_compareSettings.m_compareX += ((double)dp.x()) / width(); @@ -730,9 +763,15 @@ void ImageViewer::updateCursor(const TPoint &curPos) { //--------------------------------------------------------------------------------------------- /*! If middle button is pressed pan the image. Update current mouse position. -*/ + */ void ImageViewer::mouseMoveEvent(QMouseEvent *event) { if (!m_image) return; + + if (m_gestureActive && m_touchDevice == QTouchDevice::TouchScreen && + !m_stylusUsed) { + return; + } + QPoint curQPos = event->pos() * getDevPixRatio(); TPoint curPos = TPoint(curQPos.x(), curQPos.y()); @@ -819,7 +858,7 @@ void ImageViewer::mouseMoveEvent(QMouseEvent *event) { //--------------------------------------------------------------------------------------------- /*! notify the color picked by rgb picker to palette controller -*/ + */ void ImageViewer::setPickedColorToStyleEditor(const TPixel32 &color) { // do not modify the style #0 TPaletteHandle *ph = @@ -831,7 +870,7 @@ void ImageViewer::setPickedColorToStyleEditor(const TPixel32 &color) { //--------------------------------------------------------------------------------------------- /*! rgb picking -*/ + */ void ImageViewer::pickColor(QMouseEvent *event, bool putValueToStyleEditor) { if (!m_isHistogramEnable) return; if (!m_histogramPopup->isVisible()) return; @@ -875,7 +914,7 @@ void ImageViewer::pickColor(QMouseEvent *event, bool putValueToStyleEditor) { //--------------------------------------------------------------------------------------------- /*! rectangular rgb picking. The picked color will be an average of pixels in * specified rectangle -*/ + */ void ImageViewer::rectPickColor(bool putValueToStyleEditor) { if (!m_isHistogramEnable) return; if (!m_histogramPopup->isVisible()) return; @@ -939,6 +978,13 @@ int ImageViewer::getDragType(const TPoint &pos, const TRect &loadbox) { //------------------------------------------------------------------------------- void ImageViewer::mouseDoubleClickEvent(QMouseEvent *event) { if (!m_image) return; + // qDebug() << "[mouseDoubleClickEvent]"; + if (m_gestureActive && !m_stylusUsed) { + m_gestureActive = false; + fitView(); + return; + } + if (m_visualSettings.m_defineLoadbox && m_flipbook) { m_flipbook->setLoadbox(TRect()); update(); @@ -950,6 +996,13 @@ void ImageViewer::mouseDoubleClickEvent(QMouseEvent *event) { void ImageViewer::mousePressEvent(QMouseEvent *event) { if (!m_image) return; + + // qDebug() << "[mousePressEvent]"; + if (m_gestureActive && m_touchDevice == QTouchDevice::TouchScreen && + !m_stylusUsed) { + return; + } + m_pos = event->pos() * getDevPixRatio(); m_pressedMousePos = TPoint(m_pos.x(), m_pos.y()); m_mouseButton = event->button(); @@ -995,7 +1048,7 @@ void ImageViewer::mousePressEvent(QMouseEvent *event) { //----------------------------------------------------------------------------- /*! Reset current mouse position and current mouse button event. -*/ + */ void ImageViewer::mouseReleaseEvent(QMouseEvent *event) { if (!m_image) return; if (m_draggingZoomSelection && !m_visualSettings.m_defineLoadbox) { @@ -1026,19 +1079,64 @@ void ImageViewer::mouseReleaseEvent(QMouseEvent *event) { m_mouseButton = Qt::NoButton; m_compareSettings.m_dragCompareX = m_compareSettings.m_dragCompareY = false; + m_gestureActive = false; + m_zooming = false; + m_panning = false; + m_stylusUsed = false; + event->ignore(); } //----------------------------------------------------------------------------- /*! Apply zoom. -*/ + */ void ImageViewer::wheelEvent(QWheelEvent *event) { if (!m_image) return; if (event->orientation() == Qt::Horizontal) return; - int delta = event->delta() > 0 ? 120 : -120; - QPoint center(event->pos().x() * getDevPixRatio() - width() / 2, - -event->pos().y() * getDevPixRatio() + height() / 2); - zoomQt(center, exp(0.001 * delta)); + int delta = 0; + switch (event->source()) { + case Qt::MouseEventNotSynthesized: { + if (event->modifiers() & Qt::AltModifier) + delta = event->angleDelta().x(); + else + delta = event->angleDelta().y(); + break; + } + + case Qt::MouseEventSynthesizedBySystem: { + QPoint numPixels = event->pixelDelta(); + QPoint numDegrees = event->angleDelta() / 8; + if (!numPixels.isNull()) { + delta = event->pixelDelta().y(); + } else if (!numDegrees.isNull()) { + QPoint numSteps = numDegrees / 15; + delta = numSteps.y(); + } + break; + } + + default: // Qt::MouseEventSynthesizedByQt, + // Qt::MouseEventSynthesizedByApplication + { + std::cout << "not supported event: Qt::MouseEventSynthesizedByQt, " + "Qt::MouseEventSynthesizedByApplication" + << std::endl; + break; + } + + } // end switch + + if (abs(delta) > 0) { + if ((m_gestureActive == true && + m_touchDevice == QTouchDevice::TouchScreen) || + m_gestureActive == false) { + int delta = event->delta() > 0 ? 120 : -120; + QPoint center(event->pos().x() * getDevPixRatio() - width() / 2, + -event->pos().y() * getDevPixRatio() + height() / 2); + zoomQt(center, exp(0.001 * delta)); + } + } + event->accept(); } //----------------------------------------------------------------------------- @@ -1168,9 +1266,182 @@ void ImageViewer::onContextAboutToBeDestroyed() { doneCurrent(); } +//------------------------------------------------------------------ + +void ImageViewer::tabletEvent(QTabletEvent *e) { + // qDebug() << "[tabletEvent]"; + if (e->type() == QTabletEvent::TabletPress) { + m_stylusUsed = e->pointerType() ? true : false; + } else if (e->type() == QTabletEvent::TabletRelease) { + m_stylusUsed = false; + } + + e->accept(); +} + +//------------------------------------------------------------------ + +void ImageViewer::gestureEvent(QGestureEvent *e) { + // qDebug() << "[gestureEvent]"; + m_gestureActive = false; + if (QGesture *swipe = e->gesture(Qt::SwipeGesture)) { + m_gestureActive = true; + } else if (QGesture *pan = e->gesture(Qt::PanGesture)) { + m_gestureActive = true; + } + if (QGesture *pinch = e->gesture(Qt::PinchGesture)) { + QPinchGesture *gesture = static_cast(pinch); + QPinchGesture::ChangeFlags changeFlags = gesture->changeFlags(); + QPoint firstCenter = gesture->centerPoint().toPoint(); + if (m_touchDevice == QTouchDevice::TouchScreen) + firstCenter = mapFromGlobal(firstCenter); + + if (gesture->state() == Qt::GestureStarted) { + m_gestureActive = true; + } else if (gesture->state() == Qt::GestureFinished) { + m_gestureActive = false; + m_zooming = false; + m_scaleFactor = 0.0; + } else { + if (changeFlags & QPinchGesture::ScaleFactorChanged) { + double scaleFactor = gesture->scaleFactor(); + // the scale factor makes for too sensitive scaling + // divide the change in half + if (scaleFactor > 1) { + double decimalValue = scaleFactor - 1; + decimalValue /= 1.5; + scaleFactor = 1 + decimalValue; + } else if (scaleFactor < 1) { + double decimalValue = 1 - scaleFactor; + decimalValue /= 1.5; + scaleFactor = 1 - decimalValue; + } + if (!m_zooming) { + double delta = scaleFactor - 1; + m_scaleFactor += delta; + if (m_scaleFactor > .2 || m_scaleFactor < -.2) { + m_zooming = true; + } + } + if (m_zooming) { + const QPoint center( + firstCenter.x() * getDevPixRatio() - width() / 2, + -firstCenter.y() * getDevPixRatio() + height() / 2); + zoomQt(center, scaleFactor); + m_panning = false; + } + m_gestureActive = true; + } + + if (changeFlags & QPinchGesture::CenterPointChanged) { + QPointF centerDelta = (gesture->centerPoint() * getDevPixRatio()) - + (gesture->lastCenterPoint() * getDevPixRatio()); + if (centerDelta.manhattanLength() > 1) { + // panQt(centerDelta.toPoint()); + } + m_gestureActive = true; + } + } + } + e->accept(); +} + +void ImageViewer::touchEvent(QTouchEvent *e, int type) { + // qDebug() << "[touchEvent]"; + if (type == QEvent::TouchBegin) { + m_touchActive = true; + m_firstPanPoint = e->touchPoints().at(0).pos(); + // obtain device type + m_touchDevice = e->device()->type(); + } else if (m_touchActive) { + // touchpads must have 2 finger panning for tools and navigation to be + // functional on other devices, 1 finger panning is preferred + if ((e->touchPoints().count() == 2 && + m_touchDevice == QTouchDevice::TouchPad) || + (e->touchPoints().count() == 1 && + m_touchDevice == QTouchDevice::TouchScreen)) { + QTouchEvent::TouchPoint panPoint = e->touchPoints().at(0); + if (!m_panning) { + QPointF deltaPoint = panPoint.pos() - m_firstPanPoint; + // minimize accidental and jerky zooming/rotating during 2 finger + // panning + if ((deltaPoint.manhattanLength() > 100) && !m_zooming) { + m_panning = true; + } + } + if (m_panning) { + QPoint curPos = panPoint.pos().toPoint() * getDevPixRatio(); + QPoint lastPos = panPoint.lastPos().toPoint() * getDevPixRatio(); + QPoint centerDelta = curPos - lastPos; + panQt(centerDelta); + } + } + } + if (type == QEvent::TouchEnd || type == QEvent::TouchCancel) { + m_touchActive = false; + m_panning = false; + } + e->accept(); +} + +bool ImageViewer::event(QEvent *e) { + /* + switch (e->type()) { + case QEvent::TabletPress: { + QTabletEvent *te = static_cast(e); + qDebug() << "[event] TabletPress: pointerType(" << te->pointerType() + << ") device(" << te->device() << ")"; + } break; + case QEvent::TabletRelease: + qDebug() << "[event] TabletRelease"; + break; + case QEvent::TouchBegin: + qDebug() << "[event] TouchBegin"; + break; + case QEvent::TouchEnd: + qDebug() << "[event] TouchEnd"; + break; + case QEvent::TouchCancel: + qDebug() << "[event] TouchCancel"; + break; + case QEvent::MouseButtonPress: + qDebug() << "[event] MouseButtonPress"; + break; + case QEvent::MouseButtonDblClick: + qDebug() << "[event] MouseButtonDblClick"; + break; + case QEvent::MouseButtonRelease: + qDebug() << "[event] MouseButtonRelease"; + break; + case QEvent::Gesture: + qDebug() << "[event] Gesture"; + break; + default: + break; + } + */ + + if (e->type() == QEvent::Gesture && CommandManager::instance() + ->getAction(MI_TouchGestureControl) + ->isChecked()) { + gestureEvent(static_cast(e)); + return true; + } + if ((e->type() == QEvent::TouchBegin || e->type() == QEvent::TouchEnd || + e->type() == QEvent::TouchCancel || e->type() == QEvent::TouchUpdate) && + CommandManager::instance() + ->getAction(MI_TouchGestureControl) + ->isChecked()) { + touchEvent(static_cast(e), e->type()); + m_gestureActive = true; + return true; + } + return GLWidgetForHighDpi::event(e); +} + //----------------------------------------------------------------------------- /*! load image from history -*/ + */ class LoadRecentFlipbookImagesCommandHandler final : public MenuItemHandler { public: LoadRecentFlipbookImagesCommandHandler() @@ -1198,7 +1469,7 @@ public: //----------------------------------------------------------------------------- /*! clear the history -*/ + */ class ClearRecentFlipbookImagesCommandHandler final : public MenuItemHandler { public: ClearRecentFlipbookImagesCommandHandler() diff --git a/toonz/sources/toonz/imageviewer.h b/toonz/sources/toonz/imageviewer.h index 0e139a2a..ecdb0952 100644 --- a/toonz/sources/toonz/imageviewer.h +++ b/toonz/sources/toonz/imageviewer.h @@ -6,6 +6,8 @@ #include "toonz/imagepainter.h" #include "toonzqt/glwidget_for_highdpi.h" +#include + //----------------------------------------------------------------------------- // Forward declarations @@ -13,7 +15,8 @@ class FlipBook; class HistogramPopup; class QOpenGLFramebufferObject; class LutCalibrator; - +class QTouchEvent; +class QGestureEvent; //----------------------------------------------------------------------------- //==================== @@ -50,6 +53,7 @@ class ImageViewer final : public GLWidgetForHighDpi { QPoint m_pos; bool m_isHistogramEnable; HistogramPopup *m_histogramPopup; + bool m_firstImage; bool m_isColorModel; // when fx parameter is modified with showing the fx preview, @@ -60,6 +64,15 @@ class ImageViewer final : public GLWidgetForHighDpi { QOpenGLFramebufferObject *m_fbo = NULL; LutCalibrator *m_lutCalibrator = NULL; + bool m_touchActive = false; + bool m_gestureActive = false; + QTouchDevice::DeviceType m_touchDevice = QTouchDevice::TouchScreen; + bool m_zooming = false; + bool m_panning = false; + double m_scaleFactor; // used for zoom gesture + + bool m_stylusUsed = false; + int getDragType(const TPoint &pos, const TRect &loadBox); void updateLoadbox(const TPoint &curPos); void updateCursor(const TPoint &curPos); @@ -96,6 +109,7 @@ public: */ void hideHistogram(); void zoomQt(bool forward, bool reset); + void resetZoom(); void setIsRemakingPreviewFx(bool on) { m_isRemakingPreviewFx = on; @@ -127,6 +141,11 @@ protected: void dragCompare(const QPoint &dp); + void tabletEvent(QTabletEvent *e); + void touchEvent(QTouchEvent *e, int type); + void gestureEvent(QGestureEvent *e); + bool event(QEvent *e); + public slots: void updateImageViewer(); @@ -135,6 +154,9 @@ public slots: void showHistogram(); void swapCompared(); void onContextAboutToBeDestroyed(); + +private: + QPointF m_firstPanPoint; }; #endif // IMAGEVIEWER_INCLUDE diff --git a/toonz/sources/toonz/iocommand.cpp b/toonz/sources/toonz/iocommand.cpp index 98cd2bec..a7889670 100644 --- a/toonz/sources/toonz/iocommand.cpp +++ b/toonz/sources/toonz/iocommand.cpp @@ -190,7 +190,7 @@ public: // TFilePath process(ToonzScene *scene, ToonzScene *srcScene, TFilePath srcPath) override { - TFilePath actualSrcPath = srcPath; + TFilePath actualSrcPath = srcPath; if (srcScene) actualSrcPath = srcScene->decodeFilePath(srcPath); if (!isImportEnabled()) { @@ -1350,7 +1350,7 @@ bool IoCmd::saveScene(const TFilePath &path, int flags) { TApp *app = TApp::instance(); assert(!path.isEmpty()); - TFilePath scenePath = path; + TFilePath scenePath = path; if (scenePath.getType() == "") scenePath = scenePath.withType("tnz"); if (scenePath.getType() != "tnz") { error( @@ -1376,21 +1376,45 @@ bool IoCmd::saveScene(const TFilePath &path, int flags) { ToonzScene *scene = TApp::instance()->getCurrentScene()->getScene(); + TXsheet *xsheet = 0; + if (saveSubxsheet) xsheet = TApp::instance()->getCurrentXsheet()->getXsheet(); + // If the scene will be saved in the different folder, check out the scene // cast. // if the cast contains the level specified with $scenefolder alias, // open a warning popup notifying that such level will lose link. + + // in case of saving subxsheet, the current scene will not be switched to the + // saved one + // so the level paths are needed to be reverted after saving + QHash orgLevelPaths; + auto revertOrgLevelPaths = [&] { + QHash::const_iterator i = + orgLevelPaths.constBegin(); + while (i != orgLevelPaths.constEnd()) { + if (TXshSimpleLevel *sil = i.key()->getSimpleLevel()) + sil->setPath(i.value(), true); + else if (TXshPaletteLevel *pal = i.key()->getPaletteLevel()) + pal->setPath(i.value()); + else if (TXshSoundLevel *sol = i.key()->getSoundLevel()) + sol->setPath(i.value()); + ++i; + } + }; + if (!overwrite) { - bool ret = takeCareSceneFolderItemsOnSaveSceneAs(scene, scenePath); - if (!ret) return false; + bool ret = takeCareSceneFolderItemsOnSaveSceneAs(scene, scenePath, xsheet, + orgLevelPaths); + if (!ret) { + revertOrgLevelPaths(); + return false; + } } TFilePath oldFullPath = scene->decodeFilePath(scene->getScenePath()); TFilePath newFullPath = scene->decodeFilePath(scenePath); QApplication::setOverrideCursor(Qt::WaitCursor); - TXsheet *xsheet = 0; - if (saveSubxsheet) xsheet = TApp::instance()->getCurrentXsheet()->getXsheet(); if (app->getCurrentScene()->getDirtyFlag()) scene->getContentHistory(true)->modifiedNow(); @@ -1414,11 +1438,6 @@ bool IoCmd::saveScene(const TFilePath &path, int flags) { try { scene->save(scenePath, xsheet); - TApp::instance() - ->getPaletteController() - ->getCurrentLevelPalette() - ->notifyPaletteChanged(); // non toglieva l'asterisco alla - // paletta...forse non va qua? vinz } catch (const TSystemException &se) { DVGui::warning(QString::fromStdWString(se.getMessage())); } catch (...) { @@ -1427,7 +1446,11 @@ bool IoCmd::saveScene(const TFilePath &path, int flags) { cp->assign(&oldCP); - if (!overwrite) app->getCurrentScene()->notifyNameSceneChange(); + // in case of saving subxsheet, revert the level paths after saving + revertOrgLevelPaths(); + + if (!overwrite && !saveSubxsheet) + app->getCurrentScene()->notifyNameSceneChange(); FileBrowser::refreshFolder(scenePath.getParentDir()); IconGenerator::instance()->invalidate(scenePath); @@ -1440,8 +1463,13 @@ bool IoCmd::saveScene(const TFilePath &path, int flags) { app->getCurrentScene()->setDirtyFlag(false); History::instance()->addItem(scenePath); - RecentFiles::instance()->addFilePath(toQString(scenePath), - RecentFiles::Scene); + RecentFiles::instance()->addFilePath( + toQString(scenePath), RecentFiles::Scene, + QString::fromStdString(app->getCurrentScene() + ->getScene() + ->getProject() + ->getName() + .getName())); QApplication::restoreOverrideCursor(); @@ -1463,8 +1491,8 @@ bool IoCmd::saveScene() { ToonzScene *scene = TApp::instance()->getCurrentScene()->getScene(); if (scene->isUntitled()) { static SaveSceneAsPopup *popup = 0; - if (!popup) popup = new SaveSceneAsPopup(); - int ret = popup->exec(); + if (!popup) popup = new SaveSceneAsPopup(); + int ret = popup->exec(); if (ret == QDialog::Accepted) { TApp::instance()->getCurrentScene()->setDirtyFlag(false); return true; @@ -1728,8 +1756,8 @@ bool IoCmd::loadScene(const TFilePath &path, bool updateRecentFile, if (checkSaveOldScene) if (!saveSceneIfNeeded(QApplication::tr("Load Scene"))) return false; assert(!path.isEmpty()); - TFilePath scenePath = path; - bool importScene = false; + TFilePath scenePath = path; + bool importScene = false; if (scenePath.getType() == "") scenePath = scenePath.withType("tnz"); if (scenePath.getType() != "tnz") { QString msg; @@ -1823,9 +1851,8 @@ bool IoCmd::loadScene(const TFilePath &path, bool updateRecentFile, // import if needed TProjectManager *pm = TProjectManager::instance(); TProjectP currentProject = pm->getCurrentProject(); - if (!scene->getProject() || - scene->getProject()->getProjectPath() != - currentProject->getProjectPath()) { + if (!scene->getProject() || scene->getProject()->getProjectPath() != + currentProject->getProjectPath()) { ResourceImportDialog resourceLoader; // resourceLoader.setImportEnabled(true); ResourceImporter importer(scene, currentProject.getPointer(), @@ -1884,8 +1911,9 @@ bool IoCmd::loadScene(const TFilePath &path, bool updateRecentFile, TApp::instance()->getCurrentScene()->setDirtyFlag(false); History::instance()->addItem(scenePath); if (updateRecentFile) - RecentFiles::instance()->addFilePath(toQString(scenePath), - RecentFiles::Scene); + RecentFiles::instance()->addFilePath( + toQString(scenePath), RecentFiles::Scene, + QString::fromStdString(scene->getProject()->getName().getName())); QApplication::restoreOverrideCursor(); int forbiddenLevelCount = 0; @@ -2100,10 +2128,10 @@ static int loadPSDResource(IoCmd::LoadResourceArguments &args, int &row1 = args.row1; int &col1 = args.col1; - int count = 0; - TApp *app = TApp::instance(); - ToonzScene *scene = app->getCurrentScene()->getScene(); - TXsheet *xsh = scene->getXsheet(); + int count = 0; + TApp *app = TApp::instance(); + ToonzScene *scene = app->getCurrentScene()->getScene(); + TXsheet *xsh = scene->getXsheet(); if (row0 == -1) row0 = app->getCurrentFrame()->getFrameIndex(); if (col0 == -1) col0 = app->getCurrentColumn()->getColumnIndex(); @@ -2488,8 +2516,8 @@ bool IoCmd::exposeLevel(TXshSimpleLevel *sl, int row, int col, if (!insert && !overWrite) insertEmptyColumn = beforeCellsInsert( xsh, row, col, fids.size(), TXshColumn::toColumnType(sl->getType())); - ExposeType type = eNone; - if (insert) type = eShiftCells; + ExposeType type = eNone; + if (insert) type = eShiftCells; if (overWrite) type = eOverWrite; ExposeLevelUndo *undo = new ExposeLevelUndo(sl, row, col, frameCount, insertEmptyColumn, type); @@ -2574,36 +2602,80 @@ bool IoCmd::importLipSync(TFilePath levelPath, QList frameList, // if the cast contains the level specified with $scenefolder alias, // open a warning popup notifying that such level will lose link. // return false if cancelled. -bool IoCmd::takeCareSceneFolderItemsOnSaveSceneAs(ToonzScene *scene, - const TFilePath &newPath) { - TFilePath oldFullPath = scene->decodeFilePath(scene->getScenePath()); - TFilePath newFullPath = scene->decodeFilePath(newPath); +bool IoCmd::takeCareSceneFolderItemsOnSaveSceneAs( + ToonzScene *scene, const TFilePath &newPath, TXsheet *subxsh, + QHash &orgLevelPaths) { + auto setPathToLevel = [&](TXshLevel *level, TFilePath fp) { + // in case of saving subxsheet, the current scene will not be switched to + // the saved one + // so the level paths are needed to be reverted after saving + if (subxsh) orgLevelPaths.insert(level, level->getPath()); + if (TXshSimpleLevel *sil = level->getSimpleLevel()) + sil->setPath(fp, true); + else if (TXshPaletteLevel *pal = level->getPaletteLevel()) + pal->setPath(fp); + else if (TXshSoundLevel *sol = level->getSoundLevel()) + sol->setPath(fp); + }; + + TFilePath oldSceneFolder = + scene->decodeFilePath(scene->getScenePath()).getParentDir(); + TFilePath newSceneFolder = scene->decodeFilePath(newPath).getParentDir(); + // in case of saving in the same folder - if (oldFullPath.getParentDir() == newFullPath.getParentDir()) return true; + if (oldSceneFolder == newSceneFolder) return true; TLevelSet *levelSet = scene->getLevelSet(); std::vector levels; + + // in case of saving subxsheet, checking only used levels. + if (subxsh) { + std::set saveSet; + subxsh->getUsedLevels(saveSet); + levels = std::vector(saveSet.begin(), saveSet.end()); + } + // in case of saving the scene (i.e. top xsheet) + else + levelSet->listLevels(levels); + QList sceneFolderLevels; - levelSet->listLevels(levels); QString str; - for (int i = 0; i < levels.size(); i++) { - TXshLevel *level = levels.at(i); + int count = 0; + for (TXshLevel *level : levels) { if (!level->getPath().isEmpty() && TFilePath("$scenefolder").isAncestorOf(level->getPath())) { - sceneFolderLevels.append(level); - str.append(" " + QString::fromStdWString(level->getName()) + " (" + - level->getPath().getQString() + ")\n"); + TFilePath levelFullPath = scene->decodeFilePath(level->getPath()); + // check if the path can be re-coded with the new scene folder path + if (newSceneFolder.isAncestorOf(levelFullPath)) { + // just replace the path without warning + TFilePath fp = + TFilePath("$scenefolder") + (levelFullPath - newSceneFolder); + setPathToLevel(level, fp); + } + // if re-coding is not possible, then it needs to ask user's preference + else { + sceneFolderLevels.append(level); + if (count < 10) { + str.append(" " + QString::fromStdWString(level->getName()) + " (" + + level->getPath().getQString() + ")\n"); + } + count++; + } } } + // list maximum 10 levels + if (count > 10) + str.append(QObject::tr(" + %1 more level(s) \n").arg(count - 10)); // in case there is no items with $scenefolder if (sceneFolderLevels.isEmpty()) return true; str = QObject::tr( "The following level(s) use path with $scenefolder alias.\n\n") + - str + QObject::tr( - "\nThey will not be opened properly when you load the " - "scene next time.\nWhat do you want to do?"); + str + + QObject::tr( + "\nThey will not be opened properly when you load the " + "scene next time.\nWhat do you want to do?"); int ret = DVGui::MsgBox( str, QObject::tr("Copy the levels to correspondent paths"), @@ -2616,7 +2688,7 @@ bool IoCmd::takeCareSceneFolderItemsOnSaveSceneAs(ToonzScene *scene, for (int i = 0; i < sceneFolderLevels.size(); i++) { TXshLevel *level = sceneFolderLevels.at(i); TFilePath fp = level->getPath() - TFilePath("$scenefolder"); - fp = fp.withParentDir(newFullPath.getParentDir()); + fp = fp.withParentDir(newSceneFolder); // check the level existence if (TSystem::doesExistFileOrLevel(fp)) { bool overwrite = (policy == YES_FOR_ALL); @@ -2663,15 +2735,7 @@ bool IoCmd::takeCareSceneFolderItemsOnSaveSceneAs(ToonzScene *scene, // decode and code again TFilePath fp = scene->codeFilePath(scene->decodeFilePath(level->getPath())); - TXshSimpleLevel *sil = level->getSimpleLevel(); - TXshPaletteLevel *pal = level->getPaletteLevel(); - TXshSoundLevel *sol = level->getSoundLevel(); - if (sil) - sil->setPath(fp); - else if (pal) - pal->setPath(fp); - else if (sol) - sol->setPath(fp); + setPathToLevel(level, fp); } Preferences::instance()->setPathAliasPriority(oldPriority); } diff --git a/toonz/sources/toonz/iocommand.h b/toonz/sources/toonz/iocommand.h index d23c4803..858643ed 100644 --- a/toonz/sources/toonz/iocommand.h +++ b/toonz/sources/toonz/iocommand.h @@ -31,6 +31,7 @@ class TXshSoundLevel; class ToonzScene; class TCamera; class TPropertyGroup; +class TXsheet; namespace DVGui { class ProgressDialog; @@ -221,9 +222,8 @@ int loadResources( //! access and finalization. //!< Loads a group of resources by path. //! \return The actually loaded levels count. - int xFrom = -1, - int xTo = -1, std::wstring levelName = L"", int step = -1, int inc = -1, - int frameCount = -1, bool doesFileActuallyExist = true, + int xFrom = -1, int xTo = -1, std::wstring levelName = L"", int step = -1, + int inc = -1, int frameCount = -1, bool doesFileActuallyExist = true, CacheTlvBehavior cachingBehavior = ON_DEMAND); int loadResourceFolders( @@ -231,7 +231,7 @@ int loadResourceFolders( LoadResourceArguments::ScopedBlock *sb = 0 //!< Load block. May be nonzero in order to extend block data //! access and finalization. - ); //!< Loads the specified folders in current xsheet. +); //!< Loads the specified folders in current xsheet. //! \return The actually loaded levels count. bool exposeLevel(TXshSimpleLevel *sl, int row, int col, bool insert = false, bool overWrite = false); @@ -256,8 +256,9 @@ bool importLipSync(TFilePath levelPath, QList frameList, // cast. // if the cast contains the level specified with $scenefolder alias, // open a warning popup notifying that such level will lose link. -bool takeCareSceneFolderItemsOnSaveSceneAs(ToonzScene *scene, - const TFilePath &newPath); +bool takeCareSceneFolderItemsOnSaveSceneAs( + ToonzScene *scene, const TFilePath &newPath, TXsheet *subxsh, + QHash &orgLevelPaths); } // namespace IoCmd diff --git a/toonz/sources/toonz/mainwindow.cpp b/toonz/sources/toonz/mainwindow.cpp index fb510adb..e451ad20 100644 --- a/toonz/sources/toonz/mainwindow.cpp +++ b/toonz/sources/toonz/mainwindow.cpp @@ -32,6 +32,7 @@ #include "toonz/tscenehandle.h" #include "toonz/toonzscene.h" #include "toonz/txshleveltypes.h" +#include "toonz/tproject.h" // TnzBase includes #include "tenv.h" @@ -484,14 +485,19 @@ void MainWindow::changeWindowTitle() { ToonzScene *scene = app->getCurrentScene()->getScene(); if (!scene) return; - QString name = QString::fromStdWString(scene->getSceneName()); + TProject *project = scene->getProject(); + QString projectName = QString::fromStdString(project->getName().getName()); + + QString sceneName = QString::fromStdWString(scene->getSceneName()); + + if (sceneName.isEmpty()) sceneName = tr("Untitled"); + if (app->getCurrentScene()->getDirtyFlag()) sceneName += QString("*"); /*--- レイアウトファイル名を頭に表示させる ---*/ - if (!m_layoutName.isEmpty()) name.prepend(m_layoutName + " : "); + if (!m_layoutName.isEmpty()) sceneName.prepend(m_layoutName + " : "); - if (name.isEmpty()) name = tr("Untitled"); - - name += " : " + QString::fromStdString(TEnv::getApplicationFullName()); + QString name = sceneName + " [" + projectName + "] : " + + QString::fromStdString(TEnv::getApplicationFullName()); setWindowTitle(name); } @@ -521,7 +527,7 @@ Room *MainWindow::getRoom(int index) const { //----------------------------------------------------------------------------- /*! Roomを名前から探す -*/ + */ Room *MainWindow::getRoomByName(QString &roomName) { for (int i = 0; i < getRoomCount(); i++) { Room *room = dynamic_cast(m_stackedWidget->widget(i)); @@ -1148,7 +1154,7 @@ void MainWindow::onMenuCheckboxChanged() { #endif else if (cm->getAction(MI_RasterizePli) == action) { if (!QGLPixelBuffer::hasOpenGLPbuffers()) isChecked = 0; - RasterizePliToggleAction = isChecked; + RasterizePliToggleAction = isChecked; } else if (cm->getAction(MI_SafeArea) == action) SafeAreaToggleAction = isChecked; else if (cm->getAction(MI_ViewColorcard) == action) @@ -1428,6 +1434,13 @@ QAction *MainWindow::createViewerAction(const char *id, const QString &name, //----------------------------------------------------------------------------- +QAction *MainWindow::createVisualizationButtonAction(const char *id, + const QString &name) { + return createAction(id, name, "", VisualizationButtonCommandType); +} + +//----------------------------------------------------------------------------- + QAction *MainWindow::createMiscAction(const char *id, const QString &name, const char *defaultShortcut) { QAction *action = new DVAction(name, this); @@ -2094,8 +2107,11 @@ void MainWindow::defineActions() { createViewerAction(V_ZoomIn, tr("Zoom In"), "+"); createViewerAction(V_ZoomOut, tr("Zoom Out"), "-"); - createViewerAction(V_ZoomReset, tr("Reset View"), "Alt+0"); + createViewerAction(V_ViewReset, tr("Reset View"), "Alt+0"); createViewerAction(V_ZoomFit, tr("Fit to Window"), "Alt+9"); + createViewerAction(V_ZoomReset, tr("Reset Zoom"), ""); + createViewerAction(V_RotateReset, tr("Reset Rotation"), ""); + createViewerAction(V_PositionReset, tr("Reset Position"), ""); createViewerAction(V_ActualPixelSize, tr("Actual Pixel Size"), "N"); createViewerAction(V_FlipX, tr("Flip Viewer Horizontally"), ""); createViewerAction(V_FlipY, tr("Flip Viewer Vertically"), ""); @@ -2105,6 +2121,21 @@ void MainWindow::defineActions() { tr("Full Screen Mode"), tr("Exit Full Screen Mode")); + // Following actions are for adding "Visualization" menu items to the command + // bar. They are separated from the original actions in order to avoid + // assigning shortcut keys. They must be triggered only from pressing buttons + // in the command bar. Assinging shortcut keys and registering as MenuItem + // will break a logic of ShortcutZoomer. So here we register separate items + // and bypass the command. + createVisualizationButtonAction(VB_ViewReset, tr("Reset View")); + createVisualizationButtonAction(VB_ZoomFit, tr("Fit to Window")); + createVisualizationButtonAction(VB_ZoomReset, tr("Reset Zoom")); + createVisualizationButtonAction(VB_RotateReset, tr("Reset Rotation")); + createVisualizationButtonAction(VB_PositionReset, tr("Reset Position")); + createVisualizationButtonAction(VB_ActualPixelSize, tr("Actual Pixel Size")); + createVisualizationButtonAction(VB_FlipX, tr("Flip Viewer Horizontally")); + createVisualizationButtonAction(VB_FlipY, tr("Flip Viewer Vertically")); + QAction *refreshAct = createMiscAction(MI_RefreshTree, tr("Refresh Folder Tree"), ""); refreshAct->setIconText(tr("Refresh")); @@ -2152,6 +2183,10 @@ void MainWindow::defineActions() { createToolOptionsAction("A_ToolOption_JoinVectors", tr("Join Vectors"), ""); createToolOptionsAction("A_ToolOption_ShowOnlyActiveSkeleton", tr("Show Only Active Skeleton"), ""); + createToolOptionsAction("A_ToolOption_RasterEraser", + tr("Brush Tool - Eraser (Raster option)"), ""); + createToolOptionsAction("A_ToolOption_LockAlpha", + tr("Brush Tool - Lock Alpha"), ""); // Option Menu createToolOptionsAction("A_ToolOption_BrushPreset", tr("Brush Preset"), ""); @@ -2313,7 +2348,8 @@ void MainWindow::onQuit() { close(); } // RecentFiles //============================================================================= -RecentFiles::RecentFiles() : m_recentScenes(), m_recentLevels() {} +RecentFiles::RecentFiles() + : m_recentScenes(), m_recentSceneProjects(), m_recentLevels() {} //----------------------------------------------------------------------------- @@ -2328,17 +2364,25 @@ RecentFiles::~RecentFiles() {} //----------------------------------------------------------------------------- -void RecentFiles::addFilePath(QString path, FileType fileType) { +void RecentFiles::addFilePath(QString path, FileType fileType, + QString projectName) { QList files = - (fileType == Scene) ? m_recentScenes : (fileType == Level) - ? m_recentLevels - : m_recentFlipbookImages; + (fileType == Scene) + ? m_recentScenes + : (fileType == Level) ? m_recentLevels : m_recentFlipbookImages; int i; for (i = 0; i < files.size(); i++) - if (files.at(i) == path) files.removeAt(i); + if (files.at(i) == path) { + files.removeAt(i); + if (fileType == Scene) m_recentSceneProjects.removeAt(i); + } files.insert(0, path); + if (fileType == Scene) m_recentSceneProjects.insert(0, projectName); int maxSize = 10; - if (files.size() > maxSize) files.removeAt(maxSize); + if (files.size() > maxSize) { + files.removeAt(maxSize); + if (fileType == Scene) m_recentSceneProjects.removeAt(maxSize); + } if (fileType == Scene) m_recentScenes = files; @@ -2354,9 +2398,10 @@ void RecentFiles::addFilePath(QString path, FileType fileType) { //----------------------------------------------------------------------------- void RecentFiles::moveFilePath(int fromIndex, int toIndex, FileType fileType) { - if (fileType == Scene) + if (fileType == Scene) { m_recentScenes.move(fromIndex, toIndex); - else if (fileType == Level) + m_recentSceneProjects.move(fromIndex, toIndex); + } else if (fileType == Level) m_recentLevels.move(fromIndex, toIndex); else m_recentFlipbookImages.move(fromIndex, toIndex); @@ -2366,9 +2411,10 @@ void RecentFiles::moveFilePath(int fromIndex, int toIndex, FileType fileType) { //----------------------------------------------------------------------------- void RecentFiles::removeFilePath(int index, FileType fileType) { - if (fileType == Scene) + if (fileType == Scene) { m_recentScenes.removeAt(index); - else if (fileType == Level) + m_recentSceneProjects.removeAt(index); + } else if (fileType == Level) m_recentLevels.removeAt(index); saveRecentFiles(); } @@ -2384,10 +2430,26 @@ QString RecentFiles::getFilePath(int index, FileType fileType) const { //----------------------------------------------------------------------------- +QString RecentFiles::getFileProject(int index) const { + if (index >= m_recentScenes.size() || index >= m_recentSceneProjects.size()) + return "-"; + return m_recentSceneProjects[index]; +} + +QString RecentFiles::getFileProject(QString fileName) const { + for (int index = 0; index < m_recentScenes.size(); index++) + if (m_recentScenes[index] == fileName) return m_recentSceneProjects[index]; + + return "-"; +} + +//----------------------------------------------------------------------------- + void RecentFiles::clearRecentFilesList(FileType fileType) { - if (fileType == Scene) + if (fileType == Scene) { m_recentScenes.clear(); - else if (fileType == Level) + m_recentSceneProjects.clear(); + } else if (fileType == Level) m_recentLevels.clear(); else m_recentFlipbookImages.clear(); @@ -2411,6 +2473,22 @@ void RecentFiles::loadRecentFiles() { QString scene = settings.value(QString("Scenes")).toString(); if (!scene.isEmpty()) m_recentScenes.append(scene); } + + // Load scene's projects info. This is for display purposes only. For + // backwards compatibility it is stored and maintained separately. + QList sceneProjects = + settings.value(QString("SceneProjects")).toList(); + if (!sceneProjects.isEmpty()) { + for (i = 0; i < sceneProjects.size(); i++) + m_recentSceneProjects.append(sceneProjects.at(i).toString()); + } else { + QString sceneProject = settings.value(QString("SceneProjects")).toString(); + if (!sceneProject.isEmpty()) m_recentSceneProjects.append(sceneProject); + } + // Should be 1-to-1. If we're short, append projects list with "-". + while (m_recentSceneProjects.size() < m_recentScenes.size()) + m_recentSceneProjects.append("-"); + QList levels = settings.value(QString("Levels")).toList(); if (!levels.isEmpty()) { for (i = 0; i < levels.size(); i++) { @@ -2448,6 +2526,7 @@ void RecentFiles::saveRecentFiles() { TFilePath fp = ToonzFolder::getMyModuleDir() + TFilePath("RecentFiles.ini"); QSettings settings(toQString(fp), QSettings::IniFormat); settings.setValue(QString("Scenes"), QVariant(m_recentScenes)); + settings.setValue(QString("SceneProjects"), QVariant(m_recentSceneProjects)); settings.setValue(QString("Levels"), QVariant(m_recentLevels)); settings.setValue(QString("FlipbookImages"), QVariant(m_recentFlipbookImages)); @@ -2457,9 +2536,9 @@ void RecentFiles::saveRecentFiles() { QList RecentFiles::getFilesNameList(FileType fileType) { QList files = - (fileType == Scene) ? m_recentScenes : (fileType == Level) - ? m_recentLevels - : m_recentFlipbookImages; + (fileType == Scene) + ? m_recentScenes + : (fileType == Level) ? m_recentLevels : m_recentFlipbookImages; QList names; int i; for (i = 0; i < files.size(); i++) { @@ -2486,9 +2565,9 @@ void RecentFiles::refreshRecentFilesMenu(FileType fileType) { menu->setEnabled(false); else { CommandId clearActionId = - (fileType == Scene) ? MI_ClearRecentScene : (fileType == Level) - ? MI_ClearRecentLevel - : MI_ClearRecentImage; + (fileType == Scene) + ? MI_ClearRecentScene + : (fileType == Level) ? MI_ClearRecentLevel : MI_ClearRecentImage; menu->setActions(names); menu->addSeparator(); QAction *clearAction = CommandManager::instance()->getAction(clearActionId); diff --git a/toonz/sources/toonz/mainwindow.h b/toonz/sources/toonz/mainwindow.h index bf116379..ebb09f4d 100644 --- a/toonz/sources/toonz/mainwindow.h +++ b/toonz/sources/toonz/mainwindow.h @@ -175,6 +175,9 @@ private: const QString &defaultShortcut); QAction *createViewerAction(const char *id, const QString &name, const QString &defaultShortcut); + // For command bar, no shortcut keys + QAction *createVisualizationButtonAction(const char *id, const QString &name); + QAction *createMiscAction(const char *id, const QString &name, const char *defaultShortcut); QAction *createToolOptionsAction(const char *id, const QString &name, @@ -208,6 +211,7 @@ signals: class RecentFiles { friend class StartupPopup; QList m_recentScenes; + QList m_recentSceneProjects; QList m_recentLevels; QList m_recentFlipbookImages; @@ -219,10 +223,12 @@ public: static RecentFiles *instance(); ~RecentFiles(); - void addFilePath(QString path, FileType fileType); + void addFilePath(QString path, FileType fileType, QString projectName = 0); void moveFilePath(int fromIndex, int toIndex, FileType fileType); void removeFilePath(int fromIndex, FileType fileType); QString getFilePath(int index, FileType fileType) const; + QString getFileProject(QString fileName) const; + QString getFileProject(int index) const; void clearRecentFilesList(FileType fileType); void loadRecentFiles(); void saveRecentFiles(); diff --git a/toonz/sources/toonz/pane.cpp b/toonz/sources/toonz/pane.cpp index 527644ab..e3d08a22 100644 --- a/toonz/sources/toonz/pane.cpp +++ b/toonz/sources/toonz/pane.cpp @@ -6,6 +6,7 @@ #include "tapp.h" #include "mainwindow.h" #include "tenv.h" +#include "saveloadqsettings.h" #include "toonzqt/gutil.h" @@ -29,6 +30,7 @@ #include #include #include +#include extern TEnv::StringVar EnvSafeAreaName; @@ -60,7 +62,22 @@ TPanel::TPanel(QWidget *parent, Qt::WindowFlags flags, //----------------------------------------------------------------------------- -TPanel::~TPanel() {} +TPanel::~TPanel() { + // On quitting, save the floating panel's geomtry and state in order to + // restore them when opening the floating panel next time + if (isFloating()) { + TFilePath savePath = + ToonzFolder::getMyModuleDir() + TFilePath("popups.ini"); + QSettings settings(QString::fromStdWString(savePath.getWideString()), + QSettings::IniFormat); + settings.beginGroup("Panels"); + settings.beginGroup(QString::fromStdString(m_panelType)); + settings.setValue("geometry", geometry()); + if (SaveLoadQSettings *persistent = + dynamic_cast(widget())) + persistent->save(settings); + } +} //----------------------------------------------------------------------------- @@ -104,7 +121,7 @@ void TPanel::onCloseButtonPressed() { //----------------------------------------------------------------------------- /*! activate the panel and set focus specified widget when mouse enters -*/ + */ void TPanel::enterEvent(QEvent *event) { // Only when Toonz application is active if (qApp->activeWindow()) { @@ -120,9 +137,35 @@ void TPanel::enterEvent(QEvent *event) { //----------------------------------------------------------------------------- /*! clear focus when mouse leaves -*/ + */ void TPanel::leaveEvent(QEvent *event) { widgetClearFocusOnLeave(); } +//----------------------------------------------------------------------------- +/*! load and restore previous geometry and state of the floating panel. + called from the function OpenFloatingPanel::getOrOpenFloatingPanel() + in floatingpanelcommand.cpp +*/ +void TPanel::restoreFloatingPanelState() { + TFilePath savePath = ToonzFolder::getMyModuleDir() + TFilePath("popups.ini"); + QSettings settings(QString::fromStdWString(savePath.getWideString()), + QSettings::IniFormat); + settings.beginGroup("Panels"); + + if (!settings.childGroups().contains(QString::fromStdString(m_panelType))) + return; + + settings.beginGroup(QString::fromStdString(m_panelType)); + + QRect geom = settings.value("geometry", saveGeometry()).toRect(); + // check if it can be visible in the current screen + if (!(geom & QApplication::desktop()->availableGeometry(this)).isEmpty()) + setGeometry(geom); + // load optional settings + if (SaveLoadQSettings *persistent = + dynamic_cast(widget())) + persistent->load(settings); +} + //============================================================================= // TPanelTitleBarButton //----------------------------------------------------------------------------- @@ -181,9 +224,10 @@ void TPanelTitleBarButton::setPressed(bool pressed) { void TPanelTitleBarButton::paintEvent(QPaintEvent *event) { QPainter painter(this); - painter.drawPixmap( - 0, 0, m_pressed ? m_pressedPixmap : m_rollover ? m_rolloverPixmap - : m_standardPixmap); + painter.drawPixmap(0, 0, + m_pressed + ? m_pressedPixmap + : m_rollover ? m_rolloverPixmap : m_standardPixmap); painter.end(); } diff --git a/toonz/sources/toonz/pane.h b/toonz/sources/toonz/pane.h index 33f16970..333cd3d9 100644 --- a/toonz/sources/toonz/pane.h +++ b/toonz/sources/toonz/pane.h @@ -55,7 +55,7 @@ signals: //----------------------------------------------------------------------------- /*! specialized button for sage area which enables to choose safe area size by * context menu -*/ + */ class TPanelTitleBarButtonForSafeArea final : public TPanelTitleBarButton { Q_OBJECT @@ -232,6 +232,8 @@ public: return false; }; + void restoreFloatingPanelState(); + protected: void paintEvent(QPaintEvent *) override; void enterEvent(QEvent *) override; diff --git a/toonz/sources/toonz/penciltestpopup.cpp b/toonz/sources/toonz/penciltestpopup.cpp index bbe376e0..fdf6dfe8 100644 --- a/toonz/sources/toonz/penciltestpopup.cpp +++ b/toonz/sources/toonz/penciltestpopup.cpp @@ -177,7 +177,7 @@ inline void doPixBinary(QRgb* pix, int threshold) { gray = 255; else gray = 0; - *pix = qRgb(gray, gray, gray); + *pix = qRgb(gray, gray, gray); } //----------------------------------------------------------------------------- @@ -220,7 +220,7 @@ void onChange(QImage& img, int black, int white, float gamma, bool doGray) { void onChangeBW(QImage& img, int threshold) { int lx = img.width(), y, ly = img.height(); for (y = 0; y < ly; ++y) { - QRgb *pix = (QRgb *)img.scanLine(y), *endPix = (QRgb *)(pix + lx); + QRgb *pix = (QRgb*)img.scanLine(y), *endPix = (QRgb*)(pix + lx); while (pix < endPix) { doPixBinary(pix, threshold); ++pix; @@ -476,7 +476,7 @@ bool getRasterLevelSize(TXshLevel* level, TDimension& dim) { void ApplyLutTask::run() { int lx = m_img.width(); for (int y = m_fromY; y < m_toY; ++y) { - QRgb *pix = (QRgb *)m_img.scanLine(y), *endPix = (QRgb *)(pix + lx); + QRgb *pix = (QRgb*)m_img.scanLine(y), *endPix = (QRgb*)(pix + lx); while (pix < endPix) { doPix(pix, m_lut); ++pix; @@ -487,7 +487,7 @@ void ApplyLutTask::run() { void ApplyGrayLutTask::run() { int lx = m_img.width(); for (int y = m_fromY; y < m_toY; ++y) { - QRgb *pix = (QRgb *)m_img.scanLine(y), *endPix = (QRgb *)(pix + lx); + QRgb *pix = (QRgb*)m_img.scanLine(y), *endPix = (QRgb*)(pix + lx); while (pix < endPix) { doPixGray(pix, m_lut); ++pix; @@ -950,7 +950,14 @@ int FrameNumberLineEdit::getValue() { //----------------------------------------------------------------------------- +void FrameNumberLineEdit::focusInEvent(QFocusEvent* e) { + m_textOnFocusIn = text(); +} + void FrameNumberLineEdit::focusOutEvent(QFocusEvent* e) { + // if the field is empty, then revert the last input + if (text().isEmpty()) setText(m_textOnFocusIn); + LineEdit::focusOutEvent(e); } @@ -1249,7 +1256,7 @@ QString formatString(QString inStr, int charNum) { } return numStr.rightJustified(charNum, '0') + postStr; } -}; +}; // namespace void PencilTestSaveInFolderPopup::updateSubFolderName() { if (!m_autoSubNameCB->isChecked()) return; @@ -1419,10 +1426,10 @@ void PencilTestSaveInFolderPopup::updateParentFolder() { PencilTestPopup::PencilTestPopup() // set the parent 0 in order to enable the popup behind the main window - : Dialog(0, false, false, "PencilTest"), - m_currentCamera(NULL), - m_captureWhiteBGCue(false), - m_captureCue(false) { + : Dialog(0, false, false, "PencilTest") + , m_currentCamera(NULL) + , m_captureWhiteBGCue(false) + , m_captureCue(false) { setWindowTitle(tr("Camera Capture")); // add maximize button to the dialog @@ -1749,7 +1756,7 @@ PencilTestPopup::PencilTestPopup() bool ret = true; ret = ret && connect(refreshCamListButton, SIGNAL(pressed()), this, SLOT(refreshCameraList())); - ret = ret && connect(m_cameraListCombo, SIGNAL(activated(int)), this, + ret = ret && connect(m_cameraListCombo, SIGNAL(activated(int)), this, SLOT(onCameraListComboActivated(int))); ret = ret && connect(m_resolutionCombo, SIGNAL(activated(const QString&)), this, SLOT(onResolutionComboActivated(const QString&))); @@ -2256,7 +2263,8 @@ void PencilTestPopup::hideEvent(QHideEvent* event) { void PencilTestPopup::keyPressEvent(QKeyEvent* event) { // override return (or enter) key as shortcut key for capturing - if (event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter) { + int key = event->key(); + if (key == Qt::Key_Return || key == Qt::Key_Enter) { // show button-clicking animation followed by calling // onCaptureButtonClicked() m_captureButton->animateClick(); @@ -2267,6 +2275,23 @@ void PencilTestPopup::keyPressEvent(QKeyEvent* event) { //----------------------------------------------------------------------------- +bool PencilTestPopup::event(QEvent* event) { + if (event->type() == QEvent::ShortcutOverride) { + QKeyEvent* ke = static_cast(event); + int key = ke->key(); + if (key >= Qt::Key_0 && key <= Qt::Key_9) { + if (!m_frameNumberEdit->hasFocus()) { + m_frameNumberEdit->setFocus(); + m_frameNumberEdit->clear(); + } + event->accept(); + return true; + } + } + return DVGui::Dialog::event(event); +} +//----------------------------------------------------------------------------- + void PencilTestPopup::processImage(QImage& image) { /* "upside down" is not executed here. It will be done when capturing the * image */ @@ -2425,7 +2450,7 @@ void PencilTestPopup::onCountDown() { //----------------------------------------------------------------------------- /*! referenced from LevelCreatePopup::apply() -*/ + */ bool PencilTestPopup::importImage(QImage image) { TApp* app = TApp::instance(); ToonzScene* scene = app->getCurrentScene()->getScene(); @@ -2520,9 +2545,8 @@ bool PencilTestPopup::importImage(QImage image) { /* if the loaded level does not match in pixel size, then return */ sl = level->getSimpleLevel(); - if (!sl || - sl->getProperties()->getImageRes() != - TDimension(image.width(), image.height())) { + if (!sl || sl->getProperties()->getImageRes() != + TDimension(image.width(), image.height())) { error(tr( "The captured image size does not match with the existing level.")); return false; @@ -2543,7 +2567,7 @@ bool PencilTestPopup::importImage(QImage image) { else { TXshLevel* level = scene->createNewLevel(OVL_XSHLEVEL, levelName, TDimension(), 0, levelFp); - sl = level->getSimpleLevel(); + sl = level->getSimpleLevel(); sl->setPath(levelFp, true); sl->getProperties()->setDpiPolicy(LevelProperties::DP_CustomDpi); TPointD dpi; @@ -2732,7 +2756,7 @@ void PencilTestPopup::refreshFrameInfo() { // frame existence TFilePath frameFp(actualLevelFp.withFrame(frameNumber)); - bool frameExist = false; + bool frameExist = false; if (levelExist) frameExist = TFileStatus(frameFp).doesExist(); // reset acceptable camera size diff --git a/toonz/sources/toonz/penciltestpopup.h b/toonz/sources/toonz/penciltestpopup.h index a27be1a9..453605ed 100644 --- a/toonz/sources/toonz/penciltestpopup.h +++ b/toonz/sources/toonz/penciltestpopup.h @@ -32,7 +32,7 @@ namespace DVGui { class FileField; class IntField; class IntLineEdit; -} +} // namespace DVGui class CameraCaptureLevelControl; @@ -190,6 +190,7 @@ class FrameNumberLineEdit : public DVGui::LineEdit { QRegExpValidator* m_regexpValidator; void updateValidator(); + QString m_textOnFocusIn; public: FrameNumberLineEdit(QWidget* parent = 0, int value = 1); @@ -203,6 +204,7 @@ public: protected: /*! If focus is lost and current text value is out of range emit signal \b editingFinished.*/ + void focusInEvent(QFocusEvent*) override; void focusOutEvent(QFocusEvent*) override; void showEvent(QShowEvent* event) override { updateValidator(); } }; @@ -332,9 +334,10 @@ public: protected: void showEvent(QShowEvent* event); void hideEvent(QHideEvent* event); - void keyPressEvent(QKeyEvent* event); + bool event(QEvent* e) override; + protected slots: void refreshCameraList(); void onCameraListComboActivated(int index); diff --git a/toonz/sources/toonz/preferencespopup.cpp b/toonz/sources/toonz/preferencespopup.cpp index 73c23e4f..5a88c82b 100644 --- a/toonz/sources/toonz/preferencespopup.cpp +++ b/toonz/sources/toonz/preferencespopup.cpp @@ -260,10 +260,10 @@ void PreferencesPopup::onPixelsOnlyChanged(int index) { QString tempUnit; int unitIndex; tempUnit = m_pref->getOldUnits(); - unitIndex = m_unitOm->findText(tempUnit); + unitIndex = std::find(::units, ::units + ::unitsCount, tempUnit) - ::units; m_unitOm->setCurrentIndex(unitIndex); tempUnit = m_pref->getOldCameraUnits(); - unitIndex = m_cameraUnitOm->findText(tempUnit); + unitIndex = std::find(::units, ::units + ::unitsCount, tempUnit) - ::units; m_cameraUnitOm->setCurrentIndex(unitIndex); m_unitOm->setDisabled(false); m_cameraUnitOm->setDisabled(false); @@ -381,7 +381,7 @@ void PreferencesPopup::onInterfaceFontChanged(int index) { QString oldTypeface = m_interfaceFontStyle->currentText(); rebuilldFontStyleList(); if (!oldTypeface.isEmpty()) { - int newIndex = m_interfaceFontStyle->findText(oldTypeface); + int newIndex = m_interfaceFontStyle->findText(oldTypeface); if (newIndex < 0) newIndex = 0; m_interfaceFontStyle->setCurrentIndex(newIndex); } @@ -504,7 +504,7 @@ void PreferencesPopup::onTranspCheckDataChanged(const TPixel32 &, void PreferencesPopup::onOnionDataChanged(const TPixel32 &, bool isDragging) { if (isDragging) return; - bool inksOnly = false; + bool inksOnly = false; if (m_inksOnly) inksOnly = m_inksOnly->isChecked(); m_pref->setOnionData(m_frontOnionColor->getColor(), m_backOnionColor->getColor(), inksOnly); @@ -517,7 +517,7 @@ void PreferencesPopup::onOnionDataChanged(const TPixel32 &, bool isDragging) { //----------------------------------------------------------------------------- void PreferencesPopup::onOnionDataChanged(int) { - bool inksOnly = false; + bool inksOnly = false; if (m_inksOnly) inksOnly = m_inksOnly->isChecked(); m_pref->setOnionData(m_frontOnionColor->getColor(), m_backOnionColor->getColor(), inksOnly); diff --git a/toonz/sources/toonz/projectpopup.cpp b/toonz/sources/toonz/projectpopup.cpp index d861571d..638f9994 100644 --- a/toonz/sources/toonz/projectpopup.cpp +++ b/toonz/sources/toonz/projectpopup.cpp @@ -145,7 +145,7 @@ DvDirModelNode *ProjectDirModel::getNode(const QModelIndex &index) const { QModelIndex ProjectDirModel::index(int row, int column, const QModelIndex &parent) const { if (column != 0) return QModelIndex(); - DvDirModelNode *parentNode = m_root; + DvDirModelNode *parentNode = m_root; if (parent.isValid()) parentNode = getNode(parent); if (row < 0 || row >= parentNode->getChildCount()) return QModelIndex(); DvDirModelNode *node = parentNode->getChild(row); @@ -321,19 +321,20 @@ ProjectPopup::ProjectPopup(bool isModal) Qt::AlignRight | Qt::AlignVCenter); upperLayout->addWidget(ff, i + 2, 1); } - struct { - QString name; - std::string folderName; - } cbs[] = {{tr("Append $scenepath to +drawings"), TProject::Drawings}, - {tr("Append $scenepath to +inputs"), TProject::Inputs}, - {tr("Append $scenepath to +extras"), TProject::Extras}}; + std::vector> cbs = { + std::make_tuple(tr("Append $scenepath to +drawings"), + TProject::Drawings), + std::make_tuple(tr("Append $scenepath to +inputs"), TProject::Inputs), + std::make_tuple(tr("Append $scenepath to +extras"), TProject::Extras)}; int currentRow = upperLayout->rowCount(); - for (i = 0; i < tArrayCount(cbs); i++) { - CheckBox *cb = new CheckBox(cbs[i].name); + for (int i = 0; i < cbs.size(); ++i) { + auto const &name = std::get<0>(cbs[i]); + auto const &folderName = std::get<1>(cbs[i]); + CheckBox *cb = new CheckBox(name); cb->setMaximumHeight(WidgetHeight); upperLayout->addWidget(cb, currentRow + i, 1); - m_useScenePathCbs.append(qMakePair(cbs[i].folderName, cb)); + m_useScenePathCbs.append(qMakePair(folderName, cb)); } m_topLayout->addLayout(upperLayout); } diff --git a/toonz/sources/toonz/reframepopup.cpp b/toonz/sources/toonz/reframepopup.cpp index 7c23ef78..6b38f645 100644 --- a/toonz/sources/toonz/reframepopup.cpp +++ b/toonz/sources/toonz/reframepopup.cpp @@ -61,10 +61,10 @@ ReframePopup::ReframePopup() bool ret = true; ret = ret && connect(m_step, SIGNAL(editingFinished()), this, SLOT(updateBlankCellCount())); - ret = ret && connect(m_blank, SIGNAL(editingFinished()), this, + ret = ret && connect(m_blank, SIGNAL(editingFinished()), this, SLOT(updateBlankCellCount())); - ret = ret && connect(okBtn, SIGNAL(clicked()), this, SLOT(accept())); - ret = ret && connect(cancelBtn, SIGNAL(clicked()), this, SLOT(reject())); + ret = ret && connect(okBtn, SIGNAL(clicked()), this, SLOT(accept())); + ret = ret && connect(cancelBtn, SIGNAL(clicked()), this, SLOT(reject())); assert(ret); } @@ -81,3 +81,7 @@ void ReframePopup::getValues(int& step, int& blank) { step = m_step->getValue(); blank = m_blank->getValue(); } + +//----------------------------------------------------------------------------- + +void ReframePopup::showEvent(QShowEvent* event) { m_step->selectAll(); } \ No newline at end of file diff --git a/toonz/sources/toonz/reframepopup.h b/toonz/sources/toonz/reframepopup.h index e02c1bc1..040541be 100644 --- a/toonz/sources/toonz/reframepopup.h +++ b/toonz/sources/toonz/reframepopup.h @@ -32,6 +32,9 @@ public: ReframePopup(); void getValues(int& step, int& blank); +protected: + void showEvent(QShowEvent* event) override; + public slots: void updateBlankCellCount(); }; diff --git a/toonz/sources/toonz/sceneviewer.cpp b/toonz/sources/toonz/sceneviewer.cpp index dab3c74a..3e50de49 100644 --- a/toonz/sources/toonz/sceneviewer.cpp +++ b/toonz/sources/toonz/sceneviewer.cpp @@ -24,6 +24,7 @@ #include "toonzqt/gutil.h" #include "toonzqt/imageutils.h" #include "toonzqt/lutcalibrator.h" +#include "toonzqt/viewcommandids.h" // TnzLib includes #include "toonz/tscenehandle.h" @@ -451,6 +452,83 @@ public: } } resetShiftTraceCommand; +//----------------------------------------------------------------------------- +// Following commands (VB_***) are registered for command bar buttons. +// They are separatd from the original visalization commands +// so that they will not break a logic of ShortcutZoomer. + +class TViewResetCommand final : public MenuItemHandler { +public: + TViewResetCommand() : MenuItemHandler(VB_ViewReset) {} + void execute() override { + if (TApp::instance()->getActiveViewer()) + TApp::instance()->getActiveViewer()->resetSceneViewer(); + } +} viewResetCommand; + +class TZoomResetCommand final : public MenuItemHandler { +public: + TZoomResetCommand() : MenuItemHandler(VB_ZoomReset) {} + void execute() override { + if (TApp::instance()->getActiveViewer()) + TApp::instance()->getActiveViewer()->resetZoom(); + } +} zoomResetCommand; + +class TZoomFitCommand final : public MenuItemHandler { +public: + TZoomFitCommand() : MenuItemHandler(VB_ZoomFit) {} + void execute() override { + if (TApp::instance()->getActiveViewer()) + TApp::instance()->getActiveViewer()->fitToCamera(); + } +} zoomFitCommand; + +class TActualPixelSizeCommand final : public MenuItemHandler { +public: + TActualPixelSizeCommand() : MenuItemHandler(VB_ActualPixelSize) {} + void execute() override { + if (TApp::instance()->getActiveViewer()) + TApp::instance()->getActiveViewer()->setActualPixelSize(); + } +} actualPixelSizeCommand; + +class TFlipViewerXCommand final : public MenuItemHandler { +public: + TFlipViewerXCommand() : MenuItemHandler(VB_FlipX) {} + void execute() override { + if (TApp::instance()->getActiveViewer()) + TApp::instance()->getActiveViewer()->flipX(); + } +} flipViewerXCommand; + +class TFlipViewerYCommand final : public MenuItemHandler { +public: + TFlipViewerYCommand() : MenuItemHandler(VB_FlipY) {} + void execute() override { + if (TApp::instance()->getActiveViewer()) + TApp::instance()->getActiveViewer()->flipY(); + } +} flipViewerYCommand; + +class TRotateResetCommand final : public MenuItemHandler { +public: + TRotateResetCommand() : MenuItemHandler(VB_RotateReset) {} + void execute() override { + if (TApp::instance()->getActiveViewer()) + TApp::instance()->getActiveViewer()->resetRotation(); + } +} rotateResetCommand; + +class TPositionResetCommand final : public MenuItemHandler { +public: + TPositionResetCommand() : MenuItemHandler(VB_PositionReset) {} + void execute() override { + if (TApp::instance()->getActiveViewer()) + TApp::instance()->getActiveViewer()->resetPosition(); + } +} positionResetCommand; + //============================================================================= // SceneViewer //----------------------------------------------------------------------------- @@ -511,8 +589,10 @@ SceneViewer::SceneViewer(ImageUtils::FullScreenWidget *parent) this->setTabletTracking(true); #endif - for (int i = 0; i < tArrayCount(m_viewAff); i++) + for (int i = 0; i < m_viewAff.size(); ++i) { setViewMatrix(getNormalZoomScale(), i); + m_rotationAngle[i] = 0.0; + } m_3DSideR = rasterFromQPixmap(svgToPixmap(":Resources/3Dside_r.svg")); m_3DSideL = rasterFromQPixmap(svgToPixmap(":Resources/3Dside_l.svg")); @@ -1635,7 +1715,7 @@ double SceneViewer::projectToZ(const TPointD &delta) { GLint viewport[4]; double modelview[16], projection[16]; glGetIntegerv(GL_VIEWPORT, viewport); - for (int i = 0; i < 16; i++) + for (int i = 0; i < 16; i++) projection[i] = (double)m_projectionMatrix.constData()[i]; glGetDoublev(GL_MODELVIEW_MATRIX, modelview); @@ -1797,8 +1877,9 @@ void SceneViewer::zoomQt(bool forward, bool reset) { if (reset || ((m_zoomScale3D < 500 || !forward) && (m_zoomScale3D > 0.01 || forward))) { double oldZoomScale = m_zoomScale3D; - m_zoomScale3D = reset ? 1 : ImageUtils::getQuantizedZoomFactor( - m_zoomScale3D, forward); + m_zoomScale3D = + reset ? 1 + : ImageUtils::getQuantizedZoomFactor(m_zoomScale3D, forward); m_pan3D = -(m_zoomScale3D / oldZoomScale) * -m_pan3D; } @@ -1819,17 +1900,18 @@ void SceneViewer::zoomQt(bool forward, bool reset) { int i; for (i = 0; i < 2; i++) { - TAffine &viewAff = m_viewAff[i]; + TAffine &viewAff = m_viewAff[i]; if (m_isFlippedX) viewAff = viewAff * TScale(-1, 1); if (m_isFlippedX) viewAff = viewAff * TScale(1, -1); - double scale2 = std::abs(viewAff.det()); + double scale2 = std::abs(viewAff.det()); if (m_isFlippedX) viewAff = viewAff * TScale(-1, 1); if (m_isFlippedX) viewAff = viewAff * TScale(1, -1); if (reset || ((scale2 < 100000 || !forward) && (scale2 > 0.001 * 0.05 || forward))) { double oldZoomScale = sqrt(scale2) * dpiFactor; - double zoomScale = reset ? 1 : ImageUtils::getQuantizedZoomFactor( - oldZoomScale, forward); + double zoomScale = + reset ? 1 + : ImageUtils::getQuantizedZoomFactor(oldZoomScale, forward); // threshold value -0.001 is intended to absorb the error of calculation if ((oldZoomScale - zoomScaleFittingWithScreen) * @@ -1995,8 +2077,18 @@ void SceneViewer::zoom(const TPointD ¢er, double factor) { //----------------------------------------------------------------------------- void SceneViewer::flipX() { - m_viewAff[0] = m_viewAff[0] * TScale(-1, 1); - m_viewAff[1] = m_viewAff[1] * TScale(-1, 1); + double flipAngle0 = (m_rotationAngle[0] * -1) * 2; + double flipAngle1 = (m_rotationAngle[1] * -1) * 2; + m_rotationAngle[0] += flipAngle0; + m_rotationAngle[1] += flipAngle1; + if (m_isFlippedX != m_isFlippedY) { + flipAngle0 = -flipAngle0; + flipAngle1 = -flipAngle1; + } + m_viewAff[0] = m_viewAff[0] * TRotation(flipAngle0) * TScale(-1, 1); + m_viewAff[1] = m_viewAff[1] * TRotation(flipAngle1) * TScale(-1, 1); + m_viewAff[0].a13 *= -1; + m_viewAff[1].a13 *= -1; m_isFlippedX = !m_isFlippedX; invalidateAll(); emit onZoomChanged(); @@ -2005,8 +2097,18 @@ void SceneViewer::flipX() { //----------------------------------------------------------------------------- void SceneViewer::flipY() { - m_viewAff[0] = m_viewAff[0] * TScale(1, -1); - m_viewAff[1] = m_viewAff[1] * TScale(1, -1); + double flipAngle0 = (m_rotationAngle[0] * -1) * 2; + double flipAngle1 = (m_rotationAngle[1] * -1) * 2; + m_rotationAngle[0] += flipAngle0; + m_rotationAngle[1] += flipAngle1; + if (m_isFlippedX != m_isFlippedY) { + flipAngle0 = -flipAngle0; + flipAngle1 = -flipAngle1; + } + m_viewAff[0] = m_viewAff[0] * TRotation(flipAngle0) * TScale(1, -1); + m_viewAff[1] = m_viewAff[1] * TRotation(flipAngle1) * TScale(1, -1); + m_viewAff[0].a23 *= -1; + m_viewAff[1].a23 *= -1; m_isFlippedY = !m_isFlippedY; invalidateAll(); emit onZoomChanged(); @@ -2017,7 +2119,8 @@ void SceneViewer::flipY() { void SceneViewer::rotate(const TPointD ¢er, double angle) { if (angle == 0) return; if (m_isFlippedX != m_isFlippedY) angle = -angle; - TPointD realCenter = m_viewAff[m_viewMode] * center; + m_rotationAngle[m_viewMode] += angle; + TPointD realCenter = m_viewAff[m_viewMode] * center; setViewMatrix(TRotation(realCenter, angle) * m_viewAff[m_viewMode], m_viewMode); invalidateAll(); @@ -2080,9 +2183,9 @@ void SceneViewer::fitToCamera() { TPointD P11 = cameraAff * cameraRect.getP11(); TPointD p0 = TPointD(std::min({P00.x, P01.x, P10.x, P11.x}), std::min({P00.y, P01.y, P10.y, P11.y})); - TPointD p1 = TPointD(std::max({P00.x, P01.x, P10.x, P11.x}), + TPointD p1 = TPointD(std::max({P00.x, P01.x, P10.x, P11.x}), std::max({P00.y, P01.y, P10.y, P11.y})); - cameraRect = TRectD(p0.x, p0.y, p1.x, p1.y); + cameraRect = TRectD(p0.x, p0.y, p1.x, p1.y); // Pan if (!is3DView()) { @@ -2109,8 +2212,10 @@ void SceneViewer::resetSceneViewer() { m_visualSettings.m_sceneProperties = TApp::instance()->getCurrentScene()->getScene()->getProperties(); - for (int i = 0; i < tArrayCount(m_viewAff); i++) + for (int i = 0; i < m_viewAff.size(); ++i) { setViewMatrix(getNormalZoomScale(), i); + m_rotationAngle[i] = 0.0; + } m_pos = QPoint(0, 0); m_pan3D = TPointD(0, 0); @@ -2125,6 +2230,45 @@ void SceneViewer::resetSceneViewer() { //----------------------------------------------------------------------------- +void SceneViewer::resetZoom() { + TPointD realCenter(m_viewAff[m_viewMode].a13, m_viewAff[m_viewMode].a23); + TAffine aff = + getNormalZoomScale() * TRotation(realCenter, m_rotationAngle[m_viewMode]); + aff.a13 = realCenter.x; + aff.a23 = realCenter.y; + if (m_isFlippedX) aff = aff * TScale(-1, 1); + if (m_isFlippedY) aff = aff * TScale(1, -1); + setViewMatrix(aff, m_viewMode); + invalidateAll(); + emit onZoomChanged(); +} + +//----------------------------------------------------------------------------- + +void SceneViewer::resetRotation() { + double reverseRotatation = m_rotationAngle[m_viewMode] * -1; + if (m_isFlippedX) reverseRotatation *= -1; + if (m_isFlippedY) reverseRotatation *= -1; + TTool *tool = TApp::instance()->getCurrentTool()->getTool(); + TPointD center = m_viewAff[m_viewMode].inv() * TPointD(0, 0); + if (tool->getName() == "T_Rotate" && + tool->getProperties(0) + ->getProperty("Rotate On Camera Center") + ->getValueAsString() == "1") + center = TPointD(0, 0); + rotate(center, reverseRotatation); +} + +//----------------------------------------------------------------------------- + +void SceneViewer::resetPosition() { + m_viewAff[m_viewMode].a13 = 0.0; + m_viewAff[m_viewMode].a23 = 0.0; + invalidateAll(); +} + +//----------------------------------------------------------------------------- + void SceneViewer::setActualPixelSize() { TApp *app = TApp::instance(); TXshLevel *l = app->getCurrentLevel()->getLevel(); @@ -2148,16 +2292,17 @@ void SceneViewer::setActualPixelSize() { } else dpi = sl->getDpi(fid); - const double inch = Stage::inch; - TAffine tempAff = getNormalZoomScale(); - if (m_isFlippedX) tempAff = tempAff * TScale(-1, 1); - if (m_isFlippedY) tempAff = tempAff * TScale(1, -1); - TPointD tempScale = dpi; + const double inch = Stage::inch; + TAffine tempAff = getNormalZoomScale(); + if (m_isFlippedX) tempAff = tempAff * TScale(-1, 1); + if (m_isFlippedY) tempAff = tempAff * TScale(1, -1); + TPointD tempScale = dpi; if (m_isFlippedX) tempScale.x = -tempScale.x; if (m_isFlippedY) tempScale.y = -tempScale.y; - for (int i = 0; i < tArrayCount(m_viewAff); i++) - setViewMatrix(dpi == TPointD(0, 0) ? tempAff : TScale(tempScale.x / inch, - tempScale.y / inch), + for (int i = 0; i < m_viewAff.size(); ++i) + setViewMatrix(dpi == TPointD(0, 0) + ? tempAff + : TScale(tempScale.x / inch, tempScale.y / inch), i); m_pos = QPoint(0, 0); @@ -2261,8 +2406,8 @@ int SceneViewer::pick(const TPointD &point) { assert(glGetError() == GL_NO_ERROR); GLint viewport[4]; glGetIntegerv(GL_VIEWPORT, viewport); - GLuint selectBuffer[512]; - glSelectBuffer(tArrayCount(selectBuffer), selectBuffer); + std::array selectBuffer; + glSelectBuffer(selectBuffer.size(), selectBuffer.data()); glRenderMode(GL_SELECT); // definisco la matrice di proiezione @@ -2321,7 +2466,7 @@ int SceneViewer::pick(const TPointD &point) { // conto gli hits int ret = -1; int hitCount = glRenderMode(GL_RENDER); - GLuint *p = selectBuffer; + GLuint *p = selectBuffer.data(); for (int i = 0; i < hitCount; ++i) { GLuint nameCount = *p++; GLuint zmin = *p++; @@ -2440,7 +2585,7 @@ void drawSpline(const TAffine &viewMatrix, const TRect &clipRect, bool camera3d, TStageObject *pegbar = objId != TStageObjectId::NoneId ? xsh->getStageObject(objId) : 0; - const TStroke *stroke = 0; + const TStroke *stroke = 0; if (pegbar && pegbar->getSpline()) stroke = pegbar->getSpline()->getStroke(); if (!stroke) return; diff --git a/toonz/sources/toonz/sceneviewer.h b/toonz/sources/toonz/sceneviewer.h index d6139f1e..ec2ccb38 100644 --- a/toonz/sources/toonz/sceneviewer.h +++ b/toonz/sources/toonz/sceneviewer.h @@ -22,6 +22,7 @@ #include "pane.h" #include "previewer.h" +#include #include #include @@ -98,11 +99,11 @@ class SceneViewer final : public GLWidgetForHighDpi, bool m_isMouseEntered, m_forceGlFlush; bool m_isFlippedX = false, m_isFlippedY = false; /*! FreezedStatus: -* \li NO_FREEZED freezed is not active; -* \li NORMAL_FREEZED freezed is active: show grab image; -* \li UPDATE_FREEZED freezed is active: draw last unfreezed image and grab -* view; -*/ + * \li NO_FREEZED freezed is not active; + * \li NORMAL_FREEZED freezed is active: show grab image; + * \li UPDATE_FREEZED freezed is active: draw last unfreezed image and grab + * view; + */ enum FreezedStatus { NO_FREEZED = 0, NORMAL_FREEZED = 1, @@ -124,7 +125,7 @@ class SceneViewer final : public GLWidgetForHighDpi, // current pan/zoom matrix (two different matrices are used for editing scenes // and leves) - TAffine m_viewAff[2]; + std::array m_viewAff; int m_viewMode; TPointD m_dpiScale; @@ -178,6 +179,8 @@ class SceneViewer final : public GLWidgetForHighDpi, // updated in drawScene() and used in GLInvalidateRect() TRectD m_guidedDrawingBBox; + double m_rotationAngle[2]; + public: enum ReferenceMode { NORMAL_REFERENCE = 1, @@ -394,6 +397,9 @@ protected: public slots: void resetSceneViewer(); + void resetZoom(); + void resetRotation(); + void resetPosition(); void setActualPixelSize(); void flipX(); void flipY(); diff --git a/toonz/sources/toonz/sceneviewercontextmenu.cpp b/toonz/sources/toonz/sceneviewercontextmenu.cpp index d8b6988c..5a6c703f 100644 --- a/toonz/sources/toonz/sceneviewercontextmenu.cpp +++ b/toonz/sources/toonz/sceneviewercontextmenu.cpp @@ -81,12 +81,6 @@ SceneViewerContextMenu::SceneViewerContextMenu(SceneViewer *parent) parent->connect(action, SIGNAL(triggered()), SLOT(swapCompared())); } - // reset - action = commandManager->createAction(V_ZoomReset, this); - addAction(action); - ret = ret && - parent->connect(action, SIGNAL(triggered()), SLOT(resetSceneViewer())); - if (!isEditingLevel) { // fit camera action = commandManager->createAction(V_ZoomFit, this); @@ -95,6 +89,43 @@ SceneViewerContextMenu::SceneViewerContextMenu(SceneViewer *parent) parent->connect(action, SIGNAL(triggered()), SLOT(fitToCamera())); } + QMenu *flipViewMenu = addMenu(tr("Flip View")); + + // flip horizontally + action = commandManager->createAction(V_FlipX, this); + flipViewMenu->addAction(action); + ret = ret && parent->connect(action, SIGNAL(triggered()), SLOT(flipX())); + + // flip vertically + action = commandManager->createAction(V_FlipY, this); + flipViewMenu->addAction(action); + ret = ret && parent->connect(action, SIGNAL(triggered()), SLOT(flipY())); + + QMenu *resetViewMenu = addMenu(tr("Reset View")); + + // reset + action = commandManager->createAction(V_ViewReset, this); + resetViewMenu->addAction(action); + ret = ret && + parent->connect(action, SIGNAL(triggered()), SLOT(resetSceneViewer())); + + // reset zoom + action = commandManager->createAction(V_ZoomReset, this); + resetViewMenu->addAction(action); + ret = ret && parent->connect(action, SIGNAL(triggered()), SLOT(resetZoom())); + + // reset rotation + action = commandManager->createAction(V_RotateReset, this); + resetViewMenu->addAction(action); + ret = ret && + parent->connect(action, SIGNAL(triggered()), SLOT(resetRotation())); + + // reset position + action = commandManager->createAction(V_PositionReset, this); + resetViewMenu->addAction(action); + ret = ret && + parent->connect(action, SIGNAL(triggered()), SLOT(resetPosition())); + // actual pixel size action = commandManager->createAction(V_ActualPixelSize, this); addAction(action); diff --git a/toonz/sources/toonz/sceneviewerevents.cpp b/toonz/sources/toonz/sceneviewerevents.cpp index 3ed6e3ac..6fb6fea7 100644 --- a/toonz/sources/toonz/sceneviewerevents.cpp +++ b/toonz/sources/toonz/sceneviewerevents.cpp @@ -70,7 +70,7 @@ namespace { void initToonzEvent(TMouseEvent &toonzEvent, QMouseEvent *event, int widgetHeight, double pressure, int devPixRatio) { - toonzEvent.m_pos = TPointD(event->pos().x() * devPixRatio, + toonzEvent.m_pos = TPointD(event->pos().x() * devPixRatio, widgetHeight - 1 - event->pos().y() * devPixRatio); toonzEvent.m_mousePos = event->pos(); toonzEvent.m_pressure = 1.0; @@ -279,6 +279,8 @@ void SceneViewer::tabletEvent(QTabletEvent *e) { initToonzEvent(mouseEvent, e, height(), m_pressure, getDevPixRatio()); m_tabletState = Touched; onPress(mouseEvent); + } else if (m_tabletState == Touched) { + m_tabletState = StartStroke; } } else m_tabletEvent = false; @@ -811,9 +813,9 @@ quit: // Don't clear it out table state so the tablePress event will process // correctly. if (m_tabletState != Touched) m_tabletState = None; - m_mouseState = None; - m_tabletMove = false; - m_pressure = 0; + m_mouseState = None; + m_tabletMove = false; + m_pressure = 0; // Leave m_tabletEvent as-is in order to check whether the onRelease is called // from tabletEvent or not in mouseReleaseEvent. if (m_tabletState == Released) // only clear if tabletRelease event @@ -869,12 +871,12 @@ void SceneViewer::wheelEvent(QWheelEvent *event) { default: // Qt::MouseEventSynthesizedByQt, // Qt::MouseEventSynthesizedByApplication - { - std::cout << "not supported event: Qt::MouseEventSynthesizedByQt, " - "Qt::MouseEventSynthesizedByApplication" - << std::endl; - break; - } + { + std::cout << "not supported event: Qt::MouseEventSynthesizedByQt, " + "Qt::MouseEventSynthesizedByApplication" + << std::endl; + break; + } } // end switch @@ -966,8 +968,8 @@ void SceneViewer::gestureEvent(QGestureEvent *e) { qreal rotationDelta = gesture->rotationAngle() - gesture->lastRotationAngle(); if (m_isFlippedX != m_isFlippedY) rotationDelta = -rotationDelta; - TAffine aff = getViewMatrix().inv(); - TPointD center = aff * TPointD(0, 0); + TAffine aff = getViewMatrix().inv(); + TPointD center = aff * TPointD(0, 0); if (!m_rotating && !m_zooming) { m_rotationDelta += rotationDelta; double absDelta = abs(m_rotationDelta); @@ -1047,71 +1049,70 @@ void SceneViewer::touchEvent(QTouchEvent *e, int type) { bool SceneViewer::event(QEvent *e) { /* - switch (e->type()) { - // case QEvent::Enter: - // qDebug() << "[enter] ************************** Enter"; - // break; - // case QEvent::Leave: - // qDebug() << "[enter] ************************** Leave"; - // break; + switch (e->type()) { + // case QEvent::Enter: + // qDebug() << "[enter] ************************** Enter"; + // break; + // case QEvent::Leave: + // qDebug() << "[enter] ************************** Leave"; + // break; - case QEvent::TabletPress: { - QTabletEvent *te = static_cast(e); - qDebug() << "[enter] ************************** TabletPress mouseState(" - << m_mouseState << ") tabletState(" << m_tabletState - << ") pressure(" << m_pressure << ") pointerType(" - << te->pointerType() << ") device(" << te->device() << ")"; - } break; - // case QEvent::TabletMove: - // qDebug() << "[enter] ************************** TabletMove - //mouseState("<(e); + qDebug() << "[enter] ************************** TabletPress mouseState(" + << m_mouseState << ") tabletState(" << m_tabletState + << ") pressure(" << m_pressure << ") pointerType(" + << te->pointerType() << ") device(" << te->device() << ")"; + } break; + // case QEvent::TabletMove: + // qDebug() << "[enter] ************************** TabletMove + //mouseState("<type() == QEvent::Gesture && - CommandManager::instance() - ->getAction(MI_TouchGestureControl) - ->isChecked()) { + if (e->type() == QEvent::Gesture && CommandManager::instance() + ->getAction(MI_TouchGestureControl) + ->isChecked()) { gestureEvent(static_cast(e)); return true; } @@ -1181,11 +1182,11 @@ class ViewerZoomer final : public ImageUtils::ShortcutZoomer { public: ViewerZoomer(SceneViewer *parent) : ShortcutZoomer(parent) {} - bool zoom(bool zoomin, bool resetZoom) override { + bool zoom(bool zoomin, bool resetView) override { SceneViewer *sceneViewer = static_cast(getWidget()); - resetZoom ? sceneViewer->resetSceneViewer() - : sceneViewer->zoomQt(zoomin, resetZoom); + resetView ? sceneViewer->resetSceneViewer() + : sceneViewer->zoomQt(zoomin, resetView); return true; } @@ -1210,6 +1211,21 @@ public: return true; } + bool resetZoom() override { + static_cast(getWidget())->resetZoom(); + return true; + } + + bool resetRotation() override { + static_cast(getWidget())->resetRotation(); + return true; + } + + bool resetPosition() override { + static_cast(getWidget())->resetPosition(); + return true; + } + bool toggleFullScreen(bool quit) override { if (ImageUtils::FullScreenWidget *fsWidget = dynamic_cast( diff --git a/toonz/sources/toonz/startuppopup.cpp b/toonz/sources/toonz/startuppopup.cpp index b84d8600..fee6e056 100644 --- a/toonz/sources/toonz/startuppopup.cpp +++ b/toonz/sources/toonz/startuppopup.cpp @@ -95,9 +95,9 @@ StartupPopup::StartupPopup() : Dialog(TApp::instance()->getMainWindow(), true, true, "StartupPopup") { setWindowTitle(tr("OpenToonz Startup")); - m_projectBox = new QGroupBox(tr("Choose Project"), this); + m_projectBox = new QGroupBox(tr("Current Project"), this); m_sceneBox = new QGroupBox(tr("Create a New Scene"), this); - m_recentBox = new QGroupBox(tr("Open Scene"), this); + m_recentBox = new QGroupBox(tr("Recent Scenes [Project]"), this); m_projectBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); m_nameFld = new LineEdit(this); m_pathFld = new FileField(this); @@ -168,6 +168,7 @@ StartupPopup::StartupPopup() m_sceneBox->setMinimumWidth(480); m_projectBox->setMinimumWidth(480); m_buttonFrame->setFixedHeight(34); + //--- layout m_topLayout->setMargin(0); m_topLayout->setSpacing(0); @@ -240,14 +241,15 @@ StartupPopup::StartupPopup() newSceneLay->addWidget(createButton, 7, 1, 1, 3, Qt::AlignLeft); } m_sceneBox->setLayout(newSceneLay); - guiLay->addWidget(m_sceneBox, 2, 0, 4, 1, Qt::AlignLeft); + guiLay->addWidget(m_sceneBox, 2, 0, 4, 1, Qt::AlignTop); m_recentSceneLay->setMargin(5); m_recentSceneLay->setSpacing(2); { // Recent Scene List m_recentBox->setLayout(m_recentSceneLay); - guiLay->addWidget(m_recentBox, 1, 1, 4, 1, Qt::AlignTop); + guiLay->addWidget(m_recentBox, 1, 1, 4, 1, + Qt::AlignTop | Qt::AlignHCenter); guiLay->addWidget(loadOtherSceneButton, 5, 1, 1, 1, Qt::AlignRight); } m_topLayout->addLayout(guiLay, 0); @@ -409,10 +411,13 @@ void StartupPopup::refreshRecentScenes() { int i = 0; for (QString name : m_sceneNames) { if (i > 9) break; // box can hold 10 scenes - QString justName = QString::fromStdString(TFilePath(name).getName()); + QString fileName = + name.remove(0, name.indexOf(" ") + 1); // remove "#. " prefix + QString projectName = RecentFiles::instance()->getFileProject(fileName); + QString justName = QString::fromStdString(TFilePath(fileName).getName()) + + (projectName != "-" ? " [" + projectName + "]" : ""); m_recentNamesLabels[i] = new StartupLabel(justName, this, i); - m_recentNamesLabels[i]->setToolTip( - name.remove(0, name.indexOf(" ") + 1)); // remove "#. " prefix + m_recentNamesLabels[i]->setToolTip(fileName); m_recentSceneLay->addWidget(m_recentNamesLabels[i], 0, Qt::AlignTop); i++; } @@ -856,8 +861,34 @@ void StartupPopup::onRecentSceneClicked(int index) { DVGui::warning(msg); refreshRecentScenes(); } else { - IoCmd::loadScene(TFilePath(path.toStdWString()), false); - RecentFiles::instance()->moveFilePath(index, 0, RecentFiles::Scene); + if (RecentFiles::instance()->getFileProject(index) != "-") { + QString projectName = RecentFiles::instance()->getFileProject(index); + int projectIndex = m_projectsCB->findText(projectName); + if (projectIndex >= 0) { + TFilePath projectFp = m_projectPaths[projectIndex]; + TProjectManager::instance()->setCurrentProjectPath(projectFp); + } else { + QString msg = tr("The selected scene project '%1' is not in the " + "Current Project list and may not open automatically.") + .arg(projectName); + DVGui::warning(msg); + } + } + IoCmd::loadScene(TFilePath(path.toStdWString()), false, true); + if (RecentFiles::instance()->getFileProject(index) == "-") { + QString fileName = + RecentFiles::instance()->getFilePath(index, RecentFiles::Scene); + QString projectName = QString::fromStdString(TApp::instance() + ->getCurrentScene() + ->getScene() + ->getProject() + ->getName() + .getName()); + RecentFiles::instance()->removeFilePath(index, RecentFiles::Scene); + RecentFiles::instance()->addFilePath(fileName, RecentFiles::Scene, + projectName); + } else + RecentFiles::instance()->moveFilePath(index, 0, RecentFiles::Scene); RecentFiles::instance()->refreshRecentFilesMenu(RecentFiles::Scene); hide(); } diff --git a/toonz/sources/toonz/tapp.cpp b/toonz/sources/toonz/tapp.cpp index 83183368..023c5209 100644 --- a/toonz/sources/toonz/tapp.cpp +++ b/toonz/sources/toonz/tapp.cpp @@ -267,8 +267,9 @@ int TApp::getCurrentLevelStyleIndex() const { //----------------------------------------------------------------------------- -void TApp::setCurrentLevelStyleIndex(int index) { - m_paletteController->getCurrentLevelPalette()->setStyleIndex(index); +void TApp::setCurrentLevelStyleIndex(int index, bool forceUpdate) { + m_paletteController->getCurrentLevelPalette()->setStyleIndex(index, + forceUpdate); } //----------------------------------------------------------------------------- diff --git a/toonz/sources/toonz/tapp.h b/toonz/sources/toonz/tapp.h index ae97c522..ec5695a1 100644 --- a/toonz/sources/toonz/tapp.h +++ b/toonz/sources/toonz/tapp.h @@ -160,7 +160,7 @@ public: int getCurrentLevelStyleIndex() const override; - void setCurrentLevelStyleIndex(int index) override; + void setCurrentLevelStyleIndex(int index, bool forceUpdate = false) override; void setMainWindow(QMainWindow *mainWindow) { m_mainWindow = mainWindow; } /*! diff --git a/toonz/sources/toonz/tasksviewer.cpp b/toonz/sources/toonz/tasksviewer.cpp index e9abdf66..f76bbd80 100644 --- a/toonz/sources/toonz/tasksviewer.cpp +++ b/toonz/sources/toonz/tasksviewer.cpp @@ -324,7 +324,7 @@ void TaskSheet::update(TFarmTask *task) { m_commandLine->setText(task->getCommandLine()); m_server->setText(task->m_server); m_submittedBy->setText(task->m_user); - m_submittedOn->setText(task->m_submissionDate.toString()); + m_submittedOn->setText(task->m_callerMachineName); m_priority->setText(QString::number(task->m_priority)); m_submitDate->setText(task->m_submissionDate.toString()); m_startDate->setText(task->m_startDate.toString()); diff --git a/toonz/sources/toonz/tpanels.cpp b/toonz/sources/toonz/tpanels.cpp index 0f770110..4e5a6c1f 100644 --- a/toonz/sources/toonz/tpanels.cpp +++ b/toonz/sources/toonz/tpanels.cpp @@ -53,6 +53,7 @@ #include "toonzqt/tselectionhandle.h" #include "toonzqt/tmessageviewer.h" #include "toonzqt/scriptconsole.h" +#include "toonzqt/fxsettings.h" // TnzLib includes #include "toonz/palettecontroller.h" @@ -1358,3 +1359,52 @@ public: OpenFloatingPanel openHistoryPanelCommand(MI_OpenHistoryPanel, "HistoryPanel", QObject::tr("History")); //============================================================================= + +//============================================================================= +// FxSettings +//----------------------------------------------------------------------------- + +FxSettingsPanel::FxSettingsPanel(QWidget *parent) : TPanel(parent) { + TApp *app = TApp::instance(); + TSceneHandle *hScene = app->getCurrentScene(); + TPixel32 col1, col2; + Preferences::instance()->getChessboardColors(col1, col2); + + m_fxSettings = new FxSettings(this, col1, col2); + m_fxSettings->setSceneHandle(hScene); + m_fxSettings->setFxHandle(app->getCurrentFx()); + m_fxSettings->setFrameHandle(app->getCurrentFrame()); + m_fxSettings->setXsheetHandle(app->getCurrentXsheet()); + m_fxSettings->setLevelHandle(app->getCurrentLevel()); + m_fxSettings->setObjectHandle(app->getCurrentObject()); + + m_fxSettings->setCurrentFx(); + + setWidget(m_fxSettings); +} + +//============================================================================= +// FxSettingsFactory +//----------------------------------------------------------------------------- + +class FxSettingsFactory final : public TPanelFactory { +public: + FxSettingsFactory() : TPanelFactory("FxSettings") {} + + TPanel *createPanel(QWidget *parent) override { + FxSettingsPanel *panel = new FxSettingsPanel(parent); + panel->move(qApp->desktop()->screenGeometry(panel).center()); + panel->setObjectName(getPanelType()); + panel->setWindowTitle(QObject::tr("Fx Settings")); + panel->setMinimumSize(390, 85); + panel->allowMultipleInstances(false); + return panel; + } + + void initialize(TPanel *panel) override { assert(0); } + +} FxSettingsFactory; + +//============================================================================= +OpenFloatingPanel openFxSettingsCommand(MI_FxParamEditor, "FxSettings", + QObject::tr("Fx Settings")); diff --git a/toonz/sources/toonz/tpanels.h b/toonz/sources/toonz/tpanels.h index 2a0498a3..904902b2 100644 --- a/toonz/sources/toonz/tpanels.h +++ b/toonz/sources/toonz/tpanels.h @@ -25,6 +25,8 @@ class FunctionViewer; class FlipBook; class ToolOptions; class ComboViewerPanel; +class FxSettings; + //========================================================= // PaletteViewerPanel //--------------------------------------------------------- @@ -267,4 +269,17 @@ protected: void widgetClearFocusOnLeave() override; }; +//========================================================= +// FxSettingsPanel +//--------------------------------------------------------- + +class FxSettingsPanel final : public TPanel { + Q_OBJECT + + FxSettings *m_fxSettings; + +public: + FxSettingsPanel(QWidget *parent); +}; + #endif diff --git a/toonz/sources/toonz/viewerpane.cpp b/toonz/sources/toonz/viewerpane.cpp index a82f7e76..7373e7b3 100644 --- a/toonz/sources/toonz/viewerpane.cpp +++ b/toonz/sources/toonz/viewerpane.cpp @@ -27,6 +27,7 @@ #include "toonz/tonionskinmaskhandle.h" #include "toutputproperties.h" #include "toonz/preferences.h" +#include "toonz/tproject.h" // TnzQt includes #include "toonzqt/menubarcommand.h" @@ -521,10 +522,12 @@ void SceneViewerPanel::changeWindowTitle() { int frame = app->getCurrentFrame()->getFrame(); QString name; if (app->getCurrentFrame()->isEditingScene()) { - QString sceneName = QString::fromStdWString(scene->getSceneName()); + TProject *project = scene->getProject(); + QString projectName = QString::fromStdString(project->getName().getName()); + QString sceneName = QString::fromStdWString(scene->getSceneName()); if (sceneName.isEmpty()) sceneName = tr("Untitled"); if (app->getCurrentScene()->getDirtyFlag()) sceneName += QString("*"); - name = tr("Scene: ") + sceneName; + name = tr("Scene: ") + sceneName + tr(" :: Project: ") + projectName; if (frame >= 0) name = name + tr(" :: Frame: ") + tr(std::to_string(frame + 1).c_str()); diff --git a/toonz/sources/toonz/xshcellmover.cpp b/toonz/sources/toonz/xshcellmover.cpp index 6a5858bd..1f962f9e 100644 --- a/toonz/sources/toonz/xshcellmover.cpp +++ b/toonz/sources/toonz/xshcellmover.cpp @@ -183,10 +183,7 @@ bool CellsMover::canMoveCells(const TPoint &pos) { while (i < m_rowCount * m_colCount) { TXshColumn::ColumnType srcType = getColumnTypeFromCell(i); int dstIndex = c + i; - if (!m_orientation->isVerticalTimeline() && - dstIndex >= xsh->getColumnCount()) - return false; - TXshColumn *dstColumn = xsh->getColumn(dstIndex); + TXshColumn *dstColumn = xsh->getColumn(dstIndex); if (srcType == TXshColumn::eZeraryFxType || srcType == TXshColumn::eSoundTextType) return false; diff --git a/toonz/sources/toonz/xshcellviewer.cpp b/toonz/sources/toonz/xshcellviewer.cpp index 745e96fc..5298bb8e 100644 --- a/toonz/sources/toonz/xshcellviewer.cpp +++ b/toonz/sources/toonz/xshcellviewer.cpp @@ -318,46 +318,36 @@ bool isGlobalKeyFrameWithSameTypeDiffFromLinear(TStageObject *stageObject, TDoubleKeyframe::Type type = stageObject->getParam(TStageObject::T_Angle)->getKeyframeAt(frame).m_type; if (type == TDoubleKeyframe::Linear) return false; - if (type != - stageObject->getParam(TStageObject::T_X) - ->getKeyframeAt(frame) - .m_type || - type != - stageObject->getParam(TStageObject::T_Y) - ->getKeyframeAt(frame) - .m_type || - type != - stageObject->getParam(TStageObject::T_Z) - ->getKeyframeAt(frame) - .m_type || - type != - stageObject->getParam(TStageObject::T_SO) - ->getKeyframeAt(frame) - .m_type || - type != - stageObject->getParam(TStageObject::T_ScaleX) - ->getKeyframeAt(frame) - .m_type || - type != - stageObject->getParam(TStageObject::T_ScaleY) - ->getKeyframeAt(frame) - .m_type || - type != - stageObject->getParam(TStageObject::T_Scale) - ->getKeyframeAt(frame) - .m_type || - type != - stageObject->getParam(TStageObject::T_Path) - ->getKeyframeAt(frame) - .m_type || - type != - stageObject->getParam(TStageObject::T_ShearX) - ->getKeyframeAt(frame) - .m_type || - type != - stageObject->getParam(TStageObject::T_ShearY) - ->getKeyframeAt(frame) - .m_type) + if (type != stageObject->getParam(TStageObject::T_X) + ->getKeyframeAt(frame) + .m_type || + type != stageObject->getParam(TStageObject::T_Y) + ->getKeyframeAt(frame) + .m_type || + type != stageObject->getParam(TStageObject::T_Z) + ->getKeyframeAt(frame) + .m_type || + type != stageObject->getParam(TStageObject::T_SO) + ->getKeyframeAt(frame) + .m_type || + type != stageObject->getParam(TStageObject::T_ScaleX) + ->getKeyframeAt(frame) + .m_type || + type != stageObject->getParam(TStageObject::T_ScaleY) + ->getKeyframeAt(frame) + .m_type || + type != stageObject->getParam(TStageObject::T_Scale) + ->getKeyframeAt(frame) + .m_type || + type != stageObject->getParam(TStageObject::T_Path) + ->getKeyframeAt(frame) + .m_type || + type != stageObject->getParam(TStageObject::T_ShearX) + ->getKeyframeAt(frame) + .m_type || + type != stageObject->getParam(TStageObject::T_ShearY) + ->getKeyframeAt(frame) + .m_type) return false; return true; } @@ -380,46 +370,36 @@ bool isGlobalKeyFrameWithSamePrevTypeDiffFromLinear(TStageObject *stageObject, ->getKeyframeAt(frame) .m_prevType; if (type == TDoubleKeyframe::Linear) return false; - if (type != - stageObject->getParam(TStageObject::T_X) - ->getKeyframeAt(frame) - .m_prevType || - type != - stageObject->getParam(TStageObject::T_Y) - ->getKeyframeAt(frame) - .m_prevType || - type != - stageObject->getParam(TStageObject::T_Z) - ->getKeyframeAt(frame) - .m_prevType || - type != - stageObject->getParam(TStageObject::T_SO) - ->getKeyframeAt(frame) - .m_prevType || - type != - stageObject->getParam(TStageObject::T_ScaleX) - ->getKeyframeAt(frame) - .m_prevType || - type != - stageObject->getParam(TStageObject::T_ScaleY) - ->getKeyframeAt(frame) - .m_prevType || - type != - stageObject->getParam(TStageObject::T_Scale) - ->getKeyframeAt(frame) - .m_prevType || - type != - stageObject->getParam(TStageObject::T_Path) - ->getKeyframeAt(frame) - .m_prevType || - type != - stageObject->getParam(TStageObject::T_ShearX) - ->getKeyframeAt(frame) - .m_prevType || - type != - stageObject->getParam(TStageObject::T_ShearY) - ->getKeyframeAt(frame) - .m_prevType) + if (type != stageObject->getParam(TStageObject::T_X) + ->getKeyframeAt(frame) + .m_prevType || + type != stageObject->getParam(TStageObject::T_Y) + ->getKeyframeAt(frame) + .m_prevType || + type != stageObject->getParam(TStageObject::T_Z) + ->getKeyframeAt(frame) + .m_prevType || + type != stageObject->getParam(TStageObject::T_SO) + ->getKeyframeAt(frame) + .m_prevType || + type != stageObject->getParam(TStageObject::T_ScaleX) + ->getKeyframeAt(frame) + .m_prevType || + type != stageObject->getParam(TStageObject::T_ScaleY) + ->getKeyframeAt(frame) + .m_prevType || + type != stageObject->getParam(TStageObject::T_Scale) + ->getKeyframeAt(frame) + .m_prevType || + type != stageObject->getParam(TStageObject::T_Path) + ->getKeyframeAt(frame) + .m_prevType || + type != stageObject->getParam(TStageObject::T_ShearX) + ->getKeyframeAt(frame) + .m_prevType || + type != stageObject->getParam(TStageObject::T_ShearY) + ->getKeyframeAt(frame) + .m_prevType) return false; return true; } @@ -778,7 +758,7 @@ void RenameCellField::renameCell() { fid = TFrameId(fidRe.cap(1).toInt(), fidRe.cap(2) == "" ? 0 : fidRe.cap(2).toLatin1()[0]); #else - fid = TFrameId(fidRe.cap(1).toInt(), + fid = TFrameId(fidRe.cap(1).toInt(), fidRe.cap(2) == "" ? 0 : fidRe.cap(2).toAscii()[0]); #endif FilmstripCmd::renumberDrawing(sl, cell.m_frameId, fid); @@ -828,7 +808,7 @@ void RenameCellField::renameCell() { } TXshLevel *xl = cell.m_level.getPointer(); - if (!xl || (xl->getSimpleLevel() && + if (!xl || (xl->getSimpleLevel() && !xl->getSimpleLevel()->isEmpty() && xl->getSimpleLevel()->getFirstFid() == TFrameId::NO_FRAME)) { cells.append(TXshCell()); continue; @@ -1794,10 +1774,10 @@ void CellArea::drawLevelCell(QPainter &p, int row, int col, bool isReference) { nameRect.adjust(0, 0, -frameAdj, 0); // draw text in red if the file does not exist - bool isRed = false; - TXshSimpleLevel *sl = cell.getSimpleLevel(); + bool isRed = false; + TXshSimpleLevel *sl = cell.getSimpleLevel(); if (sl && !sl->isFid(cell.m_frameId)) isRed = true; - TXshChildLevel *cl = cell.getChildLevel(); + TXshChildLevel *cl = cell.getChildLevel(); if (cl && cell.getFrameId().getNumber() - 1 >= cl->getFrameCount()) isRed = true; QColor penColor = @@ -1897,8 +1877,9 @@ void CellArea::drawSoundTextCell(QPainter &p, int row, int col) { bool isSelected = cellSelection->isCellSelected(row, col) || columnSelection->isColumnSelected(col); - if (row > 0) prevCell = xsh->getCell(row - 1, col); // cell in previous frame - // nothing to draw + if (row > 0) + prevCell = xsh->getCell(row - 1, col); // cell in previous frame + // nothing to draw bool sameLevel = prevCell.m_level.getPointer() == cell.m_level.getPointer(); @@ -2004,7 +1985,7 @@ void CellArea::drawSoundTextCell(QPainter &p, int row, int col) { #ifdef _WIN32 fontName = "Arial"; #else - fontName = "Helvetica"; + fontName = "Helvetica"; #endif } static QFont font(fontName, -1, QFont::Normal); @@ -2036,7 +2017,7 @@ void CellArea::drawSoundTextCell(QPainter &p, int row, int col) { #if QT_VERSION >= 0x050500 QString elidaName = elideText(text, metric, nameRect.width(), "~"); #else - QString elidaName = elideText(text, font, nameRect.width(), "~"); + QString elidaName = elideText(text, font, nameRect.width(), "~"); #endif if (!sameLevel || prevCell.m_frameId != cell.m_frameId) @@ -2057,7 +2038,7 @@ void CellArea::drawPaletteCell(QPainter &p, int row, int col, bool isSelected = cellSelection->isCellSelected(row, col); if (row > 0) prevCell = xsh->getCell(row - 1, col); - TXshCell nextCell = xsh->getCell(row + 1, col); + TXshCell nextCell = xsh->getCell(row + 1, col); bool sameLevel = prevCell.m_level.getPointer() == cell.m_level.getPointer(); @@ -2068,8 +2049,8 @@ void CellArea::drawPaletteCell(QPainter &p, int row, int col, bool isAfterMarkers = distance > 0 && ((row - offset) % distance) == 0 && row != 0; - bool isRed = false; - TXshPaletteLevel *pl = cell.getPaletteLevel(); + bool isRed = false; + TXshPaletteLevel *pl = cell.getPaletteLevel(); if (pl && !pl->getPalette()) isRed = true; QPoint xy = m_viewer->positionToXY(CellPosition(row, col)); @@ -2201,7 +2182,7 @@ void CellArea::drawPaletteCell(QPainter &p, int row, int col, #ifdef _WIN32 fontName = "Arial"; #else - fontName = "Helvetica"; + fontName = "Helvetica"; #endif } static QFont font(fontName, -1, QFont::Normal); @@ -2531,6 +2512,8 @@ public: void undo() const override { m_pegbar->enableCycle(!m_pegbar->isCycleEnabled()); m_area->update(); + TApp::instance()->getCurrentScene()->setDirtyFlag(true); + TApp::instance()->getCurrentObject()->notifyObjectIdChanged(false); } void redo() const override { undo(); } int getSize() const override { return sizeof *this; } @@ -2694,8 +2677,9 @@ void CellArea::mousePressEvent(QMouseEvent *event) { } else if (isKeyframeFrame && row == k1 + 1 && o->rect(PredefinedRect::LOOP_ICON) .contains(mouseInCell)) { // cycle toggle - pegbar->enableCycle(!pegbar->isCycleEnabled()); - TUndoManager::manager()->add(new CycleUndo(pegbar, this)); + CycleUndo *undo = new CycleUndo(pegbar, this); + undo->redo(); + TUndoManager::manager()->add(undo); accept = true; } if (accept) { @@ -2709,11 +2693,16 @@ void CellArea::mousePressEvent(QMouseEvent *event) { if (m_levelExtenderRect.contains(pos.x, pos.y)) { m_viewer->getKeyframeSelection()->selectNone(); - setDragTool(XsheetGUI::DragTool::makeLevelExtenderTool(m_viewer)); + if (event->modifiers() & Qt::ControlModifier) + setDragTool( + XsheetGUI::DragTool::makeLevelExtenderTool(m_viewer, false)); + else + setDragTool(XsheetGUI::DragTool::makeLevelExtenderTool(m_viewer, true)); } else if (event->modifiers() & Qt::ControlModifier && m_upperLevelExtenderRect.contains(pos.x, pos.y)) { m_viewer->getKeyframeSelection()->selectNone(); - setDragTool(XsheetGUI::DragTool::makeLevelExtenderTool(m_viewer, true)); + setDragTool( + XsheetGUI::DragTool::makeLevelExtenderTool(m_viewer, false, true)); } else if ((!xsh->getCell(row, col).isEmpty()) && o->rect(PredefinedRect::DRAG_AREA) .adjusted(0, 0, -frameAdj, 0) @@ -2742,10 +2731,9 @@ void CellArea::mousePressEvent(QMouseEvent *event) { setDragTool(XsheetGUI::DragTool::makeLevelMoverTool(m_viewer)); } else { m_viewer->getKeyframeSelection()->selectNone(); - if (isSoundColumn && - o->rect(PredefinedRect::PREVIEW_TRACK) - .adjusted(0, 0, -frameAdj, 0) - .contains(mouseInCell)) + if (isSoundColumn && o->rect(PredefinedRect::PREVIEW_TRACK) + .adjusted(0, 0, -frameAdj, 0) + .contains(mouseInCell)) setDragTool(XsheetGUI::DragTool::makeSoundScrubTool( m_viewer, column->getSoundColumn())); else if (isSoundColumn && @@ -2879,10 +2867,9 @@ void CellArea::mouseMoveEvent(QMouseEvent *event) { : QString::fromStdWString(levelName) + QString(" ") + QString::fromStdString(frameNumber)); } - } else if (isSoundColumn && - o->rect(PredefinedRect::PREVIEW_TRACK) - .adjusted(0, 0, -frameAdj, 0) - .contains(mouseInCell)) + } else if (isSoundColumn && o->rect(PredefinedRect::PREVIEW_TRACK) + .adjusted(0, 0, -frameAdj, 0) + .contains(mouseInCell)) m_tooltip = tr("Click and drag to play"); else if (m_levelExtenderRect.contains(pos)) m_tooltip = tr("Click and drag to repeat selected cells"); @@ -3132,9 +3119,8 @@ const bool CellArea::isControlPressed() { return isCtrlPressed; } void CellArea::createCellMenu(QMenu &menu, bool isCellSelected, TXshCell cell) { CommandManager *cmdManager = CommandManager::instance(); - bool soundCellsSelected = m_viewer->areSoundCellsSelected(); - - if (m_viewer->areSoundTextCellsSelected()) return; // Magpies stop here + bool soundCellsSelected = m_viewer->areSoundCellsSelected(); + bool soundTextCellsSelected = m_viewer->areSoundTextCellsSelected(); menu.addSeparator(); @@ -3145,13 +3131,17 @@ void CellArea::createCellMenu(QMenu &menu, bool isCellSelected, TXshCell cell) { } if (isCellSelected) { + bool addSeparator = false; // open fx settings instead of level settings when clicked on zerary fx // level - if (cell.m_level && cell.m_level->getZeraryFxLevel()) + if (cell.m_level && cell.m_level->getZeraryFxLevel()) { menu.addAction(cmdManager->getAction(MI_FxParamEditor)); - else + addSeparator = true; + } else if (!soundTextCellsSelected) { menu.addAction(cmdManager->getAction(MI_LevelSettings)); - menu.addSeparator(); + addSeparator = true; + } + if (addSeparator) menu.addSeparator(); if (!soundCellsSelected) { QMenu *reframeSubMenu = new QMenu(tr("Reframe"), this); @@ -3183,74 +3173,81 @@ void CellArea::createCellMenu(QMenu &menu, bool isCellSelected, TXshCell cell) { } menu.addMenu(eachSubMenu); - QMenu *editCellNumbersMenu = new QMenu(tr("Edit Cell Numbers"), this); - { - editCellNumbersMenu->addAction(cmdManager->getAction(MI_Reverse)); - editCellNumbersMenu->addAction(cmdManager->getAction(MI_Swing)); - editCellNumbersMenu->addAction(cmdManager->getAction(MI_Random)); - editCellNumbersMenu->addAction(cmdManager->getAction(MI_Dup)); - editCellNumbersMenu->addAction(cmdManager->getAction(MI_Rollup)); - editCellNumbersMenu->addAction(cmdManager->getAction(MI_Rolldown)); - editCellNumbersMenu->addAction(cmdManager->getAction(MI_TimeStretch)); - editCellNumbersMenu->addAction( - cmdManager->getAction(MI_AutoInputCellNumber)); + if (!soundTextCellsSelected) { + QMenu *editCellNumbersMenu = new QMenu(tr("Edit Cell Numbers"), this); + { + editCellNumbersMenu->addAction(cmdManager->getAction(MI_Reverse)); + editCellNumbersMenu->addAction(cmdManager->getAction(MI_Swing)); + editCellNumbersMenu->addAction(cmdManager->getAction(MI_Random)); + editCellNumbersMenu->addAction(cmdManager->getAction(MI_Dup)); + editCellNumbersMenu->addAction(cmdManager->getAction(MI_Rollup)); + editCellNumbersMenu->addAction(cmdManager->getAction(MI_Rolldown)); + editCellNumbersMenu->addAction(cmdManager->getAction(MI_TimeStretch)); + editCellNumbersMenu->addAction( + cmdManager->getAction(MI_AutoInputCellNumber)); + } + menu.addMenu(editCellNumbersMenu); } - menu.addMenu(editCellNumbersMenu); menu.addAction(cmdManager->getAction(MI_FillEmptyCell)); menu.addSeparator(); - menu.addAction(cmdManager->getAction(MI_Autorenumber)); + + if (!soundTextCellsSelected) + menu.addAction(cmdManager->getAction(MI_Autorenumber)); } - QMenu *replaceLevelMenu = new QMenu(tr("Replace Level"), this); - menu.addMenu(replaceLevelMenu); + if (!soundTextCellsSelected) { + QMenu *replaceLevelMenu = new QMenu(tr("Replace Level"), this); + menu.addMenu(replaceLevelMenu); - replaceLevelMenu->addAction(cmdManager->getAction(MI_ReplaceLevel)); + replaceLevelMenu->addAction(cmdManager->getAction(MI_ReplaceLevel)); - replaceLevelMenu->addAction( - cmdManager->getAction(MI_ReplaceParentDirectory)); + replaceLevelMenu->addAction( + cmdManager->getAction(MI_ReplaceParentDirectory)); - { - // replace with another level in scene cast - std::vector levels; - TApp::instance() - ->getCurrentScene() - ->getScene() - ->getLevelSet() - ->listLevels(levels); - if (!levels.empty()) { - QMenu *replaceMenu = replaceLevelMenu->addMenu(tr("Replace with")); - connect(replaceMenu, SIGNAL(triggered(QAction *)), this, - SLOT(onReplaceByCastedLevel(QAction *))); - for (int i = 0; i < (int)levels.size(); i++) { - if (!levels[i]->getSimpleLevel() && !levels[i]->getChildLevel()) - continue; + { + // replace with another level in scene cast + std::vector levels; + TApp::instance() + ->getCurrentScene() + ->getScene() + ->getLevelSet() + ->listLevels(levels); + if (!levels.empty()) { + QMenu *replaceMenu = replaceLevelMenu->addMenu(tr("Replace with")); + connect(replaceMenu, SIGNAL(triggered(QAction *)), this, + SLOT(onReplaceByCastedLevel(QAction *))); + for (int i = 0; i < (int)levels.size(); i++) { + if (!levels[i]->getSimpleLevel() && !levels[i]->getChildLevel()) + continue; - if (levels[i]->getChildLevel() && - !TApp::instance()->getCurrentXsheet()->getXsheet()->isLevelUsed( - levels[i])) - continue; + if (levels[i]->getChildLevel() && + !TApp::instance()->getCurrentXsheet()->getXsheet()->isLevelUsed( + levels[i])) + continue; - QString tmpLevelName = QString::fromStdWString(levels[i]->getName()); - QAction *tmpAction = new QAction(tmpLevelName, replaceMenu); - tmpAction->setData(tmpLevelName); - replaceMenu->addAction(tmpAction); + QString tmpLevelName = + QString::fromStdWString(levels[i]->getName()); + QAction *tmpAction = new QAction(tmpLevelName, replaceMenu); + tmpAction->setData(tmpLevelName); + replaceMenu->addAction(tmpAction); + } } } - } - if (!soundCellsSelected) { - if (selectionContainTlvImage(m_viewer->getCellSelection(), - m_viewer->getXsheet())) - replaceLevelMenu->addAction( - cmdManager->getAction(MI_RevertToCleanedUp)); - if (selectionContainLevelImage(m_viewer->getCellSelection(), + if (!soundCellsSelected && !soundTextCellsSelected) { + if (selectionContainTlvImage(m_viewer->getCellSelection(), m_viewer->getXsheet())) - replaceLevelMenu->addAction( - cmdManager->getAction(MI_RevertToLastSaved)); - menu.addAction(cmdManager->getAction(MI_SetKeyframes)); + replaceLevelMenu->addAction( + cmdManager->getAction(MI_RevertToCleanedUp)); + if (selectionContainLevelImage(m_viewer->getCellSelection(), + m_viewer->getXsheet())) + replaceLevelMenu->addAction( + cmdManager->getAction(MI_RevertToLastSaved)); + menu.addAction(cmdManager->getAction(MI_SetKeyframes)); + } + menu.addSeparator(); } - menu.addSeparator(); menu.addAction(cmdManager->getAction(MI_Cut)); menu.addAction(cmdManager->getAction(MI_Copy)); @@ -3265,7 +3262,8 @@ void CellArea::createCellMenu(QMenu &menu, bool isCellSelected, TXshCell cell) { menu.addAction(cmdManager->getAction(MI_Clear)); menu.addAction(cmdManager->getAction(MI_Insert)); - menu.addAction(cmdManager->getAction(MI_Duplicate)); + if (!soundTextCellsSelected) + menu.addAction(cmdManager->getAction(MI_Duplicate)); menu.addSeparator(); TXshSimpleLevel *sl = TApp::instance()->getCurrentLevel()->getSimpleLevel(); @@ -3513,4 +3511,4 @@ void CellArea::onStepChanged(QAction *act) { //----------------------------------------------------------------------------- -} // namespace XsheetGUI; +} // namespace XsheetGUI diff --git a/toonz/sources/toonz/xsheetdragtool.cpp b/toonz/sources/toonz/xsheetdragtool.cpp index f8e3ce65..3523a848 100644 --- a/toonz/sources/toonz/xsheetdragtool.cpp +++ b/toonz/sources/toonz/xsheetdragtool.cpp @@ -325,15 +325,17 @@ class LevelExtenderUndo final : public TUndo { int m_col, m_row, m_deltaRow; std::vector m_cells; // righe x colonne + bool m_insert; bool m_invert; // upper-directional public: - LevelExtenderUndo(bool invert = false) + LevelExtenderUndo(bool insert = true, bool invert = false) : m_colCount(0) , m_rowCount(0) , m_col(0) , m_row(0) , m_deltaRow(0) + , m_insert(insert) , m_invert(invert) {} void setCells(TXsheet *xsh, int row, int col, int rowCount, int colCount) { @@ -388,6 +390,7 @@ public: } // for upper-directional smart tab + // also used for non-insert(overwriting) extension void clearCells() const { assert(m_deltaRow != 0); TXsheet *xsh = TApp::instance()->getCurrentXsheet()->getXsheet(); @@ -395,21 +398,33 @@ public: for (int c = m_col; c < m_col + m_colCount; c++) { TXshColumn *column = xsh->getColumn(c); if (column && column->getSoundColumn()) continue; - xsh->clearCells(m_row, c, count); + if (m_invert) + xsh->clearCells(m_row, c, count); + else + xsh->clearCells(m_row + m_rowCount - count, c, count); } } // for upper-directional smart tab + // also used for non-insert(overwriting) extension void setCells() const { assert(m_deltaRow != 0); TXsheet *xsh = TApp::instance()->getCurrentXsheet()->getXsheet(); int count = abs(m_deltaRow); - int r1 = m_row + count - 1; + + int r0, r1; + if (m_invert) { + r0 = m_row; + r1 = m_row + count - 1; + } else { + r0 = m_row + m_rowCount - count - 1; + r1 = m_row + m_rowCount - 1; + } for (int c = 0; c < m_colCount; c++) { TXshColumn *column = xsh->getColumn(c); if (column && column->getSoundColumn()) continue; int col = m_col + c; - for (int r = m_row; r <= r1; r++) { + for (int r = r0; r <= r1; r++) { int k = (r - m_row) * m_colCount + c; xsh->setCell(r, col, m_cells[k]); } @@ -418,10 +433,10 @@ public: void undo() const override { // undo for shrinking operation -> revert cells - if (m_deltaRow < 0) (m_invert) ? setCells() : insertCells(); + if (m_deltaRow < 0) (m_insert) ? insertCells() : setCells(); // undo for stretching operation -> remove cells else if (m_deltaRow > 0) - (m_invert) ? clearCells() : removeCells(); + (m_insert) ? removeCells() : clearCells(); else { assert(0); } @@ -433,10 +448,10 @@ public: void redo() const override { // redo for shrinking operation -> remove cells - if (m_deltaRow < 0) (m_invert) ? clearCells() : removeCells(); + if (m_deltaRow < 0) (m_insert) ? removeCells() : clearCells(); // redo for stretching operation -> revert cells else if (m_deltaRow > 0) - (m_invert) ? setCells() : insertCells(); + (m_insert) ? insertCells() : setCells(); else { assert(0); } @@ -626,12 +641,15 @@ class LevelExtenderTool final : public XsheetGUI::DragTool { LevelExtenderUndo *m_undo; bool m_invert; // upper directional smart tab + bool m_insert; public: - LevelExtenderTool(XsheetViewer *viewer, bool invert = false) + LevelExtenderTool(XsheetViewer *viewer, bool insert = true, + bool invert = false) : XsheetGUI::DragTool(viewer) , m_colCount(0) , m_undo(0) + , m_insert(insert) , m_invert(invert) {} // called when the smart tab is clicked @@ -649,11 +667,26 @@ public: m_colCount = c1 - c0 + 1; m_rowCount = r1 - r0 + 1; if (m_colCount <= 0 || m_rowCount <= 0) return; + + // if m_insert is false but there are no empty rows under the tab, + // then switch m_insert to true so that the operation works anyway + if (!m_insert && !m_invert) { + TXsheet *xsh = getViewer()->getXsheet(); + for (int c = c0; c <= c1; c++) { + TXshColumn *column = xsh->getColumn(c); + if (!column || column->getSoundColumn()) continue; + if (!column->isCellEmpty(r1 + 1)) { + m_insert = true; // switch the behavior + break; + } + } + } + m_columns.reserve(m_colCount); TXsheet *xsh = getViewer()->getXsheet(); for (int c = c0; c <= c1; c++) m_columns.push_back(CellBuilder(xsh, r0, c, m_rowCount, m_invert)); - m_undo = new LevelExtenderUndo(m_invert); + m_undo = new LevelExtenderUndo(m_insert, m_invert); m_undo->setCells(xsh, r0, c0, m_rowCount, m_colCount); } @@ -680,16 +713,41 @@ public: // Se e' una colonna sound l'extender non deve fare nulla. TXshColumn *column = xsh->getColumn(m_c0 + c); if (column && column->getSoundColumn()) continue; - xsh->removeCells(row, m_c0 + c, -dr); + if (m_insert) + xsh->removeCells(row, m_c0 + c, -dr); + else { + for (int r = row; r <= m_r1; r++) + xsh->setCell(r, m_c0 + c, TXshCell()); + } } } // extend else { + // check how many vacant rows + if (!m_insert) { + int tmp_dr; + bool found = false; + for (tmp_dr = 1; tmp_dr <= dr; tmp_dr++) { + for (int c = 0; c < m_colCount; c++) { + TXshColumn *column = xsh->getColumn(m_c0 + c); + if (!column || column->getSoundColumn()) continue; + if (!column->isCellEmpty(m_r1 + tmp_dr)) { + found = true; + break; + } + } + if (found) break; + } + if (tmp_dr == 1) return; + dr = tmp_dr - 1; + r1 = m_r1 + dr; + } + for (int c = 0; c < m_colCount; c++) { // Se e' una colonna sound l'extender non deve fare nulla. TXshColumn *column = xsh->getColumn(m_c0 + c); if (column && column->getSoundColumn()) continue; - xsh->insertCells(m_r1 + 1, m_c0 + c, dr); + if (m_insert) xsh->insertCells(m_r1 + 1, m_c0 + c, dr); for (int r = m_r1 + 1; r <= r1; r++) xsh->setCell(r, m_c0 + c, m_columns[c].generate(r)); } @@ -776,8 +834,8 @@ public: //----------------------------------------------------------------------------- XsheetGUI::DragTool *XsheetGUI::DragTool::makeLevelExtenderTool( - XsheetViewer *viewer, bool invert) { - return new LevelExtenderTool(viewer, invert); + XsheetViewer *viewer, bool insert, bool invert) { + return new LevelExtenderTool(viewer, insert, invert); } //============================================================================= diff --git a/toonz/sources/toonz/xsheetdragtool.h b/toonz/sources/toonz/xsheetdragtool.h index e01c8923..3689461d 100644 --- a/toonz/sources/toonz/xsheetdragtool.h +++ b/toonz/sources/toonz/xsheetdragtool.h @@ -48,6 +48,7 @@ public: static DragTool *makeSelectionTool(XsheetViewer *viewer); static DragTool *makeLevelMoverTool(XsheetViewer *viewer); static DragTool *makeLevelExtenderTool(XsheetViewer *viewer, + bool insert = true, bool invert = false); static DragTool *makeSoundLevelModifierTool(XsheetViewer *viewer); static DragTool *makeKeyframeMoverTool(XsheetViewer *viewer); diff --git a/toonz/sources/toonz/xsheetviewer.cpp b/toonz/sources/toonz/xsheetviewer.cpp index 0d7d9dbc..0c085df5 100644 --- a/toonz/sources/toonz/xsheetviewer.cpp +++ b/toonz/sources/toonz/xsheetviewer.cpp @@ -32,6 +32,7 @@ #include "toonz/txshnoteset.h" #include "toonz/childstack.h" #include "toonz/txshlevelhandle.h" +#include "toonz/tproject.h" #include "tconvert.h" #include "tenv.h" @@ -1603,13 +1604,16 @@ void XsheetViewer::changeWindowTitle() { TApp *app = TApp::instance(); ToonzScene *scene = app->getCurrentScene()->getScene(); if (!scene || !app->getCurrentFrame()->isEditingScene()) return; - QString sceneName = QString::fromStdWString(scene->getSceneName()); + TProject *project = scene->getProject(); + QString projectName = QString::fromStdString(project->getName().getName()); + QString sceneName = QString::fromStdWString(scene->getSceneName()); if (sceneName.isEmpty()) sceneName = tr("Untitled"); if (app->getCurrentScene()->getDirtyFlag()) sceneName += QString("*"); - QString name = tr("Scene: ") + sceneName; + QString name = + tr("Scene: ") + sceneName + tr(" :: Project: ") + projectName; int frameCount = scene->getFrameCount(); name = name + " :: " + tr(std::to_string(frameCount).c_str()) + - tr(" Frames"); + (frameCount == 1 ? tr(" Frame") : tr(" Frames")); // subXsheet or not ChildStack *childStack = scene->getChildStack(); diff --git a/toonz/sources/toonzfarm/tfarm/tfarmtask.cpp b/toonz/sources/toonzfarm/tfarm/tfarmtask.cpp index f4c79a8f..66ffc5f7 100644 --- a/toonz/sources/toonzfarm/tfarm/tfarmtask.cpp +++ b/toonz/sources/toonzfarm/tfarm/tfarmtask.cpp @@ -19,7 +19,7 @@ // MACOSX includes #ifdef _WIN32 #include -#elif MACOSX +#elif defined(MACOSX) #include "tversion.h" using namespace TVER; #include // gethostbyname @@ -361,12 +361,12 @@ void TFarmTask::saveData(TOStream &os) { //------------------------------------------------------------------------------ namespace { -QString getExeName(bool isComposer) { +static QString getExeName(bool isComposer) { QString name = isComposer ? "tcomposer" : "tcleanup"; #ifdef _WIN32 return name + ".exe "; -#elif MACOSX +#elif defined(MACOSX) TVER::ToonzVersion tver; return "\"./" + QString::fromStdString(tver.getAppName()) + "_" + QString::fromStdString(tver.getAppVersionString()) + @@ -380,7 +380,7 @@ QString getExeName(bool isComposer) { QString toString(int value, int w, char c = ' ') { QString s = QString::number(value); - while (s.size() < w) s= c + s; + while (s.size() < w) s = c + s; return s; } @@ -642,7 +642,7 @@ TFarmTaskGroup::TFarmTaskGroup(const QString &id, const QString &name, threadsIndex, maxTileSizeIndex, Overwrite_Off, false) , m_imp(new Imp()) { int subCount = 0; - if (chunksize > 0) subCount= tceil((to - from + 1) / (double)chunksize); + if (chunksize > 0) subCount = tceil((to - from + 1) / (double)chunksize); int ra = from; if (subCount > 1) { diff --git a/toonz/sources/toonzfarm/tfarmserver/tfarmserver.cpp b/toonz/sources/toonzfarm/tfarmserver/tfarmserver.cpp index b9281ec2..be839a3f 100644 --- a/toonz/sources/toonzfarm/tfarmserver/tfarmserver.cpp +++ b/toonz/sources/toonzfarm/tfarmserver/tfarmserver.cpp @@ -378,12 +378,12 @@ private: }; //------------------------------------------------------------------- -QString getExeName(bool isComposer) { +static QString getExeName(bool isComposer) { QString name = isComposer ? "tcomposer" : "tcleanup"; #ifdef _WIN32 return name + ".exe "; -#elif MACOSX +#elif defined(MACOSX) TVER::ToonzVersion tver; return "\"./" + QString::fromStdString(tver.getAppName()) + "_" + QString::fromStdString(tver.getAppVersionString()) + @@ -433,7 +433,7 @@ void Task::run() { m_log->info(logMsg); -// =========== + // =========== #ifdef _WIN32 if (m_cmdline.contains("runcasm")) service.mountDisks(); @@ -994,8 +994,8 @@ void FarmServerService::onStop() { } catch (TException & /*e*/) { } -// i dischi vengono montati al primo task di tipo "runcasm" -// e smontati allo stop del servizio + // i dischi vengono montati al primo task di tipo "runcasm" + // e smontati allo stop del servizio #ifdef _WIN32 unmountDisks(); diff --git a/toonz/sources/toonzlib/cellpositionratio.cpp b/toonz/sources/toonzlib/cellpositionratio.cpp index 1b95b03f..f3286ec9 100644 --- a/toonz/sources/toonzlib/cellpositionratio.cpp +++ b/toonz/sources/toonzlib/cellpositionratio.cpp @@ -4,7 +4,7 @@ #include // Euclid's algorithm -int greatestCommonDivisor(int a, int b) { +static int greatestCommonDivisor(int a, int b) { a = std::abs(a); b = std::abs(b); int c = std::max(a, b); @@ -18,12 +18,14 @@ int greatestCommonDivisor(int a, int b) { return c; } +#if 0 /* UNUSED */ int leastCommonMultiple(int a, int b) { return a * b / greatestCommonDivisor(a, b); } +#endif void Ratio::normalize() { - int gcd = greatestCommonDivisor(m_num, m_denom); + int gcd = greatestCommonDivisor(m_num, m_denom); if (m_denom < 0) gcd = -gcd; m_num /= gcd; m_denom /= gcd; diff --git a/toonz/sources/toonzlib/doubleparamcmd.cpp b/toonz/sources/toonzlib/doubleparamcmd.cpp index 2fa15dbb..bd9cc30d 100644 --- a/toonz/sources/toonzlib/doubleparamcmd.cpp +++ b/toonz/sources/toonzlib/doubleparamcmd.cpp @@ -2,6 +2,7 @@ #include "toonz/doubleparamcmd.h" #include "toonz/preferences.h" +#include "toonz/tscenehandle.h" #include "tdoubleparam.h" #include "tdoublekeyframe.h" #include "tundo.h" @@ -830,13 +831,23 @@ void KeyframeSetter::removeKeyframeAt(TDoubleParam *curve, double frame) { class EnableCycleUndo final : public TUndo { TDoubleParam *m_param; + TSceneHandle *m_sceneHandle; public: - EnableCycleUndo(TDoubleParam *param) : m_param(param) { m_param->addRef(); } + EnableCycleUndo(TDoubleParam *param, TSceneHandle *sceneHandle) + : m_param(param), m_sceneHandle(sceneHandle) { + m_param->addRef(); + } ~EnableCycleUndo() { m_param->release(); } void invertCycleEnabled() const { bool isEnabled = m_param->isCycleEnabled(); m_param->enableCycle(!isEnabled); + // for now the scene handle is only available when RMB click in function + // sheet + if (m_sceneHandle) { + m_sceneHandle->setDirtyFlag(true); + m_sceneHandle->notifySceneChanged(); + } } void undo() const override { invertCycleEnabled(); } void redo() const override { invertCycleEnabled(); } @@ -847,7 +858,9 @@ public: //============================================================================= -void KeyframeSetter::enableCycle(TDoubleParam *curve, bool enabled) { +void KeyframeSetter::enableCycle(TDoubleParam *curve, bool enabled, + TSceneHandle *sceneHandle) { curve->enableCycle(enabled); - TUndoManager::manager()->add(new EnableCycleUndo(curve)); + sceneHandle->notifySceneChanged(); + TUndoManager::manager()->add(new EnableCycleUndo(curve, sceneHandle)); } diff --git a/toonz/sources/toonzlib/fill.cpp b/toonz/sources/toonzlib/fill.cpp index 902a853b..7072667f 100644 --- a/toonz/sources/toonzlib/fill.cpp +++ b/toonz/sources/toonzlib/fill.cpp @@ -170,7 +170,7 @@ void fillRow(const TRasterCM32P &r, const TPoint &p, int &xa, int &xb, //----------------------------------------------------------------------------- void findSegment(const TRaster32P &r, const TPoint &p, int &xa, int &xb, - const TPixel32 &color) { + const TPixel32 &color, const int fillDepth = 254) { int matte, oldmatte; TPixel32 *pix, *pix0, *limit, *tmp_limit; @@ -185,7 +185,7 @@ void findSegment(const TRaster32P &r, const TPoint &p, int &xa, int &xb, for (; pix <= limit; pix++) { if (*pix == color) break; matte = pix->m; - if (matte < oldmatte || matte == 255) break; + if (matte < oldmatte || matte > fillDepth) break; oldmatte = matte; } if (matte == 0) { @@ -206,7 +206,7 @@ void findSegment(const TRaster32P &r, const TPoint &p, int &xa, int &xb, for (; pix >= limit; pix--) { if (*pix == color) break; matte = pix->m; - if (matte < oldmatte || matte == 255) break; + if (matte < oldmatte || matte > fillDepth) break; oldmatte = matte; } if (matte == 0) { @@ -220,6 +220,77 @@ void findSegment(const TRaster32P &r, const TPoint &p, int &xa, int &xb, xa = p.x + pix - pix0 + 1; } +//----------------------------------------------------------------------------- +// Used when the clicked pixel is solid or semi-transparent. +// Check if the fill is stemmed at the target pixel. +// Note that RGB values are used for checking the difference, not Alpha value. + +bool doesStemFill(const TPixel32 &clickColor, const TPixel32 *targetPix, + const int fillDepth2) { + // stop if the target pixel is transparent + if (targetPix->m == 0) return true; + // check difference of RGB values is larger than fillDepth + int dr = (int)clickColor.r - (int)targetPix->r; + int dg = (int)clickColor.g - (int)targetPix->g; + int db = (int)clickColor.b - (int)targetPix->b; + return (dr * dr + dg * dg + db * db) > + fillDepth2; // condition for "stem" the fill +} + +//----------------------------------------------------------------------------- + +void fullColorFindSegment(const TRaster32P &r, const TPoint &p, int &xa, + int &xb, const TPixel32 &color, + const TPixel32 &clickedPosColor, + const int fillDepth) { + if (clickedPosColor.m == 0) { + findSegment(r, p, xa, xb, color, fillDepth); + return; + } + + TPixel32 *pix, *pix0, *limit; + // check to the right + TPixel32 *line = r->pixels(p.y); + + pix0 = line + p.x; // seed pixel + pix = pix0; + limit = line + r->getBounds().x1; // right end + + TPixel32 oldPix = *pix; + + int fillDepth2 = fillDepth * fillDepth; + + for (; pix <= limit; pix++) { + // break if the target pixel is with the same as filling color + if (*pix == color) break; + // continue if the target pixel is the same as the previous one + if (*pix == oldPix) continue; + + if (doesStemFill(clickedPosColor, pix, fillDepth2)) break; + + // store pixel color in case if the next pixel is with the same color + oldPix = *pix; + } + xb = p.x + pix - pix0 - 1; + + // check to the left + pix = pix0; // seed pixel + limit = line + r->getBounds().x0; // left end + oldPix = *pix; + for (; pix >= limit; pix--) { + // break if the target pixel is with the same as filling color + if (*pix == color) break; + // continue if the target pixel is the same as the previous one + if (*pix == oldPix) continue; + + if (doesStemFill(clickedPosColor, pix, fillDepth2)) break; + + // store pixel color in case if the next pixel is with the same color + oldPix = *pix; + } + xa = p.x + pix - pix0 + 1; +} + //----------------------------------------------------------------------------- class FillSeed { @@ -271,6 +342,23 @@ void insertSegment(std::vector> &segments, segments.push_back(segment); } +//----------------------------------------------------------------------------- + +bool floodCheck(const TPixel32 &clickColor, const TPixel32 *targetPix, + const TPixel32 *oldPix, const int fillDepth) { + auto fullColorThreshMatte = [](int matte, int fillDepth) -> int { + return (matte <= fillDepth) ? matte : 255; + }; + + if (clickColor.m == 0) { + int oldMatte = fullColorThreshMatte(oldPix->m, fillDepth); + int matte = fullColorThreshMatte(targetPix->m, fillDepth); + return matte >= oldMatte && matte != 255; + } + int fillDepth2 = fillDepth * fillDepth; + return !doesStemFill(clickColor, targetPix, fillDepth2); +} + //----------------------------------------------------------------------------- } // namespace //----------------------------------------------------------------------------- @@ -588,3 +676,129 @@ void inkFill(const TRasterCM32P &r, const TPoint &pin, int ink, int searchRay, } r->unlock(); } + +//----------------------------------------------------------------------------- + +void fullColorFill(const TRaster32P &ras, const FillParameters ¶ms, + TTileSaverFullColor *saver) { + int oldy, xa, xb, xc, xd, dy, oldxd, oldxc; + TPixel32 *pix, *limit, *pix0, *oldpix; + int x = params.m_p.x, y = params.m_p.y; + + TRect bbbox = ras->getBounds(); + if (!bbbox.contains(params.m_p)) return; + + TPixel32 clickedPosColor = *(ras->pixels(y) + x); + + TPaletteP plt = params.m_palette; + TPixel32 color = plt->getStyle(params.m_styleId)->getMainColor(); + + if (clickedPosColor == color) return; + + int fillDepth = + params.m_shiftFill ? params.m_maxFillDepth : params.m_minFillDepth; + + assert(fillDepth >= 0 && fillDepth < 16); + TPointD m_firstPoint, m_clickPoint; + + // convert fillDepth range from [0 - 15] to [0 - 255] + fillDepth = (fillDepth << 4) | fillDepth; + + std::stack seeds; + std::map>> segments; + + fullColorFindSegment(ras, params.m_p, xa, xb, color, clickedPosColor, + fillDepth); + + segments[y].push_back(std::pair(xa, xb)); + seeds.push(FillSeed(xa, xb, y, 1)); + seeds.push(FillSeed(xa, xb, y, -1)); + + while (!seeds.empty()) { + FillSeed fs = seeds.top(); + seeds.pop(); + + xa = fs.m_xa; + xb = fs.m_xb; + oldy = fs.m_y; + dy = fs.m_dy; + y = oldy + dy; + // continue if the fill runs over image bounding + if (y > bbbox.y1 || y < bbbox.y0) continue; + // left end of the pixels to be filled + pix = pix0 = ras->pixels(y) + xa; + // right end of the pixels to be filled + limit = ras->pixels(y) + xb; + // left end of the fill seed pixels + oldpix = ras->pixels(oldy) + xa; + + x = xa; + oldxd = (std::numeric_limits::min)(); + oldxc = (std::numeric_limits::max)(); + + // check pixels to right + while (pix <= limit) { + bool test = false; + // check if the target is already in the range to be filled + if (segments.find(y) != segments.end()) + test = isPixelInSegment(segments[y], x); + + if (*pix != color && !test && + floodCheck(clickedPosColor, pix, oldpix, fillDepth)) { + // compute horizontal range to be filled + fullColorFindSegment(ras, TPoint(x, y), xc, xd, color, clickedPosColor, + fillDepth); + // insert segment to be filled + insertSegment(segments[y], std::pair(xc, xd)); + // create new fillSeed to invert direction, if needed + if (xc < xa) seeds.push(FillSeed(xc, xa - 1, y, -dy)); + if (xd > xb) seeds.push(FillSeed(xb + 1, xd, y, -dy)); + if (oldxd >= xc - 1) + oldxd = xd; + else { + if (oldxd >= 0) seeds.push(FillSeed(oldxc, oldxd, y, dy)); + oldxc = xc; + oldxd = xd; + } + // jump to the next pixel to the right end of the range + pix += xd - x + 1; + oldpix += xd - x + 1; + x += xd - x + 1; + } else { + pix++; + oldpix++, x++; + } + } + // insert filled range as new fill seed + if (oldxd > 0) seeds.push(FillSeed(oldxc, oldxd, y, dy)); + } + + // pixels are actually filled here + TPixel32 premultiColor = premultiply(color); + + std::map>>::iterator it; + for (it = segments.begin(); it != segments.end(); it++) { + TPixel32 *line = ras->pixels(it->first); + TPixel32 *refLine = 0; + std::vector> segmentVector = it->second; + for (int i = 0; i < (int)segmentVector.size(); i++) { + std::pair segment = segmentVector[i]; + if (segment.second >= segment.first) { + pix = line + segment.first; + if (saver) { + saver->save( + TRect(segment.first, it->first, segment.second, it->first)); + } + int n; + for (n = 0; n < segment.second - segment.first + 1; n++, pix++) { + if (clickedPosColor.m == 0) + *pix = pix->m == 0 ? color : overPix(color, *pix); + else if (color.m == 0 || color.m == 255) // used for erasing area + *pix = color; + else + *pix = overPix(*pix, premultiColor); + } + } + } + } +} diff --git a/toonz/sources/toonzlib/stylemanager.cpp b/toonz/sources/toonzlib/stylemanager.cpp index 35781c35..6bb014ec 100644 --- a/toonz/sources/toonzlib/stylemanager.cpp +++ b/toonz/sources/toonzlib/stylemanager.cpp @@ -8,10 +8,16 @@ #include "tropcm.h" #include "tvectorrenderdata.h" #include "tsystem.h" +#include "tvectorgl.h" // Qt includes #include #include +#include +#include +#include +#include +#include #include "toonz/stylemanager.h" @@ -50,6 +56,7 @@ class CustomStyleManager::StyleLoaderTask final : public TThread::Runnable { CustomStyleManager *m_manager; TFilePath m_fp; PatternData m_data; + std::shared_ptr m_offScreenSurface; public: StyleLoaderTask(CustomStyleManager *manager, const TFilePath &fp); @@ -66,6 +73,12 @@ CustomStyleManager::StyleLoaderTask::StyleLoaderTask( : m_manager(manager), m_fp(fp) { connect(this, SIGNAL(finished(TThread::RunnableP)), this, SLOT(onFinished(TThread::RunnableP))); + + if (QThread::currentThread() == qGuiApp->thread()) { + m_offScreenSurface.reset(new QOffscreenSurface()); + m_offScreenSurface->setFormat(QSurfaceFormat::defaultFormat()); + m_offScreenSurface->create(); + } } //----------------------------------------------------------------------------- @@ -90,16 +103,39 @@ void CustomStyleManager::StyleLoaderTask::run() { TRasterImageP rimg = img; TRaster32P ras; + + QImage *image = nullptr; + if (vimg) { assert(level->getPalette()); TPalette *vPalette = level->getPalette(); assert(vPalette); vimg->setPalette(vPalette); - TOfflineGL *glContext = 0; - glContext = TOfflineGL::getStock(chipSize); + QOpenGLContext *glContext = new QOpenGLContext(); + if (QOpenGLContext::currentContext()) + glContext->setShareContext(QOpenGLContext::currentContext()); + glContext->setFormat(QSurfaceFormat::defaultFormat()); + glContext->create(); + glContext->makeCurrent(m_offScreenSurface.get()); + // attaching stencil buffer here as some styles use it + QOpenGLFramebufferObject fb( + chipSize.lx, chipSize.ly, + QOpenGLFramebufferObject::CombinedDepthStencil); + + fb.bind(); + // Draw + glViewport(0, 0, chipSize.lx, chipSize.ly); + glClearColor(1.0, 1.0, 1.0, 1.0); // clear with white color + glClear(GL_COLOR_BUFFER_BIT); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluOrtho2D(0, chipSize.lx, 0, chipSize.ly); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); - glContext->clear(TPixel32::White); TRectD bbox = img->getBBox(); double scx = 0.8 * chipSize.lx / bbox.getLx(); double scy = 0.8 * chipSize.ly / bbox.getLy(); @@ -112,11 +148,14 @@ void CustomStyleManager::StyleLoaderTask::run() { TTranslation(-0.5 * (bbox.x0 + bbox.x1), -0.5 * (bbox.y0 + bbox.y1)); TVectorRenderData rd(aff, chipSize, vPalette, 0, true); - glContext->draw(img, rd); + tglDraw(rd, vimg.getPointer()); + + image = new QImage(fb.toImage().scaled(QSize(chipSize.lx, chipSize.ly), + Qt::IgnoreAspectRatio, + Qt::SmoothTransformation)); + fb.release(); + glContext->deleteLater(); - // No need to clone! The received raster already is a copy of the - // context's buffer - ras = glContext->getRaster(); //->clone(); } else if (rimg) { TDimension size = rimg->getRaster()->getSize(); if (size == chipSize) @@ -131,12 +170,11 @@ void CustomStyleManager::StyleLoaderTask::run() { TRop::addBackground(rout, TPixel::White); ras = rout; } + image = new QImage(chipSize.lx, chipSize.ly, QImage::Format_RGB32); + convertRaster32ToImage(ras, image); } else assert(!"unsupported type for custom styles!"); - QImage *image = new QImage(chipSize.lx, chipSize.ly, QImage::Format_RGB32); - convertRaster32ToImage(ras, image); - m_data.m_patternName = m_fp.getName(); m_data.m_isVector = (m_fp.getType() == "pli" || m_fp.getType() == "svg"); m_data.m_image = image; diff --git a/toonz/sources/toonzlib/tcenterlinecolors.cpp b/toonz/sources/toonzlib/tcenterlinecolors.cpp index cc08b42f..478fc864 100644 --- a/toonz/sources/toonzlib/tcenterlinecolors.cpp +++ b/toonz/sources/toonzlib/tcenterlinecolors.cpp @@ -154,8 +154,11 @@ static void sampleColor(const TRasterCM32P &ras, int threshold, Sequence &seq, return; } - params.push_back(params.back() + tdistance(*currGraph->getNode(next), - *currGraph->getNode(curr))); + double distance = + tdistance(*currGraph->getNode(next), *currGraph->getNode(curr)); + if (distance == 0.0) continue; + + params.push_back(params.back() + distance); nodes.push_back(next); meanThickness += currGraph->getNode(next)->z; @@ -174,8 +177,8 @@ static void sampleColor(const TRasterCM32P &ras, int threshold, Sequence &seq, // Prepare sampling procedure int paramCount = params.size(), paramMax = paramCount - 1; - int sampleMax = std::max(params.back() / std::max(meanThickness, 1.0), - 3.0), // Number of color samples depends on + int sampleMax = std::max(params.back() / std::max(meanThickness, 1.0), + 3.0), // Number of color samples depends on sampleCount = sampleMax + 1; // the ratio params.back() / meanThickness std::vector sampleParams(sampleCount); // Sampling lengths @@ -254,8 +257,9 @@ static void sampleColor(const TRasterCM32P &ras, int threshold, Sequence &seq, } } - if (i >= k) goto _getOut; // No admissible segment found for splitting - // check. + if (i >= k) + goto _getOut; // No admissible segment found for splitting + // check. // Find color changes between sampled colors for (l = i; l < k; ++l) { const TPixelCM32 diff --git a/toonz/sources/toonzlib/tpalettehandle.cpp b/toonz/sources/toonzlib/tpalettehandle.cpp index fd0835ec..a653b5b6 100644 --- a/toonz/sources/toonzlib/tpalettehandle.cpp +++ b/toonz/sources/toonzlib/tpalettehandle.cpp @@ -130,6 +130,17 @@ bool TPaletteHandle::disconnectBroadcasts(const QObject *receiver) { //----------------------------------------------------------------------------- void TPaletteHandle::setPalette(TPalette *palette, int styleIndex) { + if (palette) { + if (styleIndex < 0) { + styleIndex = palette->getCurrentStyleId(); + if (!palette->getStylePage(styleIndex)) { // in case the style is deleted + styleIndex = 1; + palette->setCurrentStyleId(styleIndex); + } + } else + palette->setCurrentStyleId(styleIndex); + } + if (m_palette == palette) setStyleIndex(styleIndex); else { @@ -142,11 +153,13 @@ void TPaletteHandle::setPalette(TPalette *palette, int styleIndex) { } //----------------------------------------------------------------------------- -// forceEmit flag is used in PageViewer. +// forceEmit flag is used in PageViewer and StylePicker tool. // See the function PageViewer::setCurrentStyleIndex() in paletteviewergui.cpp +// Also see the function StylePickerTool::pick() in stylepickertool.cpp void TPaletteHandle::setStyleIndex(int index, bool forceEmit) { if (m_styleIndex != index || m_styleParamIndex != 0 || forceEmit) { + if (m_palette) m_palette->setCurrentStyleId(index); m_styleIndex = index; m_styleParamIndex = 0; emit broadcastColorStyleSwitched(); diff --git a/toonz/sources/toonzlib/tproject.cpp b/toonz/sources/toonzlib/tproject.cpp index 5a1c5d32..acc3615f 100644 --- a/toonz/sources/toonzlib/tproject.cpp +++ b/toonz/sources/toonzlib/tproject.cpp @@ -893,8 +893,7 @@ void TProjectManager::getFolderNames(std::vector &names) { const std::string stdNames[] = {TProject::Inputs, TProject::Drawings, TProject::Scenes, TProject::Extras, TProject::Outputs, TProject::Scripts}; - for (int i = 0; i < (int)tArrayCount(stdNames); i++) { - string name = stdNames[i]; + for (auto const &name : stdNames) { // se il nome non e' gia' stato inserito lo aggiungo if (std::find(names.begin(), names.end(), name) == names.end()) names.push_back(name); @@ -927,7 +926,7 @@ TFilePath TProjectManager::getCurrentProjectPath() { } fp = searchProjectPath(fp.getParentDir()); if (!TFileStatus(fp).doesExist()) - fp = projectNameToProjectPath(TProject::SandboxProjectName); + fp = projectNameToProjectPath(TProject::SandboxProjectName); fp = getLatestVersionProjectPath(fp); string s = ::to_string(fp); if (s != (string)currentProjectPath) currentProjectPath = s; diff --git a/toonz/sources/toonzlib/ttileset.cpp b/toonz/sources/toonzlib/ttileset.cpp index c12288dd..fa5e135f 100644 --- a/toonz/sources/toonzlib/ttileset.cpp +++ b/toonz/sources/toonzlib/ttileset.cpp @@ -197,6 +197,16 @@ const TTileSetFullColor::Tile *TTileSetFullColor::getTile(int index) const { //------------------------------------------------------------------------------------------ +TTileSetFullColor::Tile *TTileSetFullColor::editTile(int index) const { + assert(0 <= index && index < getTileCount()); + TTileSetFullColor::Tile *tile = + dynamic_cast(m_tiles[index]); + assert(tile); + return tile; +} + +//------------------------------------------------------------------------------------------ + TTileSetFullColor *TTileSetFullColor::clone() const { TTileSetFullColor *tileSet = new TTileSetFullColor(m_srcImageSize); Tiles::const_iterator it = m_tiles.begin(); diff --git a/toonz/sources/toonzlib/txsheet.cpp b/toonz/sources/toonzlib/txsheet.cpp index 849cea37..1bb85713 100644 --- a/toonz/sources/toonzlib/txsheet.cpp +++ b/toonz/sources/toonzlib/txsheet.cpp @@ -772,7 +772,7 @@ void TXsheet::increaseStepCells(int r0, int c0, int &r1, int c1) { // controllo se devo cambiare la selezione bool allIncreaseIsEqual = true; for (c = 0; c < ends.size() - 1 && allIncreaseIsEqual; c++) - allIncreaseIsEqual = allIncreaseIsEqual && ends[c] == ends[c + 1]; + allIncreaseIsEqual = allIncreaseIsEqual && ends[c] == ends[c + 1]; if (allIncreaseIsEqual) r1 = ends[0]; } @@ -806,7 +806,7 @@ void TXsheet::decreaseStepCells(int r0, int c0, int &r1, int c1) { // controllo se devo cambiare la selezione bool allDecreaseIsEqual = true; for (c = 0; c < ends.size() - 1 && allDecreaseIsEqual; c++) - allDecreaseIsEqual = allDecreaseIsEqual && ends[c] == ends[c + 1]; + allDecreaseIsEqual = allDecreaseIsEqual && ends[c] == ends[c + 1]; if (allDecreaseIsEqual) r1 = ends[0]; } @@ -940,7 +940,7 @@ void TXsheet::resetStepCells(int r0, int c0, int r1, int c1) { //----------------------------------------------------------------------------- /*! Roll first cells of rect r0,c0,r1,c1. Move cells contained in first row to * last row. -*/ + */ void TXsheet::rollupCells(int r0, int c0, int r1, int c1) { int nc = c1 - c0 + 1; int size = 1 * nc; @@ -963,7 +963,7 @@ void TXsheet::rollupCells(int r0, int c0, int r1, int c1) { //----------------------------------------------------------------------------- /*! Roll last cells of rect r0,c0,r1,c1. Move cells contained in last row to * first row. -*/ + */ void TXsheet::rolldownCells(int r0, int c0, int r1, int c1) { int nc = c1 - c0 + 1; int size = 1 * nc; @@ -1417,8 +1417,9 @@ void searchAudioColumn(TXsheet *xsh, std::vector &sounds, TXshColumn *column = xsh->getColumn(i); if (column) { TXshSoundColumn *soundCol = column->getSoundColumn(); - if (soundCol && ((isPreview && soundCol->isCamstandVisible()) || - (!isPreview && soundCol->isPreviewVisible()))) { + if (soundCol && !soundCol->isEmpty() && + ((isPreview && soundCol->isCamstandVisible()) || + (!isPreview && soundCol->isPreviewVisible()))) { sounds.push_back(soundCol); continue; } diff --git a/toonz/sources/toonzlib/txsheetexpr.cpp b/toonz/sources/toonzlib/txsheetexpr.cpp index 66a0f278..8dd475ce 100644 --- a/toonz/sources/toonzlib/txsheetexpr.cpp +++ b/toonz/sources/toonzlib/txsheetexpr.cpp @@ -82,7 +82,7 @@ public: TMeasure *measure = m_param->getMeasure(); if (measure) { const TUnit *unit = measure->getCurrentUnit(); - if (unit) value = unit->convertTo(value); + if (unit) value = unit->convertTo(value); } return value; } @@ -256,9 +256,8 @@ public: void getAcceptableKeywords( std::vector &keywords) const override { - const std::string ks[] = {"table", "tab", "col", "cam", - "camera", "peg", "pegbar"}; - for (int i = 0; i < tArrayCount(ks); i++) keywords.push_back(ks[i]); + keywords.insert(keywords.end(), + {"table", "tab", "col", "cam", "camera", "peg", "pegbar"}); } void createNode(Calculator *calc, std::vector &stack, @@ -543,9 +542,8 @@ public: const QString &vertexName = QString::fromStdString(tokens[VERTEX_NAME].getText()); if (SkVD *skvd = skdp->vertexDeformation(vertexName)) { - const Component *componentsEnd = - m_components + - sizeof(m_components) / sizeof(Component), + const Component *componentsEnd = m_components + sizeof(m_components) / + sizeof(Component), *component = std::find(m_components, componentsEnd, tokens[COMPONENT].getText()); diff --git a/toonz/sources/toonzlib/txshsoundtextcolumn.cpp b/toonz/sources/toonzlib/txshsoundtextcolumn.cpp index b10f5836..163fec38 100644 --- a/toonz/sources/toonzlib/txshsoundtextcolumn.cpp +++ b/toonz/sources/toonzlib/txshsoundtextcolumn.cpp @@ -46,7 +46,7 @@ void TXshSoundTextColumn::createSoundTextLevel(int row, //----------------------------------------------------------------------------- bool TXshSoundTextColumn::canSetCell(const TXshCell &cell) const { - return true; + return cell.isEmpty() || cell.m_level->getSoundTextLevel() != 0; } //----------------------------------------------------------------------------- diff --git a/toonz/sources/toonzqt/CMakeLists.txt b/toonz/sources/toonzqt/CMakeLists.txt index 7863bd9c..c86d5179 100644 --- a/toonz/sources/toonzqt/CMakeLists.txt +++ b/toonz/sources/toonzqt/CMakeLists.txt @@ -45,6 +45,7 @@ set(MOC_HEADERS ../include/toonzqt/paletteviewer.h ../include/toonzqt/paletteviewergui.h ../include/toonzqt/paramfield.h + ../include/toonzqt/planeviewer.h ../include/toonzqt/popupbutton.h ../include/toonzqt/schematicgroupeditor.h ../include/toonzqt/schematicnode.h @@ -91,7 +92,6 @@ set(HEADERS ../include/toonzqt/lutcalibrator.h ../include/toonzqt/multipleselection.h ../include/toonzqt/pickrgbutils.h - ../include/toonzqt/planeviewer.h ../include/toonzqt/rasterimagedata.h ../include/toonzqt/selection.h ../include/toonzqt/selectioncommandids.h diff --git a/toonz/sources/toonzqt/dvdialog.cpp b/toonz/sources/toonzqt/dvdialog.cpp index ca877605..76ca66c2 100644 --- a/toonz/sources/toonzqt/dvdialog.cpp +++ b/toonz/sources/toonzqt/dvdialog.cpp @@ -210,7 +210,10 @@ clearButtonBar(). You can also setButtonBarSpacing() functions. */ //----------------------------------------------------------------------------- -QSettings *Dialog::m_settings = 0; + +namespace { +QString settingsPath; +}; Dialog::Dialog(QWidget *parent, bool hasButton, bool hasFixedSize, const QString &name) @@ -274,17 +277,17 @@ Dialog::Dialog(QWidget *parent, bool hasButton, bool hasFixedSize, setWindowFlags(Qt::Tool); #endif - if (!m_settings) { - TFilePath layoutDir = ToonzFolder::getMyModuleDir(); - TFilePath savePath = layoutDir + TFilePath("popups.ini"); - m_settings = - new QSettings(QString::fromStdWString(savePath.getWideString()), - QSettings::IniFormat); + if (settingsPath.isEmpty()) { + TFilePath savePath = + ToonzFolder::getMyModuleDir() + TFilePath("popups.ini"); + settingsPath = QString::fromStdWString(savePath.getWideString()); } + QSettings settings(settingsPath, QSettings::IniFormat); + if (name == QString()) return; m_name = name + "DialogGeometry"; - QString geo = m_settings->value(m_name).toString(); + QString geo = settings.value(m_name).toString(); if (geo != QString()) { QStringList values = geo.split(" "); assert(values.size() == 4); @@ -312,31 +315,28 @@ Dialog::Dialog(QWidget *parent, bool hasButton, bool hasFixedSize, // on another monitor by default, but this is better than // a user thinking the program is broken because they didn't notice // the popup on another monitor - if (x > screen.right() - 50) x = screen.right() - 50; - if (x < screen.left()) x = screen.left(); + if (x > screen.right() - 50) x = screen.right() - 50; + if (x < screen.left()) x = screen.left(); if (y > screen.bottom() - 90) y = screen.bottom() - 90; - if (y < screen.top()) y = screen.top(); + if (y < screen.top()) y = screen.top(); setGeometry(x, y, values.at(2).toInt(), values.at(3).toInt()); - m_settings->setValue(m_name, - QString::number(x) + " " + QString::number(y) + " " + - QString::number(values.at(2).toInt()) + " " + - QString::number(values.at(3).toInt())); + settings.setValue(m_name, QString::number(x) + " " + QString::number(y) + + " " + QString::number(values.at(2).toInt()) + + " " + QString::number(values.at(3).toInt())); } } //----------------------------------------------------------------------------- -Dialog::~Dialog() {} -//----------------------------------------------------------------------------- - -void Dialog::moveEvent(QMoveEvent *e) { +Dialog::~Dialog() { if (m_name == QString()) return; QRect r = geometry(); - m_settings->setValue(m_name, QString::number(r.left()) + " " + - QString::number(r.top()) + " " + - QString::number(r.width()) + " " + - QString::number(r.height())); + QSettings settings(settingsPath, QSettings::IniFormat); + settings.setValue(m_name, QString::number(r.left()) + " " + + QString::number(r.top()) + " " + + QString::number(r.width()) + " " + + QString::number(r.height())); } //--------------------------------------------------------------------------------- @@ -344,17 +344,8 @@ void Dialog::moveEvent(QMoveEvent *e) { void Dialog::resizeEvent(QResizeEvent *e) { if (Preferences::instance()->getCurrentLanguage() != "English") { QSize t = this->size(); - for (QLabel *s : m_labelList) - s->setFixedWidth(t.width() * .35); + for (QLabel *s : m_labelList) s->setFixedWidth(t.width() * .35); } - - if (m_name == QString()) return; - - QRect r = geometry(); - m_settings->setValue(m_name, QString::number(r.left()) + " " + - QString::number(r.top()) + " " + - QString::number(r.width()) + " " + - QString::number(r.height())); } //----------------------------------------------------------------------------- @@ -380,23 +371,24 @@ void Dialog::hideEvent(QHideEvent *event) { } QRect screen = QApplication::desktop()->availableGeometry(currentScreen); - if (x > screen.right() - 50) x = screen.right() - 50; - if (x < screen.left()) x = screen.left(); + if (x > screen.right() - 50) x = screen.right() - 50; + if (x < screen.left()) x = screen.left(); if (y > screen.bottom() - 90) y = screen.bottom() - 90; - if (y < screen.top()) y = screen.top(); + if (y < screen.top()) y = screen.top(); move(QPoint(x, y)); resize(size()); QRect r = geometry(); - m_settings->setValue(m_name, QString::number(r.left()) + " " + - QString::number(r.top()) + " " + - QString::number(r.width()) + " " + - QString::number(r.height())); + QSettings settings(settingsPath, QSettings::IniFormat); + settings.setValue(m_name, QString::number(r.left()) + " " + + QString::number(r.top()) + " " + + QString::number(r.width()) + " " + + QString::number(r.height())); emit dialogClosed(); } //----------------------------------------------------------------------------- /*! Create the new layouts (2 Vertical) for main part of dialog. -*/ + */ void Dialog::beginVLayout() { m_isMainVLayout = true; @@ -435,7 +427,7 @@ void Dialog::endVLayout() { //----------------------------------------------------------------------------- /*! Create a new Horizontal Layout for main part of dialog. -*/ + */ void Dialog::beginHLayout() { m_isMainHLayout = true; m_mainHLayout = new QHBoxLayout; @@ -445,7 +437,7 @@ void Dialog::beginHLayout() { //----------------------------------------------------------------------------- /*! Add to main part of dialog the Horizontal Layout and set it to 0. -*/ + */ void Dialog::endHLayout() { m_isMainHLayout = false; if (!m_mainHLayout) return; @@ -647,7 +639,7 @@ void Dialog::addLayouts(QLayout *firstL, QLayout *secondL) { //----------------------------------------------------------------------------- /*! Add spacing \b spacing to main part of dialog. -*/ + */ void Dialog::addSpacing(int spacing) { if (m_isMainVLayout) { assert(m_leftVLayout && m_rightVLayout); @@ -686,14 +678,14 @@ void Dialog::addSeparator(QString name) { //----------------------------------------------------------------------------- /*! Set the alignement of the main layout -*/ + */ void Dialog::setAlignment(Qt::Alignment alignment) { m_mainFrame->layout()->setAlignment(alignment); } //----------------------------------------------------------------------------- /*! Set to \b spacing spacing of main part of dialog. -*/ + */ void Dialog::setTopSpacing(int spacing) { m_layoutSpacing = spacing; m_topLayout->setSpacing(spacing); @@ -718,26 +710,26 @@ int Dialog::getLayoutInsertedSpacing() { return m_layoutSpacing; } //----------------------------------------------------------------------------- /*! Set to \b margin margin of main part of dialog. -*/ + */ void Dialog::setTopMargin(int margin) { m_topLayout->setMargin(margin); } //----------------------------------------------------------------------------- /*! Set to \b margin margin of button part of dialog. -*/ + */ void Dialog::setButtonBarMargin(int margin) { m_buttonLayout->setMargin(margin); } //----------------------------------------------------------------------------- /*! Set to \b spacing spacing of button part of dialog. -*/ + */ void Dialog::setButtonBarSpacing(int spacing) { m_buttonLayout->setSpacing(spacing); } //----------------------------------------------------------------------------- /*! Add a widget to the button part of dialog. -*/ + */ void Dialog::addButtonBarWidget(QWidget *widget) { widget->setMinimumSize(65, 25); assert(m_hasButton); @@ -749,7 +741,7 @@ void Dialog::addButtonBarWidget(QWidget *widget) { //----------------------------------------------------------------------------- /*! Remove all widget from the button part of dialog. -*/ + */ void Dialog::clearButtonBar() { for (int i = 0; i < (int)m_buttonBarWidgets.size(); i++) { m_buttonLayout->removeWidget(m_buttonBarWidgets[i]); @@ -759,7 +751,7 @@ void Dialog::clearButtonBar() { //----------------------------------------------------------------------------- /*! Add two widget to the button part of dialog. -*/ + */ void Dialog::addButtonBarWidget(QWidget *first, QWidget *second) { first->setMinimumSize(65, 25); second->setMinimumSize(65, 25); @@ -772,7 +764,7 @@ void Dialog::addButtonBarWidget(QWidget *first, QWidget *second) { //----------------------------------------------------------------------------- /*! Add three widget to the button part of dialog. -*/ + */ void Dialog::addButtonBarWidget(QWidget *first, QWidget *second, QWidget *third) { first->setMinimumSize(65, 25); @@ -788,7 +780,7 @@ void Dialog::addButtonBarWidget(QWidget *first, QWidget *second, //----------------------------------------------------------------------------- /*! Add four widget to the button part of dialog. -*/ + */ void Dialog::addButtonBarWidget(QWidget *first, QWidget *second, QWidget *third, QWidget *fourth) { first->setMinimumSize(65, 25); @@ -1356,7 +1348,7 @@ QString DVGui::getText(const QString &title, const QString &labelText, dialog.addButtonBarWidget(okBtn, cancelBtn); - int ret = dialog.exec(); + int ret = dialog.exec(); if (ok) *ok = (ret == QDialog::Accepted); return nameFld->text(); @@ -1377,7 +1369,7 @@ bool isStyleIdInPalette(int styleId, const TPalette *palette) { } return false; } -} +} // namespace //----------------------------------------------------------------------------- diff --git a/toonz/sources/toonzqt/functionsegmentviewer.cpp b/toonz/sources/toonzqt/functionsegmentviewer.cpp index ba8d1586..fb163565 100644 --- a/toonz/sources/toonzqt/functionsegmentviewer.cpp +++ b/toonz/sources/toonzqt/functionsegmentviewer.cpp @@ -116,9 +116,9 @@ SpeedInOutSegmentPage::SpeedInOutSegmentPage(FunctionSegmentViewer *parent) bool ret = connect(m_speed0xFld, SIGNAL(editingFinished()), this, SLOT(onFirstHandleXChanged())); - ret = ret && connect(m_speed0yFld, SIGNAL(editingFinished()), this, + ret = ret && connect(m_speed0yFld, SIGNAL(editingFinished()), this, SLOT(onFirstHandleYChanged())); - ret = ret && connect(m_firstSpeedFld, SIGNAL(editingFinished()), this, + ret = ret && connect(m_firstSpeedFld, SIGNAL(editingFinished()), this, SLOT(onFirstSpeedChanged())); ret = ret && connect(m_speed1xFld, SIGNAL(editingFinished()), this, @@ -556,11 +556,11 @@ void FunctionExpressionSegmentPage::init(int segmentLength) { /*--- すでにあるカーブをExpressionに切り替えた場合 ---*/ if (kIndex >= 0) { - TDoubleKeyframe keyFrame = curve->getKeyframe(kIndex); - double value = curve->getValue(keyFrame.m_frame); - const TUnit *unit = 0; + TDoubleKeyframe keyFrame = curve->getKeyframe(kIndex); + double value = curve->getValue(keyFrame.m_frame); + const TUnit *unit = 0; if (curve->getMeasure()) unit = curve->getMeasure()->getCurrentUnit(); - if (unit) value = unit->convertTo(value); + if (unit) value = unit->convertTo(value); m_expressionFld->setExpression(QString::number(value).toStdString()); /*--- unitがある場合だけUnitを表示 ---*/ if (unit) @@ -630,7 +630,7 @@ m_unitFld->setText(""); //----------------------------------------------------------------------------- /*! return false if a circular reference is occured -*/ + */ bool FunctionExpressionSegmentPage::getGuiValues(std::string &expressionText, std::string &unitName) { expressionText = m_expressionFld->getExpression(); @@ -703,20 +703,20 @@ FileSegmentPage::FileSegmentPage(FunctionSegmentViewer *parent) void FileSegmentPage::refresh() { TDoubleKeyframe kf; TDoubleParam *curve = getCurve(); - if (curve) kf = curve->getKeyframeAt(getR0()); + if (curve) kf = curve->getKeyframeAt(getR0()); if (curve && kf.m_isKeyframe) { TFilePath path; int fieldIndex = 0; std::string unitName = ""; if (kf.m_type == TDoubleKeyframe::File) { - path = kf.m_fileParams.m_path; - fieldIndex = kf.m_fileParams.m_fieldIndex; + path = kf.m_fileParams.m_path; + fieldIndex = kf.m_fileParams.m_fieldIndex; if (fieldIndex < 0) fieldIndex = 0; - unitName = kf.m_unitName; + unitName = kf.m_unitName; if (unitName == "") { TMeasure *measure = curve->getMeasure(); if (measure) { - const TUnit *unit = measure->getCurrentUnit(); + const TUnit *unit = measure->getCurrentUnit(); if (unit) unitName = ::to_string(unit->getDefaultExtension()); } } @@ -734,7 +734,7 @@ void FileSegmentPage::init(int segmentLength) { TMeasure *measure = curve->getMeasure(); std::string unitName = ""; if (measure) { - const TUnit *unit = measure->getCurrentUnit(); + const TUnit *unit = measure->getCurrentUnit(); if (unit) unitName = ::to_string(unit->getDefaultExtension()); } m_measureFld->setText(QString::fromStdString(unitName)); @@ -929,8 +929,7 @@ FunctionSegmentViewer::FunctionSegmentViewer(QWidget *parent, m_parametersPanel = new QStackedWidget; m_parametersPanel->setObjectName("FunctionParametersPanel"); - for (int i = 0; i < tArrayCount(m_pages); i++) - m_parametersPanel->addWidget(m_pages[i]); + for (auto const &page : m_pages) m_parametersPanel->addWidget(page); m_parametersPanel->setCurrentIndex(0); // buttons @@ -1035,17 +1034,17 @@ FunctionSegmentViewer::FunctionSegmentViewer(QWidget *parent, bool ret = true; ret = ret && connect(m_typeCombo, SIGNAL(currentIndexChanged(int)), m_parametersPanel, SLOT(setCurrentIndex(int))); - ret = ret && connect(m_typeCombo, SIGNAL(activated(int)), this, + ret = ret && connect(m_typeCombo, SIGNAL(activated(int)), this, SLOT(onSegmentTypeChanged(int))); - ret = ret && connect(applyButton, SIGNAL(clicked()), this, + ret = ret && connect(applyButton, SIGNAL(clicked()), this, SLOT(onApplyButtonPressed())); - ret = ret && connect(m_prevCurveButton, SIGNAL(clicked()), this, + ret = ret && connect(m_prevCurveButton, SIGNAL(clicked()), this, SLOT(onPrevCurveButtonPressed())); - ret = ret && connect(m_nextCurveButton, SIGNAL(clicked()), this, + ret = ret && connect(m_nextCurveButton, SIGNAL(clicked()), this, SLOT(onNextCurveButtonPressed())); - ret = ret && connect(m_prevLinkButton, SIGNAL(clicked()), this, + ret = ret && connect(m_prevLinkButton, SIGNAL(clicked()), this, SLOT(onPrevLinkButtonPressed())); - ret = ret && connect(m_nextLinkButton, SIGNAL(clicked()), this, + ret = ret && connect(m_nextLinkButton, SIGNAL(clicked()), this, SLOT(onNextLinkButtonPressed())); assert(ret); @@ -1097,7 +1096,7 @@ void FunctionSegmentViewer::setSegmentByFrame(TDoubleParam *curve, int frame) { if (k1 >= 1) segmentIndex = k1 - 1; else { - int k0 = m_curve->getPrevKeyframe(frame); + int k0 = m_curve->getPrevKeyframe(frame); if (k0 >= 0) segmentIndex = k0; } } else { @@ -1149,7 +1148,7 @@ void FunctionSegmentViewer::refresh() { int pageIndex = typeToIndex(kf.m_type); m_typeCombo->setEnabled(true); m_typeCombo->setCurrentIndex(pageIndex); - if (0 <= pageIndex && pageIndex < tArrayCount(m_pages)) { + if (0 <= pageIndex && pageIndex < m_pages.size()) { m_parametersPanel->setCurrentIndex(pageIndex); m_pages[pageIndex]->refresh(); } @@ -1262,22 +1261,22 @@ Segmentが選ばれていない場合 void FunctionSegmentViewer::onCurveChanged() { int pageIndex = m_typeCombo->currentIndex(); - if (0 <= pageIndex && pageIndex < tArrayCount(m_pages)) + if (0 <= pageIndex && pageIndex < m_pages.size()) m_pages[pageIndex]->refresh(); update(); } void FunctionSegmentViewer::onStepFieldChanged(const QString &text) { if (!segmentIsValid()) return; - int step = 1; + int step = 1; if (text != "") step = text.toInt(); - if (step < 1) step = 1; + if (step < 1) step = 1; KeyframeSetter setter(m_curve, m_segmentIndex); setter.setStep(step); } int FunctionSegmentViewer::typeToIndex(int typeId) const { - for (int i = 0; i < tArrayCount(m_typeId); i++) + for (int i = 0; i < m_typeId.size(); ++i) if (m_typeId[i] == typeId) return i; return -1; } @@ -1376,8 +1375,8 @@ void FunctionSegmentViewer::onApplyButtonPressed() { /*--- from - * toに合わせてキーフレームを作成しようと試みる。すでに有る場合はスキップ * ---*/ - if (fromFrame < 0) fromFrame = 0; - if (toFrame < 0) toFrame = 0; + if (fromFrame < 0) fromFrame = 0; + if (toFrame < 0) toFrame = 0; if (fromFrame >= toFrame) fromFrame = toFrame + 1; if (!m_curve->isKeyframe(fromFrame)) @@ -1400,7 +1399,7 @@ void FunctionSegmentViewer::onApplyButtonPressed() { // for displaying the types of neighbor segments QString FunctionSegmentViewer::typeToString(int typeId) const { int i; - for (i = 0; i < tArrayCount(m_typeId); i++) + for (i = 0; i < m_typeId.size(); ++i) if (m_typeId[i] == typeId) break; switch (i) { @@ -1523,7 +1522,7 @@ bool FunctionSegmentViewer::anyWidgetHasFocus() { } /*! in order to avoid FunctionViewer to get focus while editing the expression -*/ + */ bool FunctionSegmentViewer::isExpressionPageActive() { return (m_typeCombo->currentIndex() == 5); } diff --git a/toonz/sources/toonzqt/functionsheet.cpp b/toonz/sources/toonzqt/functionsheet.cpp index 3b50a521..7026ef33 100644 --- a/toonz/sources/toonzqt/functionsheet.cpp +++ b/toonz/sources/toonzqt/functionsheet.cpp @@ -11,6 +11,7 @@ #include "toonz/doubleparamcmd.h" #include "toonz/preferences.h" #include "toonz/toonzfolders.h" +#include "toonz/tstageobject.h" // TnzBase includes #include "tunit.h" @@ -579,6 +580,13 @@ void FunctionSheetCellViewer::drawCells(QPainter &painter, int r0, int c0, TMeasure *measure = curve->getMeasure(); const TUnit *unit = measure ? measure->getCurrentUnit() : 0; + bool isStageObjectCycled = false; + TStageObject *obj = m_sheet->getStageObject(c); + if (obj && obj->isCycleEnabled()) isStageObjectCycled = true; + + bool isParamCycled = curve->isCycleEnabled(); + int rowCount = getViewer()->getRowCount(); + // draw each cell for (int row = r0; row <= r1; row++) { int ya = m_sheet->rowToY(row); @@ -586,8 +594,11 @@ void FunctionSheetCellViewer::drawCells(QPainter &painter, int r0, int c0, bool isSelected = getViewer()->isSelectedCell(row, c); - double value = curve->getValue(row); + double value = (isStageObjectCycled) + ? curve->getValue(obj->paramsTime((double)row)) + : curve->getValue(row); if (unit) value = unit->convertTo(value); + enum { None, KeyRange, CycleRange } drawValue = None; QRect cellRect(x0, ya, x1 - x0 + 1, yb - ya + 1); QRect borderRect(x0, ya, 7, yb - ya + 1); @@ -622,8 +633,42 @@ void FunctionSheetCellViewer::drawCells(QPainter &painter, int r0, int c0, } } + drawValue = KeyRange; + + } + // empty cells + else { + // show values for cycled parameter. + // cycle option can be set in two ways; one is as TStageObject, + // the other is as TDoubleParam. + // - TStageObject cycle literally cycles values with no offset. + // Applied to all transformation parameters of the cycled object. + // - TDoubleParam cycle includes value offset so that the curve + // connects smoothly. + // - TStageObject cycle option has a priority to TDoubleParam one. + // (see TStageObject::paramsTime() in tstageobject.cpp) + if (kCount > 0 && row > kr1 && (isStageObjectCycled || isParamCycled) && + (row < rowCount)) { + drawValue = CycleRange; + } + // empty and selected cell + if (isSelected) { + cellColor = (row >= rowCount) ? SelectedEmptyColor + : SelectedSceneRangeEmptyColor; + painter.setPen(Qt::NoPen); + painter.fillRect(cellRect, cellColor); + } + } + + if (drawValue != None) { // draw cell value - painter.setPen(getViewer()->getTextColor()); + if (drawValue == KeyRange) + painter.setPen(getViewer()->getTextColor()); + else { + QColor semiTranspTextColor = getViewer()->getTextColor(); + semiTranspTextColor.setAlpha(128); + painter.setPen(semiTranspTextColor); + } /*--- 整数から小数点以下3桁以内の場合はそれ以降の0000を描かない ---*/ QString text; @@ -653,19 +698,31 @@ void FunctionSheetCellViewer::drawCells(QPainter &painter, int r0, int c0, fontName = "Helvetica"; #endif } - static QFont font(fontName, -1, QFont::Bold); + static QFont font(fontName, -1); + font.setBold(drawValue == KeyRange); font.setPixelSize(12); painter.setFont(font); painter.drawText(cellRect.adjusted(10, 0, 0, 0), - Qt::AlignVCenter | Qt::AlignLeft, text); + Qt::AlignVCenter | Qt::AlignRight, text); } - // empty and selected cell - else if (isSelected) { - int rowCount = getViewer()->getRowCount(); - cellColor = (row >= rowCount) ? SelectedEmptyColor - : SelectedSceneRangeEmptyColor; - painter.setPen(Qt::NoPen); - painter.fillRect(cellRect, cellColor); + } + + if (kCount > 0 && (isStageObjectCycled || isParamCycled)) { + // draw the row zigzag + int ymax = m_sheet->rowToY(r1 + 1); + int qx = x0 + 4; + int qy = m_sheet->rowToY(kr1 + 1); + int zig = 2; + QColor zigzagColor = (isStageObjectCycled) ? getViewer()->getTextColor() + : KeyFrameBorderColor; + painter.setPen(zigzagColor); + painter.drawLine(QPoint(qx, qy), QPoint(qx - zig, qy + zig)); + qy += zig; + while (qy < ymax) { + painter.drawLine(QPoint(qx - zig, qy), QPoint(qx + zig, qy + 2 * zig)); + painter.drawLine(QPoint(qx + zig, qy + 2 * zig), + QPoint(qx - zig, qy + 4 * zig)); + qy += 4 * zig; } } } @@ -835,6 +892,8 @@ void FunctionSheetCellViewer::openContextMenu(QMouseEvent *e) { QAction setStep2Action(tr("Step 2"), 0); QAction setStep3Action(tr("Step 3"), 0); QAction setStep4Action(tr("Step 4"), 0); + QAction activateCycleAction(tr("Activate Cycle"), 0); + QAction deactivateCycleAction(tr("Deactivate Cycle"), 0); CellPosition cellPosition = getViewer()->xyToPosition(e->pos()); int row = cellPosition.frame(); @@ -858,6 +917,15 @@ void FunctionSheetCellViewer::openContextMenu(QMouseEvent *e) { // build menu QMenu menu(0); + + // on clicking after last keyframe + if (kCount > 0 && isEmpty && kIndex == kCount - 1) { + if (curve->isCycleEnabled()) + menu.addAction(&deactivateCycleAction); + else + menu.addAction(&activateCycleAction); + } + if (!isKeyframe) // menu.addAction(&deleteKeyframeAction); else menu.addAction(&insertKeyframeAction); @@ -896,7 +964,7 @@ void FunctionSheetCellViewer::openContextMenu(QMouseEvent *e) { menu.addAction(cmdManager->getAction("MI_Insert")); FunctionSelection *selection = m_sheet->getSelection(); - + TSceneHandle *sceneHandle = m_sheet->getViewer()->getSceneHandle(); // execute menu QAction *action = menu.exec(e->globalPos()); // QCursor::pos()); if (action == &deleteKeyframeAction) { @@ -935,6 +1003,10 @@ void FunctionSheetCellViewer::openContextMenu(QMouseEvent *e) { KeyframeSetter(curve, kIndex).setStep(3); else if (action == &setStep4Action) KeyframeSetter(curve, kIndex).setStep(4); + else if (action == &activateCycleAction) + KeyframeSetter::enableCycle(curve, true, sceneHandle); + else if (action == &deactivateCycleAction) + KeyframeSetter::enableCycle(curve, false, sceneHandle); update(); } @@ -1152,3 +1224,22 @@ void FunctionSheet::onCurrentChannelChanged( } } } + +//----------------------------------------------------------------------------- +/*! Obtains a pointer to the stage object containing the parameter of specified + * column +*/ +TStageObject *FunctionSheet::getStageObject(int column) { + FunctionTreeModel::Channel *channel = getChannel(column); + if (!channel) return nullptr; + + FunctionTreeModel::ChannelGroup *channelGroup = channel->getChannelGroup(); + if (!channelGroup) return nullptr; + + // returns nullptr if the channel is a fx parameter + StageObjectChannelGroup *stageItem = + dynamic_cast(channelGroup); + if (!stageItem) return nullptr; + + return stageItem->getStageObject(); +} \ No newline at end of file diff --git a/toonz/sources/toonzqt/functiontreeviewer.cpp b/toonz/sources/toonzqt/functiontreeviewer.cpp index 4fca61b7..eeeb822e 100644 --- a/toonz/sources/toonzqt/functiontreeviewer.cpp +++ b/toonz/sources/toonzqt/functiontreeviewer.cpp @@ -64,31 +64,6 @@ public: //============================================================================= -class StageObjectChannelGroup final : public FunctionTreeModel::ChannelGroup { -public: - TStageObject *m_stageObject; //!< (not owned) Referenced stage object - FunctionTreeModel::ChannelGroup - *m_plasticGroup; //!< (not owned) Eventual plastic channels group - -public: - StageObjectChannelGroup(TStageObject *pegbar); - ~StageObjectChannelGroup(); - - QString getShortName() const override; - QString getLongName() const override; - - QString getIdName() const override; - - void *getInternalPointer() const override { - return static_cast(m_stageObject); - } - - TStageObject *getStageObject() const { return m_stageObject; } - QVariant data(int role) const override; -}; - -//============================================================================= - class SkVDChannelGroup final : public FunctionTreeModel::ChannelGroup { public: StageObjectChannelGroup *m_stageObjectGroup; //!< Parent stage object group diff --git a/toonz/sources/toonzqt/functionviewer.cpp b/toonz/sources/toonzqt/functionviewer.cpp index 4148a6c7..6d75e438 100644 --- a/toonz/sources/toonzqt/functionviewer.cpp +++ b/toonz/sources/toonzqt/functionviewer.cpp @@ -582,7 +582,10 @@ void FunctionViewer::onStageObjectChanged(bool isDragging) { static_cast(m_treeView->model()) ->setCurrentStageObject(obj); - if (!isDragging) m_treeView->updateAll(); + if (!isDragging) { + m_treeView->updateAll(); + m_numericalColumns->updateAll(); + } m_functionGraph->update(); } diff --git a/toonz/sources/toonzqt/fxschematicnode.cpp b/toonz/sources/toonzqt/fxschematicnode.cpp index 86513756..5affb297 100644 --- a/toonz/sources/toonzqt/fxschematicnode.cpp +++ b/toonz/sources/toonzqt/fxschematicnode.cpp @@ -46,6 +46,8 @@ // TnzCore includes #include "tconst.h" +#include "../toonz/menubarcommandids.h" + // Qt includes #include #include @@ -690,7 +692,7 @@ void FxPainter::contextMenuEvent(QGraphicsSceneContextMenuEvent *cme) { QMenu *addMenu = fxScene->getAddFxMenu(); QAction *fxEditorPopup = - CommandManager::instance()->getAction("MI_FxParamEditor"); + CommandManager::instance()->getAction(MI_FxParamEditor); QAction *copy = CommandManager::instance()->getAction("MI_Copy"); QAction *cut = CommandManager::instance()->getAction("MI_Cut"); QAction *group = CommandManager::instance()->getAction("MI_Group"); @@ -1579,7 +1581,7 @@ void FxSchematicPort::contextMenuEvent(QGraphicsSceneContextMenuEvent *cme) { SLOT(onConnectToXSheet())); QAction *fxEditorPopup = - CommandManager::instance()->getAction("MI_FxParamEditor"); + CommandManager::instance()->getAction(MI_FxParamEditor); menu.addMenu(fxScene->getAddFxMenu()); menu.addAction(fxEditorPopup); @@ -2238,6 +2240,15 @@ void FxSchematicOutputNode::mouseDoubleClickEvent( outputSettingsPopup->trigger(); } +void FxSchematicOutputNode::mousePressEvent(QGraphicsSceneMouseEvent *me) { + FxSchematicNode::mousePressEvent(me); + + QAction *fxEditorPopup = + CommandManager::instance()->getAction(MI_FxParamEditor); + // this signal cause the update the contents of the FxSettings + if (fxEditorPopup->isVisible()) emit fxNodeDoubleClicked(); +} + //***************************************************** // // FxSchematicXSheetNode @@ -2306,6 +2317,15 @@ void FxSchematicXSheetNode::mouseDoubleClickEvent( sceneSettingsPopup->trigger(); } +void FxSchematicXSheetNode::mousePressEvent(QGraphicsSceneMouseEvent *me) { + FxSchematicNode::mousePressEvent(me); + + QAction *fxEditorPopup = + CommandManager::instance()->getAction(MI_FxParamEditor); + // this signal cause the update the contents of the FxSettings + if (fxEditorPopup->isVisible()) emit fxNodeDoubleClicked(); +} + //***************************************************** // // FxSchematicNormalFxNode @@ -2620,9 +2640,9 @@ void FxSchematicNormalFxNode::mouseDoubleClickEvent( m_nameItem->setFocus(); setFlag(QGraphicsItem::ItemIsSelectable, false); } else { - QAction *fxEitorPopup = - CommandManager::instance()->getAction("MI_FxParamEditor"); - fxEitorPopup->trigger(); + QAction *fxEditorPopup = + CommandManager::instance()->getAction(MI_FxParamEditor); + fxEditorPopup->trigger(); // this signal cause the update the contents of the FxSettings emit fxNodeDoubleClicked(); } @@ -2630,6 +2650,17 @@ void FxSchematicNormalFxNode::mouseDoubleClickEvent( //----------------------------------------------------- +void FxSchematicNormalFxNode::mousePressEvent(QGraphicsSceneMouseEvent *me) { + FxSchematicNode::mousePressEvent(me); + + QAction *fxEditorPopup = + CommandManager::instance()->getAction(MI_FxParamEditor); + // this signal cause the update the contents of the FxSettings + if (fxEditorPopup->isVisible()) emit fxNodeDoubleClicked(); +} + +//----------------------------------------------------- + void FxSchematicNormalFxNode::resize(bool maximized) {} //***************************************************** @@ -2856,7 +2887,7 @@ void FxSchematicZeraryNode::mouseDoubleClickEvent( setFlag(QGraphicsItem::ItemIsSelectable, false); } else { QAction *fxEditorPopup = - CommandManager::instance()->getAction("MI_FxParamEditor"); + CommandManager::instance()->getAction(MI_FxParamEditor); fxEditorPopup->trigger(); // this signal cause the update the contents of the FxSettings @@ -2866,6 +2897,17 @@ void FxSchematicZeraryNode::mouseDoubleClickEvent( //----------------------------------------------------- +void FxSchematicZeraryNode::mousePressEvent(QGraphicsSceneMouseEvent *me) { + FxSchematicNode::mousePressEvent(me); + + QAction *fxEditorPopup = + CommandManager::instance()->getAction(MI_FxParamEditor); + // this signal cause the update the contents of the FxSettings + if (fxEditorPopup->isVisible()) emit fxNodeDoubleClicked(); +} + +//----------------------------------------------------- + void FxSchematicZeraryNode::onNameChanged() { m_nameItem->hide(); m_name = m_nameItem->toPlainText(); @@ -3164,11 +3206,28 @@ void FxSchematicColumnNode::mouseDoubleClickEvent( m_nameItem->show(); m_nameItem->setFocus(); setFlag(QGraphicsItem::ItemIsSelectable, false); + } else { + QAction *fxEditorPopup = + CommandManager::instance()->getAction(MI_FxParamEditor); + fxEditorPopup->trigger(); + // this signal cause the update the contents of the FxSettings + emit fxNodeDoubleClicked(); } } //----------------------------------------------------- +void FxSchematicColumnNode::mousePressEvent(QGraphicsSceneMouseEvent *me) { + FxSchematicNode::mousePressEvent(me); + + QAction *fxEditorPopup = + CommandManager::instance()->getAction(MI_FxParamEditor); + // this signal cause the update the contents of the FxSettings + if (fxEditorPopup->isVisible()) emit fxNodeDoubleClicked(); +} + +//----------------------------------------------------- + void FxSchematicColumnNode::renameObject(const TStageObjectId &id, std::string name) { FxSchematicScene *fxScene = dynamic_cast(scene()); @@ -3335,14 +3394,25 @@ void FxSchematicPaletteNode::mouseDoubleClickEvent( m_nameItem->setFocus(); setFlag(QGraphicsItem::ItemIsSelectable, false); } else { - QAction *fxEitorPopup = - CommandManager::instance()->getAction("MI_FxParamEditor"); - fxEitorPopup->trigger(); + QAction *fxEditorPopup = + CommandManager::instance()->getAction(MI_FxParamEditor); + fxEditorPopup->trigger(); } } //----------------------------------------------------- +void FxSchematicPaletteNode::mousePressEvent(QGraphicsSceneMouseEvent *me) { + FxSchematicNode::mousePressEvent(me); + + QAction *fxEditorPopup = + CommandManager::instance()->getAction(MI_FxParamEditor); + // this signal cause the update the contents of the FxSettings + if (fxEditorPopup->isVisible()) emit fxNodeDoubleClicked(); +} + +//----------------------------------------------------- + void FxSchematicPaletteNode::renameObject(const TStageObjectId &id, std::string name) { FxSchematicScene *fxScene = dynamic_cast(scene()); @@ -3494,6 +3564,15 @@ void FxGroupNode::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *me) { } } +void FxGroupNode::mousePressEvent(QGraphicsSceneMouseEvent *me) { + FxSchematicNode::mousePressEvent(me); + + QAction *fxEditorPopup = + CommandManager::instance()->getAction(MI_FxParamEditor); + // this signal cause the update the contents of the FxSettings + if (fxEditorPopup->isVisible()) emit fxNodeDoubleClicked(); +} + //----------------------------------------------------- QPointF FxGroupNode::computePos() const { diff --git a/toonz/sources/toonzqt/fxschematicscene.cpp b/toonz/sources/toonzqt/fxschematicscene.cpp index e16c8abe..2ada469f 100644 --- a/toonz/sources/toonzqt/fxschematicscene.cpp +++ b/toonz/sources/toonzqt/fxschematicscene.cpp @@ -578,6 +578,8 @@ FxSchematicNode *FxSchematicScene::addGroupedFxSchematicNode( SLOT(onSwitchCurrentFx(TFx *))); connect(node, SIGNAL(currentColumnChanged(int)), this, SLOT(onCurrentColumnChanged(int))); + connect(node, SIGNAL(fxNodeDoubleClicked()), this, + SLOT(onFxNodeDoubleClicked())); m_groupedTable[groupId] = node; return node; } @@ -727,7 +729,14 @@ void FxSchematicScene::placeNode(FxSchematicNode *node) { maxY = std::max(fx->getAttributes()->getDagNodePos().y, maxY); } if (QPointF(minX, minY) == QPointF(TConst::nowhere.x, TConst::nowhere.y)) { - pos = sceneRect().center(); + TFx *inputFx = node->getFx()->getInputPort(0)->getFx(); + if (inputFx && + inputFx->getAttributes()->getDagNodePos() != TConst::nowhere) { + TPointD dagPos = + inputFx->getAttributes()->getDagNodePos() + TPointD(150, 0); + pos = QPointF(dagPos.x, dagPos.y); + } else + pos = sceneRect().center(); nodeRect.moveTopLeft(pos); while (!isAnEmptyZone(nodeRect)) nodeRect.translate(0, -step); pos = nodeRect.topLeft(); diff --git a/toonz/sources/toonzqt/fxsettings.cpp b/toonz/sources/toonzqt/fxsettings.cpp index 20f35ab4..2c2da56a 100644 --- a/toonz/sources/toonzqt/fxsettings.cpp +++ b/toonz/sources/toonzqt/fxsettings.cpp @@ -16,6 +16,7 @@ #include "pluginhost.h" #include "tenv.h" #include "tsystem.h" +#include "docklayout.h" #include "toonz/tcamera.h" #include "toonz/toonzfolders.h" @@ -38,7 +39,6 @@ #include #include #include -#include #include #include @@ -1016,9 +1016,12 @@ void ParamViewer::setFx(const TFxP ¤tFx, const TFxP &actualFx, int frame, if (m_fx != currentFx) { getCurrentPageSet()->setFx(currentFx, actualFx, frame); - QSize pageViewerPreferedSize = - getCurrentPageSet()->getPreferedSize() + QSize(2, 20); - emit preferedSizeChanged(pageViewerPreferedSize); + if (m_actualFx != actualFx) { + m_actualFx = actualFx; + QSize pageViewerPreferedSize = + getCurrentPageSet()->getPreferedSize() + QSize(2, 50); + emit preferedSizeChanged(pageViewerPreferedSize); + } } } @@ -1086,7 +1089,8 @@ FxSettings::FxSettings(QWidget *parent, const TPixel32 &checkCol1, , m_checkCol1(checkCol1) , m_checkCol2(checkCol2) , m_isCameraModeView(false) - , m_container_height(177) { + , m_container_height(184) + , m_container_width(390) { // param viewer m_paramViewer = new ParamViewer(this); // swatch @@ -1306,7 +1310,7 @@ void FxSettings::setCurrentFrame() { //----------------------------------------------------------------------------- void FxSettings::changeTitleBar(TFx *fx) { - QDialog *popup = dynamic_cast(parentWidget()); + DockWidget *popup = dynamic_cast(parentWidget()); if (!popup) return; QString titleText(tr("Fx Settings")); @@ -1512,12 +1516,19 @@ void FxSettings::onViewModeChanged(QAction *triggeredAct) { void FxSettings::onPreferedSizeChanged(QSize pvBestSize) { QSize popupBestSize = pvBestSize; + + // Set minimum size, just in case + popupBestSize.setHeight(std::max(popupBestSize.height(), 85)); + popupBestSize.setWidth(std::max(popupBestSize.width(), 390)); + if (m_toolBar->isVisible()) { - popupBestSize += QSize(0, m_viewer->height() + m_toolBar->height()); + popupBestSize += QSize(0, m_viewer->height() + m_toolBar->height() + 4); + popupBestSize.setWidth( + std::max(popupBestSize.width(), m_viewer->width() + 13)); } - QDialog *popup = dynamic_cast(parentWidget()); - if (popup) { + DockWidget *popup = dynamic_cast(parentWidget()); + if (popup && popup->isFloating()) { QRect geom = popup->geometry(); geom.setSize(popupBestSize); popup->setGeometry(geom); @@ -1530,19 +1541,24 @@ void FxSettings::onPreferedSizeChanged(QSize pvBestSize) { void FxSettings::onShowSwatchButtonToggled(bool on) { QWidget *bottomContainer = widget(1); - if (!on) + if (!on) { m_container_height = bottomContainer->height() + handleWidth() /* ハンドル幅 */; - + m_container_width = m_viewer->width() + 13; + } bottomContainer->setVisible(on); - QDialog *popup = dynamic_cast(parentWidget()); - if (popup) { + DockWidget *popup = dynamic_cast(parentWidget()); + if (popup && popup->isFloating()) { QRect geom = popup->geometry(); int height_change = (on) ? m_container_height : -m_container_height; + int width_change = 0; - geom.setSize(geom.size() + QSize(0, height_change)); + if (on && m_container_width > geom.width()) + width_change = m_container_width - geom.width(); + + geom.setSize(geom.size() + QSize(width_change, height_change)); popup->setGeometry(geom); popup->update(); } diff --git a/toonz/sources/toonzqt/imageutils.cpp b/toonz/sources/toonzqt/imageutils.cpp index 21e7889e..34fecdb5 100644 --- a/toonz/sources/toonzqt/imageutils.cpp +++ b/toonz/sources/toonzqt/imageutils.cpp @@ -801,16 +801,17 @@ double getQuantizedZoomFactor(double zf, bool forward) { namespace { -void getViewerShortcuts(int &zoomIn, int &zoomOut, int &zoomReset, int &zoomFit, +void getViewerShortcuts(int &zoomIn, int &zoomOut, int &viewReset, int &zoomFit, int &showHideFullScreen, int &actualPixelSize, - int &flipX, int &flipY) { + int &flipX, int &flipY, int &zoomReset, + int &rotateReset, int &positionReset) { CommandManager *cManager = CommandManager::instance(); zoomIn = cManager->getKeyFromShortcut(cManager->getShortcutFromId(V_ZoomIn)); zoomOut = cManager->getKeyFromShortcut(cManager->getShortcutFromId(V_ZoomOut)); - zoomReset = - cManager->getKeyFromShortcut(cManager->getShortcutFromId(V_ZoomReset)); + viewReset = + cManager->getKeyFromShortcut(cManager->getShortcutFromId(V_ViewReset)); zoomFit = cManager->getKeyFromShortcut(cManager->getShortcutFromId(V_ZoomFit)); showHideFullScreen = cManager->getKeyFromShortcut( @@ -819,6 +820,12 @@ void getViewerShortcuts(int &zoomIn, int &zoomOut, int &zoomReset, int &zoomFit, cManager->getShortcutFromId(V_ActualPixelSize)); flipX = cManager->getKeyFromShortcut(cManager->getShortcutFromId(V_FlipX)); flipY = cManager->getKeyFromShortcut(cManager->getShortcutFromId(V_FlipY)); + zoomReset = + cManager->getKeyFromShortcut(cManager->getShortcutFromId(V_ZoomReset)); + rotateReset = + cManager->getKeyFromShortcut(cManager->getShortcutFromId(V_RotateReset)); + positionReset = cManager->getKeyFromShortcut( + cManager->getShortcutFromId(V_PositionReset)); } } // namespace @@ -833,10 +840,11 @@ ShortcutZoomer::ShortcutZoomer(QWidget *zoomingWidget) //-------------------------------------------------------------------------- bool ShortcutZoomer::exec(QKeyEvent *event) { - int zoomInKey, zoomOutKey, zoomResetKey, zoomFitKey, showHideFullScreenKey, - actualPixelSize, flipX, flipY; - getViewerShortcuts(zoomInKey, zoomOutKey, zoomResetKey, zoomFitKey, - showHideFullScreenKey, actualPixelSize, flipX, flipY); + int zoomInKey, zoomOutKey, viewResetKey, zoomFitKey, showHideFullScreenKey, + actualPixelSize, flipX, flipY, zoomReset, rotateReset, positionReset; + getViewerShortcuts(zoomInKey, zoomOutKey, viewResetKey, zoomFitKey, + showHideFullScreenKey, actualPixelSize, flipX, flipY, + zoomReset, rotateReset, positionReset); int key = event->key(); if (key == Qt::Key_Control || key == Qt::Key_Shift || key == Qt::Key_Alt) @@ -855,13 +863,22 @@ bool ShortcutZoomer::exec(QKeyEvent *event) { : (key == zoomFitKey) ? fit() : (key == zoomInKey || key == zoomOutKey || - key == zoomResetKey) + key == viewResetKey) ? zoom(key == zoomInKey, - key == zoomResetKey) + key == viewResetKey) : (key == flipX) ? setFlipX() - : (key == flipY) ? setFlipY() - : false; + : (key == flipY) + ? setFlipY() + : (key == zoomReset) + ? resetZoom() + : (key == rotateReset) + ? resetRotation() + : (key == + positionReset) + ? resetPosition() + : false; + ; } //********************************************************************************************* diff --git a/toonz/sources/toonzqt/paletteviewer.cpp b/toonz/sources/toonzqt/paletteviewer.cpp index 333d2e08..70ea76a2 100644 --- a/toonz/sources/toonzqt/paletteviewer.cpp +++ b/toonz/sources/toonzqt/paletteviewer.cpp @@ -40,40 +40,40 @@ using namespace PaletteViewerGUI; //============================================================================= /*! \class PaletteViewer - \brief The PaletteViewer class provides an object to view and - manage palette view. +\brief The PaletteViewer class provides an object to view and +manage palette view. - Inherits \b QWidget. +Inherits \b QWidget. - This object allows to show and manage palette; it's possible - distinguish three - view type, class can show: current level palette, current studio - palette or - current cleanup palette, using setPalette() to set palette - viewer. - The object is composed of a vertical layout with three widget: - \li a tab bar \b PaletteViewerGUI::TabBar in which are displayed - palette page - \b createTabBar(); - \li a central frame \b PaletteViewerGUI::PageViewer in which are - displayed - all style of current page in palette - \li a button bar, \b createToolBar(), \b createPaletteToolBar() - and \b createSavePaletteToolBar(); +This object allows to show and manage palette; it's possible +distinguish three +view type, class can show: current level palette, current studio +palette or +current cleanup palette, using setPalette() to set palette +viewer. +The object is composed of a vertical layout with three widget: +\li a tab bar \b PaletteViewerGUI::TabBar in which are displayed +palette page +\b createTabBar(); +\li a central frame \b PaletteViewerGUI::PageViewer in which are +displayed +all style of current page in palette +\li a button bar, \b createToolBar(), \b createPaletteToolBar() +and \b createSavePaletteToolBar(); - A collection of method allows you to manage this object and its - interaction - with palette. - */ +A collection of method allows you to manage this object and its +interaction +with palette. +*/ /*! \fn const TPaletteP PaletteViewer::&getPalette() const - Return current viewer palette. - */ +Return current viewer palette. +*/ /*! \fn void PaletteViewer::createToolBar() - Create down button bar. - */ +Create down button bar. +*/ /*! \fn void PaletteViewer::updateToolBar() - Update button bar. - */ +Update button bar. +*/ PaletteViewer::PaletteViewer(QWidget *parent, PaletteViewType viewType, bool hasSaveToolBar, bool hasPageCommand, bool hasPasteColors) @@ -116,7 +116,7 @@ PaletteViewer::PaletteViewer(QWidget *parent, PaletteViewType viewType, toolbarScrollWidget->setObjectName( "ToolBarContainer"); // Toonz's qss files are instructed to leave a - // 1px grey margin on top for scroll buttons + // 1px grey margin on top for scroll buttons QWidget *toolBarWidget = new QWidget; // children of this parent name. toolbarScrollWidget->setWidget(toolBarWidget); toolBarWidget->setSizePolicy(QSizePolicy::MinimumExpanding, @@ -170,6 +170,8 @@ PaletteViewer::PaletteViewer(QWidget *parent, PaletteViewType viewType, SLOT(movePage(int, int))); connect(m_pageViewer, SIGNAL(changeWindowTitleSignal()), this, SLOT(changeWindowTitle())); + connect(m_pageViewer, SIGNAL(switchToPage(int)), this, + SLOT(onSwitchToPage(int))); changeWindowTitle(); @@ -236,7 +238,7 @@ void PaletteViewer::setXsheetHandle(TXsheetHandle *xsheetHandle) { //----------------------------------------------------------------------------- /*!for clearing level cache after "paste style" command called from style - * selection +* selection */ void PaletteViewer::setLevelHandle(TXshLevelHandle *levelHandle) { m_pageViewer->setLevelHandle(levelHandle); @@ -438,8 +440,8 @@ void PaletteViewer::createPaletteToolBar() { //----------------------------------------------------------------------------- /*! Create left part of button bar; insert different actions in according to - current viewer palette type. - */ +current viewer palette type. +*/ void PaletteViewer::createSavePaletteToolBar() { m_savePaletteToolBar->clear(); m_savePaletteToolBar->setMovable(false); @@ -516,7 +518,7 @@ void PaletteViewer::updateTabBar() { //----------------------------------------------------------------------------- /*! Update right button bar, enable its action if current viewer palette is - * empty. +* empty. */ void PaletteViewer::updatePaletteToolBar() { if (!m_paletteToolBar) return; @@ -542,7 +544,7 @@ void PaletteViewer::updatePaletteToolBar() { //----------------------------------------------------------------------------- /*! Update left button bar, enable its action if current viewer palette is - * empty. +* empty. */ void PaletteViewer::updateSavePaletteToolBar() { if (!m_savePaletteToolBar) return; @@ -670,8 +672,8 @@ void PaletteViewer::hideEvent(QHideEvent *) { //----------------------------------------------------------------------------- /*! If currente palette viewer exist verify event data, if is a PaletteData or - has urls accept event. - */ +has urls accept event. +*/ void PaletteViewer::dragEnterEvent(QDragEnterEvent *event) { TPalette *palette = getPalette(); if (!palette || m_viewType == CLEANUP_PALETTE) return; @@ -683,7 +685,7 @@ void PaletteViewer::dragEnterEvent(QDragEnterEvent *event) { // Sto "draggando" stili. if (paletteData->hasStyleIndeces()) { m_pageViewer->createDropPage(); - if (!palette) m_pagesBar->setCurrentIndex(palette->getPageCount() - 1); + if (!palette) onSwitchToPage(palette->getPageCount() - 1); } // Accetto l'evento event->acceptProposedAction(); @@ -736,8 +738,11 @@ void PaletteViewer::dropEvent(QDropEvent *event) { if (ret == 0) return; } StudioPaletteCmd::loadIntoCurrentPalette(m_paletteHandle, path); - } else + } else { + int nextPageIndex = m_paletteHandle->getPalette()->getPageCount(); StudioPaletteCmd::mergeIntoCurrentPalette(m_paletteHandle, path); + if (!i) onSwitchToPage(nextPageIndex); + } if (loadPalette) { TFilePath refImagePath = @@ -771,8 +776,11 @@ void PaletteViewer::dropEvent(QDropEvent *event) { if (ret == 0) return; } StudioPaletteCmd::loadIntoCurrentPalette(m_paletteHandle, palette); - } else + } else { + int nextPageIndex = m_paletteHandle->getPalette()->getPageCount(); StudioPaletteCmd::mergeIntoCurrentPalette(m_paletteHandle, palette); + onSwitchToPage(nextPageIndex); + } } } @@ -813,8 +821,8 @@ void PaletteViewer::setPageView(int currentIndexPage) { //----------------------------------------------------------------------------- /*! If current palette viewer is not empty create emit a signal to create new - palette page. - */ +palette page. +*/ void PaletteViewer::addNewPage() { TPalette *palette = getPalette(); if (palette) { @@ -822,14 +830,15 @@ void PaletteViewer::addNewPage() { updateTabBar(); PaletteCmd::addPage(m_paletteHandle); + onSwitchToPage(m_paletteHandle->getPalette()->getPageCount() - 1); } } //----------------------------------------------------------------------------- /*! Create a new style in current page view of current palette viewer emit a - signal - to create a new style. - */ +signal +to create a new style. +*/ void PaletteViewer::addNewColor() { if (!getPalette() || getPalette()->isLocked()) return; @@ -868,8 +877,8 @@ void PaletteViewer::deletePage() { //----------------------------------------------------------------------------- /*! If current palette view is studio palette and palette has a global name - save current viewer palette in studio palette. - */ +save current viewer palette in studio palette. +*/ void PaletteViewer::saveStudioPalette() { StudioPalette *sp = StudioPalette::instance(); TPalette *palette = getPalette(); @@ -949,7 +958,7 @@ void PaletteViewer::onColorStyleSwitched() { if (indexInPage == -1) { if (!palette->getStylePage(styleIndex)) return; int pageIndex = palette->getStylePage(styleIndex)->getIndex(); - m_pagesBar->setCurrentIndex(pageIndex); + onSwitchToPage(pageIndex); indexInPage = m_pageViewer->getPage()->search(styleIndex); } @@ -967,7 +976,7 @@ void PaletteViewer::onColorStyleSwitched() { void PaletteViewer::onPaletteChanged() { int index = m_pagesBar->currentIndex(); updateTabBar(); - m_pagesBar->setCurrentIndex(index); + onSwitchToPage(index); m_pageViewer->update(); @@ -981,6 +990,17 @@ void PaletteViewer::onPaletteChanged() { void PaletteViewer::onPaletteSwitched() { updateView(); + int pageIndex = 0; + if (m_paletteHandle) { + TPalette *palette = m_paletteHandle->getPalette(); + if (palette) { + int currentStyleId = palette->getCurrentStyleId(); + TPalette::Page *page = palette->getStylePage(currentStyleId); + if (page) pageIndex = page->getIndex(); + } + } + onSwitchToPage(pageIndex); + // update GUI according to the "lock" property if (getPalette() && m_viewType != CLEANUP_PALETTE && (m_lockPaletteAction || m_lockPaletteToolButton)) { @@ -1039,8 +1059,8 @@ void PaletteViewer::onNameDisplayMode(QAction *action) { //----------------------------------------------------------------------------- /*! If current view type is LEVEL_PALETTE add to window title current level - name and current frame. - */ +name and current frame. +*/ void PaletteViewer::changeWindowTitle() { QString name = tr("Palette"); QWidget *titleOwner; @@ -1082,11 +1102,11 @@ void PaletteViewer::changeWindowTitle() { //----------------------------------------------------------------------------- /*! Move palette view page from \b srcIndex page index to \b dstIndex page - * index. +* index. */ void PaletteViewer::movePage(int srcIndex, int dstIndex) { PaletteCmd::movePalettePage(m_paletteHandle, srcIndex, dstIndex); - m_pagesBar->setCurrentIndex(dstIndex); + onSwitchToPage(dstIndex); } //----------------------------------------------------------------------------- @@ -1101,3 +1121,7 @@ void PaletteViewer::setIsLocked(bool lock) { // notify for updating the style editor m_paletteHandle->notifyPaletteLockChanged(); } + +void PaletteViewer::onSwitchToPage(int pageIndex) { + m_pagesBar->setCurrentIndex(pageIndex); +} diff --git a/toonz/sources/toonzqt/paletteviewergui.cpp b/toonz/sources/toonzqt/paletteviewergui.cpp index db6c68e2..c3450ed1 100644 --- a/toonz/sources/toonzqt/paletteviewergui.cpp +++ b/toonz/sources/toonzqt/paletteviewergui.cpp @@ -1047,7 +1047,10 @@ void PageViewer::addNewColor() { //----------------------------------------------------------------------------- void PageViewer::addNewPage() { - PaletteCmd::addPage(getPaletteHandle()); + TPaletteHandle *paletteHandle = getPaletteHandle(); + PaletteCmd::addPage(paletteHandle); + if (paletteHandle) + emit switchToPage(paletteHandle->getPalette()->getPageCount() - 1); update(); } diff --git a/toonz/sources/toonzqt/planeviewer.cpp b/toonz/sources/toonzqt/planeviewer.cpp index 2ec15593..11f247e6 100644 --- a/toonz/sources/toonzqt/planeviewer.cpp +++ b/toonz/sources/toonzqt/planeviewer.cpp @@ -4,6 +4,10 @@ // TnzQt includes #include "toonzqt/imageutils.h" +#include "toonzqt/menubarcommand.h" +#include "toonzqt/viewcommandids.h" + +#include "../toonz/menubarcommandids.h" // TnzLib includes #include "toonz/stage.h" @@ -23,6 +27,7 @@ #include #include #include +#include //#define PRINT_AFF @@ -37,6 +42,7 @@ struct PlaneViewerZoomer final : public ImageUtils::ShortcutZoomer { private: bool zoom(bool zoomin, bool resetZoom) override; + bool fit() override; }; //======================================================================== @@ -44,12 +50,19 @@ private: bool PlaneViewerZoomer::zoom(bool zoomin, bool resetZoom) { PlaneViewer &planeViewer = static_cast(*getWidget()); - resetZoom ? planeViewer.resetView() - : zoomin ? planeViewer.zoomIn() : planeViewer.zoomOut(); + resetZoom ? planeViewer.resetView() : zoomin ? planeViewer.zoomIn() + : planeViewer.zoomOut(); return true; } +bool PlaneViewerZoomer::fit() { + PlaneViewer &planeViewer = static_cast(*getWidget()); + + planeViewer.fitView(); + + return true; +} } // namespace //========================================================================================= @@ -60,9 +73,17 @@ PlaneViewer::PlaneViewer(QWidget *parent) , m_xpos(0) , m_ypos(0) , m_aff() // initialized at the first resize - , m_chessSize(40.0) { + , m_chessSize(40.0) + , m_firstDraw(true) + , m_dpiX(0.0) + , m_dpiY(0.0) { m_zoomRange[0] = 1e-3, m_zoomRange[1] = 1024.0; setBgColor(TPixel32(235, 235, 235), TPixel32(235, 235, 235)); + + setAttribute(Qt::WA_AcceptTouchEvents); + grabGesture(Qt::SwipeGesture); + grabGesture(Qt::PanGesture); + grabGesture(Qt::PinchGesture); } //========================================================================================= @@ -162,6 +183,11 @@ void PlaneViewer::resizeGL(int width, int height) { //========================================================================================= void PlaneViewer::mouseMoveEvent(QMouseEvent *event) { + if (m_gestureActive && m_touchDevice == QTouchDevice::TouchScreen && + !m_stylusUsed) { + return; + } + QPoint curPos = event->pos() * getDevPixRatio(); if (event->buttons() & Qt::MidButton) moveView(curPos.x() - m_xpos, height() - curPos.y() - m_ypos); @@ -172,18 +198,84 @@ void PlaneViewer::mouseMoveEvent(QMouseEvent *event) { //------------------------------------------------------ void PlaneViewer::mousePressEvent(QMouseEvent *event) { + // qDebug() << "[mousePressEvent]"; + if (m_gestureActive && m_touchDevice == QTouchDevice::TouchScreen && + !m_stylusUsed) { + return; + } + m_xpos = event->x() * getDevPixRatio(); m_ypos = height() - event->y() * getDevPixRatio(); } //------------------------------------------------------ -void PlaneViewer::wheelEvent(QWheelEvent *event) { - TPointD pos(event->x() * getDevPixRatio(), - height() - event->y() * getDevPixRatio()); - double zoom_par = 1 + event->delta() * 0.001; +void PlaneViewer::mouseDoubleClickEvent(QMouseEvent *event) { + // qDebug() << "[mouseDoubleClickEvent]"; + if (m_gestureActive && !m_stylusUsed) { + m_gestureActive = false; + fitView(); + return; + } +} - zoomView(pos.x, pos.y, zoom_par); +//------------------------------------------------------ + +void PlaneViewer::mouseReleaseEvent(QMouseEvent *event) { + m_gestureActive = false; + m_zooming = false; + m_panning = false; + m_stylusUsed = false; +} + +//------------------------------------------------------ + +void PlaneViewer::wheelEvent(QWheelEvent *event) { + int delta = 0; + switch (event->source()) { + case Qt::MouseEventNotSynthesized: { + if (event->modifiers() & Qt::AltModifier) + delta = event->angleDelta().x(); + else + delta = event->angleDelta().y(); + break; + } + + case Qt::MouseEventSynthesizedBySystem: { + QPoint numPixels = event->pixelDelta(); + QPoint numDegrees = event->angleDelta() / 8; + if (!numPixels.isNull()) { + delta = event->pixelDelta().y(); + } else if (!numDegrees.isNull()) { + QPoint numSteps = numDegrees / 15; + delta = numSteps.y(); + } + break; + } + + default: // Qt::MouseEventSynthesizedByQt, + // Qt::MouseEventSynthesizedByApplication + { + std::cout << "not supported event: Qt::MouseEventSynthesizedByQt, " + "Qt::MouseEventSynthesizedByApplication" + << std::endl; + break; + } + + } // end switch + + if (abs(delta) > 0) { + if ((m_gestureActive == true && + m_touchDevice == QTouchDevice::TouchScreen) || + m_gestureActive == false) { + TPointD pos(event->x() * getDevPixRatio(), + height() - event->y() * getDevPixRatio()); + double zoom_par = 1 + event->delta() * 0.001; + + zoomView(pos.x, pos.y, zoom_par); + } + } + event->accept(); } //------------------------------------------------------ @@ -199,6 +291,201 @@ void PlaneViewer::keyPressEvent(QKeyEvent *event) { //! Disposes of the auxiliary internal rasterBuffer(). void PlaneViewer::hideEvent(QHideEvent *event) { m_rasterBuffer = TRaster32P(); + m_dpiX = 0.0; // reset dpi + m_dpiY = 0.0; +} + +//------------------------------------------------------------------ + +void PlaneViewer::contextMenuEvent(QContextMenuEvent *event) { + QMenu *menu = new QMenu(this); + + QAction *reset = menu->addAction(tr("Reset View")); + reset->setShortcut( + QKeySequence(CommandManager::instance()->getKeyFromId(V_ZoomReset))); + connect(reset, SIGNAL(triggered()), SLOT(resetView())); + + QAction *fit = menu->addAction(tr("Fit To Window")); + fit->setShortcut( + QKeySequence(CommandManager::instance()->getKeyFromId(V_ZoomFit))); + connect(fit, SIGNAL(triggered()), SLOT(fitView())); + + menu->exec(event->globalPos()); + + delete menu; + update(); +} + +//------------------------------------------------------------------ + +void PlaneViewer::tabletEvent(QTabletEvent *e) { + // qDebug() << "[tabletEvent]"; + if (e->type() == QTabletEvent::TabletPress) { + m_stylusUsed = e->pointerType() ? true : false; + } else if (e->type() == QTabletEvent::TabletRelease) { + m_stylusUsed = false; + } + + e->accept(); +} + +//------------------------------------------------------------------ + +void PlaneViewer::gestureEvent(QGestureEvent *e) { + // qDebug() << "[gestureEvent]"; + m_gestureActive = false; + if (QGesture *swipe = e->gesture(Qt::SwipeGesture)) { + m_gestureActive = true; + } else if (QGesture *pan = e->gesture(Qt::PanGesture)) { + m_gestureActive = true; + } + if (QGesture *pinch = e->gesture(Qt::PinchGesture)) { + QPinchGesture *gesture = static_cast(pinch); + QPinchGesture::ChangeFlags changeFlags = gesture->changeFlags(); + QPoint firstCenter = gesture->centerPoint().toPoint(); + if (m_touchDevice == QTouchDevice::TouchScreen) + firstCenter = mapFromGlobal(firstCenter); + + if (gesture->state() == Qt::GestureStarted) { + m_gestureActive = true; + } else if (gesture->state() == Qt::GestureFinished) { + m_gestureActive = false; + m_zooming = false; + m_scaleFactor = 0.0; + } else { + if (changeFlags & QPinchGesture::ScaleFactorChanged) { + double scaleFactor = gesture->scaleFactor(); + // the scale factor makes for too sensitive scaling + // divide the change in half + if (scaleFactor > 1) { + double decimalValue = scaleFactor - 1; + decimalValue /= 1.5; + scaleFactor = 1 + decimalValue; + } else if (scaleFactor < 1) { + double decimalValue = 1 - scaleFactor; + decimalValue /= 1.5; + scaleFactor = 1 - decimalValue; + } + if (!m_zooming) { + double delta = scaleFactor - 1; + m_scaleFactor += delta; + if (m_scaleFactor > .2 || m_scaleFactor < -.2) { + m_zooming = true; + } + } + if (m_zooming) { + zoomView(firstCenter.x() * getDevPixRatio(), + firstCenter.y() * getDevPixRatio(), scaleFactor); + m_panning = false; + } + m_gestureActive = true; + } + + if (changeFlags & QPinchGesture::CenterPointChanged) { + QPointF centerDelta = (gesture->centerPoint() * getDevPixRatio()) - + (gesture->lastCenterPoint() * getDevPixRatio()); + if (centerDelta.manhattanLength() > 1) { + // panQt(centerDelta.toPoint()); + } + m_gestureActive = true; + } + } + } + e->accept(); +} + +void PlaneViewer::touchEvent(QTouchEvent *e, int type) { + // qDebug() << "[touchEvent]"; + if (type == QEvent::TouchBegin) { + m_touchActive = true; + m_firstPanPoint = e->touchPoints().at(0).pos(); + // obtain device type + m_touchDevice = e->device()->type(); + } else if (m_touchActive) { + // touchpads must have 2 finger panning for tools and navigation to be + // functional on other devices, 1 finger panning is preferred + if ((e->touchPoints().count() == 2 && + m_touchDevice == QTouchDevice::TouchPad) || + (e->touchPoints().count() == 1 && + m_touchDevice == QTouchDevice::TouchScreen)) { + QTouchEvent::TouchPoint panPoint = e->touchPoints().at(0); + if (!m_panning) { + QPointF deltaPoint = panPoint.pos() - m_firstPanPoint; + // minimize accidental and jerky zooming/rotating during 2 finger + // panning + if ((deltaPoint.manhattanLength() > 100) && !m_zooming) { + m_panning = true; + } + } + if (m_panning) { + QPoint curPos = panPoint.pos().toPoint() * getDevPixRatio(); + QPoint lastPos = panPoint.lastPos().toPoint() * getDevPixRatio(); + QPoint centerDelta = curPos - lastPos; + moveView(centerDelta.x(), -centerDelta.y()); + } + } + } + if (type == QEvent::TouchEnd || type == QEvent::TouchCancel) { + m_touchActive = false; + m_panning = false; + } + e->accept(); +} + +bool PlaneViewer::event(QEvent *e) { + /* + switch (e->type()) { + case QEvent::TabletPress: { + QTabletEvent *te = static_cast(e); + qDebug() << "[event] TabletPress: pointerType(" << te->pointerType() + << ") device(" << te->device() << ")"; + } break; + case QEvent::TabletRelease: + qDebug() << "[event] TabletRelease"; + break; + case QEvent::TouchBegin: + qDebug() << "[event] TouchBegin"; + break; + case QEvent::TouchEnd: + qDebug() << "[event] TouchEnd"; + break; + case QEvent::TouchCancel: + qDebug() << "[event] TouchCancel"; + break; + case QEvent::MouseButtonPress: + qDebug() << "[event] MouseButtonPress"; + break; + case QEvent::MouseButtonDblClick: + qDebug() << "[event] MouseButtonDblClick"; + break; + case QEvent::MouseButtonRelease: + qDebug() << "[event] MouseButtonRelease"; + break; + case QEvent::Gesture: + qDebug() << "[event] Gesture"; + break; + default: + break; + } + */ + + if (e->type() == QEvent::Gesture && + CommandManager::instance() + ->getAction(MI_TouchGestureControl) + ->isChecked()) { + gestureEvent(static_cast(e)); + return true; + } + if ((e->type() == QEvent::TouchBegin || e->type() == QEvent::TouchEnd || + e->type() == QEvent::TouchCancel || e->type() == QEvent::TouchUpdate) && + CommandManager::instance() + ->getAction(MI_TouchGestureControl) + ->isChecked()) { + touchEvent(static_cast(e), e->type()); + m_gestureActive = true; + return true; + } + return GLWidgetForHighDpi::event(e); } //========================================================================================= @@ -208,6 +495,22 @@ void PlaneViewer::resetView() { update(); } +void PlaneViewer::fitView() { + if (m_imageBounds.isEmpty()) return; + m_aff = TTranslation(0.5 * width(), 0.5 * height()); + + double imageScale = std::min(width() / (double)m_imageBounds.getLx(), + height() / (double)m_imageBounds.getLy()); + + m_aff = TScale(imageScale, imageScale); + if (m_dpiX != 0.0 && m_dpiY != 0.0) + m_aff *= TScale(m_dpiX / Stage::inch, m_dpiY / Stage::inch); + m_aff.a13 = 0.5 * width(); + m_aff.a23 = 0.5 * height(); + + update(); +} + //------------------------------------------------------ void PlaneViewer::setViewPos(double x, double y) { @@ -306,6 +609,16 @@ void PlaneViewer::draw(TRasterP ras, double dpiX, double dpiY, TPalette *pal) { TRaster32P aux(rasterBuffer()); + m_imageBounds = ras->getBounds(); + if (m_dpiX == 0.0 || m_dpiY == 0.0) { + m_dpiX = dpiX; + m_dpiY = dpiY; + } + if (m_firstDraw && !m_imageBounds.isEmpty()) { + m_firstDraw = false; + fitView(); + } + aux->lock(); ras->lock(); @@ -328,8 +641,8 @@ void PlaneViewer::draw(TRasterP ras, double dpiX, double dpiY, TPalette *pal) { } /*NOTE: - glRasterPos2d could be used, along glBitmap and glPixelZoom... - however, i've never been able to use them effectively... +glRasterPos2d could be used, along glBitmap and glPixelZoom... +however, i've never been able to use them effectively... */ //------------------------------------------------------ @@ -360,7 +673,15 @@ void PlaneViewer::draw(TVectorImageP vi) { TRectD bbox(vi->getBBox()); TRect bboxI(tfloor(bbox.x0), tfloor(bbox.y0), tceil(bbox.x1) - 1, tceil(bbox.y1) - 1); - + m_imageBounds = bboxI; + if (m_dpiX == 0.0 || m_dpiY == 0.0) { + m_dpiX = Stage::inch; + m_dpiY = Stage::inch; + } + if (m_firstDraw) { + m_firstDraw = false; + fitView(); + } TVectorRenderData rd(TAffine(), bboxI, vi->getPalette(), 0, true, true); tglDraw(rd, vi.getPointer()); } diff --git a/toonz/sources/toonzqt/plugin_param_traits.h b/toonz/sources/toonzqt/plugin_param_traits.h index beb13875..e59ed458 100644 --- a/toonz/sources/toonzqt/plugin_param_traits.h +++ b/toonz/sources/toonzqt/plugin_param_traits.h @@ -420,7 +420,7 @@ inline TSpectrumParam *param_factory_(const toonz_param_desc_t *desc) { keys[i].second = toPixel32( TPixelD(t.array[i].c0, t.array[i].c1, t.array[i].c2, t.array[i].m)); } - return new TSpectrumParam(t.points, keys.data()); + return new TSpectrumParam(keys); } else { return new TSpectrumParam(); /* use default constructor: デフォルトでは [black:white] の単純なものが設定される */ diff --git a/toonz/sources/toonzqt/schematicviewer.cpp b/toonz/sources/toonzqt/schematicviewer.cpp index db61b921..080723ec 100644 --- a/toonz/sources/toonzqt/schematicviewer.cpp +++ b/toonz/sources/toonzqt/schematicviewer.cpp @@ -52,8 +52,16 @@ class SchematicZoomer final : public ImageUtils::ShortcutZoomer { public: SchematicZoomer(QWidget *parent) : ShortcutZoomer(parent) {} - bool zoom(bool zoomin, bool resetZoom) override { - static_cast(getWidget())->zoomQt(zoomin, resetZoom); + bool zoom(bool zoomin, bool resetView) override { + static_cast(getWidget())->zoomQt(zoomin, resetView); + return true; + } + bool resetZoom() override { + static_cast(getWidget())->normalizeScene(); + return true; + } + bool fit() override { + static_cast(getWidget())->fitScene(); return true; } }; @@ -95,7 +103,7 @@ void SchematicScene::hideEvent(QHideEvent *se) { //------------------------------------------------------------------ /*! Removes and then deletes all item in the scene. -*/ + */ void SchematicScene::clearAllItems() { clearSelection(); @@ -143,7 +151,7 @@ void SchematicScene::clearAllItems() { //------------------------------------------------------------------ /*! check if any item exists in the rect -*/ + */ bool SchematicScene::isAnEmptyZone(const QRectF &rect) { QList allItems = items(); for (auto const level : allItems) { @@ -207,7 +215,7 @@ SchematicSceneViewer::~SchematicSceneViewer() {} //------------------------------------------------------------------ /*! Reimplemets the QGraphicsView::mousePressEvent() -*/ + */ void SchematicSceneViewer::mousePressEvent(QMouseEvent *me) { m_buttonState = me->button(); m_oldWinPos = me->pos(); @@ -233,7 +241,7 @@ void SchematicSceneViewer::mousePressEvent(QMouseEvent *me) { //------------------------------------------------------------------ /*! Reimplemets the QGraphicsView::mouseMoveEvent() -*/ + */ void SchematicSceneViewer::mouseMoveEvent(QMouseEvent *me) { QPoint currWinPos = me->pos(); QPointF currScenePos = mapToScene(currWinPos); @@ -257,7 +265,7 @@ void SchematicSceneViewer::mouseMoveEvent(QMouseEvent *me) { //------------------------------------------------------------------ /*! Reimplemets the QGraphicsView::mouseReleaseEvent() -*/ + */ void SchematicSceneViewer::mouseReleaseEvent(QMouseEvent *me) { m_buttonState = Qt::NoButton; QGraphicsView::mouseReleaseEvent(me); @@ -276,7 +284,7 @@ void SchematicSceneViewer::keyPressEvent(QKeyEvent *ke) { //------------------------------------------------------------------ /*! Reimplemets the QGraphicsView::wheelEvent() -*/ + */ void SchematicSceneViewer::wheelEvent(QWheelEvent *me) { me->accept(); double factor = exp(me->delta() * 0.001); @@ -285,33 +293,38 @@ void SchematicSceneViewer::wheelEvent(QWheelEvent *me) { //------------------------------------------------------------------ -void SchematicSceneViewer::zoomQt(bool zoomin, bool resetZoom) { +void SchematicSceneViewer::zoomQt(bool zoomin, bool resetView) { + if (resetView) { + resetMatrix(); + // reseting will set view to the center of items bounding + centerOn(scene()->itemsBoundingRect().center()); + return; + } + #if QT_VERSION >= 0x050000 double scale2 = matrix().determinant(); #else double scale2 = matrix().det(); #endif - if (resetZoom || - ((scale2 < 100000 || !zoomin) && (scale2 > 0.001 * 0.05 || zoomin))) { + if ((scale2 < 100000 || !zoomin) && (scale2 > 0.001 * 0.05 || zoomin)) { double oldZoomScale = sqrt(scale2); - double zoomScale = resetZoom ? 1 : ImageUtils::getQuantizedZoomFactor( - oldZoomScale, zoomin); + double zoomScale = + resetView ? 1 + : ImageUtils::getQuantizedZoomFactor(oldZoomScale, zoomin); QMatrix scale = QMatrix().scale(zoomScale / oldZoomScale, zoomScale / oldZoomScale); // See QGraphicsView::mapToScene()'s doc for details - QRect rect(0, 0, width(), height()); - QRectF sceneCenterRect( - mapToScene(QRect(rect.center(), QSize(2, 2))).boundingRect()); + QPointF sceneCenter(mapToScene(rect().center())); setMatrix(scale, true); - centerOn(sceneCenterRect.center()); + centerOn(sceneCenter); } } //------------------------------------------------------------------ /*! The view is scaled around the point \b winPos by \b scaleFactor; -*/ + */ void SchematicSceneViewer::changeScale(const QPoint &winPos, qreal scaleFactor) { QPointF startScenePos = mapToScene(winPos); @@ -350,14 +363,12 @@ void SchematicSceneViewer::reorderScene() { void SchematicSceneViewer::normalizeScene() { // See QGraphicsView::mapToScene()'s doc for details - QRect rect(0, 0, width(), height()); - QRectF sceneCenterRect( - mapToScene(QRect(rect.center(), QSize(2, 2))).boundingRect()); + QPointF sceneCenter(mapToScene(rect().center())); resetMatrix(); #if defined(MACOSX) scale(1.32, 1.32); #endif - centerOn(sceneCenterRect.center()); + centerOn(sceneCenter); } //------------------------------------------------------------------ @@ -587,10 +598,10 @@ void SchematicViewer::createActions() { QIcon nodeSizeIcon = createQIconOnOff( m_maximizedNode ? "minimizenodes" : "maximizenodes", false); - m_nodeSize = - new QAction(nodeSizeIcon, m_maximizedNode ? tr("&Minimize Nodes") - : tr("&Maximize Nodes"), - m_commonToolbar); + m_nodeSize = new QAction( + nodeSizeIcon, + m_maximizedNode ? tr("&Minimize Nodes") : tr("&Maximize Nodes"), + m_commonToolbar); connect(m_nodeSize, SIGNAL(triggered()), this, SLOT(changeNodeSize())); if (m_fullSchematic) { diff --git a/toonz/sources/toonzqt/styleeditor.cpp b/toonz/sources/toonzqt/styleeditor.cpp index fa4df3ff..00c09444 100644 --- a/toonz/sources/toonzqt/styleeditor.cpp +++ b/toonz/sources/toonzqt/styleeditor.cpp @@ -1880,7 +1880,8 @@ else return false; void drawChip(QPainter &p, QRect rect, int index) override { assert(0 <= index && index < getChipCount()); CustomStyleManager::PatternData pattern = styleManager()->getPattern(index); - p.drawImage(rect, *pattern.m_image); + if (pattern.m_image && !pattern.m_image->isNull()) + p.drawImage(rect, *pattern.m_image); } void onSelect(int index) override; }; diff --git a/toonz/sources/toonzqt/swatchviewer.cpp b/toonz/sources/toonzqt/swatchviewer.cpp index a58286e7..0e89f699 100644 --- a/toonz/sources/toonzqt/swatchviewer.cpp +++ b/toonz/sources/toonzqt/swatchviewer.cpp @@ -2,9 +2,14 @@ #include "toonzqt/swatchviewer.h" #include "toonzqt/gutil.h" +#include "toonzqt/menubarcommand.h" +#include "toonzqt/viewcommandids.h" + +#include "../toonz/menubarcommandids.h" #include #include +#include #include #include "trasterfx.h" @@ -20,6 +25,8 @@ #include #include +#include + using namespace TFxUtil; //#define USE_SQLITE_HDPOOL @@ -255,7 +262,8 @@ SwatchViewer::SwatchViewer(QWidget *parent, Qt::WFlags flags) , m_firstPos(TPoint()) , m_oldContent() , m_curContent() - , m_executor() { + , m_executor() + , m_firstEnabled(true) { // setMinimumSize(150,150); setMinimumHeight(150); setFixedWidth(150); @@ -268,6 +276,11 @@ SwatchViewer::SwatchViewer(QWidget *parent, Qt::WFlags flags) m_executor.setMaxActiveTasks(1); m_renderer.enablePrecomputing(false); + + setAttribute(Qt::WA_AcceptTouchEvents); + grabGesture(Qt::SwipeGesture); + grabGesture(Qt::PanGesture); + grabGesture(Qt::PinchGesture); } //----------------------------------------------------------------------------- @@ -363,9 +376,13 @@ void SwatchViewer::updateFrame(int frame) { void SwatchViewer::setEnable(bool enabled) { if (m_enabled == enabled) return; m_enabled = enabled; - if (m_enabled) + if (m_enabled) { + if (m_firstEnabled) { + m_firstEnabled = false; + fitView(); + } computeContent(); - else + } else update(); } @@ -425,6 +442,26 @@ void SwatchViewer::zoom(const TPoint &pos, double factor) { //----------------------------------------------------------------------------- +void SwatchViewer::resetView() { setAff(TAffine()); } + +//----------------------------------------------------------------------------- + +void SwatchViewer::fitView() { + if (m_cameraRect.isEmpty()) return; + + double imageScale = std::min( + width() / ((double)getCameraSize().lx * (m_cameraMode ? 1 : 0.44)), + height() / ((double)getCameraSize().ly * (m_cameraMode ? 1 : 0.44))); + + TAffine fitAffine = TScale(imageScale, imageScale); + fitAffine.a13 = 0; + fitAffine.a23 = 0; + + setAff(fitAffine); +} + +//----------------------------------------------------------------------------- + void SwatchViewer::zoom(bool forward, bool reset) { double scale2 = m_aff.det(); if (reset || ((scale2 < 2000 || !forward) && (scale2 > 0.004 || forward))) { @@ -437,6 +474,11 @@ void SwatchViewer::zoom(bool forward, bool reset) { } } +void SwatchViewer::pan(const TPoint &delta) { + TPointD step = convert(delta); + setAff(TTranslation(step.x, -step.y) * m_aff); +} + //----------------------------------------------------------------------------- void SwatchViewer::computeContent() { @@ -447,7 +489,7 @@ void SwatchViewer::computeContent() { // Clear the swatch cache when the zoom scale has changed (cache results are // not compatible // between different scale levels) - if (m_aff.a11 != m_contentAff.a11) + if (m_aff.a11 != m_contentAff.a11 || m_panning) SwatchCacheManager::instance()->clearSwatchResults(); TRect rect(0, 0, width() - 1, height() - 1); @@ -593,6 +635,12 @@ void SwatchViewer::resizeEvent(QResizeEvent *re) { //----------------------------------------------------------------------------- void SwatchViewer::mousePressEvent(QMouseEvent *event) { + // qDebug() << "[mousePressEvent]"; + if (m_gestureActive && m_touchDevice == QTouchDevice::TouchScreen && + !m_stylusUsed) { + return; + } + TPoint pos = TPoint(event->pos().x(), event->pos().y()); m_mouseButton = event->button(); if (m_mouseButton == Qt::LeftButton) { @@ -651,6 +699,11 @@ void SwatchViewer::mousePressEvent(QMouseEvent *event) { //----------------------------------------------------------------------------- void SwatchViewer::mouseMoveEvent(QMouseEvent *event) { + if (m_gestureActive && m_touchDevice == QTouchDevice::TouchScreen && + !m_stylusUsed) { + return; + } + TPoint pos = TPoint(event->pos().x(), event->pos().y()); if (m_mouseButton == Qt::LeftButton) { if (m_selectedPoint < 0 || m_selectedPoint >= (int)m_points.size()) return; @@ -671,15 +724,8 @@ void SwatchViewer::mouseMoveEvent(QMouseEvent *event) { QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents); } else if (m_mouseButton == Qt::MidButton) { - if (!m_oldContent || !m_curContent) return; - m_curContent->fill(TPixel32::Transparent); - TPointD step = convert(pos - m_pos); - // Devo aggiornare l'affine per riposizionare la camera. - m_aff = TTranslation(step.x, -step.y) * m_aff; - m_pos = pos; - TPoint p = pos - m_firstPos; - m_curContent->copy(m_oldContent, TPoint(p.x, -p.y)); - setContent(m_curContent, TTranslation(step.x, -step.y) * m_contentAff); + pan(pos - m_pos); + m_pos = pos; } } @@ -695,20 +741,78 @@ void SwatchViewer::mouseReleaseEvent(QMouseEvent *event) { setAff(TTranslation(p.x, -p.y) * m_aff); update(); } + m_gestureActive = false; + m_zooming = false; + m_panning = false; + m_stylusUsed = false; } //----------------------------------------------------------------------------- void SwatchViewer::wheelEvent(QWheelEvent *event) { - TPoint center(event->pos().x() - width() / 2, - -event->pos().y() + height() / 2); - zoom(center, exp(0.001 * event->delta())); + int delta = 0; + switch (event->source()) { + case Qt::MouseEventNotSynthesized: { + if (event->modifiers() & Qt::AltModifier) + delta = event->angleDelta().x(); + else + delta = event->angleDelta().y(); + break; + } + + case Qt::MouseEventSynthesizedBySystem: { + QPoint numPixels = event->pixelDelta(); + QPoint numDegrees = event->angleDelta() / 8; + if (!numPixels.isNull()) { + delta = event->pixelDelta().y(); + } else if (!numDegrees.isNull()) { + QPoint numSteps = numDegrees / 15; + delta = numSteps.y(); + } + break; + } + + default: // Qt::MouseEventSynthesizedByQt, + // Qt::MouseEventSynthesizedByApplication + { + std::cout << "not supported event: Qt::MouseEventSynthesizedByQt, " + "Qt::MouseEventSynthesizedByApplication" + << std::endl; + break; + } + + } // end switch + + if (abs(delta) > 0) { + if ((m_gestureActive == true && + m_touchDevice == QTouchDevice::TouchScreen) || + m_gestureActive == false) { + TPoint center(event->pos().x() - width() / 2, + -event->pos().y() + height() / 2); + zoom(center, exp(0.001 * event->delta())); + } + } + event->accept(); } //----------------------------------------------------------------------------- void SwatchViewer::keyPressEvent(QKeyEvent *event) { int key = event->key(); + std::string keyStr = + QKeySequence(key + event->modifiers()).toString().toStdString(); + QAction *action = CommandManager::instance()->getActionFromShortcut(keyStr); + if (action) { + std::string actionId = CommandManager::instance()->getIdFromAction(action); + if (actionId == V_ZoomFit) { + fitView(); + return; + } else if (actionId == V_ZoomReset) { + resetView(); + return; + } + } + if (key == '+' || key == '-' || key == '0') { zoom(key == '+', key == '0'); } @@ -721,6 +825,212 @@ void SwatchViewer::hideEvent(QHideEvent *event) { ::setFxForCaching(0); } +//------------------------------------------------------------------------------- + +void SwatchViewer::mouseDoubleClickEvent(QMouseEvent *event) { + // qDebug() << "[mouseDoubleClickEvent]"; + if (m_gestureActive && !m_stylusUsed) { + m_gestureActive = false; + fitView(); + return; + } +} + +//------------------------------------------------------------------ + +void SwatchViewer::contextMenuEvent(QContextMenuEvent *event) { + QMenu *menu = new QMenu(this); + + QAction *reset = menu->addAction(tr("Reset View")); + reset->setShortcut( + QKeySequence(CommandManager::instance()->getKeyFromId(V_ZoomReset))); + connect(reset, SIGNAL(triggered()), SLOT(resetView())); + + QAction *fit = menu->addAction(tr("Fit To Window")); + fit->setShortcut( + QKeySequence(CommandManager::instance()->getKeyFromId(V_ZoomFit))); + connect(fit, SIGNAL(triggered()), SLOT(fitView())); + + menu->exec(event->globalPos()); + + delete menu; + update(); +} + +//------------------------------------------------------------------ + +void SwatchViewer::tabletEvent(QTabletEvent *e) { + // qDebug() << "[tabletEvent]"; + if (e->type() == QTabletEvent::TabletPress) { + m_stylusUsed = e->pointerType() ? true : false; + } else if (e->type() == QTabletEvent::TabletRelease) { + m_stylusUsed = false; + } + + e->accept(); +} + +//------------------------------------------------------------------ + +void SwatchViewer::gestureEvent(QGestureEvent *e) { + // qDebug() << "[gestureEvent]"; + m_gestureActive = false; + if (QGesture *swipe = e->gesture(Qt::SwipeGesture)) { + m_gestureActive = true; + } else if (QGesture *pan = e->gesture(Qt::PanGesture)) { + m_gestureActive = true; + } + if (QGesture *pinch = e->gesture(Qt::PinchGesture)) { + QPinchGesture *gesture = static_cast(pinch); + QPinchGesture::ChangeFlags changeFlags = gesture->changeFlags(); + QPoint firstCenter = gesture->centerPoint().toPoint(); + if (m_touchDevice == QTouchDevice::TouchScreen) + firstCenter = mapFromGlobal(firstCenter); + + if (gesture->state() == Qt::GestureStarted) { + m_gestureActive = true; + } else if (gesture->state() == Qt::GestureFinished) { + m_gestureActive = false; + m_zooming = false; + m_scaleFactor = 0.0; + } else { + if (changeFlags & QPinchGesture::ScaleFactorChanged) { + double scaleFactor = gesture->scaleFactor(); + // the scale factor makes for too sensitive scaling + // divide the change in half + if (scaleFactor > 1) { + double decimalValue = scaleFactor - 1; + decimalValue /= 1.5; + scaleFactor = 1 + decimalValue; + } else if (scaleFactor < 1) { + double decimalValue = 1 - scaleFactor; + decimalValue /= 1.5; + scaleFactor = 1 - decimalValue; + } + if (!m_zooming) { + double delta = scaleFactor - 1; + m_scaleFactor += delta; + if (m_scaleFactor > .2 || m_scaleFactor < -.2) { + m_zooming = true; + } + } + if (m_zooming) { + TPoint center(firstCenter.x() - width() / 2, + -firstCenter.y() + height() / 2); + zoom(center, scaleFactor); + m_panning = false; + } + m_gestureActive = true; + } + + if (changeFlags & QPinchGesture::CenterPointChanged) { + QPointF centerDelta = + (gesture->centerPoint()) - (gesture->lastCenterPoint()); + if (centerDelta.manhattanLength() > 1) { + // panQt(centerDelta.toPoint()); + } + m_gestureActive = true; + } + } + } + e->accept(); +} + +void SwatchViewer::touchEvent(QTouchEvent *e, int type) { + // qDebug() << "[touchEvent]"; + if (type == QEvent::TouchBegin) { + m_touchActive = true; + m_firstPanPoint = e->touchPoints().at(0).pos(); + // obtain device type + m_touchDevice = e->device()->type(); + } else if (m_touchActive) { + // touchpads must have 2 finger panning for tools and navigation to be + // functional on other devices, 1 finger panning is preferred + if ((e->touchPoints().count() == 2 && + m_touchDevice == QTouchDevice::TouchPad) || + (e->touchPoints().count() == 1 && + m_touchDevice == QTouchDevice::TouchScreen)) { + QTouchEvent::TouchPoint panPoint = e->touchPoints().at(0); + if (!m_panning) { + QPointF deltaPoint = panPoint.pos() - m_firstPanPoint; + // minimize accidental and jerky zooming/rotating during 2 finger + // panning + if ((deltaPoint.manhattanLength() > 100) && !m_zooming) { + m_panning = true; + } + } + if (m_panning) { + QPoint curPos = panPoint.pos().toPoint(); + QPoint lastPos = panPoint.lastPos().toPoint(); + TPoint centerDelta = + TPoint(curPos.x(), curPos.y()) - TPoint(lastPos.x(), lastPos.y()); + pan(centerDelta); + } + } + } + if (type == QEvent::TouchEnd || type == QEvent::TouchCancel) { + m_touchActive = false; + m_panning = false; + } + e->accept(); +} + +bool SwatchViewer::event(QEvent *e) { + /* + switch (e->type()) { + case QEvent::TabletPress: { + QTabletEvent *te = static_cast(e); + qDebug() << "[event] TabletPress: pointerType(" << te->pointerType() + << ") device(" << te->device() << ")"; + } break; + case QEvent::TabletRelease: + qDebug() << "[event] TabletRelease"; + break; + case QEvent::TouchBegin: + qDebug() << "[event] TouchBegin"; + break; + case QEvent::TouchEnd: + qDebug() << "[event] TouchEnd"; + break; + case QEvent::TouchCancel: + qDebug() << "[event] TouchCancel"; + break; + case QEvent::MouseButtonPress: + qDebug() << "[event] MouseButtonPress"; + break; + case QEvent::MouseButtonDblClick: + qDebug() << "[event] MouseButtonDblClick"; + break; + case QEvent::MouseButtonRelease: + qDebug() << "[event] MouseButtonRelease"; + break; + case QEvent::Gesture: + qDebug() << "[event] Gesture"; + break; + default: + break; + } + */ + + if (e->type() == QEvent::Gesture && + CommandManager::instance() + ->getAction(MI_TouchGestureControl) + ->isChecked()) { + gestureEvent(static_cast(e)); + return true; + } + if ((e->type() == QEvent::TouchBegin || e->type() == QEvent::TouchEnd || + e->type() == QEvent::TouchCancel || e->type() == QEvent::TouchUpdate) && + CommandManager::instance() + ->getAction(MI_TouchGestureControl) + ->isChecked()) { + touchEvent(static_cast(e), e->type()); + m_gestureActive = true; + return true; + } + return QWidget::event(e); +} + //============================================================================= // SwatchViewer::ContentRender //-----------------------------------------------------------------------------