diff --git a/doc/how_to_build_win.md b/doc/how_to_build_win.md index fd29505..2ea25e5 100644 --- a/doc/how_to_build_win.md +++ b/doc/how_to_build_win.md @@ -70,6 +70,22 @@ Rename the following files: 1. Open `$opentoonz/toonz/build/OpenToonz.sln` and change to `Debug` or `Release` in the top bar. 2. The output will be in the corresponding folder in `$opentoonz/toonz/build/` +## Building with extended stop motion support for webcams and Canon DSLR cameras. +You will need three additional libraries. + - [OpenCV](https://opencv.org/) (v4.1.0 and later) + - [libjpeg-turbo](https://www.libjpeg-turbo.org/) + - The Canon SDK. This requires applying for the Canon developer program and downloading the SDK. + +Copy the following folders into the `$opentoonz/thirdparty` folder. + - Copy the Header and library folders from the Canon SDK to `$opentoonz/thirdparty/canon` + - Make sure that the library is the one from the EDSDK_64 folder. + - Copy the lib and include folders from libjpeg-turbo64 into `$opentoonz/thirdparty/libjpeg-turbo64`. + +Check the checkbox in CMake to build with stop motion support. +On configuring with CMake or in the environmental variables, specify `OpenCV_DIR` to the `build` folder in the install folder of OpenCV (like `C:/opencv/build`). + +To run the program with stop motion support, you will need to copy the .dll files from opencv2, libjpeg-turbo and the Canon SDK into the folder where your project is built. + ## Running the Program ### Setting Up the Program's Path 1. Copy the entire contents of `$opentoonz/toonz/build/Release` to an appropriate folder. diff --git a/doc/how_to_build_win_ja.md b/doc/how_to_build_win_ja.md index 6985438..7558571 100644 --- a/doc/how_to_build_win_ja.md +++ b/doc/how_to_build_win_ja.md @@ -61,6 +61,17 @@ Visual Studio 2015 と Qt 5.9 でビルドできることを確認していま 1. `$opentoonz/toonz/build/OpenToonz.sln` を開いて Release 構成を選択してビルドします 2. `$opentoonz/toonz/build/Release` にファイルが生成されます +## ストップモーション機能とキヤノン製デジタルカメラのサポートを有効にするには + +以下の3つのライブラリが追加で必要です。 + - [OpenCV](https://opencv.org/) (v4.1.0以上) + - [libjpeg-turbo](https://www.libjpeg-turbo.org/) + - Canon EOS Digital SDK (EDSDK):入手方法の詳細は[キヤノンマーケティングジャパン株式会社Webサイト](https://cweb.canon.jp/eos/info/api-package/)をご参照下さい。 + +CMake上で、`WITH_STOPMOTION` オプションをONにします。CMake上、または環境変数で`OpenCV_DIR` の値をOpenCVのインストールフォルダ内の`build`フォルダの場所に設定します。(例: `C:/opencv/build`) + +実行時にはOpenCV、libjpeg-turboならびにCanon EDSDKの.dllファイルを`OpenToonz.exe` と同じフォルダにコピーします。 + ## 実行 ### 実行可能ファイルなどの配置 1. `$oepntoonz/toonz/build/Release` の中身を適当なフォルダにコピーします diff --git a/stuff/config/qss/Blue/Blue.qss b/stuff/config/qss/Blue/Blue.qss index f8213f4..3546927 100644 --- a/stuff/config/qss/Blue/Blue.qss +++ b/stuff/config/qss/Blue/Blue.qss @@ -1 +1,1962 @@ -.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');qproperty-ActiveCameraColor:#2d7dca;qproperty-SelectedActiveCameraColor:#5796d3;qproperty-OtherCameraColor:#6c797b;qproperty-SelectedOtherCameraColor:#8b8e8f}#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 +/* ----------------------------------------------------------------------------- + Component: Button Styles +----------------------------------------------------------------------------- */ +.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: #ffffff; +} +.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; +} +/* ----------------------------------------------------------------------------- + Component: Frames +----------------------------------------------------------------------------- */ +.frame, +.GroupBox, +#LoadLevelFrame, +#PsdSettingsGroupBox, +#CleanupSettingsFrame, +#OutputSettingsBox, +#OutputSettingsCameraBox, +#SolidLineFrame, +#FunctionParametersPanel, +QGroupBox { + border: 1 solid #212223; + border-radius: 2; +} +/* ----------------------------------------------------------------------------- + Component: Icons +----------------------------------------------------------------------------- */ +/* ----------------------------------------------------------------------------- + Component: Tabs +----------------------------------------------------------------------------- */ +.tab-container, +#TabBarContainer { + background-color: transparent; + qproperty-BottomAboveLineColor: #323435; + qproperty-BottomBelowLineColor: #212223; +} +.tab-flat, +#StopMotionTabBar::tab, +#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, +#StopMotionTabBar::tab:hover, +#StyleEditorTabBar::tab:hover, +#PaletteTabBar::tab:hover, +#FxSettingsTabBar::tab:hover { + background-color: #414345; + color: #94969a; +} +.tab-flat:selected, +#StopMotionTabBar::tab:selected, +#StyleEditorTabBar::tab:selected, +#PaletteTabBar::tab:selected, +#FxSettingsTabBar::tab:selected { + background-color: #414345; + color: #ffffff; + border-bottom-color: #414345; +} +.tab-flat:only-one, +#StopMotionTabBar::tab: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: #ffffff; + 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; +} +/* ----------------------------------------------------------------------------- + Main +----------------------------------------------------------------------------- */ +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 +----------------------------------------------------------------------------- */ +#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: #ffffff; +} +/* ----------------------------------------------------------------------------- + Workspaces +----------------------------------------------------------------------------- */ +#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: #ffffff; +} +#TopBarTab::tab:first { + border-left: 1 solid #212223; +} +#TopBarTab::tab:last { + border-right: 1 solid #212223; +} +/* ----------------------------------------------------------------------------- + Menu +----------------------------------------------------------------------------- */ +QMenu { + background-color: #414345; + border: 1 solid #212223; + padding: 2 0; +} +QMenu::item { + padding: 3 28; +} +QMenu::item:selected { + background-color: #5385a6; + color: #ffffff; +} +QMenu::item:checked { + color: #d6d8dd; +} +QMenu::item:checked:selected { + background-color: #5385a6; + color: #ffffff; +} +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; +} +/* ----------------------------------------------------------------------------- + Titlebars +----------------------------------------------------------------------------- */ +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'); +} +/* ----------------------------------------------------------------------------- + Scrollbars +----------------------------------------------------------------------------- */ +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; +} +/* ----------------------------------------------------------------------------- + Tool Bars +----------------------------------------------------------------------------- */ +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; +} +/* -------------------------------------------------------------------------- */ +/* Scrollable QToolBar Buttons +/* -------------------------------------------------------------------------- */ +.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'); +} +/* ----------------------------------------------------------------------------- + Trees +----------------------------------------------------------------------------- */ +.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: #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/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; +} +/* ----------------------------------------------------------------------------- + Tab Systems +----------------------------------------------------------------------------- */ +#TabBarContainer { + background-color: #323435; +} +/* ----------------------------------------------------------------------------- + Push Button +----------------------------------------------------------------------------- */ +.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; +} +/* ----------------------------------------------------------------------------- + Combo Box +----------------------------------------------------------------------------- */ +.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: #ffffff; +} +/* ----------------------------------------------------------------------------- + Textfield +----------------------------------------------------------------------------- */ +.LineEdit, +QPlainTextEdit, +QLineEdit, +#TaskSheetItem, +#tasksRemoveBox, +#tasksAddBox { + background-color: #28292b; + border: 1 solid #262728; + border-radius: 2; + color: #d6d8dd; + selection-background-color: #5385a6; + selection-color: #ffffff; + 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 +----------------------------------------------------------------------------- */ +.CheckBox, +QCheckBox { + color: #d6d8dd; +} +.CheckBox:hover, +QCheckBox:hover, +.RadioButton:hover, +QRadioButton:hover { + color: #ffffff; +} +.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; + /* fix for QGroupBox */ + padding: 1; + width: 9; + /* fix for QMenu */ +} +.CheckBox::indicator:hover, +QMenu::indicator:hover, +.CheckBox::indicator:checked:hover, +.CheckBox::indicator:indeterminate:hover, +QCheckBox::indicator:hover, +.GroupBox::indicator:hover, +QMenu::indicator:checked:hover, +QMenu::indicator:indeterminate:hover, +QCheckBox::indicator:checked:hover, +QCheckBox::indicator:indeterminate:hover, +.GroupBox::indicator:checked:hover, +.GroupBox::indicator:indeterminate:hover, +QGroupBox::indicator:hover, +QGroupBox::indicator:checked:hover, +QGroupBox::indicator:indeterminate: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:indeterminate, +QMenu::indicator:indeterminate, +QCheckBox::indicator:indeterminate, +.GroupBox::indicator:indeterminate, +QGroupBox::indicator:indeterminate { + background-color: #28292b; + border-color: #262728; + image: url('../Default/imgs/white/checkpartially.svg'); +} +.CheckBox::indicator:indeterminate:disabled, +QMenu::indicator:indeterminate:disabled, +QCheckBox::indicator:indeterminate:disabled, +.GroupBox::indicator:indeterminate:disabled, +QGroupBox::indicator:indeterminate:disabled { + background-color: #353638; + border-color: #353638; + image: url('../Default/imgs/white/checkpartially_disabled.svg'); +} +.CheckBox::indicator:disabled, +QMenu::indicator:disabled, +QCheckBox::indicator:disabled, +.GroupBox::indicator:disabled, +QGroupBox::indicator:disabled { + background-color: #353638; + border-color: #353638; +} +/* ----------------------------------------------------------------------------- + Radio Button +----------------------------------------------------------------------------- */ +.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 +----------------------------------------------------------------------------- */ +.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: #ffffff; +} +.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 +----------------------------------------------------------------------------- */ +.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'); +} +/* ----------------------------------------------------------------------------- + Double Slider +----------------------------------------------------------------------------- */ +#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"); +} +/* ----------------------------------------------------------------------------- + File Browser +----------------------------------------------------------------------------- */ +/* Left Pane +----------------------------------------------------------------------------- */ +#DirTreeView { + background-color: #2d2f30; + alternate-background-color: #2d2f30; + border: 1 solid #212223; + border-right: 0; +} +/* Right Pane +----------------------------------------------------------------------------- */ +DvItemViewerPanel { + qproperty-TextColor: #d6d8dd; + qproperty-AlternateBackground: #3a3b3d; + qproperty-SelectedTextColor: #ffffff; + 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: #ffffff; + qproperty-SelectedItemBackground: #5385a6; + qproperty-FolderTextColor: #9fdaff; + qproperty-SelectedFolderTextColor: #ffffff; + alternate-background-color: #323435; + background-color: #2d2f30; + border: 1 solid #212223; +} +#FileDoesNotExistLabel { + color: #ff0000; +} +/* ----------------------------------------------------------------------------- + Scene Cast +----------------------------------------------------------------------------- */ +#SceneCast QToolBar { + border-top: 1 solid #212223; +} +#SceneCast QToolButton { + margin: 3 1 2 1; + padding: 1; +} +#CastBrowser { + border: 0; + margin: 0; +} +/* ----------------------------------------------------------------------------- + Level Strip +----------------------------------------------------------------------------- */ +#FilmStrip QComboBox { + border-radius: 0; + border-width: 0; +} +#FilmStrip QComboBox QAbstractItemView { + background-color: #414345; +} +/* ----------------------------------------------------------------------------- + Cleanup Settings +----------------------------------------------------------------------------- */ +#CleanupSettings #CleanupSettingsFrame { + margin-top: 2; + margin-bottom: 4; +} +#CleanupSettings QGroupBox { + margin-bottom: 3; +} +ParamsPage { + qproperty-TextColor: #d6d8dd; +} +/* ----------------------------------------------------------------------------- + Camera Settings +----------------------------------------------------------------------------- */ +#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'); +} +/* ----------------------------------------------------------------------------- + Output Settings +----------------------------------------------------------------------------- */ +#OutputSettingsLabel { + color: #9fdaff; +} +/* ----------------------------------------------------------------------------- + Misc +----------------------------------------------------------------------------- */ +PencilTestPopup { + min-height: 730px; + /* Allow for using a 768 screen */ + min-width: 512px; + /* some clipping will still occur on width, but this + allows for filling half of a 1024 screen */ +} +#MatchLineButton { + background-color: #66696c; +} +#MatchLineButton:checked { + background-color: #8c9093; + border: 2 solid #5385a6; + border-radius: 2; +} +#LargeSizedText { + font-size: 17px; +} +/* ----------------------------------------------------------------------------- + Stop Motion Controller +----------------------------------------------------------------------------- */ +#StopMotionController QScrollArea { + margin: 8; +} +#StopMotionController QPushButton { + margin: 2 1; + padding: 0; +} +#StopMotionController #TabBarContainer { + margin-left: -4; +} +#StopMotionController #bottomWidget { + border-top: 1 solid #212223; + padding: 3 2 8 3; +} +#StopMotionController #bottomWidget QPushButton { + padding: 3 5; +} +#StopMotionTabBar::tab::first { + border-left: 1 solid #212223; +} +/* ----------------------------------------------------------------------------- + Unknowns + Legacy +----------------------------------------------------------------------------- */ +#StartupLabel { + padding: 3; +} +#StartupLabel:hover { + background: #5a5d5f; +} +QStatusBar { + background-color: #c0c0c0; +} +QStatusBar::item { + border: 0; +} +QStatusBar QLabel { + background-color: #c0c0c0; +} +QStatusBar #StatusBarLabel { + background-color: #ffffff; + padding: 1 3; +} +#TitleTxtLabel { + color: #9fdaff; +} +/* ----------------------------------------------------------------------------- + Style Editor +----------------------------------------------------------------------------- */ +#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; +} +/* -------------------------------------------------------------------------- */ +/* Horizontal QSlider */ +#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; +} +/* ----------------------------------------------------------------------------- + Palette Viewer / Studio Palette +----------------------------------------------------------------------------- */ +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; +} +/* ----------------------------------------------------------------------------- + Quick Renamer +----------------------------------------------------------------------------- */ +#WordButton { + padding-right: 0; + padding-left: 0; +} +/* ----------------------------------------------------------------------------- + Popup Windows +----------------------------------------------------------------------------- */ +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: #ffffff; +} +QDialog #dialogButtonFrame QPushButton:focus:hover { + background-color: #6c98b6; +} +QDialog #dialogButtonFrame QPushButton:focus:pressed { + background-color: #2b2c2d; + border-color: #262728; + color: #e4e5e9; +} +/* ----------------------------------------------------------------------------- + Scene Settings +----------------------------------------------------------------------------- */ +#SceneSettings QLabel { + color: #9fdaff; +} +/* ----------------------------------------------------------------------------- + Preferences +----------------------------------------------------------------------------- */ +#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: #ffffff; +} +/* ----------------------------------------------------------------------------- + Keyboard Shortcuts +----------------------------------------------------------------------------- */ +#ShortcutTree { + border: 1 solid #212223; +} +#ShortcutTree::item { + padding: 1 0; +} +#ShortcutTree QScrollBar:vertical { + width: 16; + margin-right: -1; +} +/* ----------------------------------------------------------------------------- + New Project / Configure Project Window +----------------------------------------------------------------------------- */ +ProjectPopup QLabel { + color: #9fdaff; +} +/* ----------------------------------------------------------------------------- + PencilTestPopup / CameraCapture Window +----------------------------------------------------------------------------- */ +#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; +} +/* ----------------------------------------------------------------------------- + Schematic Viewer +----------------------------------------------------------------------------- */ +SchematicViewer { + qproperty-TextColor: #d6d8dd; + qproperty-VerticalLineColor: #222222; + 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'); +} +/* ----------------------------------------------------------------------------- + Schematic Node Viewer +----------------------------------------------------------------------------- */ +#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; +} +/* ----------------------------------------------------------------------------- + FX Settings +----------------------------------------------------------------------------- */ +#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; +} +/* ----------------------------------------------------------------------------- + Script Console +----------------------------------------------------------------------------- */ +#ScriptConsole { + font-family: 'Courier New', monospace; + border: 0; + color: #000000; + padding: 3; +} +#ScriptConsole QFrame { + background-color: #dcdcdc; +} +#ScriptConsole TPanelTitleBar { + background-color: #323435; +} +/* ----------------------------------------------------------------------------- + Task Viewer +----------------------------------------------------------------------------- */ +#TaskSheetItemLabel { + color: #d6d8dd; +} +#Tasks QToolBar { + border-bottom: 1 solid #212223; + margin: 0; + padding: 0; +} +#Tasks QToolBar QToolButton { + margin: 2 2 3 2; +} +/* ----------------------------------------------------------------------------- + Tool Bar +----------------------------------------------------------------------------- */ +#ToolBar QToolBar { + padding-left: 2; +} +/* ----------------------------------------------------------------------------- + Tool Options +----------------------------------------------------------------------------- */ +#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; +} +/* ----------------------------------------------------------------------------- + ComboViewer / Viewer / FlipBook +----------------------------------------------------------------------------- */ +#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: #000000; +} +/* ----------------------------------------------------------------------------- + XSheet Viewer +----------------------------------------------------------------------------- */ +/* ScrollAreas (Row, Column and Cell) +----------------------------------------------------------------------------- */ +#xsheetArea, +#ScrollArea { + background-color: #2d2f30; + border: 0; +} +#xsheetScrollArea { + border: 0; +} +#cornerWidget QToolButton { + padding: 0; +} +/* xsheetColumnHeader (Context Menus) +----------------------------------------------------------------------------- */ +#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; +} +/* XSheet Spreadsheet +----------------------------------------------------------------------------- */ +XsheetViewer { + qproperty-TextColor: #d6d8dd; + qproperty-BGColor: #353638; + qproperty-LightLineColor: #262728; + qproperty-MarkerLineColor: #1E96C4; + qproperty-VerticalLineColor: #222222; + 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'); + qproperty-ActiveCameraColor: #2d7dca; + qproperty-SelectedActiveCameraColor: #5796d3; + qproperty-OtherCameraColor: #6c797b; + qproperty-SelectedOtherCameraColor: #8b8e8f; +} +/* XSheet Toolbar +----------------------------------------------------------------------------- */ +#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; +} +/* ----------------------------------------------------------------------------- + Function Editor +----------------------------------------------------------------------------- */ +#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; +} +/* Function Editor Spreadsheet +----------------------------------------------------------------------------- */ +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: #222222; + 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; +} diff --git a/stuff/config/qss/Dark/Dark.qss b/stuff/config/qss/Dark/Dark.qss index b81005f..2fc49e3 100644 --- a/stuff/config/qss/Dark/Dark.qss +++ b/stuff/config/qss/Dark/Dark.qss @@ -1 +1,1962 @@ -.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');qproperty-ActiveCameraColor:#2d7dca;qproperty-SelectedActiveCameraColor:#5796d3;qproperty-OtherCameraColor:#6c797b;qproperty-SelectedOtherCameraColor:#8b8e8f}#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 +/* ----------------------------------------------------------------------------- + Component: Button Styles +----------------------------------------------------------------------------- */ +.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: #ffffff; +} +.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; +} +/* ----------------------------------------------------------------------------- + Component: Frames +----------------------------------------------------------------------------- */ +.frame, +.GroupBox, +#LoadLevelFrame, +#PsdSettingsGroupBox, +#CleanupSettingsFrame, +#OutputSettingsBox, +#OutputSettingsCameraBox, +#SolidLineFrame, +#FunctionParametersPanel, +QGroupBox { + border: 1 solid #161616; + border-radius: 2; +} +/* ----------------------------------------------------------------------------- + Component: Icons +----------------------------------------------------------------------------- */ +/* ----------------------------------------------------------------------------- + Component: Tabs +----------------------------------------------------------------------------- */ +.tab-container, +#TabBarContainer { + background-color: transparent; + qproperty-BottomAboveLineColor: #262626; + qproperty-BottomBelowLineColor: #161616; +} +.tab-flat, +#StopMotionTabBar::tab, +#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, +#StopMotionTabBar::tab:hover, +#StyleEditorTabBar::tab:hover, +#PaletteTabBar::tab:hover, +#FxSettingsTabBar::tab:hover { + background-color: #303030; + color: #8b8b8b; +} +.tab-flat:selected, +#StopMotionTabBar::tab:selected, +#StyleEditorTabBar::tab:selected, +#PaletteTabBar::tab:selected, +#FxSettingsTabBar::tab:selected { + background-color: #303030; + color: #f4f4f4; + border-bottom-color: #303030; +} +.tab-flat:only-one, +#StopMotionTabBar::tab: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; +} +/* ----------------------------------------------------------------------------- + Main +----------------------------------------------------------------------------- */ +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 +----------------------------------------------------------------------------- */ +#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: #ffffff; +} +/* ----------------------------------------------------------------------------- + Workspaces +----------------------------------------------------------------------------- */ +#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; +} +/* ----------------------------------------------------------------------------- + Menu +----------------------------------------------------------------------------- */ +QMenu { + background-color: #303030; + border: 1 solid #161616; + padding: 2 0; +} +QMenu::item { + padding: 3 28; +} +QMenu::item:selected { + background-color: #5385a6; + color: #ffffff; +} +QMenu::item:checked { + color: #cecece; +} +QMenu::item:checked:selected { + background-color: #5385a6; + color: #ffffff; +} +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; +} +/* ----------------------------------------------------------------------------- + Titlebars +----------------------------------------------------------------------------- */ +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'); +} +/* ----------------------------------------------------------------------------- + Scrollbars +----------------------------------------------------------------------------- */ +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; +} +/* ----------------------------------------------------------------------------- + Tool Bars +----------------------------------------------------------------------------- */ +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; +} +/* -------------------------------------------------------------------------- */ +/* Scrollable QToolBar Buttons +/* -------------------------------------------------------------------------- */ +.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'); +} +/* ----------------------------------------------------------------------------- + Trees +----------------------------------------------------------------------------- */ +.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: #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/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; +} +/* ----------------------------------------------------------------------------- + Tab Systems +----------------------------------------------------------------------------- */ +#TabBarContainer { + background-color: #262626; +} +/* ----------------------------------------------------------------------------- + Push Button +----------------------------------------------------------------------------- */ +.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; +} +/* ----------------------------------------------------------------------------- + Combo Box +----------------------------------------------------------------------------- */ +.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: #ffffff; +} +/* ----------------------------------------------------------------------------- + Textfield +----------------------------------------------------------------------------- */ +.LineEdit, +QPlainTextEdit, +QLineEdit, +#TaskSheetItem, +#tasksRemoveBox, +#tasksAddBox { + background-color: #1c1c1c; + border: 1 solid #3d3d3d; + border-radius: 2; + color: #cecece; + selection-background-color: #5385a6; + selection-color: #ffffff; + 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 +----------------------------------------------------------------------------- */ +.CheckBox, +QCheckBox { + color: #cecece; +} +.CheckBox:hover, +QCheckBox:hover, +.RadioButton:hover, +QRadioButton:hover { + color: #ffffff; +} +.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; + /* fix for QGroupBox */ + padding: 1; + width: 9; + /* fix for QMenu */ +} +.CheckBox::indicator:hover, +QMenu::indicator:hover, +.CheckBox::indicator:checked:hover, +.CheckBox::indicator:indeterminate:hover, +QCheckBox::indicator:hover, +.GroupBox::indicator:hover, +QMenu::indicator:checked:hover, +QMenu::indicator:indeterminate:hover, +QCheckBox::indicator:checked:hover, +QCheckBox::indicator:indeterminate:hover, +.GroupBox::indicator:checked:hover, +.GroupBox::indicator:indeterminate:hover, +QGroupBox::indicator:hover, +QGroupBox::indicator:checked:hover, +QGroupBox::indicator:indeterminate: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:indeterminate, +QMenu::indicator:indeterminate, +QCheckBox::indicator:indeterminate, +.GroupBox::indicator:indeterminate, +QGroupBox::indicator:indeterminate { + background-color: #1c1c1c; + border-color: #3d3d3d; + image: url('../Default/imgs/white/checkpartially.svg'); +} +.CheckBox::indicator:indeterminate:disabled, +QMenu::indicator:indeterminate:disabled, +QCheckBox::indicator:indeterminate:disabled, +.GroupBox::indicator:indeterminate:disabled, +QGroupBox::indicator:indeterminate:disabled { + background-color: #262626; + border-color: #191919; + image: url('../Default/imgs/white/checkpartially_disabled.svg'); +} +.CheckBox::indicator:disabled, +QMenu::indicator:disabled, +QCheckBox::indicator:disabled, +.GroupBox::indicator:disabled, +QGroupBox::indicator:disabled { + background-color: #262626; + border-color: #191919; +} +/* ----------------------------------------------------------------------------- + Radio Button +----------------------------------------------------------------------------- */ +.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 +----------------------------------------------------------------------------- */ +.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: #ffffff; +} +.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 +----------------------------------------------------------------------------- */ +.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'); +} +/* ----------------------------------------------------------------------------- + Double Slider +----------------------------------------------------------------------------- */ +#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"); +} +/* ----------------------------------------------------------------------------- + File Browser +----------------------------------------------------------------------------- */ +/* Left Pane +----------------------------------------------------------------------------- */ +#DirTreeView { + background-color: #262626; + alternate-background-color: #262626; + border: 1 solid #161616; + border-right: 0; +} +/* Right Pane +----------------------------------------------------------------------------- */ +DvItemViewerPanel { + qproperty-TextColor: #cecece; + qproperty-AlternateBackground: #282828; + qproperty-SelectedTextColor: #ffffff; + 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: #ffffff; + qproperty-SelectedItemBackground: #5385a6; + qproperty-FolderTextColor: #9fdaff; + qproperty-SelectedFolderTextColor: #ffffff; + alternate-background-color: #2b2b2b; + background-color: #262626; + border: 1 solid #161616; +} +#FileDoesNotExistLabel { + color: #ff0000; +} +/* ----------------------------------------------------------------------------- + Scene Cast +----------------------------------------------------------------------------- */ +#SceneCast QToolBar { + border-top: 1 solid #161616; +} +#SceneCast QToolButton { + margin: 3 1 2 1; + padding: 1; +} +#CastBrowser { + border: 0; + margin: 0; +} +/* ----------------------------------------------------------------------------- + Level Strip +----------------------------------------------------------------------------- */ +#FilmStrip QComboBox { + border-radius: 0; + border-width: 0; +} +#FilmStrip QComboBox QAbstractItemView { + background-color: #303030; +} +/* ----------------------------------------------------------------------------- + Cleanup Settings +----------------------------------------------------------------------------- */ +#CleanupSettings #CleanupSettingsFrame { + margin-top: 2; + margin-bottom: 4; +} +#CleanupSettings QGroupBox { + margin-bottom: 3; +} +ParamsPage { + qproperty-TextColor: #cecece; +} +/* ----------------------------------------------------------------------------- + Camera Settings +----------------------------------------------------------------------------- */ +#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'); +} +/* ----------------------------------------------------------------------------- + Output Settings +----------------------------------------------------------------------------- */ +#OutputSettingsLabel { + color: #9fdaff; +} +/* ----------------------------------------------------------------------------- + Misc +----------------------------------------------------------------------------- */ +PencilTestPopup { + min-height: 730px; + /* Allow for using a 768 screen */ + min-width: 512px; + /* some clipping will still occur on width, but this + allows for filling half of a 1024 screen */ +} +#MatchLineButton { + background-color: #565656; +} +#MatchLineButton:checked { + background-color: #7d7d7d; + border: 2 solid #5385a6; + border-radius: 2; +} +#LargeSizedText { + font-size: 17px; +} +/* ----------------------------------------------------------------------------- + Stop Motion Controller +----------------------------------------------------------------------------- */ +#StopMotionController QScrollArea { + margin: 8; +} +#StopMotionController QPushButton { + margin: 2 1; + padding: 0; +} +#StopMotionController #TabBarContainer { + margin-left: -4; +} +#StopMotionController #bottomWidget { + border-top: 1 solid #161616; + padding: 3 2 8 3; +} +#StopMotionController #bottomWidget QPushButton { + padding: 3 5; +} +#StopMotionTabBar::tab::first { + border-left: 1 solid #161616; +} +/* ----------------------------------------------------------------------------- + Unknowns + Legacy +----------------------------------------------------------------------------- */ +#StartupLabel { + padding: 3; +} +#StartupLabel:hover { + background: #4a4a4a; +} +QStatusBar { + background-color: #c0c0c0; +} +QStatusBar::item { + border: 0; +} +QStatusBar QLabel { + background-color: #c0c0c0; +} +QStatusBar #StatusBarLabel { + background-color: #ffffff; + padding: 1 3; +} +#TitleTxtLabel { + color: #9fdaff; +} +/* ----------------------------------------------------------------------------- + Style Editor +----------------------------------------------------------------------------- */ +#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; +} +/* -------------------------------------------------------------------------- */ +/* Horizontal QSlider */ +#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; +} +/* ----------------------------------------------------------------------------- + Palette Viewer / Studio Palette +----------------------------------------------------------------------------- */ +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; +} +/* ----------------------------------------------------------------------------- + Quick Renamer +----------------------------------------------------------------------------- */ +#WordButton { + padding-right: 0; + padding-left: 0; +} +/* ----------------------------------------------------------------------------- + Popup Windows +----------------------------------------------------------------------------- */ +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; +} +/* ----------------------------------------------------------------------------- + Scene Settings +----------------------------------------------------------------------------- */ +#SceneSettings QLabel { + color: #9fdaff; +} +/* ----------------------------------------------------------------------------- + Preferences +----------------------------------------------------------------------------- */ +#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: #ffffff; +} +/* ----------------------------------------------------------------------------- + Keyboard Shortcuts +----------------------------------------------------------------------------- */ +#ShortcutTree { + border: 1 solid #161616; +} +#ShortcutTree::item { + padding: 1 0; +} +#ShortcutTree QScrollBar:vertical { + width: 16; + margin-right: -1; +} +/* ----------------------------------------------------------------------------- + New Project / Configure Project Window +----------------------------------------------------------------------------- */ +ProjectPopup QLabel { + color: #9fdaff; +} +/* ----------------------------------------------------------------------------- + PencilTestPopup / CameraCapture Window +----------------------------------------------------------------------------- */ +#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; +} +/* ----------------------------------------------------------------------------- + Schematic Viewer +----------------------------------------------------------------------------- */ +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'); +} +/* ----------------------------------------------------------------------------- + Schematic Node Viewer +----------------------------------------------------------------------------- */ +#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; +} +/* ----------------------------------------------------------------------------- + FX Settings +----------------------------------------------------------------------------- */ +#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; +} +/* ----------------------------------------------------------------------------- + Script Console +----------------------------------------------------------------------------- */ +#ScriptConsole { + font-family: 'Courier New', monospace; + border: 0; + color: #000000; + padding: 3; +} +#ScriptConsole QFrame { + background-color: #dcdcdc; +} +#ScriptConsole TPanelTitleBar { + background-color: #262626; +} +/* ----------------------------------------------------------------------------- + Task Viewer +----------------------------------------------------------------------------- */ +#TaskSheetItemLabel { + color: #cecece; +} +#Tasks QToolBar { + border-bottom: 1 solid #161616; + margin: 0; + padding: 0; +} +#Tasks QToolBar QToolButton { + margin: 2 2 3 2; +} +/* ----------------------------------------------------------------------------- + Tool Bar +----------------------------------------------------------------------------- */ +#ToolBar QToolBar { + padding-left: 2; +} +/* ----------------------------------------------------------------------------- + Tool Options +----------------------------------------------------------------------------- */ +#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; +} +/* ----------------------------------------------------------------------------- + ComboViewer / Viewer / FlipBook +----------------------------------------------------------------------------- */ +#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: #000000; +} +/* ----------------------------------------------------------------------------- + XSheet Viewer +----------------------------------------------------------------------------- */ +/* ScrollAreas (Row, Column and Cell) +----------------------------------------------------------------------------- */ +#xsheetArea, +#ScrollArea { + background-color: #1c1c1c; + border: 0; +} +#xsheetScrollArea { + border: 0; +} +#cornerWidget QToolButton { + padding: 0; +} +/* xsheetColumnHeader (Context Menus) +----------------------------------------------------------------------------- */ +#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; +} +/* XSheet Spreadsheet +----------------------------------------------------------------------------- */ +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: #444444; + 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'); + qproperty-ActiveCameraColor: #2d7dca; + qproperty-SelectedActiveCameraColor: #5796d3; + qproperty-OtherCameraColor: #6c797b; + qproperty-SelectedOtherCameraColor: #8b8e8f; +} +/* XSheet Toolbar +----------------------------------------------------------------------------- */ +#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; +} +/* ----------------------------------------------------------------------------- + Function Editor +----------------------------------------------------------------------------- */ +#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; +} +/* Function Editor Spreadsheet +----------------------------------------------------------------------------- */ +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; +} diff --git a/stuff/config/qss/Default/Default.qss b/stuff/config/qss/Default/Default.qss index 35fa151..dc2f370 100644 --- a/stuff/config/qss/Default/Default.qss +++ b/stuff/config/qss/Default/Default.qss @@ -1 +1,1962 @@ -.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');qproperty-ActiveCameraColor:#2d7dca;qproperty-SelectedActiveCameraColor:#5796d3;qproperty-OtherCameraColor:#6c797b;qproperty-SelectedOtherCameraColor:#8b8e8f}#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 +/* ----------------------------------------------------------------------------- + Component: Button Styles +----------------------------------------------------------------------------- */ +.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: #ffffff; +} +.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; +} +/* ----------------------------------------------------------------------------- + Component: Frames +----------------------------------------------------------------------------- */ +.frame, +.GroupBox, +#LoadLevelFrame, +#PsdSettingsGroupBox, +#CleanupSettingsFrame, +#OutputSettingsBox, +#OutputSettingsCameraBox, +#SolidLineFrame, +#FunctionParametersPanel, +QGroupBox { + border: 1 solid #272727; + border-radius: 2; +} +/* ----------------------------------------------------------------------------- + Component: Icons +----------------------------------------------------------------------------- */ +/* ----------------------------------------------------------------------------- + Component: Tabs +----------------------------------------------------------------------------- */ +.tab-container, +#TabBarContainer { + background-color: transparent; + qproperty-BottomAboveLineColor: #393939; + qproperty-BottomBelowLineColor: #272727; +} +.tab-flat, +#StopMotionTabBar::tab, +#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, +#StopMotionTabBar::tab:hover, +#StyleEditorTabBar::tab:hover, +#PaletteTabBar::tab:hover, +#FxSettingsTabBar::tab:hover { + background-color: #484848; + color: #a1a1a1; +} +.tab-flat:selected, +#StopMotionTabBar::tab:selected, +#StyleEditorTabBar::tab:selected, +#PaletteTabBar::tab:selected, +#FxSettingsTabBar::tab:selected { + background-color: #484848; + color: #ffffff; + border-bottom-color: #484848; +} +.tab-flat:only-one, +#StopMotionTabBar::tab: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: #ffffff; + 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; +} +/* ----------------------------------------------------------------------------- + Main +----------------------------------------------------------------------------- */ +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 +----------------------------------------------------------------------------- */ +#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: #ffffff; +} +/* ----------------------------------------------------------------------------- + Workspaces +----------------------------------------------------------------------------- */ +#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: #ffffff; +} +#TopBarTab::tab:first { + border-left: 1 solid #272727; +} +#TopBarTab::tab:last { + border-right: 1 solid #272727; +} +/* ----------------------------------------------------------------------------- + Menu +----------------------------------------------------------------------------- */ +QMenu { + background-color: #484848; + border: 1 solid #272727; + padding: 2 0; +} +QMenu::item { + padding: 3 28; +} +QMenu::item:selected { + background-color: #5385a6; + color: #ffffff; +} +QMenu::item:checked { + color: #e6e6e6; +} +QMenu::item:checked:selected { + background-color: #5385a6; + color: #ffffff; +} +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; +} +/* ----------------------------------------------------------------------------- + Titlebars +----------------------------------------------------------------------------- */ +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'); +} +/* ----------------------------------------------------------------------------- + Scrollbars +----------------------------------------------------------------------------- */ +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; +} +/* ----------------------------------------------------------------------------- + Tool Bars +----------------------------------------------------------------------------- */ +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; +} +/* -------------------------------------------------------------------------- */ +/* Scrollable QToolBar Buttons +/* -------------------------------------------------------------------------- */ +.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'); +} +/* ----------------------------------------------------------------------------- + Trees +----------------------------------------------------------------------------- */ +.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: #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('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; +} +/* ----------------------------------------------------------------------------- + Tab Systems +----------------------------------------------------------------------------- */ +#TabBarContainer { + background-color: #393939; +} +/* ----------------------------------------------------------------------------- + Push Button +----------------------------------------------------------------------------- */ +.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: #555555; + border-color: #484848; + color: #808080; +} +#PushButton_NoPadding { + padding: 3; +} +/* ----------------------------------------------------------------------------- + Combo Box +----------------------------------------------------------------------------- */ +.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: #ffffff; +} +/* ----------------------------------------------------------------------------- + Textfield +----------------------------------------------------------------------------- */ +.LineEdit, +QPlainTextEdit, +QLineEdit, +#TaskSheetItem, +#tasksRemoveBox, +#tasksAddBox { + background-color: #2f2f2f; + border: 1 solid #2c2c2c; + border-radius: 2; + color: #e6e6e6; + selection-background-color: #5385a6; + selection-color: #ffffff; + 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 +----------------------------------------------------------------------------- */ +.CheckBox, +QCheckBox { + color: #e6e6e6; +} +.CheckBox:hover, +QCheckBox:hover, +.RadioButton:hover, +QRadioButton:hover { + color: #ffffff; +} +.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; + /* fix for QGroupBox */ + padding: 1; + width: 9; + /* fix for QMenu */ +} +.CheckBox::indicator:hover, +QMenu::indicator:hover, +.CheckBox::indicator:checked:hover, +.CheckBox::indicator:indeterminate:hover, +QCheckBox::indicator:hover, +.GroupBox::indicator:hover, +QMenu::indicator:checked:hover, +QMenu::indicator:indeterminate:hover, +QCheckBox::indicator:checked:hover, +QCheckBox::indicator:indeterminate:hover, +.GroupBox::indicator:checked:hover, +.GroupBox::indicator:indeterminate:hover, +QGroupBox::indicator:hover, +QGroupBox::indicator:checked:hover, +QGroupBox::indicator:indeterminate: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:indeterminate, +QMenu::indicator:indeterminate, +QCheckBox::indicator:indeterminate, +.GroupBox::indicator:indeterminate, +QGroupBox::indicator:indeterminate { + background-color: #2f2f2f; + border-color: #2c2c2c; + image: url('imgs/white/checkpartially.svg'); +} +.CheckBox::indicator:indeterminate:disabled, +QMenu::indicator:indeterminate:disabled, +QCheckBox::indicator:indeterminate:disabled, +.GroupBox::indicator:indeterminate:disabled, +QGroupBox::indicator:indeterminate:disabled { + background-color: #3b3b3b; + border-color: #3b3b3b; + image: url('imgs/white/checkpartially_disabled.svg'); +} +.CheckBox::indicator:disabled, +QMenu::indicator:disabled, +QCheckBox::indicator:disabled, +.GroupBox::indicator:disabled, +QGroupBox::indicator:disabled { + background-color: #3b3b3b; + border-color: #3b3b3b; +} +/* ----------------------------------------------------------------------------- + Radio Button +----------------------------------------------------------------------------- */ +.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 +----------------------------------------------------------------------------- */ +.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: #ffffff; +} +.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 +----------------------------------------------------------------------------- */ +.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'); +} +/* ----------------------------------------------------------------------------- + Double Slider +----------------------------------------------------------------------------- */ +#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"); +} +/* ----------------------------------------------------------------------------- + File Browser +----------------------------------------------------------------------------- */ +/* Left Pane +----------------------------------------------------------------------------- */ +#DirTreeView { + background-color: #343434; + alternate-background-color: #343434; + border: 1 solid #272727; + border-right: 0; +} +/* Right Pane +----------------------------------------------------------------------------- */ +DvItemViewerPanel { + qproperty-TextColor: #e6e6e6; + qproperty-AlternateBackground: #404040; + qproperty-SelectedTextColor: #ffffff; + 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: #ffffff; + qproperty-SelectedItemBackground: #5385a6; + qproperty-FolderTextColor: #9fdaff; + qproperty-SelectedFolderTextColor: #ffffff; + alternate-background-color: #393939; + background-color: #343434; + border: 1 solid #272727; +} +#FileDoesNotExistLabel { + color: #ff0000; +} +/* ----------------------------------------------------------------------------- + Scene Cast +----------------------------------------------------------------------------- */ +#SceneCast QToolBar { + border-top: 1 solid #272727; +} +#SceneCast QToolButton { + margin: 3 1 2 1; + padding: 1; +} +#CastBrowser { + border: 0; + margin: 0; +} +/* ----------------------------------------------------------------------------- + Level Strip +----------------------------------------------------------------------------- */ +#FilmStrip QComboBox { + border-radius: 0; + border-width: 0; +} +#FilmStrip QComboBox QAbstractItemView { + background-color: #484848; +} +/* ----------------------------------------------------------------------------- + Cleanup Settings +----------------------------------------------------------------------------- */ +#CleanupSettings #CleanupSettingsFrame { + margin-top: 2; + margin-bottom: 4; +} +#CleanupSettings QGroupBox { + margin-bottom: 3; +} +ParamsPage { + qproperty-TextColor: #e6e6e6; +} +/* ----------------------------------------------------------------------------- + Camera Settings +----------------------------------------------------------------------------- */ +#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'); +} +/* ----------------------------------------------------------------------------- + Output Settings +----------------------------------------------------------------------------- */ +#OutputSettingsLabel { + color: #9fdaff; +} +/* ----------------------------------------------------------------------------- + Misc +----------------------------------------------------------------------------- */ +PencilTestPopup { + min-height: 730px; + /* Allow for using a 768 screen */ + min-width: 512px; + /* some clipping will still occur on width, but this + allows for filling half of a 1024 screen */ +} +#MatchLineButton { + background-color: #6e6e6e; +} +#MatchLineButton:checked { + background-color: #949494; + border: 2 solid #5385a6; + border-radius: 2; +} +#LargeSizedText { + font-size: 17px; +} +/* ----------------------------------------------------------------------------- + Stop Motion Controller +----------------------------------------------------------------------------- */ +#StopMotionController QScrollArea { + margin: 8; +} +#StopMotionController QPushButton { + margin: 2 1; + padding: 0; +} +#StopMotionController #TabBarContainer { + margin-left: -4; +} +#StopMotionController #bottomWidget { + border-top: 1 solid #272727; + padding: 3 2 8 3; +} +#StopMotionController #bottomWidget QPushButton { + padding: 3 5; +} +#StopMotionTabBar::tab::first { + border-left: 1 solid #272727; +} +/* ----------------------------------------------------------------------------- + Unknowns + Legacy +----------------------------------------------------------------------------- */ +#StartupLabel { + padding: 3; +} +#StartupLabel:hover { + background: #626262; +} +QStatusBar { + background-color: #c0c0c0; +} +QStatusBar::item { + border: 0; +} +QStatusBar QLabel { + background-color: #c0c0c0; +} +QStatusBar #StatusBarLabel { + background-color: #ffffff; + padding: 1 3; +} +#TitleTxtLabel { + color: #9fdaff; +} +/* ----------------------------------------------------------------------------- + Style Editor +----------------------------------------------------------------------------- */ +#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; +} +/* -------------------------------------------------------------------------- */ +/* Horizontal QSlider */ +#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; +} +/* ----------------------------------------------------------------------------- + Palette Viewer / Studio Palette +----------------------------------------------------------------------------- */ +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; +} +/* ----------------------------------------------------------------------------- + Quick Renamer +----------------------------------------------------------------------------- */ +#WordButton { + padding-right: 0; + padding-left: 0; +} +/* ----------------------------------------------------------------------------- + Popup Windows +----------------------------------------------------------------------------- */ +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: #ffffff; +} +QDialog #dialogButtonFrame QPushButton:focus:hover { + background-color: #6c98b6; +} +QDialog #dialogButtonFrame QPushButton:focus:pressed { + background-color: #313131; + border-color: #2c2c2c; + color: #f3f3f3; +} +/* ----------------------------------------------------------------------------- + Scene Settings +----------------------------------------------------------------------------- */ +#SceneSettings QLabel { + color: #9fdaff; +} +/* ----------------------------------------------------------------------------- + Preferences +----------------------------------------------------------------------------- */ +#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: #ffffff; +} +/* ----------------------------------------------------------------------------- + Keyboard Shortcuts +----------------------------------------------------------------------------- */ +#ShortcutTree { + border: 1 solid #272727; +} +#ShortcutTree::item { + padding: 1 0; +} +#ShortcutTree QScrollBar:vertical { + width: 16; + margin-right: -1; +} +/* ----------------------------------------------------------------------------- + New Project / Configure Project Window +----------------------------------------------------------------------------- */ +ProjectPopup QLabel { + color: #9fdaff; +} +/* ----------------------------------------------------------------------------- + PencilTestPopup / CameraCapture Window +----------------------------------------------------------------------------- */ +#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; +} +/* ----------------------------------------------------------------------------- + Schematic Viewer +----------------------------------------------------------------------------- */ +SchematicViewer { + qproperty-TextColor: #e6e6e6; + qproperty-VerticalLineColor: #222222; + 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'); +} +/* ----------------------------------------------------------------------------- + Schematic Node Viewer +----------------------------------------------------------------------------- */ +#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; +} +/* ----------------------------------------------------------------------------- + FX Settings +----------------------------------------------------------------------------- */ +#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; +} +/* ----------------------------------------------------------------------------- + Script Console +----------------------------------------------------------------------------- */ +#ScriptConsole { + font-family: 'Courier New', monospace; + border: 0; + color: #000000; + padding: 3; +} +#ScriptConsole QFrame { + background-color: #dcdcdc; +} +#ScriptConsole TPanelTitleBar { + background-color: #393939; +} +/* ----------------------------------------------------------------------------- + Task Viewer +----------------------------------------------------------------------------- */ +#TaskSheetItemLabel { + color: #e6e6e6; +} +#Tasks QToolBar { + border-bottom: 1 solid #272727; + margin: 0; + padding: 0; +} +#Tasks QToolBar QToolButton { + margin: 2 2 3 2; +} +/* ----------------------------------------------------------------------------- + Tool Bar +----------------------------------------------------------------------------- */ +#ToolBar QToolBar { + padding-left: 2; +} +/* ----------------------------------------------------------------------------- + Tool Options +----------------------------------------------------------------------------- */ +#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; +} +/* ----------------------------------------------------------------------------- + ComboViewer / Viewer / FlipBook +----------------------------------------------------------------------------- */ +#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: #000000; +} +/* ----------------------------------------------------------------------------- + XSheet Viewer +----------------------------------------------------------------------------- */ +/* ScrollAreas (Row, Column and Cell) +----------------------------------------------------------------------------- */ +#xsheetArea, +#ScrollArea { + background-color: #343434; + border: 0; +} +#xsheetScrollArea { + border: 0; +} +#cornerWidget QToolButton { + padding: 0; +} +/* xsheetColumnHeader (Context Menus) +----------------------------------------------------------------------------- */ +#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; +} +/* XSheet Spreadsheet +----------------------------------------------------------------------------- */ +XsheetViewer { + qproperty-TextColor: #e6e6e6; + qproperty-BGColor: #3b3b3b; + qproperty-LightLineColor: #2c2c2c; + qproperty-MarkerLineColor: #1E96C4; + qproperty-VerticalLineColor: #222222; + 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'); + qproperty-ActiveCameraColor: #2d7dca; + qproperty-SelectedActiveCameraColor: #5796d3; + qproperty-OtherCameraColor: #6c797b; + qproperty-SelectedOtherCameraColor: #8b8e8f; +} +/* XSheet Toolbar +----------------------------------------------------------------------------- */ +#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; +} +/* ----------------------------------------------------------------------------- + Function Editor +----------------------------------------------------------------------------- */ +#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; +} +/* Function Editor Spreadsheet +----------------------------------------------------------------------------- */ +FunctionPanel { + qproperty-BGColor: #3b3b3b; + qproperty-ValueLineColor: #2f2f2f; + qproperty-FrameLineColor: #2f2f2f; + qproperty-OtherCurvesColor: #888888; + qproperty-RulerBackground: #333333; + 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: #222222; + 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 #333333; + 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; +} diff --git a/stuff/config/qss/Default/imgs/black/checkpartially.svg b/stuff/config/qss/Default/imgs/black/checkpartially.svg new file mode 100644 index 0000000..648adcf --- /dev/null +++ b/stuff/config/qss/Default/imgs/black/checkpartially.svg @@ -0,0 +1,58 @@ + +image/svg+xml + + + + \ No newline at end of file diff --git a/stuff/config/qss/Default/imgs/black/checkpartially_disabled.svg b/stuff/config/qss/Default/imgs/black/checkpartially_disabled.svg new file mode 100644 index 0000000..dfcf829 --- /dev/null +++ b/stuff/config/qss/Default/imgs/black/checkpartially_disabled.svg @@ -0,0 +1,58 @@ + +image/svg+xml + + + + \ No newline at end of file diff --git a/stuff/config/qss/Default/imgs/white/checkpartially.svg b/stuff/config/qss/Default/imgs/white/checkpartially.svg new file mode 100644 index 0000000..14de2aa --- /dev/null +++ b/stuff/config/qss/Default/imgs/white/checkpartially.svg @@ -0,0 +1,58 @@ + +image/svg+xml + + + + \ No newline at end of file diff --git a/stuff/config/qss/Default/imgs/white/checkpartially_disabled.svg b/stuff/config/qss/Default/imgs/white/checkpartially_disabled.svg new file mode 100644 index 0000000..094ce6f --- /dev/null +++ b/stuff/config/qss/Default/imgs/white/checkpartially_disabled.svg @@ -0,0 +1,58 @@ + +image/svg+xml + + + + \ No newline at end of file diff --git a/stuff/config/qss/Default/less/layouts/controls.less b/stuff/config/qss/Default/less/layouts/controls.less index acd2944..7fac506 100644 --- a/stuff/config/qss/Default/less/layouts/controls.less +++ b/stuff/config/qss/Default/less/layouts/controls.less @@ -151,6 +151,19 @@ QPlainTextEdit image: url('@{img-url}/checkmark_disabled.svg'); } } + &:indeterminate { + background-color: @checkbox-bg-color-checked; + border-color: @checkbox-border-color-checked; + image: url('@{img-url}/checkpartially.svg'); + &:hover { + &:extend(.CheckBox::indicator:hover); + } + &:disabled { + background-color: @checkbox-bg-color-disabled; + border-color: @checkbox-border-color-disabled; + image: url('@{img-url}/checkpartially_disabled.svg'); + } + } &:disabled { background-color: @checkbox-bg-color-disabled; border-color: @checkbox-border-color-disabled; diff --git a/stuff/config/qss/Default/less/layouts/misc.less b/stuff/config/qss/Default/less/layouts/misc.less index d1fb1b9..b22dbc9 100644 --- a/stuff/config/qss/Default/less/layouts/misc.less +++ b/stuff/config/qss/Default/less/layouts/misc.less @@ -26,6 +26,44 @@ PencilTestPopup { } /* ----------------------------------------------------------------------------- + Stop Motion Controller +----------------------------------------------------------------------------- */ + +#StopMotionController { + & QScrollArea { + margin: 8; + } + & QPushButton { + // Adds spacing to buttons, but this setting may be temporary + margin: 2 1; + padding: 0; + } + & #TabBarContainer { + margin-left: -4; // reset left edge margin + } + & #bottomWidget { + border-top: 1 solid @accent; + padding: 3 2 8 3; + & QPushButton { + // override above margin reset + padding: 3 5; + } + } +} + +#StopMotionTabBar { + &::tab { + &:extend(.tab-flat all); + &::first { + // add a border to first item on + // the left side due to the spacer + // coded in the cpp file + border-left: 1 solid @accent; + } + } +} + +/* ----------------------------------------------------------------------------- Unknowns + Legacy ----------------------------------------------------------------------------- */ // below are classes that are unknown and considered legacy diff --git a/stuff/config/qss/Light/Light.qss b/stuff/config/qss/Light/Light.qss index 6b3bc5c..a3608db 100644 --- a/stuff/config/qss/Light/Light.qss +++ b/stuff/config/qss/Light/Light.qss @@ -1 +1,1963 @@ -.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');qproperty-ActiveCameraColor:#6ba5de;qproperty-SelectedActiveCameraColor:#98bee4;qproperty-OtherCameraColor:#8f9c9e;qproperty-SelectedOtherCameraColor:#aeb1b2}#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 +/* ----------------------------------------------------------------------------- + Component: Button Styles +----------------------------------------------------------------------------- */ +.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: #000000; + 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: #bbbbbb; + border-color: #525252; + color: #000000; +} +.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: #000000; +} +.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: #bbbbbb; +} +.button-flat:pressed, +PaletteViewer QToolBar QToolButton:pressed { + background-color: #404040; +} +/* ----------------------------------------------------------------------------- + Component: Frames +----------------------------------------------------------------------------- */ +.frame, +.GroupBox, +#LoadLevelFrame, +#PsdSettingsGroupBox, +#CleanupSettingsFrame, +#OutputSettingsBox, +#OutputSettingsCameraBox, +#SolidLineFrame, +#FunctionParametersPanel, +QGroupBox { + border: 1 solid #404040; + border-radius: 2; +} +/* ----------------------------------------------------------------------------- + Component: Icons +----------------------------------------------------------------------------- */ +/* ----------------------------------------------------------------------------- + Component: Tabs +----------------------------------------------------------------------------- */ +.tab-container, +#TabBarContainer { + background-color: transparent; + qproperty-BottomAboveLineColor: #6c6c6c; + qproperty-BottomBelowLineColor: #404040; +} +.tab-flat, +#StopMotionTabBar::tab, +#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, +#StopMotionTabBar::tab:hover, +#StyleEditorTabBar::tab:hover, +#PaletteTabBar::tab:hover, +#FxSettingsTabBar::tab:hover { + background-color: #6e6e6e; + color: #fff; +} +.tab-flat:selected, +#StopMotionTabBar::tab:selected, +#StyleEditorTabBar::tab:selected, +#PaletteTabBar::tab:selected, +#FxSettingsTabBar::tab:selected { + background-color: #808080; + color: #000; + border-bottom-color: #808080; +} +.tab-flat:only-one, +#StopMotionTabBar::tab: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; +} +/* ----------------------------------------------------------------------------- + Main +----------------------------------------------------------------------------- */ +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 +----------------------------------------------------------------------------- */ +#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; +} +/* ----------------------------------------------------------------------------- + Workspaces +----------------------------------------------------------------------------- */ +#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; +} +/* ----------------------------------------------------------------------------- + Menu +----------------------------------------------------------------------------- */ +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; +} +/* ----------------------------------------------------------------------------- + Titlebars +----------------------------------------------------------------------------- */ +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'); +} +/* ----------------------------------------------------------------------------- + Scrollbars +----------------------------------------------------------------------------- */ +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 #555555; + 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; +} +/* ----------------------------------------------------------------------------- + Tool Bars +----------------------------------------------------------------------------- */ +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; +} +/* -------------------------------------------------------------------------- */ +/* Scrollable QToolBar Buttons +/* -------------------------------------------------------------------------- */ +.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: #bbbbbb; +} +.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'); +} +/* ----------------------------------------------------------------------------- + Trees +----------------------------------------------------------------------------- */ +.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; +} +/* ----------------------------------------------------------------------------- + Tab Systems +----------------------------------------------------------------------------- */ +#TabBarContainer { + background-color: #6c6c6c; +} +/* ----------------------------------------------------------------------------- + Push Button +----------------------------------------------------------------------------- */ +.Button, +QPushButton, +.ComboBox, +.ComboBox:checked, +QComboBox, +QComboBox:checked { + background-color: #a6a6a6; + border: 1 solid #525252; + border-radius: 2; + color: #000000; + 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: #bbbbbb; + border-color: #525252; + color: #000000; +} +.Button:pressed, +QPushButton:pressed, +#ViewerFpsSlider::sub-line:horizontal:pressed, +#ViewerFpsSlider::add-line:horizontal:pressed { + background-color: #e1e1e1; + border-color: #525252; + color: #000000; +} +.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; +} +/* ----------------------------------------------------------------------------- + Combo Box +----------------------------------------------------------------------------- */ +.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; +} +/* ----------------------------------------------------------------------------- + Textfield +----------------------------------------------------------------------------- */ +.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 +----------------------------------------------------------------------------- */ +.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; + /* fix for QGroupBox */ + padding: 1; + width: 9; + /* fix for QMenu */ +} +.CheckBox::indicator:hover, +QMenu::indicator:hover, +.CheckBox::indicator:checked:hover, +.CheckBox::indicator:indeterminate:hover, +QCheckBox::indicator:hover, +.GroupBox::indicator:hover, +QMenu::indicator:checked:hover, +QMenu::indicator:indeterminate:hover, +QCheckBox::indicator:checked:hover, +QCheckBox::indicator:indeterminate:hover, +.GroupBox::indicator:checked:hover, +.GroupBox::indicator:indeterminate:hover, +QGroupBox::indicator:hover, +QGroupBox::indicator:checked:hover, +QGroupBox::indicator:indeterminate: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:indeterminate, +QMenu::indicator:indeterminate, +QCheckBox::indicator:indeterminate, +.GroupBox::indicator:indeterminate, +QGroupBox::indicator:indeterminate { + background-color: #cdcdcd; + border-color: #525252; + image: url('../Default/imgs/black/checkpartially.svg'); +} +.CheckBox::indicator:indeterminate:disabled, +QMenu::indicator:indeterminate:disabled, +QCheckBox::indicator:indeterminate:disabled, +.GroupBox::indicator:indeterminate:disabled, +QGroupBox::indicator:indeterminate:disabled { + background-color: #8d8d8d; + border-color: #737373; + image: url('../Default/imgs/black/checkpartially_disabled.svg'); +} +.CheckBox::indicator:disabled, +QMenu::indicator:disabled, +QCheckBox::indicator:disabled, +.GroupBox::indicator:disabled, +QGroupBox::indicator:disabled { + background-color: #8d8d8d; + border-color: #737373; +} +/* ----------------------------------------------------------------------------- + Radio Button +----------------------------------------------------------------------------- */ +.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 +----------------------------------------------------------------------------- */ +.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 +----------------------------------------------------------------------------- */ +.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'); +} +/* ----------------------------------------------------------------------------- + Double Slider +----------------------------------------------------------------------------- */ +#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"); +} +/* ----------------------------------------------------------------------------- + File Browser +----------------------------------------------------------------------------- */ +/* Left Pane +----------------------------------------------------------------------------- */ +#DirTreeView { + background-color: #949494; + alternate-background-color: #949494; + border: 1 solid #404040; + border-right: 0; +} +/* Right Pane +----------------------------------------------------------------------------- */ +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: #ff0000; +} +/* ----------------------------------------------------------------------------- + Scene Cast +----------------------------------------------------------------------------- */ +#SceneCast QToolBar { + border-top: 1 solid #404040; +} +#SceneCast QToolButton { + margin: 3 1 2 1; + padding: 1; +} +#CastBrowser { + border: 0; + margin: 0; +} +/* ----------------------------------------------------------------------------- + Level Strip +----------------------------------------------------------------------------- */ +#FilmStrip QComboBox { + border-radius: 0; + border-width: 0; +} +#FilmStrip QComboBox QAbstractItemView { + background-color: #949494; +} +/* ----------------------------------------------------------------------------- + Cleanup Settings +----------------------------------------------------------------------------- */ +#CleanupSettings #CleanupSettingsFrame { + margin-top: 2; + margin-bottom: 4; +} +#CleanupSettings QGroupBox { + margin-bottom: 3; +} +ParamsPage { + qproperty-TextColor: #000; +} +/* ----------------------------------------------------------------------------- + Camera Settings +----------------------------------------------------------------------------- */ +#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: #000000; +} +#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'); +} +/* ----------------------------------------------------------------------------- + Output Settings +----------------------------------------------------------------------------- */ +#OutputSettingsLabel { + color: #000000; +} +/* ----------------------------------------------------------------------------- + Misc +----------------------------------------------------------------------------- */ +PencilTestPopup { + min-height: 730px; + /* Allow for using a 768 screen */ + min-width: 512px; + /* some clipping will still occur on width, but this + allows for filling half of a 1024 screen */ +} +#MatchLineButton { + background-color: #a6a6a6; +} +#MatchLineButton:checked { + background-color: #cdcdcd; + border: 2 solid #225baf; + border-radius: 2; +} +#LargeSizedText { + font-size: 17px; +} +/* ----------------------------------------------------------------------------- + Stop Motion Controller +----------------------------------------------------------------------------- */ +#StopMotionController QScrollArea { + margin: 8; +} +#StopMotionController QPushButton { + margin: 2 1; + padding: 0; +} +#StopMotionController #TabBarContainer { + margin-left: -4; +} +#StopMotionController #bottomWidget { + border-top: 1 solid #404040; + padding: 3 2 8 3; +} +#StopMotionController #bottomWidget QPushButton { + padding: 3 5; +} +#StopMotionTabBar::tab::first { + border-left: 1 solid #404040; +} +/* ----------------------------------------------------------------------------- + Unknowns + Legacy +----------------------------------------------------------------------------- */ +#StartupLabel { + padding: 3; +} +#StartupLabel:hover { + background: #9a9a9a; +} +QStatusBar { + background-color: #c0c0c0; +} +QStatusBar::item { + border: 0; +} +QStatusBar QLabel { + background-color: #c0c0c0; +} +QStatusBar #StatusBarLabel { + background-color: #ffffff; + padding: 1 3; +} +#TitleTxtLabel { + color: #000000; +} +/* ----------------------------------------------------------------------------- + Style Editor +----------------------------------------------------------------------------- */ +#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; +} +/* -------------------------------------------------------------------------- */ +/* Horizontal QSlider */ +#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; +} +/* ----------------------------------------------------------------------------- + Palette Viewer / Studio Palette +----------------------------------------------------------------------------- */ +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; +} +/* ----------------------------------------------------------------------------- + Quick Renamer +----------------------------------------------------------------------------- */ +#WordButton { + padding-right: 0; + padding-left: 0; +} +/* ----------------------------------------------------------------------------- + Popup Windows +----------------------------------------------------------------------------- */ +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: #000000; +} +QDialog #dialogButtonFrame QPushButton:focus:hover { + background-color: #ced5e0; +} +QDialog #dialogButtonFrame QPushButton:focus:pressed { + background-color: #e1e1e1; + border-color: #525252; + color: #000000; +} +/* ----------------------------------------------------------------------------- + Scene Settings +----------------------------------------------------------------------------- */ +#SceneSettings QLabel { + color: #000000; +} +/* ----------------------------------------------------------------------------- + Preferences +----------------------------------------------------------------------------- */ +#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; +} +/* ----------------------------------------------------------------------------- + Keyboard Shortcuts +----------------------------------------------------------------------------- */ +#ShortcutTree { + border: 1 solid #404040; +} +#ShortcutTree::item { + padding: 1 0; +} +#ShortcutTree QScrollBar:vertical { + width: 16; + margin-right: -1; +} +/* ----------------------------------------------------------------------------- + New Project / Configure Project Window +----------------------------------------------------------------------------- */ +ProjectPopup QLabel { + color: #000000; +} +/* ----------------------------------------------------------------------------- + PencilTestPopup / CameraCapture Window +----------------------------------------------------------------------------- */ +#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; +} +/* ----------------------------------------------------------------------------- + Schematic Viewer +----------------------------------------------------------------------------- */ +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'); +} +/* ----------------------------------------------------------------------------- + Schematic Node Viewer +----------------------------------------------------------------------------- */ +#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; +} +/* ----------------------------------------------------------------------------- + FX Settings +----------------------------------------------------------------------------- */ +#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: #000000; +} +#FxSettingsHelpButton { + background-color: #80a0dc; + color: #000; + padding-top: 0; + padding-bottom: 0; +} +#FxSettingsHelpButton:hover { + background-color: #a8bee7; +} +/* ----------------------------------------------------------------------------- + Script Console +----------------------------------------------------------------------------- */ +#ScriptConsole { + font-family: 'Courier New', monospace; + border: 0; + color: #000000; + padding: 3; +} +#ScriptConsole QFrame { + background-color: #dcdcdc; +} +#ScriptConsole TPanelTitleBar { + background-color: #5a5a5a; +} +/* ----------------------------------------------------------------------------- + Task Viewer +----------------------------------------------------------------------------- */ +#TaskSheetItemLabel { + color: #000; +} +#Tasks QToolBar { + border-bottom: 1 solid #404040; + margin: 0; + padding: 0; +} +#Tasks QToolBar QToolButton { + margin: 2 2 3 2; +} +/* ----------------------------------------------------------------------------- + Tool Bar +----------------------------------------------------------------------------- */ +#ToolBar QToolBar { + padding-left: 2; +} +/* ----------------------------------------------------------------------------- + Tool Options +----------------------------------------------------------------------------- */ +#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: #bbbbbb; + border-color: #525252; +} +#expandButton:checked:pressed { + background-color: #e1e1e1; + border-color: #525252; +} +/* ----------------------------------------------------------------------------- + ComboViewer / Viewer / FlipBook +----------------------------------------------------------------------------- */ +#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: #000000; +} +/* ----------------------------------------------------------------------------- + XSheet Viewer +----------------------------------------------------------------------------- */ +/* ScrollAreas (Row, Column and Cell) +----------------------------------------------------------------------------- */ +#xsheetArea, +#ScrollArea { + background-color: #6c6c6c; + border: 0; +} +#xsheetScrollArea { + border: 0; +} +#cornerWidget QToolButton { + padding: 0; +} +/* xsheetColumnHeader (Context Menus) +----------------------------------------------------------------------------- */ +#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; +} +/* XSheet Spreadsheet +----------------------------------------------------------------------------- */ +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: #ffffff; + 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'); + qproperty-ActiveCameraColor: #6ba5de; + qproperty-SelectedActiveCameraColor: #98bee4; + qproperty-OtherCameraColor: #8f9c9e; + qproperty-SelectedOtherCameraColor: #aeb1b2; +} +/* XSheet Toolbar +----------------------------------------------------------------------------- */ +#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; +} +/* ----------------------------------------------------------------------------- + Function Editor +----------------------------------------------------------------------------- */ +#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; +} +/* Function Editor Spreadsheet +----------------------------------------------------------------------------- */ +FunctionPanel { + qproperty-BGColor: #5a5a5a; + qproperty-ValueLineColor: #4d4d4d; + qproperty-FrameLineColor: #4d4d4d; + qproperty-OtherCurvesColor: #c5c5c5; + qproperty-RulerBackground: #676767; + qproperty-TextColor: #000; + qproperty-SubColor: #ffffff; + 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: #ffffff; + 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; +} diff --git a/stuff/doc/LICENSE/LICENSE_libjpeg-turbo.txt b/stuff/doc/LICENSE/LICENSE_libjpeg-turbo.txt new file mode 100644 index 0000000..1e0abfc --- /dev/null +++ b/stuff/doc/LICENSE/LICENSE_libjpeg-turbo.txt @@ -0,0 +1,35 @@ +libjpeg-turbo Licenses + +This software is based in part on the work of the Independent JPEG Group. + +- - - - - - - - - - - - - - - - - - + +The Modified (3-clause) BSD License +=================================== + +Copyright (C)2009-2019 D. R. Commander. All Rights Reserved. +Copyright (C)2015 Viktor Szathmáry. All Rights Reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +- Neither the name of the libjpeg-turbo Project nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS", +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/stuff/doc/LICENSE/LICENSE_opencv.txt b/stuff/doc/LICENSE/LICENSE_opencv.txt new file mode 100644 index 0000000..9908bb0 --- /dev/null +++ b/stuff/doc/LICENSE/LICENSE_opencv.txt @@ -0,0 +1,36 @@ + License Agreement + For Open Source Computer Vision Library + (3-clause BSD License) + +Copyright (C) 2000-2019, Intel Corporation, all rights reserved. +Copyright (C) 2009-2011, Willow Garage Inc., all rights reserved. +Copyright (C) 2009-2016, NVIDIA Corporation, all rights reserved. +Copyright (C) 2010-2013, Advanced Micro Devices, Inc., all rights reserved. +Copyright (C) 2015-2016, OpenCV Foundation, all rights reserved. +Copyright (C) 2015-2016, Itseez Inc., all rights reserved. +Third party copyrights are property of their respective owners. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the names of the copyright holders nor the names of the contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +This software is provided by the copyright holders and contributors "as is" and +any express or implied warranties, including, but not limited to, the implied +warranties of merchantability and fitness for a particular purpose are disclaimed. +In no event shall copyright holders or contributors be liable for any direct, +indirect, incidental, special, exemplary, or consequential damages +(including, but not limited to, procurement of substitute goods or services; +loss of use, data, or profits; or business interruption) however caused +and on any theory of liability, whether in contract, strict liability, +or tort (including negligence or otherwise) arising in any way out of +the use of this software, even if advised of the possibility of such damage. diff --git a/stuff/profiles/layouts/rooms/Default/menubar_template.xml b/stuff/profiles/layouts/rooms/Default/menubar_template.xml index 33aea1f..2556179 100644 --- a/stuff/profiles/layouts/rooms/Default/menubar_template.xml +++ b/stuff/profiles/layouts/rooms/Default/menubar_template.xml @@ -27,6 +27,7 @@ MI_SoundTrack + MI_ExportXDTS MI_PrintXsheet diff --git a/thirdparty/canon/.gitignore b/thirdparty/canon/.gitignore new file mode 100644 index 0000000..7551faf --- /dev/null +++ b/thirdparty/canon/.gitignore @@ -0,0 +1,2 @@ +Header/* +library/* \ No newline at end of file diff --git a/thirdparty/canon/copy_canon_sdk.txt b/thirdparty/canon/copy_canon_sdk.txt new file mode 100644 index 0000000..20bfeeb --- /dev/null +++ b/thirdparty/canon/copy_canon_sdk.txt @@ -0,0 +1,2 @@ +Copy the Header and library folders from the Canon SDK to this folder. +Make sure that the library is the one from the EDSDK_64 folder. \ No newline at end of file diff --git a/thirdparty/libjpeg-turbo64/.gitignore b/thirdparty/libjpeg-turbo64/.gitignore new file mode 100644 index 0000000..0a61909 --- /dev/null +++ b/thirdparty/libjpeg-turbo64/.gitignore @@ -0,0 +1,2 @@ +include/* +lib/* diff --git a/thirdparty/libjpeg-turbo64/.gitkeep b/thirdparty/libjpeg-turbo64/.gitkeep new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/thirdparty/libjpeg-turbo64/.gitkeep diff --git a/thirdparty/libjpeg-turbo64/copy_libjpeg-turbo64.txt b/thirdparty/libjpeg-turbo64/copy_libjpeg-turbo64.txt new file mode 100644 index 0000000..d507ae6 --- /dev/null +++ b/thirdparty/libjpeg-turbo64/copy_libjpeg-turbo64.txt @@ -0,0 +1 @@ +Copy the lib and include folders from libjpeg-turbo64 into this folder. \ No newline at end of file diff --git a/toonz/sources/CMakeLists.txt b/toonz/sources/CMakeLists.txt index 32a5828..2b8dab2 100644 --- a/toonz/sources/CMakeLists.txt +++ b/toonz/sources/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 2.8.11) +cmake_minimum_required(VERSION 2.8.11) set(CMAKE_BUILD_TYPE_INIT Release) @@ -101,6 +101,7 @@ endif() option(WITH_SYSTEM_LZO "Use the system LZO library instead of 'thirdpary'" ${_init_SYSTEM_LZO}) option(WITH_SYSTEM_SUPERLU "Use the system SuperLU library instead of 'thirdpary'" ${_init_SYSTEM_SUPERLU}) +option(WITH_STOPMOTION "Build with Stop Motion features - Requires Canon SDK" OFF) # avoid using again option_defaults_clear() @@ -258,7 +259,7 @@ if(Qt5Core_VERSION VERSION_LESS QT_MINIMUM_VERSION) endif() unset(QT_MINIMUM_VERSION) -if(BUILD_ENV_MSVC) +if(BUILD_ENV_MSVC AND NOT WITH_STOPMOTION) include_directories( SYSTEM ${SDKROOT}/glut/3.7.6/include @@ -270,6 +271,22 @@ if(BUILD_ENV_MSVC) ) endif() +if(BUILD_ENV_MSVC AND WITH_STOPMOTION) + find_package(OpenCV 4.1 REQUIRED) + include_directories( + SYSTEM + ${SDKROOT}/glut/3.7.6/include + ${SDKROOT}/zlib-1.2.8 + ${SDKROOT}/LibJPEG/jpeg-9 + ${SDKROOT}/canon/Header + ${SDKROOT}/libjpeg-turbo64/include + ${OpenCV_INCLUDE_DIRS} + ) + add_definitions( + -DGLUT_NO_LIB_PRAGMA + ) +endif() + get_target_property(QtCore_location Qt5::Core LOCATION) get_target_property(QtWidget_location Qt5::Widgets LOCATION) message(STATUS "Qt Core Location:" ${QtCore_location}) @@ -330,6 +347,10 @@ if(BUILD_ENV_MSVC) set(SUPERLU_LIB ${SDKROOT}/superlu/SuperLU_${MSVC_LIB_VERSION}_${PLATFORM}.lib) set(OPENBLAS_LIB ${SDKROOT}/openblas/libopenblas_${PLATFORM}.lib) set(USB_LIB) # unused + if (WITH_STOPMOTION) + set(CANON_LIB ${SDKROOT}/canon/library/EDSDK.lib) + set(TURBOJPEG_LIB ${SDKROOT}/libjpeg-turbo64/lib/turbojpeg.lib) + endif() if(PLATFORM EQUAL 32) set(QT_LIB ${SDKROOT}/quicktime/QT73SDK/Libraries/QTMLClient.lib) endif() diff --git a/toonz/sources/common/tvectorimage/tstroke.cpp b/toonz/sources/common/tvectorimage/tstroke.cpp index f2b86a6..022cfe2 100644 --- a/toonz/sources/common/tvectorimage/tstroke.cpp +++ b/toonz/sources/common/tvectorimage/tstroke.cpp @@ -1,6 +1,5 @@ -#include "tmachine.h" #include "tmathutil.h" #include "tstrokeutil.h" #include "tstrokeoutline.h" @@ -3109,7 +3108,7 @@ double *reparameterize3D(const TThickCubic &cubic, for (int i = 0; i < size; i++) { uPrime[i] = NewtonRaphsonRootFind3D(cubic, *(pointsArrayBegin + i), u[i]); - if (!_finite(uPrime[i])) { + if (!std::isfinite(uPrime[i])) { delete[] uPrime; return NULL; } @@ -3355,17 +3354,17 @@ void computeQuadraticsFromCubic(const TThickCubic &cubic, double error, #ifdef _DEBUG TThickQuadratic *lastTq = chunkArray.back(); TThickPoint pDeb = lastTq->getThickP0(); - assert(_finite(pDeb.x)); - assert(_finite(pDeb.y)); - assert(_finite(pDeb.thick)); + assert(std::isfinite(pDeb.x)); + assert(std::isfinite(pDeb.y)); + assert(std::isfinite(pDeb.thick)); pDeb = lastTq->getThickP1(); - assert(_finite(pDeb.x)); - assert(_finite(pDeb.y)); - assert(_finite(pDeb.thick)); + assert(std::isfinite(pDeb.x)); + assert(std::isfinite(pDeb.y)); + assert(std::isfinite(pDeb.thick)); pDeb = lastTq->getThickP2(); - assert(_finite(pDeb.x)); - assert(_finite(pDeb.y)); - assert(_finite(pDeb.thick)); + assert(std::isfinite(pDeb.x)); + assert(std::isfinite(pDeb.y)); + assert(std::isfinite(pDeb.thick)); #endif numSaved++; // variabile debug: compatibilita' precedente funzione return; @@ -3404,21 +3403,21 @@ TStroke *computeQuadStroke(const TCubicStroke &cubic) { #ifdef _DEBUG { TThickPoint p = tmp.getThickP0(); - assert(_finite(p.x)); - assert(_finite(p.y)); - assert(_finite(p.thick)); + assert(std::isfinite(p.x)); + assert(std::isfinite(p.y)); + assert(std::isfinite(p.thick)); p = tmp.getThickP1(); - assert(_finite(p.x)); - assert(_finite(p.y)); - assert(_finite(p.thick)); + assert(std::isfinite(p.x)); + assert(std::isfinite(p.y)); + assert(std::isfinite(p.thick)); p = tmp.getThickP2(); - assert(_finite(p.x)); - assert(_finite(p.y)); - assert(_finite(p.thick)); + assert(std::isfinite(p.x)); + assert(std::isfinite(p.y)); + assert(std::isfinite(p.thick)); p = tmp.getThickP3(); - assert(_finite(p.x)); - assert(_finite(p.y)); - assert(_finite(p.thick)); + assert(std::isfinite(p.x)); + assert(std::isfinite(p.y)); + assert(std::isfinite(p.thick)); } #endif @@ -3735,9 +3734,9 @@ TStroke *TStroke::interpolate(const vector &points, double error, TThickPoint p; for (; cpIndex != (UINT)stroke->getControlPointCount(); cpIndex++) { p = stroke->getControlPoint(cpIndex); - assert(_finite(p.x)); - assert(_finite(p.y)); - assert(_finite(p.thick)); + assert(std::isfinite(p.x)); + assert(std::isfinite(p.y)); + assert(std::isfinite(p.thick)); } #endif diff --git a/toonz/sources/include/tmachine.h b/toonz/sources/include/tmachine.h index d7a8944..21f07a6 100644 --- a/toonz/sources/include/tmachine.h +++ b/toonz/sources/include/tmachine.h @@ -19,13 +19,4 @@ #error "TNZ_LITTLE_ENDIAN not defined!" #endif -#ifndef WIN32 -#ifdef MACOSX -#define _finite isfinite -#else -// verificare che su sgi sia isfinite -#define _finite isfinite -#endif -#endif - #endif diff --git a/toonz/sources/include/tools/cursors.h b/toonz/sources/include/tools/cursors.h index 7947a7e..b156997 100644 --- a/toonz/sources/include/tools/cursors.h +++ b/toonz/sources/include/tools/cursors.h @@ -97,6 +97,8 @@ enum { Ex_RGB = 0x80000, Ex_HV = 0x100000, Ex_Precise = 0x200000, + Ex_Prev = 0x400000, + Ex_Next = 0x800000, // This section is for cursors that have fixed text that needs to // be handled separately when flipping for left-handed cursors. @@ -108,7 +110,9 @@ enum { PickerCursorLine = PickerCursorLineBase | Ex_StyleLine, PickerCursorArea = PickerCursorAreaBase | Ex_StyleArea, PickerRGB = PickerRGBBase | Ex_RGB, - ScaleHVCursor = ScaleHVCursorBase | Ex_HV + ScaleHVCursor = ScaleHVCursorBase | Ex_HV, + PickPrevCursor = PointingHandCursor | Ex_Prev, + PickNextCursor = PointingHandCursor | Ex_Next }; } // namespace ToolCursor diff --git a/toonz/sources/include/tools/tool.h b/toonz/sources/include/tools/tool.h index 36cdb45..6764748 100644 --- a/toonz/sources/include/tools/tool.h +++ b/toonz/sources/include/tools/tool.h @@ -8,6 +8,7 @@ #include "toonz/txsheet.h" #include "toonz/imagepainter.h" #include "toonz/tapplication.h" +#include "tools/cursors.h" // TnzCore includes #include "tcommon.h" @@ -517,15 +518,27 @@ transformation. return m_selectedFrames; } + void tweenSelectedGuideStrokes(); + void tweenGuideStrokeToSelected(); + public: - static std::vector m_cellsData; //!< \deprecated brutto brutto. fix - //! quick & dirty del baco #6213 (undo + struct CellOps { + int r0; + int r1; + enum Type { ExistingToNew = 0, BlankToExisting, BlankToNew } type; + }; + static std::vector + m_cellsData; //!< \deprecated brutto brutto. fix + //! quick & dirty del baco #6213 (undo //! con animation sheet) spiegazioni in //! tool.cpp static bool m_isLevelCreated; //!< \deprecated Shouldn't expose global //! static variables. static bool m_isFrameCreated; //!< \deprecated Shouldn't expose global //! static variables. + static std::vector m_oldFids; + static std::vector m_newFids; + static bool m_isLevelRenumbererd; protected: std::string m_name; //!< The tool's name. @@ -569,6 +582,10 @@ protected: ImagePainter::VisualSettings m_visualSettings; //!< Settings used by the Viewer to draw scene contents + int guidedStrokePickMode = 0; + int m_guidedFrontStroke = -1; + int m_guidedBackStroke = -1; + public: Viewer() {} virtual ~Viewer() {} @@ -578,9 +595,8 @@ public: } ImagePainter::VisualSettings &visualSettings() { return m_visualSettings; } - virtual double getPixelSize() - const = 0; //!< Returns the length of a pixel in current OpenGL - //!< coordinates + virtual double getPixelSize() const = 0; //!< Returns the length of a pixel + //!< in current OpenGL coordinates virtual void invalidateAll() = 0; //!< Redraws the entire viewer, passing //! through Qt's event system @@ -600,7 +616,7 @@ public: //! return the column index of the drawing intersecting point \b p //! (window coordinate, pixels, bottom-left origin) virtual int posToColumnIndex(const TPointD &p, double distance, - bool includeInvisible = true) const = 0; + bool includeInvisible = true) const = 0; virtual void posToColumnIndexes(const TPointD &p, std::vector &indexes, double distance, bool includeInvisible = true) const = 0; @@ -632,9 +648,9 @@ public: virtual void rotate(const TPointD ¢er, double angle) = 0; virtual void rotate3D(double dPhi, double dTheta) = 0; - virtual bool is3DView() const = 0; - virtual bool getIsFlippedX() const = 0; - virtual bool getIsFlippedY() const = 0; + virtual bool is3DView() const = 0; + virtual bool getIsFlippedX() const = 0; + virtual bool getIsFlippedY() const = 0; virtual double projectToZ(const TPointD &delta) = 0; @@ -654,6 +670,33 @@ public: virtual void bindFBO() {} virtual void releaseFBO() {} + + int getGuidedStrokePickerMode() { return guidedStrokePickMode; } + void setGuidedStrokePickerMode(int mode) { guidedStrokePickMode = mode; } + + int getGuidedStrokePickerCursor() { + if (guidedStrokePickMode < 0) + return ToolCursor::PickPrevCursor; + else if (guidedStrokePickMode > 0) + return ToolCursor::PickNextCursor; + else + return ToolCursor::PointingHandCursor; + } + + int getGuidedFrontStroke() { return m_guidedFrontStroke; } + void setGuidedFrontStroke(int strokeIdx) { + m_guidedFrontStroke = strokeIdx; + invalidateAll(); + } + + int getGuidedBackStroke() { return m_guidedBackStroke; } + void setGuidedBackStroke(int strokeIdx) { + m_guidedBackStroke = strokeIdx; + invalidateAll(); + } + + void getGuidedFrameIdx(int *backIdx, int *frontIdx); + void doPickGuideStroke(const TPointD &pos); }; #endif diff --git a/toonz/sources/include/tools/toolutils.h b/toonz/sources/include/tools/toolutils.h index a5b06fc..9dc2736 100644 --- a/toonz/sources/include/tools/toolutils.h +++ b/toonz/sources/include/tools/toolutils.h @@ -152,10 +152,13 @@ protected: bool m_isEditingLevel; bool m_createdFrame; bool m_createdLevel; - bool m_animationSheetEnabled; - std::vector m_cellsData; // represent original frame range when - // m_animationSheetEnabled, m_createdFrame and - // !m_isEditingLevel; see tool.cpp + bool m_renumberedLevel; + std::vector + m_cellsData; // represent original frame range when + // m_animationSheetEnabled, m_createdFrame and + // !m_isEditingLevel; see tool.cpp + std::vector m_oldFids; + std::vector m_newFids; TPaletteP m_oldPalette; std::string m_imageId; static int m_idCount; @@ -505,6 +508,13 @@ TRasterPT rotate90(const TRasterPT &ras, bool toRight) { return workRas; } +bool DVAPI doUpdateXSheet(TXshSimpleLevel *sl, std::vector oldFids, + std::vector newFids, TXsheet *xsh, + std::vector &childLevels); + +bool DVAPI renumberForInsertFId(TXshSimpleLevel *sl, const TFrameId &fid, + const TFrameId &maxFid, TXsheet *xsh); + } // namespace ToolUtils #endif // TOOLSUTILS_H diff --git a/toonz/sources/include/toonz/levelproperties.h b/toonz/sources/include/toonz/levelproperties.h index c6c4531..93ce2f0 100644 --- a/toonz/sources/include/toonz/levelproperties.h +++ b/toonz/sources/include/toonz/levelproperties.h @@ -48,11 +48,13 @@ public: //! adpoted. bool m_whiteTransp, //!< [default: false] Whether white should be - //! visualized as transparent. - m_premultiply; //!< [default: false] Whether level images should + //! visualized as transparent. + m_premultiply, //!< [default: false] Whether level images should //! be - //! premultiplied by Toonz for alpha compositing (because they - //! are not). + //! premultiplied by Toonz for alpha compositing (because they + //! are not). + m_isStopMotionLevel; + public: LevelOptions(); //!< Constructs with default values. @@ -220,6 +222,13 @@ ie } bool whiteTransp() const { return m_options.m_whiteTransp; } + void setIsStopMotion(bool isStopMotion) // Is this level used for Stop Motion + + { + m_options.m_isStopMotionLevel = isStopMotion; + } + bool isStopMotionLevel() const { return m_options.m_isStopMotionLevel; } + private: TPointD m_imageDpi; diff --git a/toonz/sources/include/toonz/preferences.h b/toonz/sources/include/toonz/preferences.h index fb8e7b9..621eddc 100644 --- a/toonz/sources/include/toonz/preferences.h +++ b/toonz/sources/include/toonz/preferences.h @@ -134,6 +134,7 @@ public: QVariant defaultValue, QVariant min = 0, QVariant max = -1); void setCallBack(const PreferencesItemId id, OnEditedFunc func); + void resolveCompatibility(); PreferencesItem &getItem(const PreferencesItemId id); bool getBoolValue(const PreferencesItemId id) const; @@ -285,8 +286,15 @@ public: double getDefLevelWidth() const { return getDoubleValue(DefLevelWidth); } double getDefLevelHeight() const { return getDoubleValue(DefLevelHeight); } double getDefLevelDpi() const { return getDoubleValue(DefLevelDpi); } - int getAutocreationType() const { return getIntValue(AutocreationType); } + bool isAutoCreateEnabled() const { return getBoolValue(EnableAutocreation); } + int getNumberingSystem() const { return getIntValue(NumberingSystem); } bool isAutoStretchEnabled() const { return getBoolValue(EnableAutoStretch); } + bool isCreationInHoldCellsEnabled() const { + return getBoolValue(EnableCreationInHoldCells); + } + bool isAutorenumberEnabled() const { + return getBoolValue(EnableAutoRenumber); + } int getVectorSnappingTarget() { return getIntValue(vectorSnappingTarget); } bool isSaveUnpaintedInCleanupEnable() const { return getBoolValue(saveUnpaintedInCleanup); @@ -418,7 +426,7 @@ public: return getBoolValue(useOnionColorsForShiftAndTraceGhosts); } bool getAnimatedGuidedDrawing() const { - return getBoolValue(animatedGuidedDrawing); + return getIntValue(animatedGuidedDrawing) == 1; } // Colors tab @@ -454,6 +462,8 @@ public: QString getShortcutPreset() { return getStringValue(shortcutPreset); } // Viewer context menu int getGuidedDrawing() { return getIntValue(guidedDrawingType); } + bool getGuidedAutoInbetween() { return getBoolValue(guidedAutoInbetween); } + int getGuidedInterpolation() { return getIntValue(guidedInterpolationType); } #if defined(MACOSX) && defined(__LP64__) int getShmMax() const { return getIntValue(shmmax); @@ -471,9 +481,8 @@ public: void setPrecompute(bool enabled); bool getPrecompute() { return m_precompute; } - bool isAutoCreateEnabled() const { return getIntValue(AutocreationType) > 0; } bool isAnimationSheetEnabled() const { - return getIntValue(AutocreationType) == 2; + return getIntValue(NumberingSystem) == 1; } bool isXsheetCameraColumnVisible() const { return getBoolValue(showXsheetCameraColumn) && diff --git a/toonz/sources/include/toonz/preferencesitemids.h b/toonz/sources/include/toonz/preferencesitemids.h index a347c44..affc4e8 100644 --- a/toonz/sources/include/toonz/preferencesitemids.h +++ b/toonz/sources/include/toonz/preferencesitemids.h @@ -80,8 +80,12 @@ enum PreferencesItemId { DefLevelWidth, DefLevelHeight, DefLevelDpi, - AutocreationType, + // AutocreationType,// deprecated + EnableAutocreation, + NumberingSystem, EnableAutoStretch, + EnableCreationInHoldCells, + EnableAutoRenumber, vectorSnappingTarget, saveUnpaintedInCleanup, minimizeSaveboxAfterEditing, @@ -174,6 +178,8 @@ enum PreferencesItemId { shortcutPreset, // Viewer context menu guidedDrawingType, + guidedAutoInbetween, + guidedInterpolationType, // OSX shared memory settings shmmax, shmseg, diff --git a/toonz/sources/include/toonz/stage.h b/toonz/sources/include/toonz/stage.h index 39abc4e..95c6800 100644 --- a/toonz/sources/include/toonz/stage.h +++ b/toonz/sources/include/toonz/stage.h @@ -66,13 +66,15 @@ DVAPI void visit(Visitor &visitor, ToonzScene *scene, TXsheet *xsh, int row); DVAPI void visit(Visitor &visitor, TXshSimpleLevel *level, const TFrameId &fid, const OnionSkinMask &osm, bool isPlaying, - int isGuidedDrawingEnabled = 0); + int isGuidedDrawingEnabled = 0, int guidedBackStroke = -1, + int guidedFrontStroke = -1); //----------------------------------------------------------------------------- DVAPI void visit(Visitor &visitor, TXshLevel *level, const TFrameId &fid, const OnionSkinMask &osm, bool isPlaying, - double isGuidedDrawingEnabled = 0.0); + double isGuidedDrawingEnabled = 0.0, int guidedBackStroke = -1, + int guidedFrontStroke = -1); //----------------------------------------------------------------------------- } // namespace Stage diff --git a/toonz/sources/include/toonz/stageplayer.h b/toonz/sources/include/toonz/stageplayer.h index d1aa926..4c9fae1 100644 --- a/toonz/sources/include/toonz/stageplayer.h +++ b/toonz/sources/include/toonz/stageplayer.h @@ -86,6 +86,8 @@ public: bool m_isEditingLevel; bool m_isVisibleinOSM; // Whether the current frame is in the onion skin int m_isGuidedDrawingEnabled = 0; + int m_guidedFrontStroke = -1; + int m_guidedBackStroke = -1; TXshSimpleLevel *m_sl; //!< (not owned) The player's simple level TFrameId m_fid; //!< The player's frame in m_sl TFrameId @@ -104,6 +106,7 @@ public: static double m_onionSkinFrontSize; static double m_onionSkinBackSize; + static double m_firstFrontOnionSkin; static double m_firstBackOnionSkin; static double m_lastBackVisibleSkin; diff --git a/toonz/sources/include/toonz/stagevisitor.h b/toonz/sources/include/toonz/stagevisitor.h index 6d134e5..98935d3 100644 --- a/toonz/sources/include/toonz/stagevisitor.h +++ b/toonz/sources/include/toonz/stagevisitor.h @@ -133,6 +133,8 @@ struct DVAPI VisitArgs { bool m_checkPreviewVisibility; bool m_rasterizePli; int m_isGuidedDrawingEnabled; + int m_guidedFrontStroke; + int m_guidedBackStroke; public: VisitArgs() @@ -147,6 +149,8 @@ public: , m_onlyVisible(false) , m_checkPreviewVisibility(false) , m_isGuidedDrawingEnabled(0) + , m_guidedFrontStroke(-1) + , m_guidedBackStroke(-1) , m_rasterizePli(false) {} }; diff --git a/toonz/sources/include/toonz/ttileset.h b/toonz/sources/include/toonz/ttileset.h index c2cefcd..3e64e0c 100644 --- a/toonz/sources/include/toonz/ttileset.h +++ b/toonz/sources/include/toonz/ttileset.h @@ -84,7 +84,7 @@ public: Tile(const TRasterCM32P &ras, const TPoint &p); ~Tile(); QString id() const override { - return "TileCM" + QString::number((uintptr_t)this); + return "TileCM" + QString::number((uintptr_t) this); } Tile *clone() const override; @@ -124,7 +124,7 @@ public: Tile(const TRasterP &ras, const TPoint &p); ~Tile(); QString id() const override { - return "TTileSet32::Tile" + QString::number((uintptr_t)this); + return "TTileSet32::Tile" + QString::number((uintptr_t) this); } Tile *clone() const override; diff --git a/toonz/sources/stopmotion/stopmotion.cpp b/toonz/sources/stopmotion/stopmotion.cpp new file mode 100644 index 0000000..3b92539 --- /dev/null +++ b/toonz/sources/stopmotion/stopmotion.cpp @@ -0,0 +1,4013 @@ +#include "stopmotion.h" + +#ifdef WIN32 +#include +#include +#include +#include +#pragma comment(lib, "Mfplat.lib") +#pragma comment(lib, "Mf.lib") +#pragma comment(lib, "Mfreadwrite.lib") +#pragma comment(lib, "mfuuid.lib") +#pragma comment(lib, "shlwapi.lib") +#endif + +// TnzCore includes +#include "menubarcommandids.h" +#include "tapp.h" +#include "tenv.h" +#include "tsystem.h" +#include "filebrowsermodel.h" +#include "penciltestpopup.h" +#include "tlevel_io.h" +#include "toutputproperties.h" + +#include "toonz/namebuilder.h" +#include "toonz/preferences.h" +#include "toonz/tcamera.h" +#include "toonz/tcolumnhandle.h" +#include "toonz/tframehandle.h" +#include "toonz/levelset.h" +#include "toonz/sceneproperties.h" +#include "toonz/toonzscene.h" +#include "toonz/tscenehandle.h" +#include "toonz/stage.h" +#include "toonz/txsheethandle.h" +#include "toonz/txshlevelhandle.h" +#include "toonz/txshsimplelevel.h" +#include "toonz/levelproperties.h" +#include "toonz/tstageobjecttree.h" + +#include "toonzqt/menubarcommand.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Connected camera +TEnv::IntVar StopMotionUseScaledImages("StopMotionUseScaledImages", 0); +TEnv::IntVar StopMotionOpacity("StopMotionOpacity", 100); +TEnv::IntVar StopMotionUseDirectShow("StopMotionUseDirectShow", 1); +TEnv::IntVar StopMotionAlwaysLiveView("StopMotionAlwaysLiveView", 0); + +TEnv::IntVar StopMotionBlackCapture("StopMotionBlackCapture", 0); +TEnv::IntVar StopMotionPlaceOnXSheet("StopMotionPlaceOnXSheet", 1); +TEnv::IntVar StopMotionReviewTime("StopMotionReviewTime", 1); +TEnv::IntVar StopMotionUseMjpg("StopMotionUseMjpg", 1); +TEnv::IntVar StopMotionUseNumpad("StopMotionUseNumpad", 0); + +// Connected camera +TEnv::StringVar StopMotionCameraName("CamCapCameraName", ""); +// Camera resolution +TEnv::StringVar StopMotionCameraResolution("CamCapCameraResolution", ""); + +namespace { +bool l_quitLoop = false; + +TPointD getCurrentCameraDpi() { + TCamera *camera = + TApp::instance()->getCurrentScene()->getScene()->getCurrentCamera(); + TDimensionD size = camera->getSize(); + TDimension res = camera->getRes(); + return TPointD(res.lx / size.lx, res.ly / size.ly); +} + +//----------------------------------------------------------------------------- + +bool findCell(TXsheet *xsh, int col, const TXshCell &targetCell, + int &bottomRowWithTheSameLevel) { + bottomRowWithTheSameLevel = -1; + TXshColumnP column = const_cast(xsh)->getColumn(col); + if (!column) return false; + + TXshCellColumn *cellColumn = column->getCellColumn(); + if (!cellColumn) return false; + + int r0, r1; + if (!cellColumn->getRange(r0, r1)) return false; + + for (int r = r0; r <= r1; r++) { + TXshCell cell = cellColumn->getCell(r); + if (cell == targetCell) { + bottomRowWithTheSameLevel = r; + return true; + } + if (cell.m_level == targetCell.m_level) bottomRowWithTheSameLevel = r; + } + + return false; +} + +//----------------------------------------------------------------------------- + +QChar numToLetter(int letterNum) { + switch (letterNum) { + case 0: + return QChar(); + break; + case 1: + return 'A'; + break; + case 2: + return 'B'; + break; + case 3: + return 'C'; + break; + case 4: + return 'D'; + break; + case 5: + return 'E'; + break; + case 6: + return 'F'; + break; + case 7: + return 'G'; + break; + case 8: + return 'H'; + break; + case 9: + return 'I'; + break; + default: + return QChar(); + break; + } +} + +//----------------------------------------------------------------------------- + +QString convertToFrameWithLetter(int value, int length = -1) { + QString str; + str.setNum((int)(value / 10)); + while (str.length() < length) str.push_front("0"); + QChar letter = numToLetter(value % 10); + if (!letter.isNull()) str.append(letter); + return str; +} + +//----------------------------------------------------------------------------- + +QString fidsToString(const std::vector &fids, + bool letterOptionEnabled) { + if (fids.empty()) return StopMotion::tr("No", "frame id"); + QString retStr(""); + if (letterOptionEnabled) { + bool beginBlock = true; + for (int f = 0; f < fids.size() - 1; f++) { + int num = fids[f].getNumber(); + int next_num = fids[f + 1].getNumber(); + + if (num % 10 == 0 && num + 10 == next_num) { + if (beginBlock) { + retStr += convertToFrameWithLetter(num) + " - "; + beginBlock = false; + } + } else { + retStr += convertToFrameWithLetter(num) + ", "; + beginBlock = true; + } + } + retStr += convertToFrameWithLetter(fids.back().getNumber()); + } else { + bool beginBlock = true; + for (int f = 0; f < fids.size() - 1; f++) { + int num = fids[f].getNumber(); + int next_num = fids[f + 1].getNumber(); + if (num + 1 == next_num) { + if (beginBlock) { + retStr += QString::number(num) + " - "; + beginBlock = false; + } + } else { + retStr += QString::number(num) + ", "; + beginBlock = true; + } + } + retStr += QString::number(fids.back().getNumber()); + } + return retStr; +} + +//----------------------------------------------------------------------------- + +bool getRasterLevelSize(TXshLevel *level, TDimension &dim) { + std::vector fids; + level->getFids(fids); + if (fids.empty()) return false; + TXshSimpleLevel *simpleLevel = level->getSimpleLevel(); + if (!simpleLevel) return false; + TRasterImageP rimg = (TRasterImageP)simpleLevel->getFrame(fids[0], false); + if (!rimg || rimg->isEmpty()) return false; + + dim = rimg->getRaster()->getSize(); + return true; +} + +}; // namespace + +//============================================================================= +//============================================================================= + +JpgConverter::JpgConverter() {} +JpgConverter::~JpgConverter() {} + +void JpgConverter::setStream(EdsStreamRef stream) { m_stream = stream; } + +void JpgConverter::convertFromJpg() { + unsigned __int64 mySize = 0; + unsigned char *data = NULL; + EdsError err = EdsGetPointer(m_stream, (EdsVoid **)&data); + err = EdsGetLength(m_stream, &mySize); + + int width, height, pixelFormat; + int inSubsamp, inColorspace; + tjhandle tjInstance = NULL; + unsigned char *imgBuf = NULL; + tjInstance = tjInitDecompress(); + tjDecompressHeader3(tjInstance, data, mySize, &width, &height, &inSubsamp, + &inColorspace); + + if (width < 0 || height < 0) { + emit(imageReady(false)); + return; + } + + pixelFormat = TJPF_BGRX; + imgBuf = (unsigned char *)tjAlloc(width * height * tjPixelSize[pixelFormat]); + int flags = 0; +#ifdef WIN32 + flags |= TJFLAG_BOTTOMUP; +#endif + int factorsNum; + tjscalingfactor scalingFactor = {1, 1}; + tjscalingfactor *factor = tjGetScalingFactors(&factorsNum); + int i = 0; + int tempWidth, tempHeight; + while (i < factorsNum) { + scalingFactor = factor[i]; + i++; + tempWidth = TJSCALED(width, scalingFactor); + tempHeight = TJSCALED(height, scalingFactor); + } + tjDecompress2(tjInstance, data, mySize, imgBuf, width, + width * tjPixelSize[pixelFormat], height, pixelFormat, flags); + + m_finalImage = TRaster32P(width, height); + m_finalImage->lock(); + uchar *rawData = m_finalImage->getRawData(); + memcpy(rawData, imgBuf, width * height * tjPixelSize[pixelFormat]); + m_finalImage->unlock(); + + tjFree(imgBuf); + imgBuf = NULL; + tjDestroy(tjInstance); + tjInstance = NULL; + + if (m_stream != NULL) { + EdsRelease(m_stream); + m_stream = NULL; + } + data = NULL; + emit(imageReady(true)); +} + +void JpgConverter::run() { convertFromJpg(); } + +//----------------------------------------------------------------------------- + +StopMotion::StopMotion() { + m_opacity = StopMotionOpacity; + m_useScaledImages = StopMotionUseScaledImages; + buildAvMap(); + buildIsoMap(); + buildTvMap(); + buildModeMap(); + buildExposureMap(); + buildWhiteBalanceMap(); + buildColorTemperatures(); + buildImageQualityMap(); + buildPictureStyleMap(); + m_useDirectShow = StopMotionUseDirectShow; + m_useMjpg = StopMotionUseMjpg; + m_alwaysLiveView = StopMotionAlwaysLiveView; + m_blackCapture = StopMotionBlackCapture; + m_placeOnXSheet = StopMotionPlaceOnXSheet; + m_reviewTime = StopMotionReviewTime; + m_useNumpadShortcuts = StopMotionUseNumpad; + m_numpadForStyleSwitching = + Preferences::instance()->isUseNumpadForSwitchingStylesEnabled(); + setUseNumpadShortcuts(m_useNumpadShortcuts); + m_turnOnRewind = Preferences::instance()->rewindAfterPlaybackEnabled(); + m_timer = new QTimer(this); + m_reviewTimer = new QTimer(this); + m_reviewTimer->setSingleShot(true); + + m_fullScreen1 = new QDialog(); + m_fullScreen1->setModal(false); + m_fullScreen1->setStyleSheet("background-color:black;"); + m_screenCount = QApplication::desktop()->screenCount(); + if (m_screenCount > 1) { + m_fullScreen2 = new QDialog(); + m_fullScreen2->setModal(false); + m_fullScreen2->setStyleSheet("background-color:black;"); + if (m_screenCount == 3) { + m_fullScreen3 = new QDialog(); + m_fullScreen3->setModal(false); + m_fullScreen3->setStyleSheet("background-color:black;"); + } + } + + TXsheetHandle *xsheetHandle = TApp::instance()->getCurrentXsheet(); + TSceneHandle *sceneHandle = TApp::instance()->getCurrentScene(); + TFrameHandle *frameHandle = TApp::instance()->getCurrentFrame(); + bool ret = true; + + ret = ret && + connect(xsheetHandle, SIGNAL(xsheetSwitched()), this, SLOT(update())); + ret = ret && connect(m_reviewTimer, SIGNAL(timeout()), this, + SLOT(onReviewTimeout())); + ret = ret && connect(m_timer, SIGNAL(timeout()), this, SLOT(onTimeout())); + ret = + ret && connect(this, SIGNAL(newImageReady()), this, SLOT(importImage())); + ret = ret && connect(sceneHandle, SIGNAL(sceneSwitched()), this, + SLOT(onSceneSwitched())); + ret = ret && connect(frameHandle, SIGNAL(isPlayingStatusChanged()), this, + SLOT(onPlaybackChanged())); + assert(ret); + + ToonzScene *scene = TApp::instance()->getCurrentScene()->getScene(); + + setToNextNewLevel(); + m_filePath = scene->getDefaultLevelPath(OVL_TYPE, m_levelName.toStdWString()) + .getParentDir() + .getQString(); + + // set handler for a camera detected + initializeCanonSDK(); + if (!m_error) + m_error = EdsSetCameraAddedHandler(StopMotion::handleCameraAddedEvent, + (EdsVoid *)this); +} + +//----------------------------------------------------------------- + +StopMotion::~StopMotion() { + if (m_liveViewStatus != LiveViewClosed) endLiveView(); + if (m_sessionOpen) closeCameraSession(); + if (m_camera) releaseCamera(); + if (m_cameraList != NULL) releaseCameraList(); + if (m_isSDKLoaded) closeCanonSDK(); + setUseNumpadShortcuts(false); +} + +//----------------------------------------------------------------------------- + +void StopMotion::onSceneSwitched() { + TApp *app = TApp::instance(); + ToonzScene *scene = app->getCurrentScene()->getScene(); + TXsheet *xsh = TApp::instance()->getCurrentXsheet()->getXsheet(); + setToNextNewLevel(); + m_filePath = scene->getDefaultLevelPath(OVL_TYPE, m_levelName.toStdWString()) + .getParentDir() + .getQString(); + m_frameNumber = 1; + m_xSheetFrameNumber = 0; + + TLevelSet *levelSet = scene->getLevelSet(); + std::vector levels; + levelSet->listLevels(levels); + int size = levels.size(); + for (int i = 0; i < size; i++) { + TXshLevel *level = levels[i]; + if (level->getType() == OVL_XSHLEVEL) { + TXshSimpleLevel *sl = 0; + sl = level->getSimpleLevel(); + bool isStopMotionLevel = sl->getProperties()->isStopMotionLevel(); + if (isStopMotionLevel) { + m_filePath = sl->getPath().getParentDir().getQString(); + m_levelName = QString::fromStdWString(sl->getName()); + m_frameNumber = sl->getFrameCount() + 1; + setXSheetFrameNumber(xsh->getFrameCount() + 1); + break; + } + } + } + emit(levelNameChanged(m_levelName)); + emit(filePathChanged(m_filePath)); + emit(frameNumberChanged(m_frameNumber)); + emit(xSheetFrameNumberChanged(m_xSheetFrameNumber)); + refreshFrameInfo(); +} + +//----------------------------------------------------------------- + +void StopMotion::onPlaybackChanged() { + if (TApp::instance()->getCurrentFrame()->isPlaying() || m_liveViewStatus == 0) + return; + + int r0, r1, step; + ToonzScene *scene = TApp::instance()->getCurrentScene()->getScene(); + scene->getProperties()->getPreviewProperties()->getRange(r0, r1, step); + if (r1 > -1) return; + + int frame = TApp::instance()->getCurrentFrame()->getFrame(); + int lastFrame = TApp::instance()->getCurrentFrame()->getMaxFrameIndex(); + if (frame == 0 || frame == lastFrame) { + TApp::instance()->getCurrentFrame()->setFrame(m_xSheetFrameNumber - 1); + } +} + +//----------------------------------------------------------------- + +void StopMotion::setOpacity(int opacity) { + m_opacity = opacity; + StopMotionOpacity = m_opacity; + emit(opacityChanged(m_opacity)); +} + +//----------------------------------------------------------------- + +void StopMotion::lowerOpacity() { + int opacity = round((double)m_opacity / 255.0 * 10.0); + opacity *= 10; + opacity -= 10; + m_opacity = double(opacity) / 100.0 * 255.0; + m_opacity = max(0, m_opacity); + StopMotionOpacity = m_opacity; + emit(opacityChanged(m_opacity)); +} + +//----------------------------------------------------------------- + +void StopMotion::raiseOpacity() { + int opacity = round((double)m_opacity / 255.0 * 10.0); + opacity *= 10; + opacity += 10; + m_opacity = double(opacity) / 100.0 * 255.0; + m_opacity = min(255, m_opacity); + StopMotionOpacity = m_opacity; + emit(opacityChanged(m_opacity)); +} + +//----------------------------------------------------------------- + +void StopMotion::setUseScaledImages(bool on) { + m_useScaledImages = on; + StopMotionUseScaledImages = int(on); + emit(scaleFullSizeImagesSignal(on)); +} + +//----------------------------------------------------------------- + +void StopMotion::setAlwaysLiveView(bool on) { + m_alwaysLiveView = on; + StopMotionAlwaysLiveView = int(on); + emit(liveViewOnAllFramesSignal(on)); +} + +//----------------------------------------------------------------- + +void StopMotion::setBlackCapture(bool on) { + m_blackCapture = on; + StopMotionBlackCapture = int(on); + emit(blackCaptureSignal(on)); +} + +//----------------------------------------------------------------- + +void StopMotion::setPlaceOnXSheet(bool on) { + m_placeOnXSheet = on; + StopMotionPlaceOnXSheet = int(on); + emit(placeOnXSheetSignal(on)); +} + +//----------------------------------------------------------------- + +void StopMotion::setReviewTime(int time) { + m_reviewTime = time; + StopMotionReviewTime = time; + emit(reviewTimeChangedSignal(time)); +} + +//----------------------------------------------------------------- + +void StopMotion::setUseMjpg(bool on) { + m_useMjpg = on; + StopMotionUseMjpg = int(on); + emit(useMjpgSignal(on)); +} + +//----------------------------------------------------------------- + +void StopMotion::jumpToCameraFrame() { + TApp::instance()->getCurrentFrame()->setFrame(m_xSheetFrameNumber - 1); +} + +//----------------------------------------------------------------- + +void StopMotion::setUseNumpadShortcuts(bool on) { + m_useNumpadShortcuts = on; + StopMotionUseNumpad = int(on); + emit(useNumpadSignal(on)); +} + +void StopMotion::toggleNumpadShortcuts(bool on) { + // can't just return if this feature is off + // it could have been toggled while the camera was active + if (!m_useNumpadShortcuts) on = false; + CommandManager *comm = CommandManager::instance(); + + if (on) { + // if turning it on, get all old shortcuts + if (m_numpadForStyleSwitching) { + Preferences::instance()->setValue(useNumpadForSwitchingStyles, false); + } + std::string shortcut; + QAction *action; + for (int i = 0; i <= 9; i++) { + shortcut = QString::number(i).toStdString(); + action = comm->getActionFromShortcut(shortcut); + if (action) { + m_oldActionMap.insert( + std::pair(shortcut, action)); + action->setShortcut(QKeySequence("")); + action = NULL; + } + } + shortcut = "+"; + action = comm->getActionFromShortcut(shortcut); + if (action) { + m_oldActionMap.insert( + std::pair(shortcut, action)); + action = NULL; + } + shortcut = "-"; + action = comm->getActionFromShortcut(shortcut); + if (action) { + m_oldActionMap.insert( + std::pair(shortcut, action)); + action = NULL; + } + shortcut = "Return"; + action = comm->getActionFromShortcut(shortcut); + if (action) { + m_oldActionMap.insert( + std::pair(shortcut, action)); + action = NULL; + } + shortcut = "*"; + action = comm->getActionFromShortcut(shortcut); + if (action) { + m_oldActionMap.insert( + std::pair(shortcut, action)); + action = NULL; + } + + // now set all new shortcuts + action = comm->getAction(MI_PrevDrawing); + if (action) { + action->setShortcut(QKeySequence("1")); + action = NULL; + } + action = comm->getAction(MI_NextDrawing); + if (action) { + action->setShortcut(QKeySequence("2")); + action = NULL; + } + action = comm->getAction(MI_StopMotionJumpToCamera); + if (action) { + action->setShortcut(QKeySequence("3")); + action = NULL; + } + action = comm->getAction(MI_Loop); + if (action) { + action->setShortcut(QKeySequence("8")); + action = NULL; + } + action = comm->getAction(MI_Play); + if (action) { + action->setShortcut(QKeySequence("0")); + action = NULL; + } + action = comm->getAction(MI_StopMotionRaiseOpacity); + if (action) { + action->setShortcut(QKeySequence("+")); + action = NULL; + } + action = comm->getAction(MI_StopMotionLowerOpacity); + if (action) { + action->setShortcut(QKeySequence("-")); + action = NULL; + } + action = comm->getAction(MI_StopMotionCapture); + if (action) { + action->setShortcut(QKeySequence("Enter")); + action = NULL; + } + action = comm->getAction(MI_StopMotionToggleLiveView); + if (action) { + action->setShortcut(QKeySequence("5")); + action = NULL; + } + action = comm->getAction(MI_StopMotionToggleZoom); + if (action) { + action->setShortcut(QKeySequence("*")); + action = NULL; + } + + } else { + // unset the new shortcuts first + QAction *action; + action = comm->getAction(MI_PrevDrawing); + if (action) { + action->setShortcut( + QKeySequence(comm->getShortcutFromAction(action).c_str())); + action = NULL; + } + action = comm->getAction(MI_NextDrawing); + if (action) { + action->setShortcut( + QKeySequence(comm->getShortcutFromAction(action).c_str())); + action = NULL; + } + action = comm->getAction(MI_StopMotionJumpToCamera); + if (action) { + action->setShortcut( + QKeySequence(comm->getShortcutFromAction(action).c_str())); + action = NULL; + } + action = comm->getAction(MI_Loop); + if (action) { + action->setShortcut( + QKeySequence(comm->getShortcutFromAction(action).c_str())); + action = NULL; + } + action = comm->getAction(MI_Play); + if (action) { + action->setShortcut( + QKeySequence(comm->getShortcutFromAction(action).c_str())); + action = NULL; + } + action = comm->getAction(MI_StopMotionCapture); + if (action) { + action->setShortcut( + QKeySequence(comm->getShortcutFromAction(action).c_str())); + action = NULL; + } + action = comm->getAction(MI_StopMotionLowerOpacity); + if (action) { + action->setShortcut( + QKeySequence(comm->getShortcutFromAction(action).c_str())); + action = NULL; + } + action = comm->getAction(MI_StopMotionRaiseOpacity); + if (action) { + action->setShortcut( + QKeySequence(comm->getShortcutFromAction(action).c_str())); + action = NULL; + } + action = comm->getAction(MI_StopMotionToggleLiveView); + if (action) { + action->setShortcut( + QKeySequence(comm->getShortcutFromAction(action).c_str())); + action = NULL; + } + action = comm->getAction(MI_StopMotionToggleZoom); + if (action) { + action->setShortcut( + QKeySequence(comm->getShortcutFromAction(action).c_str())); + action = NULL; + } + + // now put back the old shortcuts + auto it = m_oldActionMap.begin(); + while (it != m_oldActionMap.end()) { + it->second->setShortcut(QKeySequence(it->first.c_str())); + it++; + } + if (m_numpadForStyleSwitching) { + std::string shortcut; + QAction *action; + for (int i = 0; i <= 9; i++) { + shortcut = QString::number(i).toStdString(); + action = comm->getActionFromShortcut(shortcut); + if (action) { + action->setShortcut(QKeySequence("")); + action = NULL; + } + } + Preferences::instance()->setValue(useNumpadForSwitchingStyles, true); + } + } +} + +//----------------------------------------------------------------- + +void StopMotion::setXSheetFrameNumber(int frameNumber) { + m_xSheetFrameNumber = frameNumber; + loadLineUpImage(); + emit(xSheetFrameNumberChanged(m_xSheetFrameNumber)); + TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); +} + +//----------------------------------------------------------------- + +bool StopMotion::loadLineUpImage() { + if (m_liveViewStatus < 1) return false; + m_hasLineUpImage = false; + // first see if the level exists in the current level set + ToonzScene *currentScene = TApp::instance()->getCurrentScene()->getScene(); + TLevelSet *levelSet = currentScene->getLevelSet(); + + std::wstring levelName = m_levelName.toStdWString(); + + // level with the same name + TXshLevel *level_sameName = levelSet->getLevel(levelName); + + TFilePath levelFp = TFilePath(m_filePath) + + TFilePath(levelName + L".." + m_fileType.toStdWString()); + + // level with the same path + TXshLevel *level_samePath = levelSet->getLevel(*(currentScene), levelFp); + + TFilePath actualLevelFp = currentScene->decodeFilePath(levelFp); + TXshSimpleLevelP sl; + if (level_sameName && level_samePath && level_sameName == level_samePath) { + sl = dynamic_cast(level_sameName); + bool isRasterLevel = sl && (sl->getType() == OVL_XSHLEVEL); + if (!isRasterLevel) { + return false; + } + } else + return false; + + // next we need to find the column the level is on + + TApp *app = TApp::instance(); + TXsheet *xsh = currentScene->getXsheet(); + int row; + if (m_xSheetFrameNumber == 1) { + row = 0; + } else { + row = m_xSheetFrameNumber - 2; + } + int col = app->getCurrentColumn()->getColumnIndex(); + + int foundCol = -1; + // most possibly, it's in the current column + int rowCheck; + findCell(xsh, col, TXshCell(level_sameName, TFrameId(1)), rowCheck); + if (rowCheck >= 0) { + foundCol = col; + } else { + // search entire xsheet + for (int c = 0; c < xsh->getColumnCount(); c++) { + if (c == col) continue; + findCell(xsh, c, TXshCell(level_sameName, TFrameId(1)), rowCheck); + if (rowCheck >= 0) { + foundCol = c; + } + } + } + if (rowCheck < 0) return false; + + // note found row represents the last row found that uses + // the active level + + TFrameId frameId = xsh->getCell(row, foundCol).getFrameId(); + + int frameNumber = frameId.getNumber(); + + if (m_usingWebcam) { + if (frameNumber > 0) { + m_lineUpImage = sl->getFrame(frameId, false)->raster(); + m_hasLineUpImage = true; + return true; + } else + return false; + } + + // now check to see if a file actually exists there + TFilePath liveViewFolder = currentScene->decodeFilePath( + TFilePath(m_filePath) + TFilePath(levelName + L"_LiveView")); + TFilePath liveViewFp = currentScene->decodeFilePath( + liveViewFolder + TFilePath(levelName + L"..jpg")); + TFilePath liveViewFile(liveViewFp.withFrame(frameNumber)); + if (TFileStatus(liveViewFile).doesExist()) { + if (loadJpg(liveViewFile, m_lineUpImage)) { + m_hasLineUpImage = true; + return true; + } + } + return false; +} + +//----------------------------------------------------------------- + +void StopMotion::setFrameNumber(int frameNumber) { + m_frameNumber = frameNumber; + emit(frameNumberChanged(m_frameNumber)); +} + +//----------------------------------------------------------------------------- + +void StopMotion::nextFrame() { + if (Preferences::instance()->isShowFrameNumberWithLettersEnabled()) { + int f = m_frameNumber; + if (f % 10 == 0) // next number + m_frameNumber = ((int)(f / 10) + 1) * 10; + else // next alphabet + m_frameNumber = f + 1; + } else + m_frameNumber = m_frameNumber + 1; + emit(frameNumberChanged(m_frameNumber)); + refreshFrameInfo(); +} + +//----------------------------------------------------------------------------- + +void StopMotion::lastFrame() {} + +//----------------------------------------------------------------------------- + +void StopMotion::previousFrame() { + int f = m_frameNumber; + if (f > 1) { + if (Preferences::instance()->isShowFrameNumberWithLettersEnabled()) { + if (f % 10 == 0) // next number + m_frameNumber = ((int)(f / 10) - 1) * 10; + else // next alphabet + m_frameNumber = f - 1; + } else + m_frameNumber = f - 1; + emit(frameNumberChanged(m_frameNumber)); + refreshFrameInfo(); + } +} + +//----------------------------------------------------------------- + +void StopMotion::setLevelName(QString levelName) { m_levelName = levelName; } + +//----------------------------------------------------------------- + +void StopMotion::nextName() { + std::unique_ptr nameCreator(new FlexibleNameCreator()); + if (!nameCreator->setCurrent(m_levelName.toStdWString())) { + setToNextNewLevel(); + return; + } + + std::wstring levelName = nameCreator->getNext(); + updateLevelNameAndFrame(levelName); +} + +//----------------------------------------------------------------- + +void StopMotion::previousName() { + std::unique_ptr nameCreator(new FlexibleNameCreator()); + + std::wstring levelName; + + // if the current level name is non-sequencial, then try to switch the last + // sequencial level in the scene. + if (!nameCreator->setCurrent(m_levelName.toStdWString())) { + TLevelSet *levelSet = + TApp::instance()->getCurrentScene()->getScene()->getLevelSet(); + nameCreator->setCurrent(L"ZZ"); + for (;;) { + levelName = nameCreator->getPrevious(); + if (levelSet->getLevel(levelName) != 0) break; + if (levelName == L"A") { + setToNextNewLevel(); + return; + } + } + } else + levelName = nameCreator->getPrevious(); + + updateLevelNameAndFrame(levelName); +} + +//----------------------------------------------------------------- + +void StopMotion::setFileType(QString fileType) { + m_fileType = fileType; + emit(fileTypeChanged(m_fileType)); +} + +//----------------------------------------------------------------- + +void StopMotion::setFilePath(QString filePath) { + m_filePath = filePath; + + ToonzScene *scene = TApp::instance()->getCurrentScene()->getScene(); + TFilePath saveInPath(filePath.toStdWString()); + scene->getProperties()->setCameraCaptureSaveInPath(saveInPath); + refreshFrameInfo(); + + emit(filePathChanged(m_filePath)); +} + +//----------------------------------------------------------------- + +void StopMotion::setSubsamplingValue(int subsampling) { + m_subsampling = subsampling; +} + +//----------------------------------------------------------------- + +void StopMotion::getSubsampling() { + ToonzScene *currentScene = TApp::instance()->getCurrentScene()->getScene(); + TLevelSet *levelSet = currentScene->getLevelSet(); + + std::wstring levelName = m_levelName.toStdWString(); + + // level with the same name + TXshLevel *level_sameName = levelSet->getLevel(levelName); + + TFilePath levelFp = TFilePath(m_filePath) + + TFilePath(levelName + L".." + m_fileType.toStdWString()); + + // level with the same path + TXshLevel *level_samePath = levelSet->getLevel(*(currentScene), levelFp); + + TFilePath actualLevelFp = currentScene->decodeFilePath(levelFp); + + if (level_sameName && level_samePath && level_sameName == level_samePath) { + TXshSimpleLevelP m_sl; + m_sl = dynamic_cast(level_sameName); + bool isRasterLevel = m_sl && (m_sl->getType() == OVL_XSHLEVEL); + if (isRasterLevel) { + int currSubsampling = m_sl->getProperties()->getSubsampling(); + m_subsampling = currSubsampling; + emit(subsamplingChanged(m_subsampling)); + } else + emit(subsamplingChanged(-1)); + } else + emit(subsamplingChanged(-1)); +} + +//----------------------------------------------------------------------------- + +void StopMotion::update() { getSubsampling(); } + +//----------------------------------------------------------------------------- + +void StopMotion::setSubsampling() { + ToonzScene *currentScene = TApp::instance()->getCurrentScene()->getScene(); + TLevelSet *levelSet = currentScene->getLevelSet(); + + std::wstring levelName = m_levelName.toStdWString(); + + // level with the same name + TXshLevel *level_sameName = levelSet->getLevel(levelName); + + TFilePath levelFp = TFilePath(m_filePath) + + TFilePath(levelName + L".." + m_fileType.toStdWString()); + + // level with the same path + TXshLevel *level_samePath = levelSet->getLevel(*(currentScene), levelFp); + + TFilePath actualLevelFp = currentScene->decodeFilePath(levelFp); + + if (level_sameName && level_samePath && level_sameName == level_samePath) { + TXshSimpleLevelP m_sl; + m_sl = dynamic_cast(level_sameName); + bool isRasterLevel = m_sl && (m_sl->getType() & RASTER_TYPE); + if (isRasterLevel) { + int currSubsampling = m_sl->getProperties()->getSubsampling(); + int newSubsampling = m_subsampling; + if (currSubsampling != newSubsampling) { + m_sl->getProperties()->setSubsampling(newSubsampling); + m_sl->invalidateFrames(); + TApp::instance()->getCurrentScene()->setDirtyFlag(true); + TApp::instance() + ->getCurrentXsheet() + ->getXsheet() + ->getStageObjectTree() + ->invalidateAll(); + TApp::instance()->getCurrentLevel()->notifyLevelChange(); + emit(subsamplingChanged(m_subsampling)); + } + } + } +} + +//----------------------------------------------------------------------------- + +void StopMotion::onTimeout() { + int currentFrame = TApp::instance()->getCurrentFrame()->getFrame(); + // int destinationFrame = m_xSheetFrameNumber - 1; + if (m_liveViewStatus > 0 && m_liveViewStatus < 3 && + !TApp::instance()->getCurrentFrame()->isPlaying()) { + if (getAlwaysLiveView() || (currentFrame == m_xSheetFrameNumber - 1)) { + if (!m_usingWebcam) + downloadEVFData(); + else + getWebcamImage(); + if (getAlwaysLiveView() && currentFrame != m_xSheetFrameNumber - 1 || + m_pickLiveViewZoom) { + m_showLineUpImage = false; + } else { + m_showLineUpImage = true; + } + } else if (m_liveViewStatus == 2) { + m_liveViewStatus = 3; + TApp::instance()->getCurrentScene()->notifySceneChanged(); + } + } else if (m_liveViewStatus == 3 && !m_userCalledPause) { + if (getAlwaysLiveView() || (currentFrame == m_xSheetFrameNumber - 1)) { + if (!m_usingWebcam) + downloadEVFData(); + else + getWebcamImage(); + } + } +} + +//----------------------------------------------------------------------------- + +void StopMotion::onReviewTimeout() { + if (m_liveViewStatus > 0) { + m_liveViewStatus = 2; + m_timer->start(40); + } + TApp::instance()->getCurrentFrame()->setFrame(m_xSheetFrameNumber - 1); +} + +//----------------------------------------------------------------------------- + +bool StopMotion::importImage() { + if (getBlackCapture()) { + m_fullScreen1->hide(); + + if (m_screenCount > 1) { + m_fullScreen2->hide(); + + if (m_screenCount == 3) { + m_fullScreen3->hide(); + } + } + } + if (getReviewTime() > 0) { + m_reviewTimer->start(getReviewTime() * 1000); + } + + TApp *app = TApp::instance(); + ToonzScene *scene = app->getCurrentScene()->getScene(); + TXsheet *xsh = scene->getXsheet(); + + std::wstring levelName = m_levelName.toStdWString(); + if (levelName.empty()) { + DVGui::error( + tr("No level name specified: please choose a valid level name")); + return false; + } + + if (m_usingWebcam) { + m_newImage = m_liveViewImage; + } + int frameNumber = m_frameNumber; + + /* create parent directory if it does not exist */ + TFilePath parentDir = scene->decodeFilePath(TFilePath(m_filePath)); + TFilePath fullResFolder = scene->decodeFilePath( + TFilePath(m_filePath) + TFilePath(levelName + L"_FullRes")); + TFilePath liveViewFolder = scene->decodeFilePath( + TFilePath(m_filePath) + TFilePath(levelName + L"_LiveView")); + + TFilePath levelFp = TFilePath(m_filePath) + + TFilePath(levelName + L".." + m_fileType.toStdWString()); + TFilePath actualLevelFp = scene->decodeFilePath(levelFp); + + TFilePath fullResFp = + scene->decodeFilePath(fullResFolder + TFilePath(levelName + L"..jpg")); + TFilePath fullResFile(fullResFp.withFrame(frameNumber)); + + TFilePath liveViewFp = + scene->decodeFilePath(liveViewFolder + TFilePath(levelName + L"..jpg")); + TFilePath liveViewFile(liveViewFp.withFrame(frameNumber)); + + TFilePath tempFile = parentDir + "temp.jpg"; + + TXshSimpleLevel *sl = 0; + TXshLevel *level = scene->getLevelSet()->getLevel(levelName); + enum State { NEWLEVEL = 0, ADDFRAME, OVERWRITE } state; + + /* if the level already exists in the scene cast */ + if (level) { + /* if the existing level is not a raster level, then return */ + if (level->getType() != OVL_XSHLEVEL) { + DVGui::error( + tr("The level name specified is already used: please choose a " + "different level name.")); + return false; + } + /* if the existing level does not match file path and pixel size, then + * return */ + sl = level->getSimpleLevel(); + if (scene->decodeFilePath(sl->getPath()) != actualLevelFp) { + DVGui::error( + tr("The save in path specified does not match with the existing " + "level.")); + return false; + } + if (sl->getProperties()->getImageRes() != + TDimension(m_newImage->getLx(), m_newImage->getLy())) { + DVGui::error(tr( + "The captured image size does not match with the existing level.")); + return false; + } + /* if the level already have the same frame, then ask if overwrite it */ + TFilePath frameFp(actualLevelFp.withFrame(frameNumber)); + if (TFileStatus(frameFp).doesExist()) { + QString question = + tr("File %1 already exists.\nDo you want to overwrite it?") + .arg(toQString(frameFp)); + int ret = DVGui::MsgBox(question, QObject::tr("Overwrite"), + QObject::tr("Cancel")); + if (ret == 0 || ret == 2) return false; + state = OVERWRITE; + } else + state = ADDFRAME; + } + /* if the level does not exist in the scene cast */ + else { + /* if the file does exist, load it first */ + if (TSystem::doesExistFileOrLevel(actualLevelFp)) { + level = scene->loadLevel(actualLevelFp); + if (!level) { + DVGui::error(tr("Failed to load %1.").arg(toQString(actualLevelFp))); + return false; + } + + /* if the loaded level does not match in pixel size, then return */ + sl = level->getSimpleLevel(); + if (!sl || + sl->getProperties()->getImageRes() != + TDimension(m_newImage->getLx(), m_newImage->getLy())) { + DVGui::error( + tr("The captured image size does not match with the existing " + "level.")); + return false; + } + + /* confirm overwrite */ + TFilePath frameFp(actualLevelFp.withFrame(frameNumber)); + if (TFileStatus(frameFp).doesExist()) { + QString question = + tr("File %1 already exists.\nDo you want to overwrite it?") + .arg(toQString(frameFp)); + int ret = DVGui::MsgBox(question, QObject::tr("Overwrite"), + QObject::tr("Cancel")); + if (ret == 0 || ret == 2) return false; + } + } + /* if the file does not exist, then create a new level */ + else { + TXshLevel *level = scene->createNewLevel(OVL_XSHLEVEL, levelName, + TDimension(), 0, levelFp); + sl = level->getSimpleLevel(); + sl->setPath(levelFp, true); + sl->getProperties()->setDpiPolicy(LevelProperties::DP_CustomDpi); + TPointD dpi; + // Right now always set the dpi to scale to the camera width + if (Preferences::instance()->getPixelsOnly() && false) + dpi = getCurrentCameraDpi(); + // Compute the dpi so that the image will fit + // to the camera frame + else { + TCamera *camera = + TApp::instance()->getCurrentScene()->getScene()->getCurrentCamera(); + TDimensionD size = camera->getSize(); + double minimumDpi = std::min(m_newImage->getLx() / size.lx, + m_newImage->getLy() / size.ly); + dpi = TPointD(minimumDpi, minimumDpi); + } + sl->getProperties()->setDpi(dpi.x); + sl->getProperties()->setImageDpi(dpi); + sl->getProperties()->setImageRes( + TDimension(m_newImage->getLx(), m_newImage->getLy())); + } + + state = NEWLEVEL; + getSubsampling(); + } + + if (!TFileStatus(parentDir).doesExist()) { + QString question; + question = tr("Folder %1 doesn't exist.\nDo you want to create it?") + .arg(toQString(parentDir)); + int ret = DVGui::MsgBox(question, QObject::tr("Yes"), QObject::tr("No")); + if (ret == 0 || ret == 2) return false; + try { + TSystem::mkDir(parentDir); + DvDirModel::instance()->refreshFolder(parentDir.getParentDir()); + } catch (...) { + DVGui::error(tr("Unable to create") + toQString(parentDir)); + return false; + } + } + if (!m_usingWebcam) { + if (!TFileStatus(fullResFolder).doesExist()) { + try { + TSystem::mkDir(fullResFolder); + DvDirModel::instance()->refreshFolder(fullResFolder.getParentDir()); + } catch (...) { + DVGui::error(tr("Unable to create") + toQString(fullResFolder)); + return false; + } + } + if (!TFileStatus(liveViewFolder).doesExist()) { + try { + TSystem::mkDir(liveViewFolder); + DvDirModel::instance()->refreshFolder(liveViewFolder.getParentDir()); + } catch (...) { + DVGui::error(tr("Unable to create") + toQString(liveViewFolder)); + return false; + } + } + } + + // move the temp file + if (!m_usingWebcam) { + if (m_useScaledImages) { + TSystem::copyFile(fullResFile, tempFile); + TSystem::deleteFile(tempFile); + } + if (m_hasLineUpImage) { + saveJpg(m_lineUpImage, liveViewFile); + } + } + + TFrameId fid(frameNumber); + TPointD levelDpi = sl->getDpi(); + /* create the raster */ + TRaster32P raster = m_newImage; + + TRasterImageP ri(raster); + ri->setDpi(levelDpi.x, levelDpi.y); + + /* setting the frame */ + sl->setFrame(fid, ri); + + /* set dirty flag */ + sl->getProperties()->setDirtyFlag(true); + sl->getProperties()->setIsStopMotion(true); + sl->setIsReadOnly(true); + + // if (m_saveOnCaptureCB->isChecked()) sl->save(); + // for now always save. This can be tweaked later + sl->save(); + + /* placement in xsheet */ + if (!getPlaceOnXSheet()) { + postImportProcess(); + return true; + } + int row = m_xSheetFrameNumber - 1; + int col = app->getCurrentColumn()->getColumnIndex(); + + // if the level is newly created or imported, then insert a new column + if (state == NEWLEVEL) { + if (!xsh->isColumnEmpty(col)) { + col += 1; + xsh->insertColumn(col); + } + xsh->insertCells(row, col); + xsh->setCell(row, col, TXshCell(sl, fid)); + app->getCurrentColumn()->setColumnIndex(col); + if (getReviewTime() == 0) app->getCurrentFrame()->setFrame(row + 1); + m_xSheetFrameNumber = row + 2; + emit(xSheetFrameNumberChanged(m_xSheetFrameNumber)); + postImportProcess(); + // if (m_newImage->getLx() > 2000) { + // m_subsampling = 4; + // setSubsampling(); + //} + return true; + } + + // state == OVERWRITE, ADDFRAME + + // if the same cell is already in the column, then just replace the content + // and do not set a new cell + int foundCol, foundRow = -1; + // most possibly, it's in the current column + int rowCheck; + if (findCell(xsh, col, TXshCell(sl, fid), rowCheck)) { + postImportProcess(); + return true; + } + if (rowCheck >= 0) { + foundRow = rowCheck; + foundCol = col; + } + // search entire xsheet + for (int c = 0; c < xsh->getColumnCount(); c++) { + if (c == col) continue; + if (findCell(xsh, c, TXshCell(sl, fid), rowCheck)) { + postImportProcess(); + return true; + } + if (rowCheck >= 0) { + foundRow = rowCheck; + foundCol = c; + } + } + + // note found row represents the last row found that uses + // the active level + + // if there is a column containing the same level + if (foundRow >= 0) { + // put the cell at the bottom + xsh->insertCells(row, foundCol); + xsh->setCell(row, foundCol, TXshCell(sl, fid)); + app->getCurrentColumn()->setColumnIndex(foundCol); + if (getReviewTime() == 0) app->getCurrentFrame()->setFrame(row + 1); + m_xSheetFrameNumber = row + 2; + emit(xSheetFrameNumberChanged(m_xSheetFrameNumber)); + } + // if the level is registered in the scene, but is not placed in the xsheet, + // then insert a new column + else { + if (!xsh->isColumnEmpty(col)) { + col += 1; + xsh->insertColumn(col); + } + xsh->setCell(row, col, TXshCell(sl, fid)); + app->getCurrentColumn()->setColumnIndex(col); + if (getReviewTime() == 0) app->getCurrentFrame()->setFrame(row + 1); + m_xSheetFrameNumber = row + 2; + emit(xSheetFrameNumberChanged(m_xSheetFrameNumber)); + } + postImportProcess(); + return true; +} + +//----------------------------------------------------------------- + +void StopMotion::captureImage() { + if (!m_usingWebcam && !m_sessionOpen) { + DVGui::warning("Please start live view before capturing an image."); + return; + } + if (m_usingWebcam) { + if (!m_hasLiveViewImage) { + DVGui::warning("Cannot capture webcam image unless live view is active."); + return; + } + if (getReviewTime() > 0) { + m_timer->stop(); + if (m_liveViewStatus > 0) { + m_liveViewStatus = 3; + } + } + m_lineUpImage = m_liveViewImage; + m_hasLineUpImage = true; + emit(newLiveViewImageReady()); + importImage(); + return; + } + if (getBlackCapture()) { + m_fullScreen1->showFullScreen(); + m_fullScreen1->setGeometry(QApplication::desktop()->screenGeometry(0)); + if (m_screenCount > 1) { + m_fullScreen2->showFullScreen(); + m_fullScreen2->setGeometry(QApplication::desktop()->screenGeometry(1)); + + if (m_screenCount == 3) { + m_fullScreen3->showFullScreen(); + m_fullScreen3->setGeometry(QApplication::desktop()->screenGeometry(2)); + } + } + // this allows the full screen qdialogs to go full screen before + // taking a photo + qApp->processEvents(QEventLoop::AllEvents, 1500); + } + + if (getReviewTime() > 0) { + m_timer->stop(); + } + + if (m_liveViewStatus > 0) { + m_liveViewStatus = 3; + } + + if (m_hasLiveViewImage) { + m_lineUpImage = m_liveViewImage; + m_hasLineUpImage = true; + emit(newLiveViewImageReady()); + } + + TApp *app = TApp::instance(); + ToonzScene *scene = app->getCurrentScene()->getScene(); + + int frameNumber = m_frameNumber; + std::wstring levelName = m_levelName.toStdWString(); + + TFilePath parentDir = scene->decodeFilePath(TFilePath(m_filePath)); + TFilePath tempFile = parentDir + "temp.jpg"; + + if (!TFileStatus(parentDir).doesExist()) { + TSystem::mkDir(parentDir); + } + m_tempFile = tempFile.getQString(); + takePicture(); +} + +//----------------------------------------------------------------------------- + +void StopMotion::saveJpg(TRaster32P image, TFilePath path) { + unsigned char *jpegBuf = NULL; /* Dynamically allocate the JPEG buffer */ + unsigned long jpegSize = 0; + int pixelFormat = TJPF_BGRX; + int outQual = 95; + int subSamp = TJSAMP_411; + bool success = false; + tjhandle tjInstance; + + int width = image->getLx(); + int height = image->getLy(); + int flags = 0; +#ifdef WIN32 + flags |= TJFLAG_BOTTOMUP; +#endif + + image->lock(); + uchar *rawData = image->getRawData(); + if ((tjInstance = tjInitCompress()) != NULL) { + if (tjCompress2(tjInstance, rawData, width, 0, height, pixelFormat, + &jpegBuf, &jpegSize, subSamp, outQual, flags) >= 0) { + success = true; + } + } + image->unlock(); + tjDestroy(tjInstance); + tjInstance = NULL; + + if (success) { + /* Write the JPEG image to disk. */ + QFile fullImage(path.getQString()); + fullImage.open(QIODevice::WriteOnly); + QDataStream dataStream(&fullImage); + dataStream.writeRawData((const char *)jpegBuf, jpegSize); + fullImage.close(); + } + tjFree(jpegBuf); + jpegBuf = NULL; +} + +//----------------------------------------------------------------------------- + +bool StopMotion::loadJpg(TFilePath path, TRaster32P &image) { + long size; + int inSubsamp, inColorspace, width, height; + unsigned long jpegSize; + unsigned char *jpegBuf; + FILE *jpegFile; + QString qPath = path.getQString(); + QByteArray ba = qPath.toLocal8Bit(); + const char *c_path = ba.data(); + bool success = true; + tjhandle tjInstance; + + /* Read the JPEG file into memory. */ + if ((jpegFile = fopen(c_path, "rb")) == NULL) success = false; + if (success && fseek(jpegFile, 0, SEEK_END) < 0 || + ((size = ftell(jpegFile)) < 0) || fseek(jpegFile, 0, SEEK_SET) < 0) + success = false; + if (success && size == 0) success = false; + jpegSize = (unsigned long)size; + if (success && (jpegBuf = (unsigned char *)tjAlloc(jpegSize)) == NULL) + success = false; + if (success && fread(jpegBuf, jpegSize, 1, jpegFile) < 1) success = false; + fclose(jpegFile); + jpegFile = NULL; + + if (success && (tjInstance = tjInitDecompress()) == NULL) success = false; + + if (success && + tjDecompressHeader3(tjInstance, jpegBuf, jpegSize, &width, &height, + &inSubsamp, &inColorspace) < 0) + success = false; + + int pixelFormat = TJPF_BGRX; + unsigned char *imgBuf = NULL; + if (success && + (imgBuf = tjAlloc(width * height * tjPixelSize[pixelFormat])) == NULL) + success = false; + + int flags = 0; +#ifdef WIN32 + flags |= TJFLAG_BOTTOMUP; +#endif + if (success && + tjDecompress2(tjInstance, jpegBuf, jpegSize, imgBuf, width, 0, height, + pixelFormat, flags) < 0) + success = false; + tjFree(jpegBuf); + jpegBuf = NULL; + tjDestroy(tjInstance); + tjInstance = NULL; + + image = TRaster32P(width, height); + image->lock(); + uchar *rawData = image->getRawData(); + memcpy(rawData, imgBuf, width * height * tjPixelSize[pixelFormat]); + image->unlock(); + + tjFree(imgBuf); + imgBuf = NULL; + + return success; +} + +//----------------------------------------------------------------------------- + +void StopMotion::postImportProcess() { + if (Preferences::instance()->isShowFrameNumberWithLettersEnabled()) { + int f = m_frameNumber; + if (f % 10 == 0) // next number + m_frameNumber = ((int)(f / 10) + 1) * 10; + else // next alphabet + m_frameNumber = f + 1; + } else + m_frameNumber += 1; + emit(frameNumberChanged(m_frameNumber)); + /* notify */ + refreshFrameInfo(); + TApp::instance()->getCurrentScene()->notifySceneChanged(); + TApp::instance()->getCurrentScene()->notifyCastChange(); + TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); +} + +//----------------------------------------------------------------------------- + +// Refresh information that how many & which frames are saved for the current +// level +void StopMotion::refreshFrameInfo() { + if ((!m_sessionOpen && m_liveViewStatus < 2) && !m_usingWebcam) { + m_frameInfoText = ""; + return; + } + + QString tooltipStr, labelStr; + enum InfoType { NEW = 0, ADD, OVERWRITE, WARNING } infoType(WARNING); + + static QColor infoColors[4] = {Qt::cyan, Qt::green, Qt::yellow, Qt::red}; + + ToonzScene *currentScene = TApp::instance()->getCurrentScene()->getScene(); + TLevelSet *levelSet = currentScene->getLevelSet(); + + std::wstring levelName = m_levelName.toStdWString(); + int frameNumber = m_frameNumber; + + TDimension stopMotionRes; + bool checkRes = true; + if (m_usingWebcam) + stopMotionRes = m_liveViewImageDimensions; + + else if (m_useScaledImages || !getCurrentImageQuality().contains("Large")) { + stopMotionRes = m_proxyImageDimensions; + if (m_proxyImageDimensions == TDimension(0, 0)) { + checkRes = false; + } + } else + stopMotionRes = m_fullImageDimensions; + + bool letterOptionEnabled = + Preferences::instance()->isShowFrameNumberWithLettersEnabled(); + + // level with the same name + TXshLevel *level_sameName = levelSet->getLevel(levelName); + + TFilePath levelFp = TFilePath(m_filePath) + + TFilePath(levelName + L".." + m_fileType.toStdWString()); + + // level with the same path + TXshLevel *level_samePath = levelSet->getLevel(*(currentScene), levelFp); + + TFilePath actualLevelFp = currentScene->decodeFilePath(levelFp); + + // level existence + bool levelExist = TSystem::doesExistFileOrLevel(actualLevelFp); + + // frame existence + TFilePath frameFp(actualLevelFp.withFrame(frameNumber)); + bool frameExist = false; + if (levelExist) frameExist = TFileStatus(frameFp).doesExist(); + + // reset acceptable camera size + m_allowedCameraSize = QSize(); + + // ### CASE 1 ### + // If there is no same level registered in the scene cast + if (!level_sameName && !level_samePath) { + // If there is a level in the file system + if (levelExist) { + TLevelReaderP lr; + TLevelP level_p; + try { + lr = TLevelReaderP(actualLevelFp); + } catch (...) { + // TODO: output something + m_frameInfoText = tr("UNDEFINED WARNING"); + return; + } + if (!lr) { + // TODO: output something + m_frameInfoText = tr("UNDEFINED WARNING"); + return; + } + try { + level_p = lr->loadInfo(); + } catch (...) { + // TODO: output something + m_frameInfoText = tr("UNDEFINED WARNING"); + return; + } + if (!level_p) { + // TODO: output something + m_frameInfoText = tr("UNDEFINED WARNING"); + return; + } + int frameCount = level_p->getFrameCount(); + TLevel::Iterator it = level_p->begin(); + std::vector fids; + for (int i = 0; it != level_p->end(); ++it, ++i) + fids.push_back(it->first); + + tooltipStr += + tr("The level is not registered in the scene, but exists in the file " + "system."); + + // check resolution + const TImageInfo *ii; + try { + ii = lr->getImageInfo(fids[0]); + } catch (...) { + // TODO: output something + m_frameInfoText = tr("UNDEFINED WARNING"); + return; + } + TDimension dim(ii->m_lx, ii->m_ly); + // if the saved images has not the same resolution as the current camera + // resolution + if (checkRes && m_hasLiveViewImage && stopMotionRes != dim) { + tooltipStr += tr("\nWARNING : Image size mismatch. The saved image " + "size is %1 x %2.") + .arg(dim.lx) + .arg(dim.ly); + labelStr += tr("WARNING "); + infoType = WARNING; + } + // if the resolutions are matched + { + if (frameCount == 1) + tooltipStr += tr("\nFrame %1 exists.") + .arg(fidsToString(fids, letterOptionEnabled)); + else + tooltipStr += tr("\nFrames %1 exist.") + .arg(fidsToString(fids, letterOptionEnabled)); + // if the frame exists, then it will be overwritten + if (frameExist) { + labelStr += tr("OVERWRITE 1 of"); + infoType = OVERWRITE; + } else { + labelStr += tr("ADD to"); + infoType = ADD; + } + if (frameCount == 1) + labelStr += tr(" %1 frame").arg(frameCount); + else + labelStr += tr(" %1 frames").arg(frameCount); + } + m_allowedCameraSize = QSize(dim.lx, dim.ly); + } + // If no level exists in the file system, then it will be a new level + else { + tooltipStr += tr("The level will be newly created."); + labelStr += tr("NEW"); + infoType = NEW; + } + } + // ### CASE 2 ### + // If there is already the level registered in the scene cast + else if (level_sameName && level_samePath && + level_sameName == level_samePath) { + tooltipStr += tr("The level is already registered in the scene."); + if (!levelExist) tooltipStr += tr("\nNOTE : The level is not saved."); + + std::vector fids; + level_sameName->getFids(fids); + + // check resolution + TDimension dim; + bool ret = getRasterLevelSize(level_sameName, dim); + if (!ret) { + tooltipStr += + tr("\nWARNING : Failed to get image size of the existing level %1.") + .arg(QString::fromStdWString(levelName)); + labelStr += tr("WARNING "); + infoType = WARNING; + } + // if the saved images has not the same resolution as the current camera + // resolution + else if (checkRes && m_hasLiveViewImage && stopMotionRes != dim) { + tooltipStr += tr("\nWARNING : Image size mismatch. The existing level " + "size is %1 x %2.") + .arg(dim.lx) + .arg(dim.ly); + labelStr += tr("WARNING "); + infoType = WARNING; + } + // if the resolutions are matched + { + int frameCount = fids.size(); + if (fids.size() == 1) + tooltipStr += tr("\nFrame %1 exists.") + .arg(fidsToString(fids, letterOptionEnabled)); + else + tooltipStr += tr("\nFrames %1 exist.") + .arg(fidsToString(fids, letterOptionEnabled)); + // Check if the target frame already exist in the level + bool hasFrame = false; + for (int f = 0; f < frameCount; f++) { + if (fids.at(f).getNumber() == frameNumber) { + hasFrame = true; + break; + } + } + // If there is already the frame then it will be overwritten + if (hasFrame) { + labelStr += tr("OVERWRITE 1 of"); + infoType = OVERWRITE; + } + // Or, the frame will be added to the level + else { + labelStr += tr("ADD to"); + infoType = ADD; + } + if (frameCount == 1) + labelStr += tr(" %1 frame").arg(frameCount); + else + labelStr += tr(" %1 frames").arg(frameCount); + } + m_allowedCameraSize = QSize(dim.lx, dim.ly); + } + // ### CASE 3 ### + // If there are some conflicts with the existing level. + else { + if (level_sameName) { + TFilePath anotherPath = level_sameName->getPath(); + tooltipStr += + tr("WARNING : Level name conflicts. There already is a level %1 in the scene with the path\ + \n %2.") + .arg(QString::fromStdWString(levelName)) + .arg(toQString(anotherPath)); + // check resolution + TDimension dim; + bool ret = getRasterLevelSize(level_sameName, dim); + if (ret && checkRes && m_hasLiveViewImage && stopMotionRes != dim) + tooltipStr += tr("\nWARNING : Image size mismatch. The size of level " + "with the same name is is %1 x %2.") + .arg(dim.lx) + .arg(dim.ly); + m_allowedCameraSize = QSize(dim.lx, dim.ly); + } + if (level_samePath) { + std::wstring anotherName = level_samePath->getName(); + if (!tooltipStr.isEmpty()) tooltipStr += QString("\n"); + tooltipStr += + tr("WARNING : Level path conflicts. There already is a level with the path %1\ + \n in the scene with the name %2.") + .arg(toQString(levelFp)) + .arg(QString::fromStdWString(anotherName)); + // check resolution + TDimension dim; + bool ret = getRasterLevelSize(level_samePath, dim); + if (ret && checkRes && m_hasLiveViewImage && stopMotionRes != dim) + tooltipStr += tr("\nWARNING : Image size mismatch. The size of level " + "with the same path is %1 x %2.") + .arg(dim.lx) + .arg(dim.ly); + m_allowedCameraSize = QSize(dim.lx, dim.ly); + } + labelStr += tr("WARNING"); + infoType = WARNING; + } + + QColor infoColor = infoColors[(int)infoType]; + m_infoColorName = infoColor.name(); + m_frameInfoText = labelStr; + m_frameInfoToolTip = tooltipStr; + emit(frameInfoTextChanged(m_frameInfoText)); +} + +//----------------------------------------------------------------------------- + +void StopMotion::updateLevelNameAndFrame(std::wstring levelName) { + if (levelName != m_levelName.toStdWString()) { + m_levelName = QString::fromStdWString(levelName); + loadLineUpImage(); + } + emit(levelNameChanged(m_levelName)); + // m_previousLevelButton->setDisabled(levelName == L"A"); + + // set the start frame 10 if the option in preferences + // "Show ABC Appendix to the Frame Number in Xsheet Cell" is active. + // (frame 10 is displayed as "1" with this option) + bool withLetter = + Preferences::instance()->isShowFrameNumberWithLettersEnabled(); + + TLevelSet *levelSet = + TApp::instance()->getCurrentScene()->getScene()->getLevelSet(); + TXshLevel *level_p = levelSet->getLevel(levelName); + int startFrame; + if (!level_p) { + startFrame = withLetter ? 10 : 1; + } else { + std::vector fids; + level_p->getFids(fids); + if (fids.empty()) { + startFrame = withLetter ? 10 : 1; + } else { + int lastNum = fids.back().getNumber(); + startFrame = withLetter ? ((int)(lastNum / 10) + 1) * 10 : lastNum + 1; + } + } + m_frameNumber = startFrame; + emit(frameNumberChanged(startFrame)); + refreshFrameInfo(); + getSubsampling(); +} + +//----------------------------------------------------------------------------- + +void StopMotion::setToNextNewLevel() { + const std::unique_ptr nameBuilder(NameBuilder::getBuilder(L"")); + + TLevelSet *levelSet = + TApp::instance()->getCurrentScene()->getScene()->getLevelSet(); + ToonzScene *scene = TApp::instance()->getCurrentScene()->getScene(); + std::wstring levelName = L""; + + // Select a different unique level name in case it already exists (either in + // scene or on disk) + TFilePath fp; + TFilePath actualFp; + for (;;) { + levelName = nameBuilder->getNext(); + + if (levelSet->getLevel(levelName) != 0) continue; + + fp = TFilePath(m_filePath) + + TFilePath(levelName + L".." + m_fileType.toStdWString()); + actualFp = scene->decodeFilePath(fp); + + if (TSystem::doesExistFileOrLevel(actualFp)) { + continue; + } + + break; + } + + updateLevelNameAndFrame(levelName); +} + +//----------------------------------------------------------------- + +void StopMotion::refreshCameraList() { emit(updateCameraList()); } + +//----------------------------------------------------------------- + +void StopMotion::changeCameras(int index) { + QList cameras = QCameraInfo::availableCameras(); + + // if selected the non-connected state, then disconnect the current camera + if (index == 0) { + m_active = false; + m_webcamDeviceName = QString(); + m_webcamDescription = QString(); + m_webcamIndex = -1; + m_proxyDpi = TPointD(0.0, 0.0); + m_proxyImageDimensions = TDimension(0, 0); + + if (m_sessionOpen || m_usingWebcam) { + if (m_liveViewStatus > 0) { + endLiveView(); + } + closeCameraSession(); + m_usingWebcam = false; + } + + setTEnvCameraName(""); + + emit(newCameraSelected(index, false)); + toggleNumpadShortcuts(false); + return; + } + + // There is a "Select Camera" as the first index + index -= 1; + m_active = true; + + // Check if its a webcam or DSLR + // Webcams are listed first, so see if one of them is selected + if (index > cameras.size() - 1) { + m_usingWebcam = false; + } else { + m_usingWebcam = true; + m_webcamIndex = index; + } + + // in case the camera is not changed + if (m_usingWebcam) { + if (cameras.at(index).deviceName() == m_webcamDeviceName) { + return; + } + + if (m_sessionOpen) { + if (m_liveViewStatus > 0) { + endLiveView(); + closeCameraSession(); + } + } + + setWebcam(new QCamera(cameras.at(index))); + m_webcamDeviceName = cameras.at(index).deviceName(); + m_webcamDescription = cameras.at(index).description(); + +#ifdef MACOSX + // this line is needed only in macosx + m_stopMotion->getWebcam()->setViewfinder(m_dummyViewFinder); +#endif + + // loading new camera + getWebcam()->load(); + + m_webcamResolutions.clear(); + + m_webcamResolutions = getWebcam()->supportedViewfinderResolutions(); + int sizeCount = m_webcamResolutions.count(); + + int width; + int height; + for (int s = 0; s < m_webcamResolutions.size(); s++) { + width = m_webcamResolutions.at(s).width(); + height = m_webcamResolutions.at(s).height(); + } + + getWebcam()->unload(); + + setWebcamResolution( + QString(QString::number(width) + " x " + QString::number(height))); + setTEnvCameraName(m_webcamDescription.toStdString()); + emit(newCameraSelected(index + 1, true)); + emit(webcamResolutionsChanged()); + emit(newWebcamResolutionSelected(sizeCount - 1)); + + } else { + m_webcamDeviceName = QString(); + m_webcamDescription = QString(); + m_webcamIndex = -1; + openCameraSession(); + setTEnvCameraName(getCameraName()); + emit(newCameraSelected(index + 1, false)); + } + if (m_useNumpadShortcuts) toggleNumpadShortcuts(true); + m_liveViewDpi = TPointD(0.0, 0.0); + refreshFrameInfo(); +} + +//----------------------------------------------------------------- + +QList StopMotion::getWebcams() { + m_webcams.clear(); + m_webcams = QCameraInfo::availableCameras(); + return m_webcams; +} + +//----------------------------------------------------------------- + +void StopMotion::setWebcam(QCamera *camera) { m_webcam = camera; } + +//----------------------------------------------------------------- + +bool StopMotion::translateIndex(int index) { + // We are using Qt to get the camera info and supported resolutions, but + // we are using OpenCV to actually get the images. + // The camera index from OpenCV and from Qt don't always agree, + // So this checks the name against the correct index. + m_webcamIndex = index; + +#ifdef WIN32 + +// Thanks to: +// https://elcharolin.wordpress.com/2017/08/28/webcam-capture-with-the-media-foundation-sdk/ +// for the webcam enumeration here + +#define CLEAN_ATTRIBUTES() \ + if (attributes) { \ + attributes->Release(); \ + attributes = NULL; \ + } \ + for (DWORD i = 0; i < count; i++) { \ + if (&devices[i]) { \ + devices[i]->Release(); \ + devices[i] = NULL; \ + } \ + } \ + CoTaskMemFree(devices); \ + return hr; + + HRESULT hr = S_OK; + + // this is important!! + hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); + + UINT32 count = 0; + IMFAttributes *attributes = NULL; + IMFActivate **devices = NULL; + + if (FAILED(hr)) { + CLEAN_ATTRIBUTES() + } + // Create an attribute store to specify enumeration parameters. + hr = MFCreateAttributes(&attributes, 1); + + if (FAILED(hr)) { + CLEAN_ATTRIBUTES() + } + + // The attribute to be requested is devices that can capture video + hr = attributes->SetGUID(MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE, + MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID); + if (FAILED(hr)) { + CLEAN_ATTRIBUTES() + } + // Enummerate the video capture devices + hr = MFEnumDeviceSources(attributes, &devices, &count); + + if (FAILED(hr)) { + CLEAN_ATTRIBUTES() + } + // if there are any available devices + if (count > 0) { + WCHAR *nameString = NULL; + // Get the human-friendly name of the device + UINT32 cchName; + + for (int i = 0; i < count; i++) { + hr = devices[i]->GetAllocatedString(MF_DEVSOURCE_ATTRIBUTE_FRIENDLY_NAME, + &nameString, &cchName); + std::string desc = m_webcamDescription.toStdString(); + if (nameString == m_webcamDescription.toStdWString()) { + m_webcamIndex = i; + break; + } + // devices[0]->ShutdownObject(); + } + + CoTaskMemFree(nameString); + } + // clean + CLEAN_ATTRIBUTES() +#else + return true; +#endif +} + +//----------------------------------------------------------------- + +bool StopMotion::initWebcam(int index) { + if (!m_useDirectShow) { + // the webcam order obtained from Qt isn't always the same order as + // the one obtained from OpenCV without DirectShow + translateIndex(index); + m_cvWebcam.open(m_webcamIndex); + } else { + m_webcamIndex = index; + m_cvWebcam.open(m_webcamIndex, cv::CAP_DSHOW); + } + if (m_cvWebcam.isOpened() == false) { + return false; + } + + return true; +} + +//----------------------------------------------------------------- + +void StopMotion::releaseWebcam() { + m_cvWebcam.release(); + m_liveViewStatus = 0; + emit(liveViewStopped()); +} + +//----------------------------------------------------------------- + +void StopMotion::setWebcamResolution(QString resolution) { + m_cvWebcam.release(); + + // resolution is written in the itemText with the format " x + // " (e.g. "800 x 600") + QStringList texts = resolution.split(' '); + // the splited text must be "" "x" and "" + if (texts.size() != 3) return; + int tempStatus = m_liveViewStatus; + m_liveViewStatus = 0; + bool startTimer = false; + if (m_timer->isActive()) { + m_timer->stop(); + startTimer = true; + } + qApp->processEvents(QEventLoop::AllEvents, 1000); + + m_webcamWidth = texts[0].toInt(); + m_webcamHeight = texts[2].toInt(); + + m_liveViewDpi = TPointD(0.0, 0.0); + m_liveViewStatus = tempStatus; + if (startTimer) m_timer->start(40); + + // update env + setTEnvCameraResolution(resolution.toStdString()); + + refreshFrameInfo(); + + int index = m_webcamResolutions.indexOf(QSize(m_webcamWidth, m_webcamHeight)); + emit(newWebcamResolutionSelected(index)); +} + +//----------------------------------------------------------------- + +void StopMotion::getWebcamImage() { + bool error = false; + cv::Mat imgOriginal; + cv::Mat imgCorrected; + + if (m_cvWebcam.isOpened() == false) { + initWebcam(m_webcamIndex); + // mjpg is used by many webcams + // opencv runs very slow on some webcams without it. + if (m_useMjpg) { + m_cvWebcam.set(cv::CAP_PROP_FOURCC, + cv::VideoWriter::fourcc('m', 'j', 'p', 'g')); + m_cvWebcam.set(cv::CAP_PROP_FOURCC, + cv::VideoWriter::fourcc('M', 'J', 'P', 'G')); + } + m_cvWebcam.set(3, m_webcamWidth); + m_cvWebcam.set(4, m_webcamHeight); + if (!m_cvWebcam.isOpened()) { + m_hasLiveViewImage = false; + error = true; + } + } + + bool blnFrameReadSuccessfully = + m_cvWebcam.read(imgOriginal); // get next frame + + if (!blnFrameReadSuccessfully || + imgOriginal.empty()) { // if frame not read successfully + std::cout << "error: frame not read from webcam\n"; + error = true; // print error message to std out + } + + if (!error) { + cv::cvtColor(imgOriginal, imgCorrected, cv::COLOR_BGR2BGRA); + cv::flip(imgCorrected, imgCorrected, 0); + int width = m_cvWebcam.get(3); + int height = m_cvWebcam.get(4); + int size = imgCorrected.total() * imgCorrected.elemSize(); + + m_liveViewImage = TRaster32P(width, height); + m_liveViewImage->lock(); + uchar *imgBuf = imgCorrected.data; + uchar *rawData = m_liveViewImage->getRawData(); + memcpy(rawData, imgBuf, size); + m_liveViewImage->unlock(); + m_hasLiveViewImage = true; + m_liveViewStatus = 2; + if (m_hasLiveViewImage && + (m_liveViewDpi.x == 0.0 || m_liveViewImageDimensions.lx == 0)) { + TCamera *camera = + TApp::instance()->getCurrentScene()->getScene()->getCurrentCamera(); + TDimensionD size = camera->getSize(); + m_liveViewImageDimensions = + TDimension(m_liveViewImage->getLx(), m_liveViewImage->getLy()); + double minimumDpi = std::min(m_liveViewImageDimensions.lx / size.lx, + m_liveViewImageDimensions.ly / size.ly); + m_liveViewDpi = TPointD(minimumDpi, minimumDpi); + + m_fullImageDimensions = m_liveViewImageDimensions; + + m_fullImageDpi = m_liveViewDpi; + + emit(newDimensions()); + } + + emit(newLiveViewImageReady()); + } else + m_hasLiveViewImage = false; +} + +//----------------------------------------------------------------- + +void StopMotion::setUseDirectShow(int state) { + m_useDirectShow = state; + StopMotionUseDirectShow = state; + emit(useDirectShowSignal(state)); +} + +//----------------------------------------------------------------- + +bool StopMotion::toggleLiveView() { + if ((m_sessionOpen || m_usingWebcam) && m_liveViewStatus == 0) { + m_liveViewDpi = TPointD(0.0, 0.0); + m_liveViewImageDimensions = TDimension(0, 0); + if (!m_usingWebcam) { + startLiveView(); + } else + m_liveViewStatus = 1; + loadLineUpImage(); + m_timer->start(40); + emit(liveViewChanged(true)); + Preferences::instance()->setValue(rewindAfterPlayback, false); + TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); + return true; + } else if ((m_sessionOpen || m_usingWebcam) && m_liveViewStatus > 0) { + if (!m_usingWebcam) + endLiveView(); + else + releaseWebcam(); + m_timer->stop(); + emit(liveViewChanged(false)); + if (m_turnOnRewind) { + Preferences::instance()->setValue(rewindAfterPlayback, true); + } + TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); + return false; + } else { + DVGui::warning(tr("No camera selected.")); + return false; + } +} + +//----------------------------------------------------------------- + +void StopMotion::pauseLiveView() { + if (m_liveViewStatus == 2) { + m_liveViewStatus = 3; + m_userCalledPause = true; + emit(liveViewStopped()); + } else if (m_liveViewStatus == 3) { + m_liveViewStatus = 2; + m_userCalledPause = false; + } +} + +//----------------------------------------------------------------- + +EdsError StopMotion::initializeCanonSDK() { + m_error = EdsInitializeSDK(); + if (m_error == EDS_ERR_OK) { + m_isSDKLoaded = true; + } + return m_error; +} + +//----------------------------------------------------------------- + +EdsCameraListRef StopMotion::getCameraList() { + if (!m_isSDKLoaded) initializeCanonSDK(); + if (m_isSDKLoaded) { + m_error = EdsGetCameraList(&m_cameraList); + } + return m_cameraList; +} + +//----------------------------------------------------------------- + +EdsError StopMotion::releaseCameraList() { + if (m_cameraList != NULL) m_error = EdsRelease(m_cameraList); + return m_error; +} + +//----------------------------------------------------------------- + +int StopMotion::getCameraCount() { + if (m_cameraList == NULL) { + getCameraList(); + } + if (m_cameraList != NULL) { + m_error = EdsGetChildCount(m_cameraList, &m_count); + if (m_count == 0) { + m_error = EDS_ERR_DEVICE_NOT_FOUND; + m_sessionOpen = false; + m_liveViewStatus = 0; + } + return m_count; + } else + return -1; +} + +//----------------------------------------------------------------- + +EdsError StopMotion::getCamera(int index) { + if (m_count == 0) { + m_error = EDS_ERR_DEVICE_NOT_FOUND; + } + if (m_count > 0) { + m_error = EdsGetChildAtIndex(m_cameraList, index, &m_camera); + } + return m_error; +} + +//----------------------------------------------------------------- + +EdsError StopMotion::releaseCamera() { + if (m_camera != NULL) { + m_error = EdsRelease(m_camera); + } + return m_error; +} + +//----------------------------------------------------------------- + +void StopMotion::cameraAdded() { + if (!m_active) refreshCameraList(); +} + +//----------------------------------------------------------------- + +void StopMotion::closeCanonSDK() { + if (m_isSDKLoaded) { + EdsTerminateSDK(); + } +} + +//----------------------------------------------------------------- + +EdsError StopMotion::openCameraSession() { + if (m_camera != NULL) { + m_error = EdsOpenSession(m_camera); + if (m_error == EDS_ERR_OK) m_sessionOpen = true; + } + m_error = + EdsSetObjectEventHandler(m_camera, kEdsObjectEvent_All, + StopMotion::handleObjectEvent, (EdsVoid *)this); + + m_error = EdsSetPropertyEventHandler(m_camera, kEdsPropertyEvent_All, + StopMotion::handlePropertyEvent, + (EdsVoid *)this); + + m_error = EdsSetCameraStateEventHandler(m_camera, kEdsStateEvent_All, + StopMotion::handleStateEvent, + (EdsVoid *)this); + + // We can't handle raw images yet, so make sure we are getting jpgs + if (getCurrentImageQuality().contains("RAW")) + setImageQuality("Large Fine Jpeg"); + + EdsUInt32 saveto = kEdsSaveTo_Host; + m_error = EdsSetPropertyData(m_camera, kEdsPropID_SaveTo, 0, + sizeof(EdsUInt32), &saveto); + EdsCapacity newCapacity = {0x7FFFFFFF, 0x1000, 1}; + m_error = EdsSetCapacity(m_camera, newCapacity); + return m_error; +} + +//----------------------------------------------------------------- + +EdsError StopMotion::closeCameraSession() { + if (m_camera != NULL) { + m_error = EdsCloseSession(m_camera); + m_sessionOpen = false; + } + return m_error; +} + +//----------------------------------------------------------------- + +void StopMotion::refreshOptions() { + getAvailableShutterSpeeds(); + getAvailableIso(); + getAvailableApertures(); + getAvailableExposureCompensations(); + getAvailableWhiteBalances(); + buildColorTemperatures(); + getAvailableImageQualities(); + getAvailablePictureStyles(); +} + +//----------------------------------------------------------------- + +std::string StopMotion::getCameraName() { + EdsChar name[EDS_MAX_NAME]; + EdsError err = EDS_ERR_OK; + EdsDataType dataType; + EdsUInt32 dataSize; + m_error = EdsGetPropertySize(m_camera, kEdsPropID_ProductName, 0, &dataType, + &dataSize); + + if (m_error == EDS_ERR_OK) { + m_error = + EdsGetPropertyData(m_camera, kEdsPropID_ProductName, 0, dataSize, name); + } + m_cameraName = name; + return m_cameraName; +} + +//----------------------------------------------------------------- + +QString StopMotion::getMode() { + EdsError err = EDS_ERR_OK; + EdsDataType modeType; + EdsUInt32 size; + EdsUInt32 data; + + err = EdsGetPropertySize(m_camera, kEdsPropID_AEMode, 0, &modeType, &size); + err = EdsGetPropertyData(m_camera, kEdsPropID_AEMode, 0, sizeof(size), &data); + + return QString::fromStdString(m_modeMap[data]); +} + +//----------------------------------------------------------------- + +EdsError StopMotion::getAvailableIso() { + EdsPropertyDesc *IsoDesc = new EdsPropertyDesc; + EdsError err = EDS_ERR_OK; + m_isoOptions.clear(); + + err = EdsGetPropertyDesc(m_camera, kEdsPropID_ISOSpeed, IsoDesc); + int count = IsoDesc->numElements; + if (count > 0) { + int i = 0; + while (i < count) { + m_isoOptions.push_back( + QString::fromStdString(m_isoMap[IsoDesc->propDesc[i]])); + i++; + } + } + delete IsoDesc; + return err; +} + +//----------------------------------------------------------------- + +EdsError StopMotion::getAvailableShutterSpeeds() { + EdsPropertyDesc *TvDesc = new EdsPropertyDesc; + EdsError err = EDS_ERR_OK; + m_shutterSpeedOptions.clear(); + + err = EdsGetPropertyDesc(m_camera, kEdsPropID_Tv, TvDesc); + int count = TvDesc->numElements; + if (count > 0) { + int i = 0; + while (i < count) { + m_shutterSpeedOptions.push_back( + QString::fromStdString(m_tvMap[TvDesc->propDesc[i]])); + i++; + } + } + delete TvDesc; + return err; +} + +//----------------------------------------------------------------- + +EdsError StopMotion::getAvailableApertures() { + EdsPropertyDesc *AvDesc = new EdsPropertyDesc; + EdsError err = EDS_ERR_OK; + m_apertureOptions.clear(); + + err = EdsGetPropertyDesc(m_camera, kEdsPropID_Av, AvDesc); + int count = AvDesc->numElements; + if (count > 0) { + int i = 0; + while (i < count) { + m_apertureOptions.push_back( + QString::fromStdString(m_avMap[AvDesc->propDesc[i]])); + i++; + } + } + delete AvDesc; + return err; +} + +//----------------------------------------------------------------- + +EdsError StopMotion::getAvailableExposureCompensations() { + EdsPropertyDesc *exposureDesc = new EdsPropertyDesc; + EdsError err = EDS_ERR_OK; + m_exposureOptions.clear(); + + err = EdsGetPropertyDesc(m_camera, kEdsPropID_ExposureCompensation, + exposureDesc); + int count = exposureDesc->numElements; + if (count > 0) { + int i = 0; + while (i < count) { + m_exposureOptions.push_back( + QString::fromStdString(m_exposureMap[exposureDesc->propDesc[i]])); + i++; + } + } + delete exposureDesc; + return err; +} + +//----------------------------------------------------------------- + +EdsError StopMotion::getAvailableWhiteBalances() { + EdsPropertyDesc *whiteBalanceDesc = new EdsPropertyDesc; + EdsError err = EDS_ERR_OK; + m_whiteBalanceOptions.clear(); + + err = EdsGetPropertyDesc(m_camera, kEdsPropID_WhiteBalance, whiteBalanceDesc); + int count = whiteBalanceDesc->numElements; + if (count > 0) { + int i = 0; + while (i < count) { + m_whiteBalanceOptions.push_back(QString::fromStdString( + m_whiteBalanceMap[whiteBalanceDesc->propDesc[i]])); + i++; + } + } + delete whiteBalanceDesc; + return err; +} + +//----------------------------------------------------------------- + +EdsError StopMotion::getAvailableImageQualities() { + EdsPropertyDesc *imageQualityDesc = new EdsPropertyDesc; + EdsError err = EDS_ERR_OK; + m_imageQualityOptions.clear(); + + err = EdsGetPropertyDesc(m_camera, kEdsPropID_ImageQuality, imageQualityDesc); + int count = imageQualityDesc->numElements; + if (count > 0) { + int i = 0; + while (i < count) { + QString quality = QString::fromStdString( + m_imageQualityMap[imageQualityDesc->propDesc[i]]); + if (!quality.contains("RAW")) { + m_imageQualityOptions.push_back(quality); + } + i++; + } + } + delete imageQualityDesc; + return err; +} + +//----------------------------------------------------------------- + +EdsError StopMotion::getAvailablePictureStyles() { + EdsPropertyDesc *pictureStyleDesc = new EdsPropertyDesc; + EdsError err = EDS_ERR_OK; + m_pictureStyleOptions.clear(); + + err = EdsGetPropertyDesc(m_camera, kEdsPropID_PictureStyle, pictureStyleDesc); + int count = pictureStyleDesc->numElements; + if (count > 0) { + int i = 0; + while (i < count) { + m_pictureStyleOptions.push_back(QString::fromStdString( + m_pictureStyleMap[pictureStyleDesc->propDesc[i]])); + i++; + } + } + delete pictureStyleDesc; + return err; +} + +//----------------------------------------------------------------- + +void StopMotion::buildColorTemperatures() { + m_colorTempOptions.clear(); + int i = 2800; + while (i <= 10000) { + m_colorTempOptions.push_back(QString::number(i)); + i += 100; + } +} + +//----------------------------------------------------------------- + +QString StopMotion::getCurrentShutterSpeed() { + EdsError err = EDS_ERR_OK; + EdsDataType tvType; + EdsUInt32 size; + EdsUInt32 data; + + err = EdsGetPropertySize(m_camera, kEdsPropID_Tv, 0, &tvType, &size); + err = EdsGetPropertyData(m_camera, kEdsPropID_Tv, 0, sizeof(size), &data); + + return QString::fromStdString(m_tvMap[data]); +} + +//----------------------------------------------------------------- + +QString StopMotion::getCurrentIso() { + EdsError err = EDS_ERR_OK; + EdsDataType isoType; + EdsUInt32 size; + EdsUInt32 data; + + err = EdsGetPropertySize(m_camera, kEdsPropID_ISOSpeed, 0, &isoType, &size); + err = + EdsGetPropertyData(m_camera, kEdsPropID_ISOSpeed, 0, sizeof(size), &data); + + return QString::fromStdString(m_isoMap[data]); +} + +//----------------------------------------------------------------- + +QString StopMotion::getCurrentAperture() { + EdsError err = EDS_ERR_OK; + EdsDataType avType; + EdsUInt32 size; + EdsUInt32 data; + + err = EdsGetPropertySize(m_camera, kEdsPropID_Av, 0, &avType, &size); + err = EdsGetPropertyData(m_camera, kEdsPropID_Av, 0, sizeof(size), &data); + + return QString::fromStdString(m_avMap[data]); +} + +//----------------------------------------------------------------- + +QString StopMotion::getCurrentExposureCompensation() { + EdsError err = EDS_ERR_OK; + EdsDataType exposureType; + EdsUInt32 size; + EdsUInt32 data; + + err = EdsGetPropertySize(m_camera, kEdsPropID_ExposureCompensation, 0, + &exposureType, &size); + err = EdsGetPropertyData(m_camera, kEdsPropID_ExposureCompensation, 0, + sizeof(size), &data); + + return QString::fromStdString(m_exposureMap[data]); +} + +//----------------------------------------------------------------- + +QString StopMotion::getCurrentWhiteBalance() { + EdsError err = EDS_ERR_OK; + EdsDataType whiteBalanceType; + EdsUInt32 size; + EdsUInt32 data; + + err = EdsGetPropertySize(m_camera, kEdsPropID_WhiteBalance, 0, + &whiteBalanceType, &size); + err = EdsGetPropertyData(m_camera, kEdsPropID_WhiteBalance, 0, sizeof(size), + &data); + std::string wbString = m_whiteBalanceMap[data]; + return QString::fromStdString(m_whiteBalanceMap[data]); +} + +//----------------------------------------------------------------- + +QString StopMotion::getCurrentImageQuality() { + EdsError err = EDS_ERR_OK; + EdsDataType imageQualityType; + EdsUInt32 size; + EdsUInt32 data; + + err = EdsGetPropertySize(m_camera, kEdsPropID_ImageQuality, 0, + &imageQualityType, &size); + err = EdsGetPropertyData(m_camera, kEdsPropID_ImageQuality, 0, sizeof(size), + &data); + std::string wbString = m_imageQualityMap[data]; + return QString::fromStdString(m_imageQualityMap[data]); +} + +//----------------------------------------------------------------- + +QString StopMotion::getCurrentPictureStyle() { + EdsError err = EDS_ERR_OK; + EdsDataType pictureStyleType; + EdsUInt32 size; + EdsUInt32 data; + + err = EdsGetPropertySize(m_camera, kEdsPropID_PictureStyle, 0, + &pictureStyleType, &size); + err = EdsGetPropertyData(m_camera, kEdsPropID_PictureStyle, 0, sizeof(size), + &data); + std::string wbString = m_pictureStyleMap[data]; + return QString::fromStdString(m_pictureStyleMap[data]); +} + +//----------------------------------------------------------------- + +QString StopMotion::getCurrentColorTemperature() { + EdsError err = EDS_ERR_OK; + EdsDataType colorTempType; + EdsUInt32 size; + EdsUInt32 data; + + err = EdsGetPropertySize(m_camera, kEdsPropID_ColorTemperature, 0, + &colorTempType, &size); + err = EdsGetPropertyData(m_camera, kEdsPropID_ColorTemperature, 0, + sizeof(size), &data); + + return QString::number(data); +} + +//----------------------------------------------------------------- + +EdsError StopMotion::setShutterSpeed(QString shutterSpeed) { + EdsError err = EDS_ERR_OK; + EdsUInt32 value; + auto it = m_tvMap.begin(); + while (it != m_tvMap.end()) { + if (it->second == shutterSpeed.toStdString()) { + value = it->first; + break; + } + it++; + } + + err = EdsSetPropertyData(m_camera, kEdsPropID_Tv, 0, sizeof(value), &value); + emit(shutterSpeedChangedSignal(shutterSpeed)); + return err; +} + +//----------------------------------------------------------------- + +EdsError StopMotion::setIso(QString iso) { + EdsError err = EDS_ERR_OK; + EdsUInt32 value; + auto it = m_isoMap.begin(); + while (it != m_isoMap.end()) { + if (it->second == iso.toStdString()) { + value = it->first; + break; + } + it++; + } + + err = EdsSetPropertyData(m_camera, kEdsPropID_ISOSpeed, 0, sizeof(value), + &value); + emit(isoChangedSignal(iso)); + return err; +} + +//----------------------------------------------------------------- + +EdsError StopMotion::setAperture(QString aperture) { + EdsError err = EDS_ERR_OK; + EdsUInt32 value; + auto it = m_avMap.begin(); + while (it != m_avMap.end()) { + if (it->second == aperture.toStdString()) { + value = it->first; + break; + } + it++; + } + + err = EdsSetPropertyData(m_camera, kEdsPropID_Av, 0, sizeof(value), &value); + emit(apertureChangedSignal(aperture)); + return err; +} + +//----------------------------------------------------------------- + +EdsError StopMotion::setExposureCompensation(QString exposure) { + EdsError err = EDS_ERR_OK; + EdsUInt32 value; + auto it = m_exposureMap.begin(); + while (it != m_exposureMap.end()) { + if (it->second == exposure.toStdString()) { + value = it->first; + break; + } + it++; + } + + err = EdsSetPropertyData(m_camera, kEdsPropID_ExposureCompensation, 0, + sizeof(value), &value); + emit(exposureChangedSignal(exposure)); + return err; +} + +//----------------------------------------------------------------- + +EdsError StopMotion::setWhiteBalance(QString whiteBalance) { + EdsError err = EDS_ERR_OK; + EdsUInt32 value; + auto it = m_whiteBalanceMap.begin(); + while (it != m_whiteBalanceMap.end()) { + if (it->second == whiteBalance.toStdString()) { + value = it->first; + break; + } + it++; + } + + err = EdsSetPropertyData(m_camera, kEdsPropID_WhiteBalance, 0, sizeof(value), + &value); + emit(whiteBalanceChangedSignal(whiteBalance)); + return err; +} + +//----------------------------------------------------------------- + +EdsError StopMotion::setImageQuality(QString quality) { + EdsError err = EDS_ERR_OK; + EdsUInt32 value; + auto it = m_imageQualityMap.begin(); + while (it != m_imageQualityMap.end()) { + if (it->second == quality.toStdString()) { + value = it->first; + break; + } + it++; + } + + err = EdsSetPropertyData(m_camera, kEdsPropID_ImageQuality, 0, sizeof(value), + &value); + emit(imageQualityChangedSignal(quality)); + m_proxyImageDimensions = TDimension(0, 0); + m_proxyDpi = TPointD(0.0, 0.0); + return err; +} + +//----------------------------------------------------------------- + +EdsError StopMotion::setPictureStyle(QString style) { + EdsError err = EDS_ERR_OK; + EdsUInt32 value; + auto it = m_pictureStyleMap.begin(); + while (it != m_pictureStyleMap.end()) { + if (it->second == style.toStdString()) { + value = it->first; + break; + } + it++; + } + + err = EdsSetPropertyData(m_camera, kEdsPropID_PictureStyle, 0, sizeof(value), + &value); + err = EdsSetPropertyData(m_camera, kEdsPropID_PictureStyle, 0, sizeof(value), + &value); + emit(pictureStyleChangedSignal(style)); + return err; +} + +//----------------------------------------------------------------- + +EdsError StopMotion::setColorTemperature(QString temp) { + EdsError err = EDS_ERR_OK; + EdsUInt32 value; + value = temp.toInt(); + + err = EdsSetPropertyData(m_camera, kEdsPropID_ColorTemperature, 0, + sizeof(value), &value); + err = EdsSetPropertyData(m_camera, kEdsPropID_Evf_ColorTemperature, 0, + sizeof(value), &value); + emit(colorTemperatureChangedSignal(temp)); + return err; +} + +//----------------------------------------------------------------- + +EdsError StopMotion::downloadImage(EdsBaseRef object) { + EdsError err = EDS_ERR_OK; + EdsStreamRef stream = NULL; + EdsDirectoryItemInfo dirItemInfo; + + err = EdsGetDirectoryItemInfo(object, &dirItemInfo); + err = EdsCreateMemoryStream(0, &stream); + err = EdsDownload(object, dirItemInfo.size, stream); + EdsDownloadComplete(object); + + // tj code + + unsigned __int64 mySize = 0; + unsigned char *data = NULL; + err = EdsGetPointer(stream, (EdsVoid **)&data); + err = EdsGetLength(stream, &mySize); + + int width, height, pixelFormat; + // long size; + int inSubsamp, inColorspace; + // unsigned long jpegSize; + tjhandle tjInstance = NULL; + unsigned char *imgBuf = NULL; + tjInstance = tjInitDecompress(); + tjDecompressHeader3(tjInstance, data, mySize, &width, &height, &inSubsamp, + &inColorspace); + + pixelFormat = TJPF_BGRX; + imgBuf = (unsigned char *)tjAlloc(width * height * tjPixelSize[pixelFormat]); + int flags = 0; +#ifdef WIN32 + flags |= TJFLAG_BOTTOMUP; +#endif + int tempWidth, tempHeight; + + if (m_useScaledImages) { + int factorsNum; + tjscalingfactor scalingFactor = {1, 1}; + tjscalingfactor *factor = tjGetScalingFactors(&factorsNum); + int intRatio = (float)width / (float)height * 100.0; + int i = 0; + + TCamera *camera = + TApp::instance()->getCurrentScene()->getScene()->getCurrentCamera(); + TDimension res = camera->getRes(); + + // find the scaling factor that is at least as big as the current camera + while (i < factorsNum) { + scalingFactor = factor[i]; + tempWidth = TJSCALED(width, scalingFactor); + if (tempWidth < res.lx && i > 0) { + scalingFactor = factor[i - 1]; + break; + } + i++; + } + // make sure the scaling factor has the right aspect ratio + while (i >= 0) { + tempWidth = TJSCALED(width, scalingFactor); + tempHeight = TJSCALED(height, scalingFactor); + if ((int)((float)tempWidth / (float)tempHeight * 100.0) == intRatio) { + break; + } + i--; + scalingFactor = factor[i]; + } + } else { + tempWidth = width; + tempHeight = height; + } + + if (m_useScaledImages || !getCurrentImageQuality().contains("Large")) { + TCamera *camera = + TApp::instance()->getCurrentScene()->getScene()->getCurrentCamera(); + TDimensionD size = camera->getSize(); + m_proxyImageDimensions = TDimension(tempWidth, tempHeight); + double minimumDpi = std::min(m_proxyImageDimensions.lx / size.lx, + m_proxyImageDimensions.ly / size.ly); + m_proxyDpi = TPointD(minimumDpi, minimumDpi); + } + + tjDecompress2(tjInstance, data, mySize, imgBuf, tempWidth, + tempWidth * tjPixelSize[pixelFormat], tempHeight, pixelFormat, + flags); + + m_newImage = TRaster32P(tempWidth, tempHeight); + m_newImage->lock(); + uchar *rawData = m_newImage->getRawData(); + memcpy(rawData, imgBuf, tempWidth * tempHeight * tjPixelSize[pixelFormat]); + m_newImage->unlock(); + + tjFree(imgBuf); + imgBuf = NULL; + tjDestroy(tjInstance); + tjInstance = NULL; + + // end tj code + + if (m_useScaledImages) { + QFile fullImage(m_tempFile); + fullImage.open(QIODevice::WriteOnly); + QDataStream dataStream(&fullImage); + dataStream.writeRawData((const char *)data, mySize); + fullImage.close(); + } + + EdsRelease(stream); + stream = NULL; + if (object) EdsRelease(object); + + if (err == EDS_ERR_OK) { + emit(newImageReady()); + } + + return err; +} + +//----------------------------------------------------------------- + +EdsError StopMotion::takePicture() { + EdsError err; + err = EdsSendCommand(m_camera, kEdsCameraCommand_PressShutterButton, + kEdsCameraCommand_ShutterButton_Completely_NonAF); + err = EdsSendCommand(m_camera, kEdsCameraCommand_PressShutterButton, + kEdsCameraCommand_ShutterButton_OFF); + return err; +} + +//----------------------------------------------------------------- + +EdsError StopMotion::startLiveView() { + if (m_camera && m_sessionOpen) { + EdsError err = EDS_ERR_OK; + // Get the output device for the live view image + EdsUInt32 device; + err = EdsGetPropertyData(m_camera, kEdsPropID_Evf_OutputDevice, 0, + sizeof(device), &device); + // PC live view starts by setting the PC as the output device for the live + // view image. + if (err == EDS_ERR_OK) { + device |= kEdsEvfOutputDevice_PC; + err = EdsSetPropertyData(m_camera, kEdsPropID_Evf_OutputDevice, 0, + sizeof(device), &device); + } + if (err == EDS_ERR_OK) { + m_liveViewStatus = LiveViewStarting; + } + // A property change event notification is issued from the camera if + // property settings are made successfully. Start downloading of the live + // view image once the property change notification arrives. + return err; + } else + return EDS_ERR_DEVICE_NOT_FOUND; +} + +//----------------------------------------------------------------- + +EdsError StopMotion::endLiveView() { + EdsError err = EDS_ERR_OK; + // Get the output device for the live view image + EdsUInt32 device; + err = EdsGetPropertyData(m_camera, kEdsPropID_Evf_OutputDevice, 0, + sizeof(device), &device); + // PC live view ends if the PC is disconnected from the live view image output + // device. + if (err == EDS_ERR_OK) { + device &= ~kEdsEvfOutputDevice_PC; + err = EdsSetPropertyData(m_camera, kEdsPropID_Evf_OutputDevice, 0, + sizeof(device), &device); + } + m_liveViewStatus = LiveViewClosed; + return err; +} + +//----------------------------------------------------------------- + +EdsError StopMotion::zoomLiveView() { + if (!m_sessionOpen) return EDS_ERR_DEVICE_INVALID; + EdsError err = EDS_ERR_OK; + + if (m_liveViewZoom == 1) { + m_liveViewZoom = 5; + m_zooming = true; + } else if (m_liveViewZoom == 5) { + m_liveViewZoom = 1; + m_zooming = false; + } + + err = EdsSetPropertyData(m_camera, kEdsPropID_Evf_Zoom, 0, + sizeof(m_liveViewZoom), &m_liveViewZoom); + if (m_liveViewZoom == 5) setZoomPoint(); + + return err; +} + +//----------------------------------------------------------------- + +void StopMotion::makeZoomPoint(TPointD pos) { + m_liveViewZoomPickPoint = pos; + double maxFullWidth = + (double)m_fullImageDimensions.lx / m_fullImageDpi.x * Stage::inch; + double maxFullHeight = + (double)m_fullImageDimensions.ly / m_fullImageDpi.y * Stage::inch; + double newX = m_liveViewZoomPickPoint.x + maxFullWidth / 2.0; + double newY = -m_liveViewZoomPickPoint.y + maxFullHeight / 2.0; + m_calculatedZoomPoint.x = newX / Stage::inch * m_fullImageDpi.x; + m_calculatedZoomPoint.y = newY / Stage::inch * m_fullImageDpi.x; +} + +//----------------------------------------------------------------- + +EdsError StopMotion::setZoomPoint() { + EdsError err = EDS_ERR_OK; + + EdsPoint zoomPoint; + if (m_liveViewZoomPickPoint == TPointD(0.0, 0.0)) { + m_calculatedZoomPoint = + TPoint(m_fullImageDimensions.lx / 2, m_fullImageDimensions.ly / 2); + m_finalZoomPoint.x = m_calculatedZoomPoint.x - (m_zoomRect.x / 2); + m_finalZoomPoint.y = m_calculatedZoomPoint.y - (m_zoomRect.y / 2); + } else { + m_finalZoomPoint.x = m_calculatedZoomPoint.x - (m_zoomRect.x / 2); + m_finalZoomPoint.y = m_calculatedZoomPoint.y - (m_zoomRect.y / 2); + if (m_finalZoomPoint.x < 0) m_finalZoomPoint.x = 0; + if (m_finalZoomPoint.y < 0) m_finalZoomPoint.y = 0; + if (m_finalZoomPoint.x > m_fullImageDimensions.lx - (m_zoomRect.x)) { + m_finalZoomPoint.x = m_fullImageDimensions.lx - (m_zoomRect.x); + } + if (m_finalZoomPoint.y > m_fullImageDimensions.ly - (m_zoomRect.y)) { + m_finalZoomPoint.y = m_fullImageDimensions.ly - (m_zoomRect.y); + } + } + + zoomPoint.x = m_finalZoomPoint.x; + zoomPoint.y = m_finalZoomPoint.y; + + // make sure this is set AFTER starting zoom + err = EdsSetPropertyData(m_camera, kEdsPropID_Evf_ZoomPosition, 0, + sizeof(zoomPoint), &zoomPoint); + + return err; +} + +//----------------------------------------------------------------- + +EdsError StopMotion::downloadEVFData() { + EdsError err = EDS_ERR_OK; + EdsStreamRef stream = NULL; + EdsEvfImageRef evfImage = NULL; + + // Create memory stream. + err = EdsCreateMemoryStream(0, &stream); + // Create EvfImageRef. + if (err == EDS_ERR_OK) { + err = EdsCreateEvfImageRef(stream, &evfImage); + } + // Download live view image data. + if (err == EDS_ERR_OK) { + err = EdsDownloadEvfImage(m_camera, evfImage); + } + + EdsDataType evfZoom; + EdsDataType evfZoomPos; + EdsDataType evfZoomRect; + EdsUInt32 size; + EdsUInt32 sizePos; + EdsUInt32 sizeRect; + EdsUInt32 sizeImagePos; + EdsUInt32 sizeCoordSys; + EdsUInt32 zoomAmount; + EdsPoint zoomPos; + EdsRect zoomRect; + EdsPoint imagePos; + EdsSize coordSys; + + err = EdsGetPropertySize(evfImage, kEdsPropID_Evf_Zoom, 0, &evfZoom, &size); + err = EdsGetPropertyData(evfImage, kEdsPropID_Evf_Zoom, 0, sizeof(size), + &zoomAmount); + + // this is the top corner? of the zoomed image + err = EdsGetPropertySize(evfImage, kEdsPropID_Evf_ZoomPosition, 0, + &evfZoomPos, &sizePos); + err = EdsGetPropertyData(evfImage, kEdsPropID_Evf_ZoomPosition, 0, sizePos, + &zoomPos); + // this is the top corner of the zoomed image and the size of the zoomed image + err = EdsGetPropertySize(evfImage, kEdsPropID_Evf_ZoomRect, 0, &evfZoomRect, + &sizeRect); + err = EdsGetPropertyData(evfImage, kEdsPropID_Evf_ZoomRect, 0, sizeRect, + &zoomRect); + + err = EdsGetPropertySize(evfImage, kEdsPropID_Evf_ImagePosition, 0, + &evfZoomRect, &sizeImagePos); + err = EdsGetPropertyData(evfImage, kEdsPropID_Evf_ImagePosition, 0, + sizeImagePos, &imagePos); + // this returns the size of the full image + err = EdsGetPropertySize(evfImage, kEdsPropID_Evf_CoordinateSystem, 0, + &evfZoomRect, &sizeCoordSys); + err = EdsGetPropertyData(evfImage, kEdsPropID_Evf_CoordinateSystem, 0, + sizeCoordSys, &coordSys); + + m_zoomRect = TPoint(zoomRect.size.width, zoomRect.size.height); + if (zoomAmount == 5 && m_zoomRect == TPoint(0, 0)) { + setZoomPoint(); + } + + // Get the incidental data of the image. + if (err == EDS_ERR_OK) { + JpgConverter *converter = new JpgConverter; + converter->setStream(stream); + converter->setScale(m_useScaledImages); + + connect(converter, SIGNAL(imageReady(bool)), this, SLOT(onImageReady(bool)), + Qt::QueuedConnection); + connect(converter, SIGNAL(finished()), this, SLOT(onFinished()), + Qt::QueuedConnection); + + converter->start(); + + while (!l_quitLoop) + QCoreApplication::processEvents(QEventLoop::AllEvents | + QEventLoop::WaitForMoreEvents); + + l_quitLoop = false; + m_liveViewImage = converter->getImage(); + m_hasLiveViewImage = true; + delete converter; + if (!m_converterSucceeded) return EDS_ERR_UNEXPECTED_EXCEPTION; + + // make sure not to set to LiveViewOpen if it has been turned off + if (m_liveViewStatus > 0) { + m_liveViewStatus = LiveViewOpen; + } + emit(newLiveViewImageReady()); + + if (m_hasLiveViewImage && + (m_liveViewDpi.x == 0.0 || m_liveViewImageDimensions.lx == 0)) { + TCamera *camera = + TApp::instance()->getCurrentScene()->getScene()->getCurrentCamera(); + TDimensionD size = camera->getSize(); + m_liveViewImageDimensions = + TDimension(m_liveViewImage->getLx(), m_liveViewImage->getLy()); + double minimumDpi = std::min(m_liveViewImageDimensions.lx / size.lx, + m_liveViewImageDimensions.ly / size.ly); + m_liveViewDpi = TPointD(minimumDpi, minimumDpi); + + m_fullImageDimensions = TDimension(coordSys.width, coordSys.height); + minimumDpi = std::min(m_fullImageDimensions.lx / size.lx, + m_fullImageDimensions.ly / size.ly); + m_fullImageDpi = TPointD(minimumDpi, minimumDpi); + + emit(newDimensions()); + } + } + + if (stream != NULL) { + EdsRelease(stream); + } + stream = NULL; + if (evfImage != NULL) { + EdsRelease(evfImage); + evfImage = NULL; + } + + // calculate dpi data + + return err; +} + +//----------------------------------------------------------------- + +EdsError StopMotion::focusNear() { + EdsError err = EDS_ERR_OK; + err = EdsSendCommand(m_camera, kEdsCameraCommand_DriveLensEvf, + kEdsEvfDriveLens_Near1); + return err; +} + +//----------------------------------------------------------------- + +EdsError StopMotion::focusFar() { + EdsError err = EDS_ERR_OK; + err = EdsSendCommand(m_camera, kEdsCameraCommand_DriveLensEvf, + kEdsEvfDriveLens_Far1); + return err; +} + +//----------------------------------------------------------------- + +EdsError StopMotion::focusNear2() { + EdsError err = EDS_ERR_OK; + err = EdsSendCommand(m_camera, kEdsCameraCommand_DriveLensEvf, + kEdsEvfDriveLens_Near2); + return err; +} + +//----------------------------------------------------------------- + +EdsError StopMotion::focusFar2() { + EdsError err = EDS_ERR_OK; + err = EdsSendCommand(m_camera, kEdsCameraCommand_DriveLensEvf, + kEdsEvfDriveLens_Far2); + return err; +} + +//----------------------------------------------------------------- + +EdsError StopMotion::focusNear3() { + EdsError err = EDS_ERR_OK; + err = EdsSendCommand(m_camera, kEdsCameraCommand_DriveLensEvf, + kEdsEvfDriveLens_Near3); + return err; +} + +//----------------------------------------------------------------- + +EdsError StopMotion::focusFar3() { + EdsError err = EDS_ERR_OK; + err = EdsSendCommand(m_camera, kEdsCameraCommand_DriveLensEvf, + kEdsEvfDriveLens_Far3); + return err; +} + +//----------------------------------------------------------------- + +void StopMotion::onImageReady(const bool &status) { + m_converterSucceeded = status; +} + +//----------------------------------------------------------------- + +void StopMotion::onFinished() { l_quitLoop = true; } + +//----------------------------------------------------------------- +//----------------------------------------------------------------- + +EdsError StopMotion::handleObjectEvent(EdsObjectEvent event, EdsBaseRef object, + EdsVoid *context) { + if (event == kEdsObjectEvent_DirItemRequestTransfer) { + instance()->downloadImage(object); + } + + return EDS_ERR_OK; +} + +//----------------------------------------------------------------- + +EdsError StopMotion::handlePropertyEvent(EdsPropertyEvent event, + EdsPropertyID property, + EdsUInt32 param, EdsVoid *context) { + if (property == kEdsPropID_Evf_OutputDevice && + event == kEdsPropertyEvent_PropertyChanged) { + if (instance()->m_liveViewStatus == LiveViewStarting) + instance()->m_liveViewStatus = LiveViewOpen; + } + if (property == kEdsPropID_AEMode && + event == kEdsPropertyEvent_PropertyChanged) { + emit(instance()->modeChanged()); + } + + if (property == kEdsPropID_Av && + event == kEdsPropertyEvent_PropertyDescChanged) { + emit(instance()->apertureOptionsChanged()); + } + + if (property == kEdsPropID_Tv && + event == kEdsPropertyEvent_PropertyDescChanged) { + emit(instance()->shutterSpeedOptionsChanged()); + } + if (property == kEdsPropID_ISOSpeed && + event == kEdsPropertyEvent_PropertyDescChanged) { + emit(instance()->isoOptionsChanged()); + } + if (property == kEdsPropID_ExposureCompensation && + event == kEdsPropertyEvent_PropertyDescChanged) { + emit(instance()->exposureOptionsChanged()); + } + if (property == kEdsPropID_WhiteBalance && + event == kEdsPropertyEvent_PropertyDescChanged) { + emit(instance()->whiteBalanceOptionsChanged()); + } + if (property == kEdsPropID_PictureStyle && + event == kEdsPropertyEvent_PropertyDescChanged) { + emit(instance()->pictureStyleOptionsChanged()); + } + if (property == kEdsPropID_ImageQuality && + event == kEdsPropertyEvent_PropertyDescChanged) { + emit(instance()->imageQualityOptionsChanged()); + } + + return EDS_ERR_OK; +} + +//----------------------------------------------------------------- + +EdsError StopMotion::handleStateEvent(EdsStateEvent event, EdsUInt32 parameter, + EdsVoid *context) { + if (event == kEdsStateEvent_Shutdown) { + if (instance()->m_sessionOpen) { + instance()->closeCameraSession(); + instance()->releaseCamera(); + instance()->m_liveViewStatus = LiveViewClosed; + emit(instance()->cameraChanged()); + } + } + return EDS_ERR_OK; +} + +//----------------------------------------------------------------- + +EdsError StopMotion::handleCameraAddedEvent(EdsVoid *context) { + instance()->cameraAdded(); + return EDS_ERR_OK; +} + +//----------------------------------------------------------------- + +void StopMotion::buildAvMap() { + m_avMap.insert(std::pair(0x00, "00")); + m_avMap.insert(std::pair(0x08, "1")); + m_avMap.insert(std::pair(0x0B, "1.1")); + m_avMap.insert(std::pair(0x0C, "1.2")); + m_avMap.insert(std::pair(0x0D, "1.2")); + m_avMap.insert(std::pair(0x10, "1.4")); + m_avMap.insert(std::pair(0x13, "1.6")); + m_avMap.insert(std::pair(0x14, "1.8")); + m_avMap.insert(std::pair(0x15, "1.8")); + m_avMap.insert(std::pair(0x18, "2")); + m_avMap.insert(std::pair(0x1B, "2.2")); + m_avMap.insert(std::pair(0x1C, "2.5")); + m_avMap.insert(std::pair(0x1D, "2.5")); + m_avMap.insert(std::pair(0x20, "2.8")); + m_avMap.insert(std::pair(0x23, "3.2")); + m_avMap.insert(std::pair(0x24, "3.5")); + m_avMap.insert(std::pair(0x25, "3.5")); + m_avMap.insert(std::pair(0x28, "4")); + m_avMap.insert(std::pair(0x2B, "4.5")); + m_avMap.insert(std::pair(0x2C, "4.5")); + m_avMap.insert(std::pair(0x2D, "5.0")); + m_avMap.insert(std::pair(0x30, "5.6")); + m_avMap.insert(std::pair(0x33, "6.3")); + m_avMap.insert(std::pair(0x34, "6.7")); + m_avMap.insert(std::pair(0x35, "7.1")); + m_avMap.insert(std::pair(0x38, "8")); + m_avMap.insert(std::pair(0x3B, "9")); + m_avMap.insert(std::pair(0x3C, "9.5")); + m_avMap.insert(std::pair(0x3D, "10")); + m_avMap.insert(std::pair(0x40, "11")); + m_avMap.insert(std::pair(0x43, "13")); + m_avMap.insert(std::pair(0x44, "13")); + m_avMap.insert(std::pair(0x45, "14")); + m_avMap.insert(std::pair(0x48, "16")); + m_avMap.insert(std::pair(0x4B, "18")); + m_avMap.insert(std::pair(0x4C, "19")); + m_avMap.insert(std::pair(0x4D, "20")); + m_avMap.insert(std::pair(0x50, "22")); + m_avMap.insert(std::pair(0x53, "25")); + m_avMap.insert(std::pair(0x54, "27")); + m_avMap.insert(std::pair(0x55, "29")); + m_avMap.insert(std::pair(0x58, "32")); + m_avMap.insert(std::pair(0x5B, "36")); + m_avMap.insert(std::pair(0x5C, "38")); + m_avMap.insert(std::pair(0x5D, "40")); + m_avMap.insert(std::pair(0x60, "45")); + m_avMap.insert(std::pair(0x63, "51")); + m_avMap.insert(std::pair(0x64, "54")); + m_avMap.insert(std::pair(0x65, "57")); + m_avMap.insert(std::pair(0x68, "64")); + m_avMap.insert(std::pair(0x6B, "72")); + m_avMap.insert(std::pair(0x6C, "76")); + m_avMap.insert(std::pair(0x6D, "80")); + m_avMap.insert(std::pair(0x70, "91")); + m_avMap.insert(std::pair(0xFF, "Auto")); + m_avMap.insert(std::pair(0xffffffff, "unknown")); +} + +//----------------------------------------------------------------- + +void StopMotion::buildIsoMap() { + m_isoMap.insert(std::pair(0x00, "Auto")); + m_isoMap.insert(std::pair(0x28, "6")); + m_isoMap.insert(std::pair(0x30, "12")); + m_isoMap.insert(std::pair(0x38, "25")); + m_isoMap.insert(std::pair(0x40, "50")); + m_isoMap.insert(std::pair(0x48, "100")); + m_isoMap.insert(std::pair(0x4b, "125")); + m_isoMap.insert(std::pair(0x4d, "160")); + m_isoMap.insert(std::pair(0x50, "200")); + m_isoMap.insert(std::pair(0x53, "250")); + m_isoMap.insert(std::pair(0x55, "320")); + m_isoMap.insert(std::pair(0x58, "400")); + m_isoMap.insert(std::pair(0x5b, "500")); + m_isoMap.insert(std::pair(0x5d, "640")); + m_isoMap.insert(std::pair(0x60, "800")); + m_isoMap.insert(std::pair(0x63, "1000")); + m_isoMap.insert(std::pair(0x65, "1250")); + m_isoMap.insert(std::pair(0x68, "1600")); + m_isoMap.insert(std::pair(0x6b, "2000")); + m_isoMap.insert(std::pair(0x6d, "2500")); + m_isoMap.insert(std::pair(0x70, "3200")); + m_isoMap.insert(std::pair(0x73, "4000")); + m_isoMap.insert(std::pair(0x75, "5000")); + m_isoMap.insert(std::pair(0x78, "6400")); + m_isoMap.insert(std::pair(0x7b, "8000")); + m_isoMap.insert(std::pair(0x7d, "10000")); + m_isoMap.insert(std::pair(0x80, "12800")); + m_isoMap.insert(std::pair(0x83, "16000")); + m_isoMap.insert(std::pair(0x85, "20000")); + m_isoMap.insert(std::pair(0x88, "25600")); + m_isoMap.insert(std::pair(0x8b, "32000")); + m_isoMap.insert(std::pair(0x8d, "40000")); + m_isoMap.insert(std::pair(0x90, "51200")); + m_isoMap.insert(std::pair(0x98, "102400")); + m_isoMap.insert(std::pair(0xa0, "204800")); + m_isoMap.insert(std::pair(0xa8, "409600")); + m_isoMap.insert(std::pair(0xffffffff, "unknown")); +} + +//----------------------------------------------------------------- + +void StopMotion::buildTvMap() { + m_tvMap.insert(std::pair(0x04, "Auto")); + m_tvMap.insert(std::pair(0x0c, "Bulb")); + m_tvMap.insert(std::pair(0x10, "30\"")); + m_tvMap.insert(std::pair(0x13, "25\"")); + m_tvMap.insert(std::pair(0x14, "20\"")); + m_tvMap.insert(std::pair(0x15, "20\"")); + m_tvMap.insert(std::pair(0x18, "15\"")); + m_tvMap.insert(std::pair(0x1B, "13\"")); + m_tvMap.insert(std::pair(0x1C, "10\"")); + m_tvMap.insert(std::pair(0x1D, "10\"")); + m_tvMap.insert(std::pair(0x20, "8\"")); + m_tvMap.insert(std::pair(0x23, "6\"")); + m_tvMap.insert(std::pair(0x24, "6\"")); + m_tvMap.insert(std::pair(0x25, "5\"")); + m_tvMap.insert(std::pair(0x28, "4\"")); + m_tvMap.insert(std::pair(0x2B, "3\"2")); + m_tvMap.insert(std::pair(0x2C, "3\"")); + m_tvMap.insert(std::pair(0x2D, "2\"5")); + m_tvMap.insert(std::pair(0x30, "2\"")); + m_tvMap.insert(std::pair(0x33, "1\"6")); + m_tvMap.insert(std::pair(0x34, "1\"5")); + m_tvMap.insert(std::pair(0x35, "1\"3")); + m_tvMap.insert(std::pair(0x38, "1\"")); + m_tvMap.insert(std::pair(0x3B, "0\"8")); + m_tvMap.insert(std::pair(0x3C, "0\"7")); + m_tvMap.insert(std::pair(0x3D, "0\"6")); + m_tvMap.insert(std::pair(0x40, "0\"5")); + m_tvMap.insert(std::pair(0x43, "0\"4")); + m_tvMap.insert(std::pair(0x44, "0\"3")); + m_tvMap.insert(std::pair(0x45, "0\"3")); + m_tvMap.insert(std::pair(0x48, "1/4")); + m_tvMap.insert(std::pair(0x4B, "1/5")); + m_tvMap.insert(std::pair(0x4C, "1/6")); + m_tvMap.insert(std::pair(0x4D, "1/6")); + m_tvMap.insert(std::pair(0x50, "1/8")); + m_tvMap.insert(std::pair(0x53, "1/10")); + m_tvMap.insert(std::pair(0x54, "1/10")); + m_tvMap.insert(std::pair(0x55, "1/13")); + m_tvMap.insert(std::pair(0x58, "1/15")); + m_tvMap.insert(std::pair(0x5B, "1/20")); + m_tvMap.insert(std::pair(0x5C, "1/20")); + m_tvMap.insert(std::pair(0x5D, "1/25")); + m_tvMap.insert(std::pair(0x60, "1/30")); + m_tvMap.insert(std::pair(0x63, "1/40")); + m_tvMap.insert(std::pair(0x64, "1/45")); + m_tvMap.insert(std::pair(0x65, "1/50")); + m_tvMap.insert(std::pair(0x68, "1/60")); + m_tvMap.insert(std::pair(0x6B, "1/80")); + m_tvMap.insert(std::pair(0x6C, "1/90")); + m_tvMap.insert(std::pair(0x6D, "1/100")); + m_tvMap.insert(std::pair(0x70, "1/125")); + m_tvMap.insert(std::pair(0x73, "1/160")); + m_tvMap.insert(std::pair(0x74, "1/180")); + m_tvMap.insert(std::pair(0x75, "1/200")); + m_tvMap.insert(std::pair(0x78, "1/250")); + m_tvMap.insert(std::pair(0x7B, "1/320")); + m_tvMap.insert(std::pair(0x7C, "1/350")); + m_tvMap.insert(std::pair(0x7D, "1/400")); + m_tvMap.insert(std::pair(0x80, "1/500")); + m_tvMap.insert(std::pair(0x83, "1/640")); + m_tvMap.insert(std::pair(0x84, "1/750")); + m_tvMap.insert(std::pair(0x85, "1/800")); + m_tvMap.insert(std::pair(0x88, "1/1000")); + m_tvMap.insert(std::pair(0x8B, "1/1250")); + m_tvMap.insert(std::pair(0x8C, "1/1500")); + m_tvMap.insert(std::pair(0x8D, "1/1600")); + m_tvMap.insert(std::pair(0x90, "1/2000")); + m_tvMap.insert(std::pair(0x93, "1/2500")); + m_tvMap.insert(std::pair(0x94, "1/3000")); + m_tvMap.insert(std::pair(0x95, "1/3200")); + m_tvMap.insert(std::pair(0x98, "1/4000")); + m_tvMap.insert(std::pair(0x9B, "1/5000")); + m_tvMap.insert(std::pair(0x9C, "1/6000")); + m_tvMap.insert(std::pair(0x9D, "1/6400")); + m_tvMap.insert(std::pair(0xA0, "1/8000")); + m_tvMap.insert(std::pair(0xffffffff, "unknown")); +} + +//----------------------------------------------------------------- + +void StopMotion::buildModeMap() { + m_modeMap.insert(std::pair(0, "P")); + m_modeMap.insert(std::pair(1, "Tv")); + m_modeMap.insert(std::pair(2, "Av")); + m_modeMap.insert(std::pair(3, "M")); + m_modeMap.insert(std::pair(55, "FV")); + m_modeMap.insert(std::pair(4, "Bulb")); + m_modeMap.insert(std::pair(5, "A-DEP")); + m_modeMap.insert(std::pair(6, "DEP")); + m_modeMap.insert(std::pair(7, "C1")); + m_modeMap.insert(std::pair(16, "C2")); + m_modeMap.insert(std::pair(17, "C3")); + m_modeMap.insert(std::pair(8, "Lock")); + m_modeMap.insert(std::pair(9, "GreenMode")); + m_modeMap.insert(std::pair(10, "Night Portrait")); + m_modeMap.insert(std::pair(11, "Sports")); + m_modeMap.insert(std::pair(13, "LandScape")); + m_modeMap.insert(std::pair(14, "Close-Up")); + m_modeMap.insert(std::pair(15, "No Strobo")); + m_modeMap.insert(std::pair(12, "Portrait")); + m_modeMap.insert(std::pair(19, "Creative Auto")); + m_modeMap.insert(std::pair(20, "Movies")); + m_modeMap.insert(std::pair(25, "SCN")); + m_modeMap.insert( + std::pair(22, "Scene Intelligent Auto")); + m_modeMap.insert(std::pair(29, "Creative filters")); + m_modeMap.insert(std::pair(0xffffffff, "unknown")); +} + +//----------------------------------------------------------------- + +void StopMotion::buildExposureMap() { + m_exposureMap.insert(std::pair(0x28, "+5")); + m_exposureMap.insert(std::pair(0x25, "+4 2/3")); + m_exposureMap.insert(std::pair(0x24, "+4 1/2")); + m_exposureMap.insert(std::pair(0x23, "+4 1/3")); + m_exposureMap.insert(std::pair(0x20, "+4")); + m_exposureMap.insert(std::pair(0x1D, "+3 2/3")); + m_exposureMap.insert(std::pair(0x1C, "+3 1/2")); + m_exposureMap.insert(std::pair(0x1B, "+3 1/3")); + + m_exposureMap.insert(std::pair(0x18, "+3")); + m_exposureMap.insert(std::pair(0x15, "+2 2/3")); + m_exposureMap.insert(std::pair(0x14, "+2 1/2")); + m_exposureMap.insert(std::pair(0x13, "+2 1/3")); + m_exposureMap.insert(std::pair(0x10, "+2")); + m_exposureMap.insert(std::pair(0x0d, "+1 2/3")); + m_exposureMap.insert(std::pair(0x0c, "+1 1/2")); + m_exposureMap.insert(std::pair(0x0b, "+1 1/3")); + m_exposureMap.insert(std::pair(0x08, "+1")); + m_exposureMap.insert(std::pair(0x05, "+2/3")); + m_exposureMap.insert(std::pair(0x04, "+1/2")); + m_exposureMap.insert(std::pair(0x03, "+1/3")); + m_exposureMap.insert(std::pair(0x00, "0")); + m_exposureMap.insert(std::pair(0xfd, "-1/3")); + m_exposureMap.insert(std::pair(0xfc, "-1/2")); + m_exposureMap.insert(std::pair(0xfb, "-2/3")); + m_exposureMap.insert(std::pair(0xf8, "-1")); + m_exposureMap.insert(std::pair(0xf5, "-1 1/3")); + m_exposureMap.insert(std::pair(0xf4, "-1 1/2")); + m_exposureMap.insert(std::pair(0xf3, "-1 2/3")); + m_exposureMap.insert(std::pair(0xf0, "-2")); + m_exposureMap.insert(std::pair(0xed, "-2 1/3")); + m_exposureMap.insert(std::pair(0xec, "-2 1/2")); + m_exposureMap.insert(std::pair(0xeb, "-2 2/3")); + m_exposureMap.insert(std::pair(0xe8, "-3")); + + m_exposureMap.insert(std::pair(0xE5, "-3 1/3")); + m_exposureMap.insert(std::pair(0xE4, "-3 1/2")); + m_exposureMap.insert(std::pair(0xE3, "-3 2/3")); + m_exposureMap.insert(std::pair(0xE0, "-4")); + m_exposureMap.insert(std::pair(0xDD, "-4 1/3")); + m_exposureMap.insert(std::pair(0xDC, "-4 1/2")); + m_exposureMap.insert(std::pair(0xDB, "-4 2/3")); + m_exposureMap.insert(std::pair(0xD8, "-5")); + + m_exposureMap.insert( + std::pair(0xffffffff, "unknown")); +} + +//----------------------------------------------------------------- + +void StopMotion::buildWhiteBalanceMap() { + m_whiteBalanceMap.insert( + std::pair(0, "Auto: Ambience Priority")); + m_whiteBalanceMap.insert(std::pair(1, "Daylight")); + m_whiteBalanceMap.insert(std::pair(2, "Cloudy")); + m_whiteBalanceMap.insert(std::pair(3, "Tungsten")); + m_whiteBalanceMap.insert( + std::pair(4, "Fluorescent")); + m_whiteBalanceMap.insert(std::pair(5, "Flash")); + m_whiteBalanceMap.insert(std::pair(6, "Manual")); + m_whiteBalanceMap.insert(std::pair(8, "Shade")); + m_whiteBalanceMap.insert( + std::pair(9, "Color Temperature")); + m_whiteBalanceMap.insert(std::pair(10, "Custom 1")); + m_whiteBalanceMap.insert(std::pair(11, "Custom 2")); + m_whiteBalanceMap.insert(std::pair(12, "Custom 3")); + m_whiteBalanceMap.insert(std::pair(15, "Manual 2")); + m_whiteBalanceMap.insert(std::pair(16, "Manual 3")); + m_whiteBalanceMap.insert(std::pair(18, "Manual 4")); + m_whiteBalanceMap.insert(std::pair(19, "Manual 5")); + m_whiteBalanceMap.insert(std::pair(20, "Custom 4")); + m_whiteBalanceMap.insert(std::pair(21, "Custom 5")); + m_whiteBalanceMap.insert( + std::pair(23, "Auto: White Priority")); +} + +//----------------------------------------------------------------- + +void StopMotion::buildImageQualityMap() { + m_imageQualityMap.insert( + std::pair(EdsImageQuality_LR, "RAW")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_LRLJF, "RAW + Large Fine Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_LRMJF, "RAW + Middle Fine Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_LRSJF, "RAW + Small Fine Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_LRLJN, "RAW + Large Normal Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_LRMJN, "RAW + Middle Normal Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_LRSJN, "RAW + Small Normal Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_LRS1JF, "RAW + Small1 Fine Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_LRS1JN, "RAW + Small1 Normal Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_LRS2JF, "RAW + Small2 Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_LRS3JF, "RAW + Small3 Jpeg")); + + m_imageQualityMap.insert(std::pair( + EdsImageQuality_LRLJ, "RAW + Large Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_LRM1J, "RAW + Middle1 Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_LRM2J, "RAW + Middle2 Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_LRSJ, "RAW + Small Jpeg")); + + m_imageQualityMap.insert(std::pair( + EdsImageQuality_MR, "Middle Raw(Small RAW1)")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_MRLJF, "Middle Raw(Small RAW1) + Large Fine Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_MRMJF, "Middle Raw(Small RAW1) + Middle Fine Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_MRSJF, "Middle Raw(Small RAW1) + Small Fine Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_MRLJN, "Middle Raw(Small RAW1) + Large Normal Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_MRMJN, "Middle Raw(Small RAW1) + Middle Normal Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_MRSJN, "Middle Raw(Small RAW1) + Small Normal Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_MRS1JF, "Middle RAW + Small1 Fine Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_MRS1JN, "Middle RAW + Small1 Normal Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_MRS2JF, "Middle RAW + Small2 Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_MRS3JF, "Middle RAW + Small3 Jpeg")); + + m_imageQualityMap.insert(std::pair( + EdsImageQuality_MRLJ, "Middle Raw + Large Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_MRM1J, "Middle Raw + Middle1 Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_MRM2J, "Middle Raw + Middle2 Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_MRSJ, "Middle Raw + Small Jpeg")); + + m_imageQualityMap.insert(std::pair( + EdsImageQuality_SR, "Small RAW(Small RAW2)")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_SRLJF, "Small RAW(Small RAW2) + Large Fine Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_SRMJF, "Small RAW(Small RAW2) + Middle Fine Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_SRSJF, "Small RAW(Small RAW2) + Small Fine Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_SRLJN, "Small RAW(Small RAW2) + Large Normal Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_SRMJN, "Small RAW(Small RAW2) + Middle Normal Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_SRSJN, "Small RAW(Small RAW2) + Small Normal Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_SRS1JF, "Small RAW + Small1 Fine Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_SRS1JN, "Small RAW + Small1 Normal Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_SRS2JF, "Small RAW + Small2 Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_SRS3JF, "Small RAW + Small3 Jpeg")); + + m_imageQualityMap.insert(std::pair( + EdsImageQuality_SRLJ, "Small RAW + Large Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_SRM1J, "Small RAW + Middle1 Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_SRM2J, "Small RAW + Middle2 Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_SRSJ, "Small RAW + Small Jpeg")); + + m_imageQualityMap.insert( + std::pair(EdsImageQuality_CR, "CRAW")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_CRLJF, "CRAW + Large Fine Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_CRMJF, "CRAW + Middle Fine Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_CRM1JF, "CRAW + Middle1 Fine Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_CRM2JF, "CRAW + Middle2 Fine Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_CRSJF, "CRAW + Small Fine Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_CRS1JF, "CRAW + Small1 Fine Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_CRS2JF, "CRAW + Small2 Fine Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_CRS3JF, "CRAW + Small3 Fine Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_CRLJN, "CRAW + Large Normal Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_CRMJN, "CRAW + Middle Normal Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_CRM1JN, "CRAW + Middle1 Normal Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_CRM2JN, "CRAW + Middle2 Normal Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_CRSJN, "CRAW + Small Normal Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_CRS1JN, "CRAW + Small1 Normal Jpeg")); + + m_imageQualityMap.insert(std::pair( + EdsImageQuality_CRLJ, "CRAW + Large Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_CRM1J, "CRAW + Middle1 Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_CRM2J, "CRAW + Middle2 Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_CRSJ, "CRAW + Small Jpeg")); + + m_imageQualityMap.insert(std::pair( + EdsImageQuality_LJF, "Large Fine Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_LJN, "Large Normal Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_MJF, "Middle Fine Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_MJN, "Middle Normal Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_SJF, "Small Fine Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_SJN, "Small Normal Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_S1JF, "Small1 Fine Jpeg")); + m_imageQualityMap.insert(std::pair( + EdsImageQuality_S1JN, "Small1 Normal Jpeg")); + m_imageQualityMap.insert( + std::pair(EdsImageQuality_S2JF, "Small2 Jpeg")); + m_imageQualityMap.insert( + std::pair(EdsImageQuality_S3JF, "Small3 Jpeg")); + + m_imageQualityMap.insert( + std::pair(EdsImageQuality_LJ, "Large Jpeg")); + m_imageQualityMap.insert( + std::pair(EdsImageQuality_M1J, "Middle1 Jpeg")); + m_imageQualityMap.insert( + std::pair(EdsImageQuality_M2J, "Middle2 Jpeg")); + m_imageQualityMap.insert( + std::pair(EdsImageQuality_SJ, "Small Jpeg")); +} + +//----------------------------------------------------------------- + +void StopMotion::buildPictureStyleMap() { + m_pictureStyleMap.insert(std::pair( + kEdsPictureStyle_Standard, "Standard")); + m_pictureStyleMap.insert(std::pair( + kEdsPictureStyle_Portrait, "Portrait")); + m_pictureStyleMap.insert(std::pair( + kEdsPictureStyle_Landscape, "Landscape")); + m_pictureStyleMap.insert( + std::pair(kEdsPictureStyle_Neutral, "Neutral")); + m_pictureStyleMap.insert(std::pair( + kEdsPictureStyle_Faithful, "Faithful")); + m_pictureStyleMap.insert(std::pair( + kEdsPictureStyle_Monochrome, "Monochrome")); + m_pictureStyleMap.insert( + std::pair(kEdsPictureStyle_Auto, "Auto")); + m_pictureStyleMap.insert(std::pair( + kEdsPictureStyle_FineDetail, "Fine Detail")); + m_pictureStyleMap.insert( + std::pair(kEdsPictureStyle_User1, "User 1")); + m_pictureStyleMap.insert( + std::pair(kEdsPictureStyle_User2, "User 2")); + m_pictureStyleMap.insert( + std::pair(kEdsPictureStyle_User3, "User 3")); + m_pictureStyleMap.insert( + std::pair(kEdsPictureStyle_PC1, "Computer 1")); + m_pictureStyleMap.insert( + std::pair(kEdsPictureStyle_PC2, "Computer 2")); + m_pictureStyleMap.insert( + std::pair(kEdsPictureStyle_PC3, "Computer 3")); +} + +//----------------------------------------------------------------- +std::string StopMotion::getTEnvCameraName() { return StopMotionCameraName; } +//----------------------------------------------------------------- +void StopMotion::setTEnvCameraName(std::string name) { + StopMotionCameraName = name; +} +//----------------------------------------------------------------- +std::string StopMotion::getTEnvCameraResolution() { + return StopMotionCameraResolution; +} +//----------------------------------------------------------------- +void StopMotion::setTEnvCameraResolution(std::string resolution) { + StopMotionCameraResolution = resolution; +} + +//============================================================================= + +class StopMotionCaptureCommand : public MenuItemHandler { +public: + StopMotionCaptureCommand() : MenuItemHandler(MI_StopMotionCapture) {} + void execute() { + StopMotion *sm = StopMotion::instance(); + if (sm->m_liveViewStatus > 0) sm->captureImage(); + } +} StopMotionCaptureCommand; + +//============================================================================= + +class StopMotionRaiseOpacityCommand : public MenuItemHandler { +public: + StopMotionRaiseOpacityCommand() + : MenuItemHandler(MI_StopMotionRaiseOpacity) {} + void execute() { + StopMotion *sm = StopMotion::instance(); + if (sm->m_liveViewStatus > 0) sm->raiseOpacity(); + } +} StopMotionRaiseOpacityCommand; + +//============================================================================= + +class StopMotionLowerOpacityCommand : public MenuItemHandler { +public: + StopMotionLowerOpacityCommand() + : MenuItemHandler(MI_StopMotionLowerOpacity) {} + void execute() { + StopMotion *sm = StopMotion::instance(); + if (sm->m_liveViewStatus > 0) sm->lowerOpacity(); + } +} StopMotionLowerOpacityCommand; + +//============================================================================= + +class StopMotionToggleLiveViewCommand : public MenuItemHandler { +public: + StopMotionToggleLiveViewCommand() + : MenuItemHandler(MI_StopMotionToggleLiveView) {} + void execute() { + StopMotion *sm = StopMotion::instance(); + sm->pauseLiveView(); + } +} StopMotionToggleLiveViewCommand; + +//============================================================================= + +class StopMotionToggleZoomCommand : public MenuItemHandler { +public: + StopMotionToggleZoomCommand() : MenuItemHandler(MI_StopMotionToggleZoom) {} + void execute() { + StopMotion *sm = StopMotion::instance(); + sm->zoomLiveView(); + } +} StopMotionToggleZoomCommand; + +//============================================================================= + +class StopMotionLowerSubsamplingCommand : public MenuItemHandler { +public: + StopMotionLowerSubsamplingCommand() + : MenuItemHandler(MI_StopMotionLowerSubsampling) {} + void execute() { + StopMotion *sm = StopMotion::instance(); + sm->setSubsamplingValue(std::max(1, sm->getSubsamplingValue() - 1)); + sm->setSubsampling(); + } +} StopMotionLowerSubsamplingCommand; + +//============================================================================= + +class StopMotionRaiseSubsamplingCommand : public MenuItemHandler { +public: + StopMotionRaiseSubsamplingCommand() + : MenuItemHandler(MI_StopMotionRaiseSubsampling) {} + void execute() { + StopMotion *sm = StopMotion::instance(); + sm->setSubsamplingValue(std::min(30, sm->getSubsamplingValue() + 1)); + sm->setSubsampling(); + } +} StopMotionRaiseSubsamplingCommand; + +//============================================================================= + +class StopMotionJumpToCameraCommand : public MenuItemHandler { +public: + StopMotionJumpToCameraCommand() + : MenuItemHandler(MI_StopMotionJumpToCamera) {} + void execute() { + StopMotion *sm = StopMotion::instance(); + sm->jumpToCameraFrame(); + } +} StopMotionJumpToCameraCommand; \ No newline at end of file diff --git a/toonz/sources/stopmotion/stopmotion.h b/toonz/sources/stopmotion/stopmotion.h new file mode 100644 index 0000000..09f76fd --- /dev/null +++ b/toonz/sources/stopmotion/stopmotion.h @@ -0,0 +1,380 @@ +#pragma once + +#ifndef STOPMOTION_H +#define STOPMOTION_H + +#ifdef WITH_STOPMOTION +// Canon Includes +#include "EDSDK.h" +#include "EDSDKErrors.h" +#include "EDSDKTypes.h" +#include "turbojpeg.h" +#include "opencv2/opencv.hpp" + +// Toonz Includes +#include "traster.h" +#include "toonzqt/gutil.h" +#include "toonzqt/dvdialog.h" + +#include + +class QCamera; +class QCameraInfo; +class QDialog; +class QTimer; + +enum ASPECT_RATIO { FOUR_THREE = 0, THREE_TWO, SIXTEEN_NINE, OTHER_RATIO }; +#endif + +#include +//============================================================================= +// JpgConverter +//----------------------------------------------------------------------------- + +class JpgConverter : public QThread { + Q_OBJECT +#ifdef WITH_STOPMOTION + EdsStreamRef m_stream; + TRaster32P m_finalImage; + bool m_scale = false; + int m_scaleWidth = 0; + +public: + JpgConverter(); + ~JpgConverter(); + void setStream(EdsStreamRef stream); + void setScale(bool scale) { m_scale = scale; } + void setScaleWidth(bool scaleWidth) { m_scaleWidth = scaleWidth; } + TRaster32P getImage() { return m_finalImage; } + void convertFromJpg(); + +protected: + void run() override; + +#endif +signals: + void imageReady(bool); +}; + +class StopMotion : public QObject { // Singleton + Q_OBJECT + +public: + static StopMotion* instance() { + static StopMotion _instance; + return &_instance; + }; +#ifdef WITH_STOPMOTION + +private: + StopMotion(); + ~StopMotion(); + + int m_opacity = 255.0; + int m_xSheetFrameNumber = 1; + int m_frameNumber = 1; + int m_subsampling = 1; + QString m_levelName = ""; + QString m_fileType = "jpg"; + QString m_filePath = "+extras"; + QString m_frameInfoText = ""; + QString m_infoColorName = ""; + QString m_frameInfoToolTip = ""; + QSize m_allowedCameraSize; + QStringList m_isoOptions, m_shutterSpeedOptions, m_apertureOptions, + m_exposureOptions, m_whiteBalanceOptions, m_colorTempOptions, + m_imageQualityOptions, m_pictureStyleOptions; + std::map m_avMap, m_tvMap, m_isoMap, m_modeMap, + m_exposureMap, m_whiteBalanceMap, m_imageQualityMap, m_pictureStyleMap; + QDialog *m_fullScreen1, *m_fullScreen2, *m_fullScreen3; + int m_screenCount; + bool m_useMjpg = true; + bool m_useNumpadShortcuts = false; + bool m_numpadForStyleSwitching = true; + bool m_turnOnRewind = false; + + QTimer* m_reviewTimer; + std::map m_oldActionMap; + + // Webcam Properties + QList m_webcams; + QCamera* m_webcam; + cv::VideoCapture m_cvWebcam; + + static EdsError EDSCALLBACK handleObjectEvent(EdsObjectEvent event, + EdsBaseRef object, + EdsVoid* context); + + static EdsError EDSCALLBACK handlePropertyEvent(EdsPropertyEvent event, + EdsPropertyID property, + EdsUInt32 param, + EdsVoid* context); + + static EdsError EDSCALLBACK handleStateEvent(EdsStateEvent event, + EdsUInt32 parameter, + EdsVoid* context); + static EdsError EDSCALLBACK handleCameraAddedEvent(EdsVoid* context); + + void buildAvMap(); + void buildTvMap(); + void buildIsoMap(); + void buildModeMap(); + void buildExposureMap(); + void buildWhiteBalanceMap(); + void buildImageQualityMap(); + void buildPictureStyleMap(); + +public: + enum LiveViewStatus { + LiveViewClosed = 0, + LiveViewStarting, + LiveViewOpen, + LiveViewPaused + }; + + JpgConverter* m_converter; + bool m_useScaledImages = true; + bool m_usingWebcam = false; + bool m_blackCapture = true; + bool m_placeOnXSheet = true; + int m_reviewTime = 2; + int m_liveViewStatus = LiveViewClosed; + bool m_hasLiveViewImage, m_hasLineUpImage, m_showLineUpImage; + bool m_alwaysLiveView = false; + bool m_active = false; + bool m_userCalledPause = false; + bool m_converterSucceeded = false; + QString m_tempFile; + QTimer* m_timer; + QList m_webcamResolutions; + + // Canon Public Properties + EdsError m_error = EDS_ERR_OK; + bool m_isSDKLoaded = false; + EdsUInt32 m_count = 0; + EdsCameraListRef m_cameraList = NULL; + EdsCameraRef m_camera = NULL; + bool m_sessionOpen = false; + bool m_zooming = false; + std::string m_cameraName; + TRaster32P m_liveViewImage, m_newImage, m_lineUpImage; + TDimension m_liveViewImageDimensions = TDimension(0, 0); + TDimension m_fullImageDimensions = TDimension(0, 0); + TDimension m_proxyImageDimensions = TDimension(0, 0); + TPointD m_proxyDpi = TPointD(0.0, 0.0); + TPointD m_liveViewDpi = TPointD(0.0, 0.0); + TPointD m_fullImageDpi = TPointD(0.0, 0.0); + TPoint m_liveViewZoomOffset = TPoint(0, 0); + EdsUInt32 m_liveViewZoom = 1; + bool m_pickLiveViewZoom = false; + TPointD m_liveViewZoomPickPoint = TPointD(0.0, 0.0); + TPoint m_zoomRect = TPoint(0, 0); + TPoint m_calculatedZoomPoint = TPoint(0, 0); + TPoint m_finalZoomPoint = TPoint(0, 0); + + // Webcam Public Properties + QString m_webcamDeviceName; + QString m_webcamDescription; + int m_webcamIndex = -1; + bool m_useDirectShow = true; + int m_webcamWidth = 0; + int m_webcamHeight = 0; + + void setOpacity(int opacity); + int getOpacity() { return m_opacity; } + void setUseScaledImages(bool on); + bool getUseScaledImages() { return m_useScaledImages; } + void setAlwaysLiveView(bool on); + bool getAlwaysLiveView() { return m_alwaysLiveView; } + void setBlackCapture(bool on); + bool getBlackCapture() { return m_blackCapture; } + void setPlaceOnXSheet(bool on); + bool getPlaceOnXSheet() { return m_placeOnXSheet; } + void setUseMjpg(bool on); + bool getUseMjpg() { return m_useMjpg; } + void setUseNumpadShortcuts(bool on); + bool getUseNumpadShortcuts() { return m_useNumpadShortcuts; } + void toggleNumpadShortcuts(bool on); + void setReviewTime(int time); + int getReviewTime() { return m_reviewTime; } + void setXSheetFrameNumber(int frameNumber); + int getXSheetFrameNumber() { return m_xSheetFrameNumber; } + void setFrameNumber(int frameNumber); + int getFrameNumber() { return m_frameNumber; } + void setLevelName(QString levelName); + QString getLevelName() { return m_levelName; } + void setFileType(QString fileType); + QString getFileType() { return m_fileType; } + void setFilePath(QString filePath); + QString getFilePath() { return m_filePath; } + void updateLevelNameAndFrame(std::wstring levelName); + void setToNextNewLevel(); + void nextFrame(); + void previousFrame(); + void lastFrame(); + void nextName(); + void previousName(); + + QString getFrameInfoText() { return m_frameInfoText; } + QString getInfoColorName() { return m_infoColorName; } + QString getFrameInfoToolTip() { return m_frameInfoToolTip; } + bool toggleLiveView(); + void pauseLiveView(); + void getSubsampling(); + void setSubsampling(); + int getSubsamplingValue() { return m_subsampling; } + void setSubsamplingValue(int subsampling); + void captureImage(); + void postImportProcess(); + void refreshFrameInfo(); + void refreshCameraList(); + void changeCameras(int index); + void raiseOpacity(); + void lowerOpacity(); + void jumpToCameraFrame(); + + std::string getTEnvCameraName(); + void setTEnvCameraName(std::string name); + std::string getTEnvCameraResolution(); + void setTEnvCameraResolution(std::string resolution); + + void saveJpg(TRaster32P, TFilePath path); + bool loadJpg(TFilePath path, TRaster32P& image); + bool loadLineUpImage(); + + // Webcam Commands + QList getWebcams(); + QCamera* getWebcam() { return m_webcam; } + void setWebcam(QCamera* camera); + bool initWebcam(int index = 0); + void releaseWebcam(); + void setWebcamResolution(QString resolution); + void getWebcamImage(); + bool translateIndex(int index); + bool getUseDirectShow() { return m_useDirectShow; } + void setUseDirectShow(int state); + QList getWebcamResolutions() { return m_webcamResolutions; } + // void changeResolutions(int index); + + // Canon Commands + EdsError initializeCanonSDK(); + void closeCanonSDK(); + EdsCameraListRef getCameraList(); + EdsError releaseCameraList(); + int getCameraCount(); + EdsError getCamera(int index); + EdsError releaseCamera(); + void cameraAdded(); + EdsError openCameraSession(); + EdsError closeCameraSession(); + std::string getCameraName(); + EdsError downloadImage(EdsBaseRef object); + EdsError takePicture(); + EdsError startLiveView(); + EdsError endLiveView(); + EdsError downloadEVFData(); + QStringList getIsoOptions() { return m_isoOptions; } + QStringList getShutterSpeedOptions() { return m_shutterSpeedOptions; } + QStringList getApertureOptions() { return m_apertureOptions; } + QStringList getExposureOptions() { return m_exposureOptions; } + QStringList getWhiteBalanceOptions() { return m_whiteBalanceOptions; } + QStringList getColorTemperatureOptions() { return m_colorTempOptions; } + QStringList getImageQualityOptions() { return m_imageQualityOptions; } + QStringList getPictureStyleOptions() { return m_pictureStyleOptions; } + EdsError getAvailableShutterSpeeds(); + EdsError getAvailableIso(); + EdsError getAvailableApertures(); + EdsError getAvailableExposureCompensations(); + EdsError getAvailableWhiteBalances(); + EdsError getAvailableImageQualities(); + EdsError getAvailablePictureStyles(); + void buildColorTemperatures(); + QString getCurrentShutterSpeed(); + QString getCurrentIso(); + QString getCurrentAperture(); + QString getCurrentExposureCompensation(); + QString getCurrentWhiteBalance(); + QString getCurrentColorTemperature(); + QString getCurrentImageQuality(); + QString getCurrentPictureStyle(); + EdsError setShutterSpeed(QString shutterSpeed); + EdsError setIso(QString iso); + EdsError setAperture(QString aperture); + EdsError setExposureCompensation(QString exposure); + EdsError setWhiteBalance(QString whiteBalance); + EdsError setColorTemperature(QString temp); + EdsError setImageQuality(QString quality); + EdsError setPictureStyle(QString style); + QString getMode(); + void refreshOptions(); + EdsError zoomLiveView(); + EdsError setZoomPoint(); + void makeZoomPoint(TPointD pos); + EdsError focusNear(); + EdsError focusFar(); + EdsError focusNear2(); + EdsError focusFar2(); + EdsError focusNear3(); + EdsError focusFar3(); + +#endif // WITH_STOPMOTION +public slots: + void onImageReady(const bool&); + void onFinished(); + void onTimeout(); + void onReviewTimeout(); + void update(); + bool importImage(); + void onSceneSwitched(); + void onPlaybackChanged(); + +signals: + void newLiveViewImageReady(); + void liveViewStopped(); + void newImageReady(); + void cameraChanged(); + void optionsChanged(); + void liveViewChanged(bool); + void newCameraSelected(int, bool); + void webcamResolutionsChanged(); + void newWebcamResolutionSelected(int); + + void apertureOptionsChanged(); + void isoOptionsChanged(); + void shutterSpeedOptionsChanged(); + void exposureOptionsChanged(); + void whiteBalanceOptionsChanged(); + void colorTemperatureChanged(); + void imageQualityOptionsChanged(); + void pictureStyleOptionsChanged(); + void apertureChangedSignal(QString); + void isoChangedSignal(QString); + void shutterSpeedChangedSignal(QString); + void exposureChangedSignal(QString); + void whiteBalanceChangedSignal(QString); + void colorTemperatureChangedSignal(QString); + void imageQualityChangedSignal(QString); + void pictureStyleChangedSignal(QString); + void modeChanged(); + + void newDimensions(); + void subsamplingChanged(int); + void filePathChanged(QString); + void levelNameChanged(QString); + void fileTypeChanged(QString); + void xSheetFrameNumberChanged(int); + void frameNumberChanged(int); + void frameInfoTextChanged(QString); + void opacityChanged(int); + void scaleFullSizeImagesSignal(bool); + void blackCaptureSignal(bool); + void liveViewOnAllFramesSignal(bool); + void placeOnXSheetSignal(bool); + void useMjpgSignal(bool); + void useNumpadSignal(bool); + void useDirectShowSignal(bool); + void reviewTimeChangedSignal(int); + void updateCameraList(); +}; + +#endif // STOPMOTION_H \ No newline at end of file diff --git a/toonz/sources/stopmotion/stopmotioncontroller.cpp b/toonz/sources/stopmotion/stopmotioncontroller.cpp new file mode 100644 index 0000000..d27d30d --- /dev/null +++ b/toonz/sources/stopmotion/stopmotioncontroller.cpp @@ -0,0 +1,1730 @@ +#include "stopmotioncontroller.h" + +// TnzLib includes +#include "toonz/levelset.h" +#include "toonz/preferences.h" +#include "toonz/sceneproperties.h" +#include "toonz/toonzscene.h" +#include "toonz/tcamera.h" +#include "toonz/tcolumnhandle.h" +#include "toonz/tframehandle.h" +#include "toonz/tscenehandle.h" +#include "toonz/txshcell.h" +#include "toonz/txsheethandle.h" +#include "toonz/txshlevelhandle.h" +#include "toonz/txshsimplelevel.h" +#include "toonz/tstageobjecttree.h" + +// TnzCore includes +#include "filebrowsermodel.h" +#include "formatsettingspopups.h" +#include "tapp.h" +#include "tenv.h" +#include "tlevel_io.h" +#include "toutputproperties.h" +#include "tsystem.h" + +// TnzQt includes +#include "toonzqt/filefield.h" +#include "toonzqt/intfield.h" +#include "toonzqt/menubarcommand.h" + +// Qt includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef _WIN32 +#include +#endif + +namespace { + +//----------------------------------------------------------------------------- + +#ifdef _WIN32 +void openCaptureFilterSettings(const QWidget *parent, + const QString &cameraName) { + HRESULT hr; + + ICreateDevEnum *createDevEnum = NULL; + IEnumMoniker *enumMoniker = NULL; + IMoniker *moniker = NULL; + + IBaseFilter *deviceFilter; + + ISpecifyPropertyPages *specifyPropertyPages; + CAUUID cauuid; + // set parent's window handle in order to make the dialog modal + HWND ghwndApp = (HWND)(parent->winId()); + + // initialize COM + CoInitialize(NULL); + + // get device list + CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, + IID_ICreateDevEnum, (PVOID *)&createDevEnum); + + // create EnumMoniker + createDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, + &enumMoniker, 0); + if (enumMoniker == NULL) { + // if no connected devices found + return; + } + + // reset EnumMoniker + enumMoniker->Reset(); + + // find target camera + ULONG fetched = 0; + bool isCameraFound = false; + while (hr = enumMoniker->Next(1, &moniker, &fetched), hr == S_OK) { + // get friendly name (= device name) of the camera + IPropertyBag *pPropertyBag; + moniker->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pPropertyBag); + VARIANT var; + var.vt = VT_BSTR; + VariantInit(&var); + + pPropertyBag->Read(L"FriendlyName", &var, 0); + + QString deviceName = QString::fromWCharArray(var.bstrVal); + + VariantClear(&var); + + if (deviceName == cameraName) { + // bind monkier to the filter + moniker->BindToObject(0, 0, IID_IBaseFilter, (void **)&deviceFilter); + + // release moniker etc. + moniker->Release(); + enumMoniker->Release(); + createDevEnum->Release(); + + isCameraFound = true; + break; + } + } + + // if no matching camera found + if (!isCameraFound) return; + + // open capture filter popup + hr = deviceFilter->QueryInterface(IID_ISpecifyPropertyPages, + (void **)&specifyPropertyPages); + if (hr == S_OK) { + hr = specifyPropertyPages->GetPages(&cauuid); + + hr = OleCreatePropertyFrame(ghwndApp, 30, 30, NULL, 1, + (IUnknown **)&deviceFilter, cauuid.cElems, + (GUID *)cauuid.pElems, 0, 0, NULL); + + CoTaskMemFree(cauuid.pElems); + specifyPropertyPages->Release(); + } +} +#endif + +//----------------------------------------------------------------------------- + +QScrollArea *makeChooserPage(QWidget *chooser) { + QScrollArea *scrollArea = new QScrollArea(); + scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); + scrollArea->setWidgetResizable(true); + scrollArea->setWidget(chooser); + return scrollArea; +} + +//----------------------------------------------------------------------------- + +QScrollArea *makeChooserPageWithoutScrollBar(QWidget *chooser) { + QScrollArea *scrollArea = new QScrollArea(); + scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + scrollArea->setWidgetResizable(true); + scrollArea->setWidget(chooser); + return scrollArea; +} + +} // namespace + +//***************************************************************************** +// StopMotionController implementation +//***************************************************************************** + +StopMotionController::StopMotionController(QWidget *parent) : QWidget(parent) { + m_stopMotion = StopMotion::instance(); + m_tabBar = new DVGui::TabBar(this); + m_tabBar->setDrawBase(false); + m_tabBar->setObjectName("StopMotionTabBar"); + m_tabBar->addSimpleTab(tr("Controls")); + m_tabBar->addSimpleTab(tr("Settings")); + m_tabBar->addSimpleTab(tr("Options")); + m_tabBarContainer = new TabBarContainter(this); + m_mainControlsPage = new QFrame(); + m_cameraSettingsPage = new QFrame(); + m_optionsPage = new QFrame(); + + // ********************** + // Make Control Page + // ********************** + + m_saveInFolderPopup = new PencilTestSaveInFolderPopup(this); + m_cameraListCombo = new QComboBox(this); + m_resolutionCombo = new QComboBox(this); + m_resolutionCombo->setFixedWidth(fontMetrics().width("0000 x 0000") + 25); + m_resolutionLabel = new QLabel(tr("Resolution: "), this); + QPushButton *refreshCamListButton = new QPushButton(tr("Refresh"), this); + refreshCamListButton->setFixedHeight(28); + refreshCamListButton->setStyleSheet("padding: 0 2;"); + QGroupBox *fileFrame = new QGroupBox(tr("File"), this); + m_levelNameEdit = new LevelNameLineEdit(this); + +#ifdef _WIN32 + m_captureFilterSettingsBtn = new QPushButton(this); +#else + m_captureFilterSettingsBtn = 0; +#endif + if (m_captureFilterSettingsBtn) { + m_captureFilterSettingsBtn->setObjectName("GearButton"); + m_captureFilterSettingsBtn->setFixedSize(28, 28); + m_captureFilterSettingsBtn->setIconSize(QSize(15, 15)); + m_captureFilterSettingsBtn->setToolTip(tr("Webcam Settings...")); + } + + // set the start frame 10 if the option in preferences + // "Show ABC Appendix to the Frame Number in Xsheet Cell" is active. + // (frame 10 is displayed as "1" with this option) + int startFrame = + Preferences::instance()->isShowFrameNumberWithLettersEnabled() ? 10 : 1; + m_frameNumberEdit = new FrameNumberLineEdit(this, startFrame); + m_frameInfoLabel = new QLabel("", this); + m_fileTypeCombo = new QComboBox(this); + m_fileFormatOptionButton = new QPushButton(tr("Options"), this); + m_fileFormatOptionButton->setFixedHeight(28); + m_fileFormatOptionButton->setStyleSheet("padding: 0 2;"); + m_xSheetFrameNumberEdit = new DVGui::IntLineEdit(this, 1, 1); + m_saveInFileFld = + new DVGui::FileField(this, m_saveInFolderPopup->getParentPath()); + QToolButton *nextLevelButton = new QToolButton(this); + m_previousLevelButton = new QToolButton(this); + QPushButton *nextOpenLevelButton = new QPushButton(this); + QToolButton *nextFrameButton = new QToolButton(this); + m_previousFrameButton = new QToolButton(this); + QPushButton *lastFrameButton = new QPushButton(this); + QToolButton *nextXSheetFrameButton = new QToolButton(this); + m_previousXSheetFrameButton = new QToolButton(this); + m_onionOpacityFld = new DVGui::IntField(this); + m_captureButton = new QPushButton(tr("Capture"), this); + // QPushButton *subfolderButton = new QPushButton(tr("Subfolder"), this); + m_fileTypeCombo->addItems({"jpg", "png", "tga", "tif"}); + m_fileTypeCombo->setCurrentIndex(0); + + fileFrame->setObjectName("CleanupSettingsFrame"); + m_frameNumberEdit->setObjectName("LargeSizedText"); + m_frameInfoLabel->setAlignment(Qt::AlignRight); + nextLevelButton->setFixedSize(24, 24); + nextLevelButton->setArrowType(Qt::RightArrow); + nextLevelButton->setToolTip(tr("Next Level")); + nextOpenLevelButton->setText(tr("Next New")); + nextOpenLevelButton->setFixedHeight(28); + nextOpenLevelButton->setStyleSheet("padding: 0 2;"); + nextOpenLevelButton->setSizePolicy(QSizePolicy::Maximum, + QSizePolicy::Maximum); + m_previousLevelButton->setFixedSize(24, 24); + m_previousLevelButton->setArrowType(Qt::LeftArrow); + m_previousLevelButton->setToolTip(tr("Previous Level")); + nextFrameButton->setFixedSize(24, 24); + nextFrameButton->setArrowType(Qt::RightArrow); + nextFrameButton->setToolTip(tr("Next Frame")); + lastFrameButton->setText(tr("Last Frame")); + lastFrameButton->setFixedHeight(28); + lastFrameButton->setStyleSheet("padding: 0 2;"); + lastFrameButton->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum); + m_previousFrameButton->setFixedSize(24, 24); + m_previousFrameButton->setArrowType(Qt::LeftArrow); + m_previousFrameButton->setToolTip(tr("Previous Frame")); + + m_xSheetFrameNumberEdit->setObjectName("LargeSizedText"); + nextXSheetFrameButton->setFixedSize(24, 24); + nextXSheetFrameButton->setArrowType(Qt::RightArrow); + nextXSheetFrameButton->setToolTip(tr("Next XSheet Frame")); + m_previousXSheetFrameButton->setFixedSize(24, 24); + m_previousXSheetFrameButton->setArrowType(Qt::LeftArrow); + m_previousXSheetFrameButton->setToolTip(tr("Previous XSheet Frame")); + + m_setToCurrentXSheetFrameButton = new QPushButton(this); + m_setToCurrentXSheetFrameButton->setText(tr("Current Frame")); + m_setToCurrentXSheetFrameButton->setFixedHeight(28); + m_setToCurrentXSheetFrameButton->setSizePolicy(QSizePolicy::Maximum, + QSizePolicy::Maximum); + m_setToCurrentXSheetFrameButton->setStyleSheet("padding: 2px;"); + m_setToCurrentXSheetFrameButton->setToolTip( + tr("Set to the Current Playhead Location")); + + m_onionOpacityFld->setRange(0, 100); + m_onionOpacityFld->setValue(100); + m_onionOpacityFld->setDisabled(false); + m_toggleLiveViewButton = new QPushButton(tr("Start Live View")); + m_toggleLiveViewButton->setObjectName("LargeSizedText"); + m_toggleLiveViewButton->setFixedHeight(35); + m_captureButton->setObjectName("LargeSizedText"); + m_captureButton->setFixedHeight(35); + QCommonStyle style; + m_captureButton->setIcon(style.standardIcon(QStyle::SP_DialogOkButton)); + m_captureButton->setIconSize(QSize(20, 20)); + + // subfolderButton->setObjectName("SubfolderButton"); + // subfolderButton->setIconSize(QSize(15, 15)); + m_saveInFileFld->setMaximumWidth(380); + m_levelNameEdit->setMaximumWidth(380); + + m_saveInFolderPopup->hide(); + m_zoomButton = new QPushButton(tr("Zoom"), this); + m_zoomButton->setFixedHeight(28); + m_zoomButton->setStyleSheet("padding: 0 2;"); + m_zoomButton->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum); + m_pickZoomButton = new QPushButton(tr("Pick Zoom"), this); + m_pickZoomButton->setStyleSheet("padding: 0 2;"); + m_pickZoomButton->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum); + m_pickZoomButton->setFixedHeight(28); + m_focusNearButton = new QPushButton(tr("<"), this); + m_focusNearButton->setFixedSize(32, 28); + m_focusFarButton = new QPushButton(tr(">"), this); + m_focusFarButton->setFixedSize(32, 28); + m_focusNear2Button = new QPushButton(tr("<<"), this); + m_focusNear2Button->setFixedSize(32, 28); + m_focusFar2Button = new QPushButton(tr(">>"), this); + m_focusFar2Button->setFixedSize(32, 28); + m_focusNear3Button = new QPushButton(tr("<<<"), this); + m_focusNear3Button->setFixedSize(32, 28); + m_focusFar3Button = new QPushButton(tr(">>>"), this); + m_focusFar3Button->setFixedSize(32, 28); + //*****//**** + + QVBoxLayout *controlLayout = new QVBoxLayout(); + controlLayout->setSpacing(0); + controlLayout->setMargin(5); + + { + { + QGridLayout *camLay = new QGridLayout(); + camLay->setMargin(0); + camLay->setSpacing(3); + { + camLay->addWidget(new QLabel(tr("Camera:"), this), 0, 0, + Qt::AlignRight); + camLay->addWidget(m_cameraListCombo, 0, 1, Qt::AlignLeft); + camLay->addWidget(refreshCamListButton, 0, 2, Qt::AlignLeft); + if (m_captureFilterSettingsBtn) { + camLay->addWidget(m_captureFilterSettingsBtn, 0, 3, Qt::AlignLeft); + camLay->addWidget(m_resolutionLabel, 1, 0, Qt::AlignRight); + camLay->addWidget(m_resolutionCombo, 1, 1, 1, 3, Qt::AlignLeft); + camLay->setColumnStretch(3, 30); + } else { + camLay->addWidget(m_resolutionLabel, 1, 0, Qt::AlignRight); + camLay->addWidget(m_resolutionCombo, 1, 1, 1, 2, Qt::AlignLeft); + camLay->setColumnStretch(2, 30); + } + } + controlLayout->addLayout(camLay, 0); + + QVBoxLayout *fileLay = new QVBoxLayout(); + fileLay->setMargin(8); + fileLay->setSpacing(5); + { + QGridLayout *levelLay = new QGridLayout(); + levelLay->setMargin(0); + levelLay->setHorizontalSpacing(3); + levelLay->setVerticalSpacing(5); + { + levelLay->addWidget(new QLabel(tr("Name:"), this), 0, 0, + Qt::AlignRight); + QHBoxLayout *nameLay = new QHBoxLayout(); + nameLay->setMargin(0); + nameLay->setSpacing(2); + { + nameLay->addWidget(m_previousLevelButton, 0); + nameLay->addWidget(m_levelNameEdit, 1); + nameLay->addWidget(nextLevelButton, 0); + nameLay->addWidget(nextOpenLevelButton, 0); + } + levelLay->addLayout(nameLay, 0, 1); + + levelLay->addWidget(new QLabel(tr("Frame:"), this), 1, 0, + Qt::AlignRight); + + QHBoxLayout *frameLay = new QHBoxLayout(); + frameLay->setMargin(0); + frameLay->setSpacing(2); + { + frameLay->addWidget(m_previousFrameButton, 0); + frameLay->addWidget(m_frameNumberEdit, 1); + frameLay->addWidget(nextFrameButton, 0); + frameLay->addWidget(lastFrameButton, 0); + frameLay->addWidget(m_frameInfoLabel, 1, Qt::AlignVCenter); + } + levelLay->addLayout(frameLay, 1, 1); + } + levelLay->setColumnStretch(0, 0); + levelLay->setColumnStretch(1, 1); + fileLay->addLayout(levelLay, 0); + + QHBoxLayout *fileTypeLay = new QHBoxLayout(); + fileTypeLay->setMargin(0); + fileTypeLay->setSpacing(3); + { + fileTypeLay->addWidget(new QLabel(tr("File Type:"), this), 0); + fileTypeLay->addWidget(m_fileTypeCombo, 1); + fileTypeLay->addSpacing(10); + fileTypeLay->addWidget(m_fileFormatOptionButton); + } + fileLay->addLayout(fileTypeLay, 0); + + QHBoxLayout *saveInLay = new QHBoxLayout(); + saveInLay->setMargin(0); + saveInLay->setSpacing(3); + { + saveInLay->addWidget(new QLabel(tr("Save In:"), this), 0); + saveInLay->addWidget(m_saveInFileFld, 1); + } + fileLay->addLayout(saveInLay, 0); + // fileLay->addWidget(subfolderButton, 0); + } + fileFrame->setLayout(fileLay); + controlLayout->addWidget(fileFrame, 0); + + QGridLayout *displayLay = new QGridLayout(); + displayLay->setMargin(8); + displayLay->setHorizontalSpacing(3); + displayLay->setVerticalSpacing(5); + { + displayLay->addWidget(new QLabel(tr("XSheet Frame:"), this), 0, 0, + Qt::AlignRight); + QHBoxLayout *xsheetLay = new QHBoxLayout(); + xsheetLay->setMargin(0); + xsheetLay->setSpacing(2); + { + xsheetLay->addWidget(m_previousXSheetFrameButton, Qt::AlignLeft); + xsheetLay->addWidget(m_xSheetFrameNumberEdit, Qt::AlignLeft); + xsheetLay->addWidget(nextXSheetFrameButton, Qt::AlignLeft); + xsheetLay->addWidget(m_setToCurrentXSheetFrameButton, + Qt::AlignCenter); + xsheetLay->addStretch(50); + } + displayLay->addLayout(xsheetLay, 0, 1); + } + displayLay->setColumnStretch(0, 0); + displayLay->setColumnStretch(1, 1); + controlLayout->addLayout(displayLay, 0); + controlLayout->addStretch(1); + controlLayout->addSpacing(5); + controlLayout->addStretch(1); + } + + m_mainControlsPage->setLayout(controlLayout); + + // Make Settings Page + + m_isoCombo = new QComboBox(this); + m_shutterSpeedCombo = new QComboBox(this); + m_exposureCombo = new QComboBox(this); + m_apertureCombo = new QComboBox(this); + m_whiteBalanceCombo = new QComboBox(this); + m_kelvinCombo = new QComboBox(this); + m_imageQualityCombo = new QComboBox(this); + m_pictureStyleCombo = new QComboBox(this); + m_cameraSettingsLabel = new QLabel(tr("Camera Model"), this); + m_cameraModeLabel = new QLabel(tr("Camera Mode"), this); + m_kelvinLabel = new QLabel(tr("Temperature: "), this); + m_isoCombo->setFixedWidth(fontMetrics().width("000000") + 25); + m_shutterSpeedCombo->setFixedWidth(fontMetrics().width("000000") + 25); + m_apertureCombo->setFixedWidth(fontMetrics().width("000000") + 25); + m_exposureCombo->setFixedWidth(fontMetrics().width("000000") + 25); + QVBoxLayout *settingsLayout = new QVBoxLayout; + settingsLayout->setSpacing(0); + settingsLayout->setMargin(5); + + QGridLayout *settingsGridLayout = new QGridLayout; + { + settingsGridLayout->setMargin(0); + settingsGridLayout->setSpacing(3); + settingsGridLayout->addWidget(m_cameraSettingsLabel, 0, 0, 1, 2, + Qt::AlignCenter); + settingsGridLayout->addWidget(m_cameraModeLabel, 1, 0, 1, 2, + Qt::AlignCenter); + settingsGridLayout->addWidget(new QLabel(tr("Shutter Speed: ")), 2, 0, + Qt::AlignRight); + settingsGridLayout->addWidget(m_shutterSpeedCombo, 2, 1, Qt::AlignLeft); + settingsGridLayout->addWidget(new QLabel(tr("Iso: ")), 3, 0, + Qt::AlignRight); + settingsGridLayout->addWidget(m_isoCombo, 3, 1, Qt::AlignLeft); + settingsGridLayout->addWidget(new QLabel(tr("Aperture: ")), 4, 0, + Qt::AlignRight); + settingsGridLayout->addWidget(m_apertureCombo, 4, 1, Qt::AlignLeft); + settingsGridLayout->addWidget(new QLabel(tr("Exposure: ")), 5, 0, + Qt::AlignRight); + settingsGridLayout->addWidget(m_exposureCombo, 5, 1, Qt::AlignLeft); + settingsGridLayout->addWidget(new QLabel(tr("Image Quality: ")), 6, 0, + Qt::AlignRight); + settingsGridLayout->addWidget(m_imageQualityCombo, 6, 1, Qt::AlignLeft); + settingsGridLayout->addWidget(new QLabel(tr("Picture Style: ")), 7, 0, + Qt::AlignRight); + settingsGridLayout->addWidget(m_pictureStyleCombo, 7, 1, Qt::AlignLeft); + settingsGridLayout->addWidget(new QLabel(tr("White Balance: ")), 8, 0, + Qt::AlignRight); + settingsGridLayout->addWidget(m_whiteBalanceCombo, 8, 1, Qt::AlignLeft); + settingsGridLayout->addWidget(m_kelvinLabel, 9, 0, Qt::AlignRight); + settingsGridLayout->addWidget(m_kelvinCombo, 9, 1, Qt::AlignLeft); + + settingsGridLayout->setColumnStretch(1, 30); + } + settingsLayout->addLayout(settingsGridLayout, 0); + m_focusAndZoomLayout = new QHBoxLayout; + m_focusAndZoomLayout->addStretch(); + m_focusAndZoomLayout->addWidget(m_focusNear3Button, Qt::AlignCenter); + m_focusAndZoomLayout->addWidget(m_focusNear2Button, Qt::AlignCenter); + m_focusAndZoomLayout->addWidget(m_focusNearButton, Qt::AlignCenter); + m_focusAndZoomLayout->addWidget(m_zoomButton, Qt::AlignCenter); + m_focusAndZoomLayout->addWidget(m_pickZoomButton, Qt::AlignCenter); + m_focusAndZoomLayout->addWidget(m_focusFarButton, Qt::AlignCenter); + m_focusAndZoomLayout->addWidget(m_focusFar2Button, Qt::AlignCenter); + m_focusAndZoomLayout->addWidget(m_focusFar3Button, Qt::AlignCenter); + m_focusAndZoomLayout->addStretch(); + // settingsLayout->addStretch(); + settingsLayout->addLayout(m_focusAndZoomLayout); + settingsLayout->addStretch(); + m_cameraSettingsPage->setLayout(settingsLayout); + + // Make Options Page + QGroupBox *webcamBox = new QGroupBox(tr("Webcam Options"), this); + QGroupBox *dslrBox = new QGroupBox(tr("DSLR Options"), this); + m_postCaptureReviewFld = new DVGui::IntField(this); + m_postCaptureReviewFld->setRange(0, 10); + + m_subsamplingFld = new DVGui::IntField(this); + m_subsamplingFld->setRange(1, 30); + m_subsamplingFld->setDisabled(true); + m_blackScreenForCapture = new QCheckBox(this); + + m_placeOnXSheetCB = new QCheckBox(this); + m_placeOnXSheetCB->setToolTip(tr("Place the frame in the XSheet")); + + m_useScaledFullSizeImages = new QCheckBox(this); + m_directShowLabel = new QLabel(tr("Use Direct Show Webcam Drivers"), this); + m_directShowCB = new QCheckBox(this); + m_useMjpgCB = new QCheckBox(this); + m_useNumpadCB = new QCheckBox(this); + + m_liveViewOnAllFramesCB = new QCheckBox(this); + QVBoxLayout *optionsOutsideLayout = new QVBoxLayout; + QGridLayout *optionsLayout = new QGridLayout; + optionsLayout->setSpacing(3); + optionsLayout->setMargin(5); + QGridLayout *webcamLayout = new QGridLayout; + QGridLayout *dslrLayout = new QGridLayout; + QGridLayout *checkboxLayout = new QGridLayout; + + dslrLayout->addWidget(m_blackScreenForCapture, 0, 0, Qt::AlignRight); + dslrLayout->addWidget(new QLabel(tr("Black Screen for Capture")), 0, 1, + Qt::AlignLeft); + dslrLayout->addWidget(m_useScaledFullSizeImages, 1, 0, Qt::AlignRight); + dslrLayout->addWidget(new QLabel(tr("Use Reduced Resolution Images")), 1, 1, + Qt::AlignLeft); + dslrLayout->setColumnStretch(1, 30); + dslrBox->setLayout(dslrLayout); + dslrBox->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Maximum); + optionsOutsideLayout->addWidget(dslrBox, Qt::AlignCenter); + + webcamLayout->addWidget(m_directShowCB, 0, 0, Qt::AlignRight); + webcamLayout->addWidget(m_directShowLabel, 0, 1, Qt::AlignLeft); + webcamLayout->addWidget(m_useMjpgCB, 1, 0, Qt::AlignRight); + webcamLayout->addWidget(new QLabel(tr("Use MJPG with Webcam")), 1, 1, + Qt::AlignLeft); + webcamLayout->setColumnStretch(1, 30); + webcamBox->setLayout(webcamLayout); + webcamBox->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Maximum); + optionsOutsideLayout->addWidget(webcamBox, Qt::AlignCenter); + + checkboxLayout->addWidget(m_placeOnXSheetCB, 0, 0, 1, 1, Qt::AlignRight); + checkboxLayout->addWidget(new QLabel(tr("Place on XSheet")), 0, 1, + Qt::AlignLeft); + checkboxLayout->addWidget(m_useNumpadCB, 1, 0, Qt::AlignRight); + checkboxLayout->addWidget( + new QLabel(tr("Use Numpad Shortcuts When Active")), 1, 1, + Qt::AlignLeft); + checkboxLayout->addWidget(m_liveViewOnAllFramesCB, 2, 0, Qt::AlignRight); + checkboxLayout->addWidget(new QLabel(tr("Show Live View on All Frames")), 2, + 1, Qt::AlignLeft); + + checkboxLayout->setColumnStretch(1, 30); + optionsOutsideLayout->addLayout(checkboxLayout, Qt::AlignLeft); + + optionsLayout->addWidget(new QLabel(tr("Capture Review Time: ")), 0, 0, + Qt::AlignRight); + optionsLayout->addWidget(m_postCaptureReviewFld, 0, 1); + optionsLayout->addWidget(new QLabel(tr("Level Subsampling: ")), 1, 0, + Qt::AlignRight); + optionsLayout->addWidget(m_subsamplingFld, 1, 1); + optionsLayout->setColumnStretch(1, 30); + optionsLayout->setRowStretch(2, 30); + optionsOutsideLayout->addLayout(optionsLayout, Qt::AlignLeft); + optionsOutsideLayout->addStretch(); + + m_optionsPage->setLayout(optionsOutsideLayout); + + QScrollArea *mainArea = makeChooserPageWithoutScrollBar(m_mainControlsPage); + QScrollArea *settingsArea = + makeChooserPageWithoutScrollBar(m_cameraSettingsPage); + QScrollArea *optionsArea = makeChooserPageWithoutScrollBar(m_optionsPage); + + m_stackedChooser = new QStackedWidget(this); + m_stackedChooser->addWidget(mainArea); + m_stackedChooser->addWidget(settingsArea); + m_stackedChooser->addWidget(optionsArea); + m_stackedChooser->setFocusPolicy(Qt::NoFocus); + + QFrame *opacityFrame = new QFrame(); + QHBoxLayout *opacityLay = new QHBoxLayout(); + opacityLay->addWidget(new QLabel(tr("Opacity:"), this), 0); + opacityLay->addWidget(m_onionOpacityFld, 1); + opacityFrame->setLayout(opacityLay); + opacityFrame->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Maximum); + + QFrame *controlButtonFrame = new QFrame(); + QHBoxLayout *controlButtonLay = new QHBoxLayout(); + controlButtonLay->addWidget(m_captureButton, 0); + controlButtonLay->addWidget(m_toggleLiveViewButton, 0); + controlButtonFrame->setLayout(controlButtonLay); + + QVBoxLayout *mainLayout = new QVBoxLayout; + mainLayout->setMargin(0); + mainLayout->setSpacing(0); + { + QHBoxLayout *hLayout = new QHBoxLayout; + hLayout->setMargin(0); + { + hLayout->addSpacing(4); + hLayout->addWidget(m_tabBar); + hLayout->addStretch(); + } + m_tabBarContainer->setLayout(hLayout); + + mainLayout->addWidget(m_tabBarContainer, 0, 0); + mainLayout->addWidget(m_stackedChooser, 1, 0); + mainLayout->addWidget(opacityFrame, 0); + mainLayout->addWidget(controlButtonFrame, 0); + setLayout(mainLayout); + m_tabBarContainer->layout()->update(); + } + } + + TSceneHandle *sceneHandle = TApp::instance()->getCurrentScene(); + TXsheetHandle *xsheetHandle = TApp::instance()->getCurrentXsheet(); + + bool ret = true; + + // Outside Connections + ret = ret && connect(sceneHandle, SIGNAL(sceneSwitched()), this, + SLOT(onSceneSwitched())); + ret = ret && + connect(xsheetHandle, SIGNAL(xsheetSwitched()), this, SLOT(update())); + + // UI SIGNALS + ret = ret && connect(m_tabBar, SIGNAL(currentChanged(int)), this, + SLOT(setPage(int))); + + // Control Page + ret = ret && connect(refreshCamListButton, SIGNAL(pressed()), this, + SLOT(refreshCameraListCalled())); + 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 &))); + if (m_captureFilterSettingsBtn) + ret = ret && connect(m_captureFilterSettingsBtn, SIGNAL(pressed()), this, + SLOT(onCaptureFilterSettingsBtnPressed())); + ret = ret && connect(m_fileFormatOptionButton, SIGNAL(pressed()), this, + SLOT(onFileFormatOptionButtonPressed())); + ret = ret && connect(m_levelNameEdit, SIGNAL(levelNameEdited()), this, + SLOT(onLevelNameEdited())); + ret = ret && + connect(nextLevelButton, SIGNAL(pressed()), this, SLOT(onNextName())); + ret = ret && connect(m_previousLevelButton, SIGNAL(pressed()), this, + SLOT(onPreviousName())); + ret = ret && connect(nextOpenLevelButton, SIGNAL(pressed()), this, + SLOT(onNextNewLevel())); + ret = ret && + connect(nextFrameButton, SIGNAL(pressed()), this, SLOT(onNextFrame())); + ret = ret && + connect(lastFrameButton, SIGNAL(pressed()), this, SLOT(onLastFrame())); + ret = ret && connect(m_previousFrameButton, SIGNAL(pressed()), this, + SLOT(onPreviousFrame())); + ret = ret && connect(nextXSheetFrameButton, SIGNAL(pressed()), this, + SLOT(onNextXSheetFrame())); + ret = ret && connect(m_previousXSheetFrameButton, SIGNAL(pressed()), this, + SLOT(onPreviousXSheetFrame())); + ret = ret && connect(m_setToCurrentXSheetFrameButton, SIGNAL(pressed()), this, + SLOT(setToCurrentXSheetFrame())); + ret = ret && connect(m_onionOpacityFld, SIGNAL(valueEditedByHand()), this, + SLOT(onOnionOpacityFldEdited())); + ret = ret && connect(m_onionOpacityFld, SIGNAL(valueChanged(bool)), this, + SLOT(onOnionOpacitySliderChanged(bool))); + ret = ret && connect(m_captureButton, SIGNAL(clicked(bool)), this, + SLOT(onCaptureButtonClicked(bool))); + // ret = ret && connect(subfolderButton, SIGNAL(clicked(bool)), this, + // SLOT(openSaveInFolderPopup())); + ret = ret && connect(m_saveInFileFld, SIGNAL(pathChanged()), this, + SLOT(onSaveInPathEdited())); + ret = ret && connect(m_fileTypeCombo, SIGNAL(activated(int)), this, + SLOT(onFileTypeActivated())); + ret = ret && connect(m_frameNumberEdit, SIGNAL(editingFinished()), this, + SLOT(onFrameNumberChanged())); + ret = ret && connect(m_xSheetFrameNumberEdit, SIGNAL(editingFinished()), this, + SLOT(onXSheetFrameNumberChanged())); + ret = ret && connect(m_toggleLiveViewButton, SIGNAL(clicked()), this, + SLOT(onLiveViewToggleClicked())); + ret = ret && connect(m_stopMotion, SIGNAL(filePathChanged(QString)), this, + SLOT(onFilePathChanged(QString))); + ret = ret && connect(m_stopMotion, SIGNAL(levelNameChanged(QString)), this, + SLOT(onLevelNameChanged(QString))); + ret = ret && connect(m_stopMotion, SIGNAL(fileTypeChanged(QString)), this, + SLOT(onFileTypeChanged(QString))); + ret = ret && connect(m_stopMotion, SIGNAL(frameInfoTextChanged(QString)), + this, SLOT(onFrameInfoTextChanged(QString))); + ret = ret && connect(m_stopMotion, SIGNAL(xSheetFrameNumberChanged(int)), + this, SLOT(onXSheetFrameNumberChanged(int))); + ret = ret && connect(m_stopMotion, SIGNAL(frameNumberChanged(int)), this, + SLOT(onFrameNumberChanged(int))); + ret = ret && connect(m_stopMotion, SIGNAL(opacityChanged(int)), this, + SLOT(onOpacityChanged(int))); + + // Options Page + ret = ret && connect(m_useScaledFullSizeImages, SIGNAL(stateChanged(int)), + this, SLOT(onScaleFullSizeImagesChanged(int))); + ret = ret && connect(m_liveViewOnAllFramesCB, SIGNAL(stateChanged(int)), this, + SLOT(onLiveViewOnAllFramesChanged(int))); + ret = ret && connect(m_blackScreenForCapture, SIGNAL(stateChanged(int)), this, + SLOT(onBlackScreenForCaptureChanged(int))); + ret = ret && connect(m_placeOnXSheetCB, SIGNAL(stateChanged(int)), this, + SLOT(onPlaceOnXSheetChanged(int))); + ret = ret && connect(m_directShowCB, SIGNAL(stateChanged(int)), this, + SLOT(onUseDirectShowChanged(int))); + ret = ret && connect(m_useMjpgCB, SIGNAL(stateChanged(int)), this, + SLOT(onUseMjpgChanged(int))); + ret = ret && connect(m_useNumpadCB, SIGNAL(stateChanged(int)), this, + SLOT(onUseNumpadChanged(int))); + ret = ret && connect(m_postCaptureReviewFld, SIGNAL(valueEditedByHand()), + this, SLOT(onCaptureReviewFldEdited())); + ret = ret && connect(m_postCaptureReviewFld, SIGNAL(valueChanged(bool)), this, + SLOT(onCaptureReviewSliderChanged(bool))); + ret = ret && connect(m_subsamplingFld, SIGNAL(valueEditedByHand()), this, + SLOT(onSubsamplingFldEdited())); + ret = ret && connect(m_subsamplingFld, SIGNAL(valueChanged(bool)), this, + SLOT(onSubsamplingSliderChanged(bool))); + ret = ret && connect(m_stopMotion, SIGNAL(subsamplingChanged(int)), this, + SLOT(onSubsamplingChanged(int))); + ret = ret && connect(m_stopMotion, SIGNAL(scaleFullSizeImagesSignal(bool)), + this, SLOT(onScaleFullSizeImagesSignal(bool))); + ret = ret && connect(m_stopMotion, SIGNAL(blackCaptureSignal(bool)), this, + SLOT(onBlackCaptureSignal(bool))); + ret = ret && connect(m_stopMotion, SIGNAL(liveViewOnAllFramesSignal(bool)), + this, SLOT(onLiveViewOnAllFramesSignal(bool))); + ret = ret && connect(m_stopMotion, SIGNAL(placeOnXSheetSignal(bool)), this, + SLOT(onPlaceOnXSheetSignal(bool))); + ret = ret && connect(m_stopMotion, SIGNAL(useDirectShowSignal(bool)), this, + SLOT(onUseDirectShowSignal(bool))); + ret = ret && connect(m_stopMotion, SIGNAL(useMjpgSignal(bool)), this, + SLOT(onUseMjpgSignal(bool))); + ret = ret && connect(m_stopMotion, SIGNAL(useNumpadSignal(bool)), this, + SLOT(onUseNumpadSignal(bool))); + ret = ret && connect(m_stopMotion, SIGNAL(reviewTimeChangedSignal(int)), this, + SLOT(onReviewTimeChangedSignal(int))); + + // From Stop Motion Main + ret = ret && connect(m_stopMotion, SIGNAL(newDimensions()), this, + SLOT(updateDimensions())); + ret = ret && connect(m_stopMotion, SIGNAL(updateCameraList()), this, + SLOT(refreshCameraList())); + ret = ret && connect(m_stopMotion, SIGNAL(liveViewChanged(bool)), this, + SLOT(onLiveViewChanged(bool))); + ret = ret && connect(m_stopMotion, SIGNAL(newCameraSelected(int, bool)), this, + SLOT(onNewCameraSelected(int, bool))); + ret = ret && connect(m_stopMotion, SIGNAL(cameraChanged()), this, + SLOT(refreshCameraList())); + ret = ret && connect(m_stopMotion, SIGNAL(optionsChanged()), this, + SLOT(refreshOptionsLists())); + + // EOS Connections + ret = ret && + connect(m_zoomButton, SIGNAL(pressed()), this, SLOT(onZoomPressed())); + ret = ret && connect(m_pickZoomButton, SIGNAL(pressed()), this, + SLOT(onPickZoomPressed())); + ret = ret && connect(m_focusNearButton, SIGNAL(pressed()), this, + SLOT(onFocusNear())); + ret = ret && + connect(m_focusFarButton, SIGNAL(pressed()), this, SLOT(onFocusFar())); + ret = ret && connect(m_focusNear2Button, SIGNAL(pressed()), this, + SLOT(onFocusNear2())); + ret = ret && connect(m_focusFar2Button, SIGNAL(pressed()), this, + SLOT(onFocusFar2())); + ret = ret && connect(m_focusNear3Button, SIGNAL(pressed()), this, + SLOT(onFocusNear3())); + ret = ret && connect(m_focusFar3Button, SIGNAL(pressed()), this, + SLOT(onFocusFar3())); + ret = ret && connect(m_stopMotion, SIGNAL(apertureChangedSignal(QString)), + this, SLOT(onApertureChangedSignal(QString))); + ret = ret && connect(m_stopMotion, SIGNAL(isoChangedSignal(QString)), this, + SLOT(onIsoChangedSignal(QString))); + ret = ret && connect(m_stopMotion, SIGNAL(shutterSpeedChangedSignal(QString)), + this, SLOT(onShutterSpeedChangedSignal(QString))); + ret = ret && connect(m_stopMotion, SIGNAL(exposureChangedSignal(QString)), + this, SLOT(onExposureChangedSignal(QString))); + ret = ret && connect(m_stopMotion, SIGNAL(whiteBalanceChangedSignal(QString)), + this, SLOT(onWhiteBalanceChangedSignal(QString))); + ret = ret && connect(m_stopMotion, SIGNAL(imageQualityChangedSignal(QString)), + this, SLOT(onImageQualityChangedSignal(QString))); + ret = ret && connect(m_stopMotion, SIGNAL(pictureStyleChangedSignal(QString)), + this, SLOT(onPictureStyleChangedSignal(QString))); + ret = ret && + connect(m_stopMotion, SIGNAL(colorTemperatureChangedSignal(QString)), + this, SLOT(onColorTemperatureChangedSignal(QString))); + ret = ret && connect(m_apertureCombo, SIGNAL(currentIndexChanged(int)), this, + SLOT(onApertureChanged(int))); + ret = ret && connect(m_shutterSpeedCombo, SIGNAL(currentIndexChanged(int)), + this, SLOT(onShutterSpeedChanged(int))); + ret = ret && connect(m_isoCombo, SIGNAL(currentIndexChanged(int)), this, + SLOT(onIsoChanged(int))); + ret = ret && connect(m_exposureCombo, SIGNAL(currentIndexChanged(int)), this, + SLOT(onExposureChanged(int))); + ret = ret && connect(m_whiteBalanceCombo, SIGNAL(currentIndexChanged(int)), + this, SLOT(onWhiteBalanceChanged(int))); + ret = ret && connect(m_kelvinCombo, SIGNAL(currentIndexChanged(int)), this, + SLOT(onColorTemperatureChanged(int))); + ret = ret && connect(m_imageQualityCombo, SIGNAL(currentIndexChanged(int)), + this, SLOT(onImageQualityChanged(int))); + ret = ret && connect(m_pictureStyleCombo, SIGNAL(currentIndexChanged(int)), + this, SLOT(onPictureStyleChanged(int))); + ret = ret && connect(m_stopMotion, SIGNAL(apertureOptionsChanged()), this, + SLOT(refreshApertureList())); + ret = ret && connect(m_stopMotion, SIGNAL(shutterSpeedOptionsChanged()), this, + SLOT(refreshShutterSpeedList())); + ret = ret && connect(m_stopMotion, SIGNAL(isoOptionsChanged()), this, + SLOT(refreshIsoList())); + ret = ret && connect(m_stopMotion, SIGNAL(exposureOptionsChanged()), this, + SLOT(refreshExposureList())); + ret = ret && connect(m_stopMotion, SIGNAL(whiteBalanceOptionsChanged()), this, + SLOT(refreshWhiteBalanceList())); + ret = ret && connect(m_stopMotion, SIGNAL(imageQualityOptionsChanged()), this, + SLOT(refreshImageQualityList())); + ret = ret && connect(m_stopMotion, SIGNAL(pictureStyleOptionsChanged()), this, + SLOT(refreshPictureStyleList())); + ret = ret && + connect(m_stopMotion, SIGNAL(modeChanged()), this, SLOT(refreshMode())); + + // Webcam Specific Connections + ret = ret && connect(m_stopMotion, SIGNAL(webcamResolutionsChanged()), this, + SLOT(onWebcamResolutionsChanged())); + ret = ret && connect(m_stopMotion, SIGNAL(newWebcamResolutionSelected(int)), + this, SLOT(onNewWebcamResolutionSelected(int))); + + assert(ret); + + m_placeOnXSheetCB->setChecked( + m_stopMotion->getPlaceOnXSheet() == true ? true : false); + m_useScaledFullSizeImages->setChecked(m_stopMotion->m_useScaledImages); + m_onionOpacityFld->setValue(double(100 * m_stopMotion->getOpacity()) / 255.0); + m_directShowCB->setChecked(m_stopMotion->getUseDirectShow()); + m_useMjpgCB->setChecked(m_stopMotion->getUseMjpg()); + m_useNumpadCB->setChecked(m_stopMotion->getUseNumpadShortcuts()); + m_liveViewOnAllFramesCB->setChecked(m_stopMotion->getAlwaysLiveView()); + m_blackScreenForCapture->setChecked( + m_stopMotion->getBlackCapture() == true ? true : false); + m_postCaptureReviewFld->setValue(m_stopMotion->getReviewTime()); + + refreshCameraList(); + onSceneSwitched(); + m_stopMotion->setToNextNewLevel(); + m_saveInFileFld->setPath(m_stopMotion->getFilePath()); +} + +//----------------------------------------------------------------------------- + +StopMotionController::~StopMotionController() {} + +//----------------------------------------------------------------------------- + +void StopMotionController::setPage(int index) { + if (m_stopMotion->m_usingWebcam && index > 0) index += 1; + m_stackedChooser->setCurrentIndex(index); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onScaleFullSizeImagesChanged(int checked) { + m_stopMotion->setUseScaledImages(checked > 0 ? true : false); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onScaleFullSizeImagesSignal(bool on) { + m_useScaledFullSizeImages->setChecked(on); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onLiveViewOnAllFramesChanged(int checked) { + m_stopMotion->setAlwaysLiveView(checked > 0 ? true : false); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onLiveViewOnAllFramesSignal(bool on) { + m_liveViewOnAllFramesCB->setChecked(on); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onBlackScreenForCaptureChanged(int checked) { + m_stopMotion->setBlackCapture(checked); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onBlackCaptureSignal(bool on) { + m_blackScreenForCapture->setChecked(on); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onPlaceOnXSheetChanged(int checked) { + m_stopMotion->setPlaceOnXSheet(checked); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onPlaceOnXSheetSignal(bool on) { + m_placeOnXSheetCB->setChecked(on); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onUseDirectShowChanged(int checked) { + m_stopMotion->setUseDirectShow(checked); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onUseDirectShowSignal(bool on) { + m_directShowCB->setChecked(on); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onUseMjpgChanged(int checked) { + m_stopMotion->setUseMjpg(checked); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onUseMjpgSignal(bool on) { + m_useMjpgCB->setChecked(on); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onUseNumpadChanged(int checked) { + m_stopMotion->setUseNumpadShortcuts(checked); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onUseNumpadSignal(bool on) { + m_useNumpadCB->setChecked(on); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onCaptureReviewFldEdited() { + m_stopMotion->setReviewTime(m_postCaptureReviewFld->getValue()); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onCaptureReviewSliderChanged(bool ignore) { + m_stopMotion->setReviewTime(m_postCaptureReviewFld->getValue()); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onReviewTimeChangedSignal(int time) { + m_postCaptureReviewFld->setValue(time); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onSubsamplingChanged(int subsampling) { + if (subsampling < 1) { + m_subsamplingFld->setValue(1); + m_subsamplingFld->setDisabled(true); + } else { + m_subsamplingFld->setValue(subsampling); + m_subsamplingFld->setEnabled(true); + } +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onFrameNumberChanged(int frameNumber) { + m_frameNumberEdit->setValue(frameNumber); + m_previousFrameButton->setDisabled(frameNumber == 1); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onXSheetFrameNumberChanged(int frameNumber) { + m_xSheetFrameNumberEdit->setValue(frameNumber); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onFilePathChanged(QString filePath) { + m_saveInFileFld->setPath(filePath); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onLevelNameChanged(QString levelName) { + m_levelNameEdit->setText(levelName); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onFileTypeChanged(QString fileType) { + m_fileTypeCombo->setCurrentText(fileType); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onFrameInfoTextChanged(QString infoText) { + m_frameInfoLabel->setText(infoText); + m_frameInfoLabel->setStyleSheet(QString("QLabel{color: %1;}\ + QLabel QWidget{ color: black;}") + .arg(m_stopMotion->getInfoColorName())); + m_frameInfoLabel->setToolTip(m_stopMotion->getFrameInfoToolTip()); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onSubsamplingFldEdited() { + m_stopMotion->setSubsamplingValue(m_subsamplingFld->getValue()); + m_stopMotion->setSubsampling(); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onSubsamplingSliderChanged(bool ignore) { + m_stopMotion->setSubsamplingValue(m_subsamplingFld->getValue()); + m_stopMotion->setSubsampling(); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::refreshCameraListCalled() { + m_stopMotion->refreshCameraList(); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::refreshCameraList() { + m_cameraListCombo->clear(); + + QList webcams = m_stopMotion->getWebcams(); + + int count = m_stopMotion->getCameraCount() + webcams.count(); + if (count < 1) { + m_cameraListCombo->addItem(tr("No camera detected.")); + m_cameraSettingsLabel->setText(tr("No camera detected")); + m_cameraModeLabel->setText(""); + m_cameraListCombo->setDisabled(true); + m_captureButton->setDisabled(true); + m_toggleLiveViewButton->setDisabled(true); + m_toggleLiveViewButton->setText("Start Live View"); + } else { + int maxTextLength = 0; + m_cameraListCombo->addItem(tr("- Select camera -")); + if (webcams.count() > 0) { + for (int c = 0; c < webcams.size(); c++) { + std::string name = webcams.at(c).deviceName().toStdString(); + QString camDesc = webcams.at(c).description(); + m_cameraListCombo->addItem(camDesc); + maxTextLength = std::max(maxTextLength, fontMetrics().width(camDesc)); + } + } + if (m_stopMotion->getCameraCount() > 0) { + QString name; + m_stopMotion->getCamera(0); + m_stopMotion->openCameraSession(); + name = QString::fromStdString(m_stopMotion->getCameraName()); + m_stopMotion->closeCameraSession(); + m_cameraSettingsLabel->setText(name); + m_cameraListCombo->addItem(name); + maxTextLength = std::max(maxTextLength, fontMetrics().width(name)); + } + m_cameraListCombo->setMaximumWidth(maxTextLength + 25); + m_cameraListCombo->setEnabled(true); + m_cameraListCombo->setCurrentIndex(0); + m_captureButton->setEnabled(true); + m_toggleLiveViewButton->setEnabled(true); + } + m_stopMotion->updateLevelNameAndFrame(m_levelNameEdit->text().toStdWString()); + refreshOptionsLists(); + refreshMode(); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::refreshOptionsLists() { + m_apertureCombo->blockSignals(true); + m_isoCombo->blockSignals(true); + m_shutterSpeedCombo->blockSignals(true); + m_exposureCombo->blockSignals(true); + m_whiteBalanceCombo->blockSignals(true); + m_kelvinCombo->blockSignals(true); + m_imageQualityCombo->blockSignals(true); + m_pictureStyleCombo->blockSignals(true); + + m_isoCombo->clear(); + m_shutterSpeedCombo->clear(); + m_apertureCombo->clear(); + m_exposureCombo->clear(); + + if (m_stopMotion->getCameraCount() == 0) { + m_resolutionCombo->setDisabled(true); + m_shutterSpeedCombo->setDisabled(true); + m_isoCombo->setDisabled(true); + m_apertureCombo->setDisabled(true); + m_exposureCombo->setDisabled(true); + m_whiteBalanceCombo->setDisabled(true); + m_kelvinCombo->setDisabled(true); + m_imageQualityCombo->setDisabled(true); + m_pictureStyleCombo->setDisabled(true); + return; + } + + refreshApertureList(); + refreshShutterSpeedList(); + refreshIsoList(); + refreshExposureList(); + refreshWhiteBalanceList(); + refreshImageQualityList(); + refreshPictureStyleList(); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::refreshMode() { + if (m_stopMotion->getCameraCount() == 0) { + m_cameraModeLabel->setText(""); + return; + } + QString mode = m_stopMotion->getMode(); + m_cameraModeLabel->setText(tr("Mode: ") + mode); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::refreshApertureList() { + m_apertureCombo->blockSignals(true); + m_apertureCombo->clear(); + m_stopMotion->getAvailableApertures(); + m_apertureCombo->addItems(m_stopMotion->getApertureOptions()); + + if (m_apertureCombo->count() == 0) { + m_apertureCombo->addItem(tr("Auto")); + m_apertureCombo->setDisabled(true); + } else { + m_apertureCombo->setEnabled(true); + m_apertureCombo->setCurrentText(m_stopMotion->getCurrentAperture()); + } + m_apertureCombo->blockSignals(false); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::refreshShutterSpeedList() { + m_shutterSpeedCombo->blockSignals(true); + m_shutterSpeedCombo->clear(); + m_stopMotion->getAvailableShutterSpeeds(); + m_shutterSpeedCombo->addItems(m_stopMotion->getShutterSpeedOptions()); + + if (m_shutterSpeedCombo->count() == 0) { + m_shutterSpeedCombo->addItem(tr("Auto")); + m_shutterSpeedCombo->setDisabled(true); + } else { + m_shutterSpeedCombo->setEnabled(true); + m_shutterSpeedCombo->setCurrentText(m_stopMotion->getCurrentShutterSpeed()); + } + m_shutterSpeedCombo->blockSignals(false); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::refreshIsoList() { + m_isoCombo->blockSignals(true); + m_isoCombo->clear(); + m_stopMotion->getAvailableIso(); + m_isoCombo->addItems(m_stopMotion->getIsoOptions()); + + if (m_isoCombo->count() == 0) { + m_isoCombo->addItem(tr("Auto")); + m_isoCombo->setDisabled(true); + } else { + m_isoCombo->setEnabled(true); + std::string currIso = m_stopMotion->getCurrentIso().toStdString(); + m_isoCombo->setCurrentText(m_stopMotion->getCurrentIso()); + } + m_isoCombo->blockSignals(false); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::refreshExposureList() { + m_exposureCombo->blockSignals(true); + m_exposureCombo->clear(); + m_stopMotion->getAvailableExposureCompensations(); + m_exposureCombo->addItems(m_stopMotion->getExposureOptions()); + + if (m_exposureCombo->count() == 0) { + m_exposureCombo->addItem(tr("Disabled")); + m_exposureCombo->setDisabled(true); + } else { + m_exposureCombo->setEnabled(true); + m_exposureCombo->setCurrentText( + m_stopMotion->getCurrentExposureCompensation()); + } + m_exposureCombo->blockSignals(false); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::refreshWhiteBalanceList() { + m_whiteBalanceCombo->blockSignals(true); + m_whiteBalanceCombo->clear(); + m_stopMotion->getAvailableWhiteBalances(); + m_whiteBalanceCombo->addItems(m_stopMotion->getWhiteBalanceOptions()); + + if (m_whiteBalanceCombo->count() == 0) { + m_whiteBalanceCombo->addItem(tr("Disabled")); + m_whiteBalanceCombo->setDisabled(true); + } else { + m_whiteBalanceCombo->setEnabled(true); + m_whiteBalanceCombo->setCurrentText(m_stopMotion->getCurrentWhiteBalance()); + } + m_whiteBalanceCombo->blockSignals(false); + refreshColorTemperatureList(); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::refreshColorTemperatureList() { + m_kelvinCombo->blockSignals(true); + m_kelvinCombo->clear(); + m_kelvinCombo->addItems(m_stopMotion->getColorTemperatureOptions()); + std::string ct = m_stopMotion->getCurrentWhiteBalance().toStdString(); + int kCount = m_kelvinCombo->count(); + if (m_kelvinCombo->count() == 0 || + m_stopMotion->getCurrentWhiteBalance() != "Color Temperature") { + // m_kelvinCombo->addItem(tr("Disabled")); + m_kelvinCombo->setDisabled(true); + m_kelvinCombo->hide(); + m_kelvinLabel->hide(); + } else { + m_kelvinCombo->show(); + m_kelvinLabel->show(); + m_kelvinCombo->setEnabled(true); + m_kelvinCombo->setCurrentText(m_stopMotion->getCurrentColorTemperature()); + } + m_kelvinCombo->blockSignals(false); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::refreshImageQualityList() { + m_imageQualityCombo->blockSignals(true); + m_imageQualityCombo->clear(); + m_stopMotion->getAvailableImageQualities(); + m_imageQualityCombo->addItems(m_stopMotion->getImageQualityOptions()); + + if (m_imageQualityCombo->count() == 0) { + m_imageQualityCombo->addItem(tr("Disabled")); + m_imageQualityCombo->setDisabled(true); + } else { + m_imageQualityCombo->setEnabled(true); + m_imageQualityCombo->setCurrentText(m_stopMotion->getCurrentImageQuality()); + } + m_imageQualityCombo->blockSignals(false); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::refreshPictureStyleList() { + m_pictureStyleCombo->blockSignals(true); + m_pictureStyleCombo->clear(); + m_stopMotion->getAvailablePictureStyles(); + m_pictureStyleCombo->addItems(m_stopMotion->getPictureStyleOptions()); + + if (m_pictureStyleCombo->count() == 0) { + m_pictureStyleCombo->addItem(tr("Disabled")); + m_pictureStyleCombo->setDisabled(true); + } else { + m_pictureStyleCombo->setEnabled(true); + m_pictureStyleCombo->setCurrentText(m_stopMotion->getCurrentPictureStyle()); + } + m_pictureStyleCombo->blockSignals(false); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onCameraListComboActivated(int comboIndex) { + QList cameras = QCameraInfo::availableCameras(); + if (cameras.size() + m_stopMotion->getCameraCount() != + m_cameraListCombo->count() - 1) + return; + + m_stopMotion->changeCameras(comboIndex); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onNewCameraSelected(int index, bool useWebcam) { + if (index < m_cameraListCombo->count()) + m_cameraListCombo->setCurrentIndex(index); + if (index == 0) { + m_cameraListCombo->setCurrentIndex(index); + m_resolutionCombo->hide(); + m_resolutionLabel->hide(); + } + if (useWebcam) { + if (m_tabBar->tabText(1) == "Settings") { + m_tabBar->removeTab(1); + } + m_resolutionCombo->show(); + m_resolutionCombo->setEnabled(true); + m_resolutionLabel->show(); + m_captureFilterSettingsBtn->show(); + } else { + m_resolutionCombo->hide(); + m_resolutionLabel->hide(); + m_captureFilterSettingsBtn->hide(); + if (m_tabBar->tabText(1) == "Options") { + m_tabBar->insertTab(1, "Settings"); + } + } +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onWebcamResolutionsChanged() { + m_resolutionCombo->clear(); + QList resolutions = m_stopMotion->getWebcamResolutions(); + for (int s = 0; s < resolutions.size(); s++) { + m_resolutionCombo->addItem(QString("%1 x %2") + .arg(resolutions.at(s).width()) + .arg(resolutions.at(s).height())); + } +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onNewWebcamResolutionSelected(int index) { + m_resolutionCombo->setCurrentIndex(index); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onResolutionComboActivated(const QString &itemText) { + m_stopMotion->setWebcamResolution(itemText); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onCaptureFilterSettingsBtnPressed() { + if (!m_stopMotion->getWebcam() || m_stopMotion->m_webcamDeviceName.isNull()) + return; + + QList cameras = QCameraInfo::availableCameras(); + for (int c = 0; c < cameras.size(); c++) { + if (cameras.at(c).deviceName() == m_stopMotion->m_webcamDeviceName) { +#ifdef _WIN32 + openCaptureFilterSettings(this, cameras.at(c).description()); +#endif + return; + } + } +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onFileFormatOptionButtonPressed() { + if (m_fileTypeCombo->currentIndex() == 0) return; + // Tentatively use the preview output settings + ToonzScene *scene = TApp::instance()->getCurrentScene()->getScene(); + if (!scene) return; + TOutputProperties *prop = scene->getProperties()->getPreviewProperties(); + std::string ext = m_fileTypeCombo->currentText().toStdString(); + openFormatSettingsPopup(this, ext, prop->getFileFormatProperties(ext)); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onLevelNameEdited() { + m_stopMotion->updateLevelNameAndFrame(m_levelNameEdit->text().toStdWString()); +} + +//----------------------------------------------------------------------------- +void StopMotionController::onNextName() { m_stopMotion->nextName(); } + +//----------------------------------------------------------------------------- + +void StopMotionController::onNextNewLevel() { + m_stopMotion->setToNextNewLevel(); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onPreviousName() { m_stopMotion->previousName(); } + +//----------------------------------------------------------------------------- + +void StopMotionController::onNextFrame() { m_stopMotion->nextFrame(); } + +//----------------------------------------------------------------------------- + +void StopMotionController::onLastFrame() {} + +//----------------------------------------------------------------------------- + +void StopMotionController::onPreviousFrame() { m_stopMotion->previousFrame(); } + +//----------------------------------------------------------------------------- + +void StopMotionController::onNextXSheetFrame() { + m_stopMotion->setXSheetFrameNumber(m_stopMotion->getXSheetFrameNumber() + 1); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onPreviousXSheetFrame() { + m_stopMotion->setXSheetFrameNumber(m_stopMotion->getXSheetFrameNumber() - 1); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::setToCurrentXSheetFrame() { + int frameNumber = TApp::instance()->getCurrentFrame()->getFrame() + 1; + m_stopMotion->setXSheetFrameNumber(frameNumber); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::updateDimensions() { + m_stopMotion->refreshFrameInfo(); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onFrameCaptured(QImage &image) {} + +//----------------------------------------------------------------------------- + +void StopMotionController::onApertureChanged(int index) { + m_stopMotion->setAperture(m_apertureCombo->currentText()); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onApertureChangedSignal(QString text) { + m_apertureCombo->setCurrentText(m_stopMotion->getCurrentAperture()); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onShutterSpeedChanged(int index) { + m_stopMotion->setShutterSpeed(m_shutterSpeedCombo->currentText()); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onShutterSpeedChangedSignal(QString text) { + m_shutterSpeedCombo->setCurrentText(m_stopMotion->getCurrentShutterSpeed()); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onIsoChanged(int index) { + m_stopMotion->setIso(m_isoCombo->currentText()); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onIsoChangedSignal(QString text) { + m_isoCombo->setCurrentText(m_stopMotion->getCurrentIso()); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onExposureChanged(int index) { + m_stopMotion->setExposureCompensation(m_exposureCombo->currentText()); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onExposureChangedSignal(QString text) { + m_exposureCombo->setCurrentText( + m_stopMotion->getCurrentExposureCompensation()); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onWhiteBalanceChanged(int index) { + m_stopMotion->setWhiteBalance(m_whiteBalanceCombo->currentText()); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onWhiteBalanceChangedSignal(QString text) { + m_whiteBalanceCombo->setCurrentText(m_stopMotion->getCurrentWhiteBalance()); + refreshColorTemperatureList(); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onColorTemperatureChanged(int index) { + m_stopMotion->setColorTemperature(m_kelvinCombo->currentText()); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onColorTemperatureChangedSignal(QString text) { + m_kelvinCombo->setCurrentText(m_stopMotion->getCurrentColorTemperature()); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onImageQualityChanged(int index) { + m_stopMotion->setImageQuality(m_imageQualityCombo->currentText()); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onImageQualityChangedSignal(QString text) { + m_imageQualityCombo->setCurrentText(m_stopMotion->getCurrentImageQuality()); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onPictureStyleChanged(int index) { + m_stopMotion->setPictureStyle(m_pictureStyleCombo->currentText()); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onPictureStyleChangedSignal(QString text) { + m_pictureStyleCombo->setCurrentText(m_stopMotion->getCurrentPictureStyle()); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onZoomPressed() { m_stopMotion->zoomLiveView(); } + +//----------------------------------------------------------------------------- + +void StopMotionController::onPickZoomPressed() { + m_stopMotion->m_pickLiveViewZoom = true; +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onFocusNear() { m_stopMotion->focusNear(); } + +//----------------------------------------------------------------------------- + +void StopMotionController::onFocusFar() { m_stopMotion->focusFar(); } + +//----------------------------------------------------------------------------- + +void StopMotionController::onFocusNear2() { m_stopMotion->focusNear2(); } + +//----------------------------------------------------------------------------- + +void StopMotionController::onFocusFar2() { m_stopMotion->focusFar2(); } + +//----------------------------------------------------------------------------- + +void StopMotionController::onFocusNear3() { m_stopMotion->focusNear3(); } + +//----------------------------------------------------------------------------- + +void StopMotionController::onFocusFar3() { m_stopMotion->focusFar3(); } + +//----------------------------------------------------------------------------- + +void StopMotionController::showEvent(QShowEvent *event) {} + +//----------------------------------------------------------------------------- + +void StopMotionController::hideEvent(QHideEvent *event) { + // disconnect(m_apertureCombo, SIGNAL(currentIndexChanged(int)), this, + // SLOT(onApertureChanged(int))); + // disconnect(m_shutterSpeedCombo, SIGNAL(currentIndexChanged(int)), this, + // SLOT(onShutterSpeedChanged(int))); + // disconnect(m_isoCombo, SIGNAL(currentIndexChanged(int)), this, + // SLOT(onIsoChanged(int))); + // disconnect(m_exposureCombo, SIGNAL(currentIndexChanged(int)), this, + // SLOT(onExposureChanged(int))); + + // disconnect(m_stopMotion, SIGNAL(cameraChanged()), this, + // SLOT(refreshCameraList())); + // disconnect(m_stopMotion, SIGNAL(optionsChanged()), this, + // SLOT(refreshOptionsLists())); + // disconnect(m_stopMotion, SIGNAL(apertureOptionsChanged()), this, + // SLOT(refreshApertureList())); + // disconnect(m_stopMotion, SIGNAL(shutterSpeedOptionsChanged()), this, + // SLOT(refreshShutterSpeedList())); + // disconnect(m_stopMotion, SIGNAL(isoOptionsChanged()), this, + // SLOT(refreshIsoList())); + // disconnect(m_stopMotion, SIGNAL(exposureOptionsChanged()), this, + // SLOT(refreshExposureList())); + // disconnect(m_stopMotion, SIGNAL(modeChanged()), this, SLOT(refreshMode())); +} + +////----------------------------------------------------------------------------- +// +// void StopMotionController::keyPressEvent(QKeyEvent *event) { +// // override return (or enter) key as shortcut key for capturing +// if (event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter) { +// // show button-clicking animation followed by calling +// // onCaptureButtonClicked() +// m_captureButton->animateClick(); +// event->accept(); +// } else +// event->ignore(); +//} +// +////----------------------------------------------------------------------------- +// +// void StopMotionController::mousePressEvent(QMouseEvent *event) {} + +//----------------------------------------------------------------------------- + +void StopMotionController::onLiveViewToggleClicked() { + m_stopMotion->toggleLiveView(); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onLiveViewChanged(bool on) { + if (on) { + m_toggleLiveViewButton->setText(tr("Stop Live View")); + + } else + m_toggleLiveViewButton->setText(tr("Start Live View")); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onOnionOpacityFldEdited() { + int value = (int)(255.0f * (float)m_onionOpacityFld->getValue() / 100.0f); + m_stopMotion->setOpacity(value); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onOnionOpacitySliderChanged(bool ignore) { + int value = (int)(255.0f * (float)m_onionOpacityFld->getValue() / 100.0f); + m_stopMotion->setOpacity(value); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onOpacityChanged(int opacity) { + m_onionOpacityFld->setValue(double(100 * opacity) / 255.0); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onCaptureButtonClicked(bool on) { + m_stopMotion->captureImage(); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::openSaveInFolderPopup() { + if (m_saveInFolderPopup->exec()) { + QString oldPath = m_saveInFileFld->getPath(); + m_saveInFileFld->setPath(m_saveInFolderPopup->getPath()); + if (oldPath == m_saveInFileFld->getPath()) + m_stopMotion->setToNextNewLevel(); + else { + onSaveInPathEdited(); + } + } +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onFileTypeActivated() { + m_stopMotion->setFileType(m_fileTypeCombo->currentText()); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onFrameNumberChanged() { + m_stopMotion->setFrameNumber(m_frameNumberEdit->getValue()); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onXSheetFrameNumberChanged() { + m_stopMotion->setXSheetFrameNumber(m_xSheetFrameNumberEdit->getValue()); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onSaveInPathEdited() { + m_stopMotion->setFilePath(m_saveInFileFld->getPath()); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::onSceneSwitched() { + // m_saveInFolderPopup->updateParentFolder(); + // m_saveInFileFld->setPath(m_saveInFolderPopup->getParentPath()); + // m_stopMotion->refreshFrameInfo(); +} + +//----------------------------------------------------------------------------- + +void StopMotionController::updateStopMotion() {} diff --git a/toonz/sources/stopmotion/stopmotioncontroller.h b/toonz/sources/stopmotion/stopmotioncontroller.h new file mode 100644 index 0000000..2f66707 --- /dev/null +++ b/toonz/sources/stopmotion/stopmotioncontroller.h @@ -0,0 +1,206 @@ +#pragma once + +#ifndef STOPMOTIONCONTROLLER_H +#define STOPMOTIONCONTROLLER_H + +// TnzCore includes +#include "stopmotion.h" +#include "penciltestpopup.h" + +// TnzQt includes +#include "toonzqt/tabbar.h" +#include "toonzqt/gutil.h" + +// Qt includes +#include +#include +#include +#include +#include +#include + +#undef DVAPI +#undef DVVAR +#ifdef TOONZQT_EXPORTS +#define DVAPI DV_EXPORT_API +#define DVVAR DV_EXPORT_VAR +#else +#define DVAPI DV_IMPORT_API +#define DVVAR DV_IMPORT_VAR +#endif + +//============================================= + +// Forward declarations + +class TColorStyle; +class TPalette; + +class TXshLevelHandle; + +class QGridLayout; +class QLabel; +class QStackedWidget; +class QSlider; +class QRadioButton; +class QButtonGroup; +class QPushButton; +class QTabWidget; +class QToolBar; +class QTimer; + +//============================================================================= +// StopMotionController +//----------------------------------------------------------------------------- + +class StopMotionController final : public QWidget { + Q_OBJECT + StopMotion *m_stopMotion; + + QWidget *m_parent; + TXshLevelHandle + *m_levelHandle; //!< for clearing the level cache when the color changed + + DVGui::TabBar *m_tabBar; + QFrame *m_mainControlsPage; + QFrame *m_cameraSettingsPage; + QFrame *m_optionsPage; + QStackedWidget *m_stackedChooser; + TabBarContainter *m_tabBarContainer; //!< Tabs container for style types. + QPushButton *m_toggleLiveViewButton, *m_setToCurrentXSheetFrameButton; + QPushButton *m_fileFormatOptionButton, *m_captureButton, *m_zoomButton, + *m_pickZoomButton, *m_focusNearButton, *m_focusFarButton, + *m_focusNear2Button, *m_focusNear3Button, *m_focusFar2Button, + *m_focusFar3Button, *m_captureFilterSettingsBtn; + QHBoxLayout *m_focusAndZoomLayout; + QLabel *m_frameInfoLabel, *m_cameraSettingsLabel, *m_cameraModeLabel, + *m_kelvinLabel, *m_resolutionLabel, *m_directShowLabel; + QToolButton *m_previousLevelButton, *m_previousFrameButton, + *m_previousXSheetFrameButton; + + QComboBox *m_cameraListCombo, *m_fileTypeCombo, *m_isoCombo, + *m_shutterSpeedCombo, *m_exposureCombo, *m_apertureCombo, + *m_whiteBalanceCombo, *m_kelvinCombo, *m_resolutionCombo, + *m_imageQualityCombo, *m_pictureStyleCombo; + LevelNameLineEdit *m_levelNameEdit; + QCheckBox *m_blackScreenForCapture, *m_useScaledFullSizeImages, + *m_placeOnXSheetCB, *m_directShowCB, *m_liveViewOnAllFramesCB, + *m_useMjpgCB, *m_useNumpadCB; + DVGui::FileField *m_saveInFileFld; + DVGui::IntLineEdit *m_xSheetFrameNumberEdit; + FrameNumberLineEdit *m_frameNumberEdit; + DVGui::IntField *m_onionOpacityFld, *m_postCaptureReviewFld, + *m_subsamplingFld; + PencilTestSaveInFolderPopup *m_saveInFolderPopup; + +public: + StopMotionController(QWidget *parent = 0); + ~StopMotionController(); + +protected: + void updateStopMotion(); + void showEvent(QShowEvent *event); + void hideEvent(QHideEvent *event); + // void mousePressEvent(QMouseEvent *event) override; + // void keyPressEvent(QKeyEvent *event); + +protected slots: + void refreshCameraList(); + void refreshCameraListCalled(); + void refreshOptionsLists(); + void refreshApertureList(); + void refreshShutterSpeedList(); + void refreshIsoList(); + void refreshExposureList(); + void refreshWhiteBalanceList(); + void refreshColorTemperatureList(); + void refreshImageQualityList(); + void refreshPictureStyleList(); + void onCameraListComboActivated(int index); + void onResolutionComboActivated(const QString &itemText); + void onCaptureFilterSettingsBtnPressed(); + void onFileFormatOptionButtonPressed(); + void onLevelNameEdited(); + void onNextName(); + void onPreviousName(); + void onNextFrame(); + void onPreviousFrame(); + void onNextNewLevel(); + void onLastFrame(); + void onFileTypeActivated(); + void onFrameNumberChanged(); + void onXSheetFrameNumberChanged(); + void onFrameCaptured(QImage &image); + void onOnionOpacityFldEdited(); + void onOnionOpacitySliderChanged(bool ignore); + void onLiveViewToggleClicked(); + void onCaptureButtonClicked(bool); + void setPage(int); + void onScaleFullSizeImagesChanged(int checked); + void onBlackScreenForCaptureChanged(int checked); + void onPlaceOnXSheetChanged(int checked); + void onUseMjpgChanged(int checked); + void onUseDirectShowChanged(int checked); + void onLiveViewOnAllFramesChanged(int checked); + void onUseNumpadChanged(int checked); + void updateDimensions(); + void onSaveInPathEdited(); + void onSceneSwitched(); + void onPreviousXSheetFrame(); + void onNextXSheetFrame(); + void setToCurrentXSheetFrame(); + void onApertureChanged(int index); + void onShutterSpeedChanged(int index); + void onIsoChanged(int index); + void onExposureChanged(int index); + void onWhiteBalanceChanged(int index); + void onColorTemperatureChanged(int index); + void onImageQualityChanged(int index); + void onPictureStyleChanged(int index); + void refreshMode(); + void onZoomPressed(); + void onPickZoomPressed(); + void onFocusNear(); + void onFocusFar(); + void onFocusNear2(); + void onFocusFar2(); + void onFocusNear3(); + void onFocusFar3(); + void onCaptureReviewFldEdited(); + void onCaptureReviewSliderChanged(bool ignore); + void onSubsamplingFldEdited(); + void onSubsamplingSliderChanged(bool ignore); + void onSubsamplingChanged(int); + void onFilePathChanged(QString); + void onLevelNameChanged(QString); + void onFileTypeChanged(QString); + void onXSheetFrameNumberChanged(int); + void onFrameNumberChanged(int); + void onFrameInfoTextChanged(QString); + void onOpacityChanged(int opacity); + void onScaleFullSizeImagesSignal(bool); + void onBlackCaptureSignal(bool); + void onLiveViewOnAllFramesSignal(bool); + void onPlaceOnXSheetSignal(bool); + void onUseMjpgSignal(bool); + void onUseDirectShowSignal(bool); + void onReviewTimeChangedSignal(int); + void onUseNumpadSignal(bool); + void onLiveViewChanged(bool); + void onNewCameraSelected(int, bool); + void onWebcamResolutionsChanged(); + void onNewWebcamResolutionSelected(int); + void onApertureChangedSignal(QString); + void onIsoChangedSignal(QString); + void onShutterSpeedChangedSignal(QString); + void onExposureChangedSignal(QString); + void onWhiteBalanceChangedSignal(QString); + void onColorTemperatureChangedSignal(QString); + void onImageQualityChangedSignal(QString); + void onPictureStyleChangedSignal(QString); + +public slots: + void openSaveInFolderPopup(); +}; + +#endif // STOPMOTIONCONTROLLER_H diff --git a/toonz/sources/tnztools/Resources/ex_next.png b/toonz/sources/tnztools/Resources/ex_next.png new file mode 100644 index 0000000..933cdd6 Binary files /dev/null and b/toonz/sources/tnztools/Resources/ex_next.png differ diff --git a/toonz/sources/tnztools/Resources/ex_next_left.png b/toonz/sources/tnztools/Resources/ex_next_left.png new file mode 100644 index 0000000..933cdd6 Binary files /dev/null and b/toonz/sources/tnztools/Resources/ex_next_left.png differ diff --git a/toonz/sources/tnztools/Resources/ex_prev.png b/toonz/sources/tnztools/Resources/ex_prev.png new file mode 100644 index 0000000..5cfb85e Binary files /dev/null and b/toonz/sources/tnztools/Resources/ex_prev.png differ diff --git a/toonz/sources/tnztools/Resources/ex_prev_left.png b/toonz/sources/tnztools/Resources/ex_prev_left.png new file mode 100644 index 0000000..5cfb85e Binary files /dev/null and b/toonz/sources/tnztools/Resources/ex_prev_left.png differ diff --git a/toonz/sources/tnztools/bendertool.cpp b/toonz/sources/tnztools/bendertool.cpp index 8d67966..5293679 100644 --- a/toonz/sources/tnztools/bendertool.cpp +++ b/toonz/sources/tnztools/bendertool.cpp @@ -188,7 +188,11 @@ public: m_hitStrokeCorners.clear(); } - int getCursorId() const override { return m_cursor; } + int getCursorId() const override { + if (m_viewer && m_viewer->getGuidedStrokePickerMode()) + return m_viewer->getGuidedStrokePickerCursor(); + return m_cursor; + } } BenderTool; //----------------------------------------------------------------------------- @@ -407,6 +411,11 @@ void BenderTool::leftButtonDrag(const TPointD &pos, const TMouseEvent &) { //----------------------------------------------------------------------------- void BenderTool::leftButtonDown(const TPointD &p, const TMouseEvent &) { + if (getViewer() && getViewer()->getGuidedStrokePickerMode()) { + getViewer()->doPickGuideStroke(p); + return; + } + m_active = false; TVectorImageP vi = TImageP(getImage(true)); if (!vi) return; diff --git a/toonz/sources/tnztools/controlpointeditortool.cpp b/toonz/sources/tnztools/controlpointeditortool.cpp index 2f6131b..12a04ee 100644 --- a/toonz/sources/tnztools/controlpointeditortool.cpp +++ b/toonz/sources/tnztools/controlpointeditortool.cpp @@ -428,6 +428,11 @@ void ControlPointEditorTool::mouseMove(const TPointD &pos, void ControlPointEditorTool::leftButtonDown(const TPointD &pos, const TMouseEvent &e) { + if (getViewer() && getViewer()->getGuidedStrokePickerMode()) { + getViewer()->doPickGuideStroke(pos); + return; + } + m_pos = pos; double pix = getPixelSize() * 2.0f; double maxDist = 5 * pix; @@ -883,6 +888,9 @@ void ControlPointEditorTool::onImageChanged() { //--------------------------------------------------------------------------- int ControlPointEditorTool::getCursorId() const { + if (m_viewer && m_viewer->getGuidedStrokePickerMode()) + return m_viewer->getGuidedStrokePickerCursor(); + switch (m_cursorType) { case NORMAL: return ToolCursor::SplineEditorCursor; diff --git a/toonz/sources/tnztools/cursormanager.cpp b/toonz/sources/tnztools/cursormanager.cpp index 0381006..24531fa 100644 --- a/toonz/sources/tnztools/cursormanager.cpp +++ b/toonz/sources/tnztools/cursormanager.cpp @@ -92,6 +92,8 @@ const struct { {ToolCursor::FillCursorL, "karasu", 7, 25, true}, {ToolCursor::RulerModifyCursor, "ruler_modify", 7, 7, true}, {ToolCursor::RulerNewCursor, "ruler_new", 7, 7, true}, + {ToolCursor::PickPrevCursor, "", 13, 4, false}, + {ToolCursor::PickNextCursor, "", 13, 4, false}, {0, 0, 0, 0, false}}; struct CursorData { @@ -115,6 +117,8 @@ const struct { {ToolCursor::Ex_RGB, "ex_rgb"}, {ToolCursor::Ex_HV, "ex_hv"}, {ToolCursor::Ex_Precise, "ex_precise"}, + {ToolCursor::Ex_Prev, "ex_prev"}, + {ToolCursor::Ex_Next, "ex_next"}, {0, 0}}; }; // namespace diff --git a/toonz/sources/tnztools/cuttertool.cpp b/toonz/sources/tnztools/cuttertool.cpp index 677324f..0aaf25b 100644 --- a/toonz/sources/tnztools/cuttertool.cpp +++ b/toonz/sources/tnztools/cuttertool.cpp @@ -195,6 +195,11 @@ public: } void leftButtonDown(const TPointD &pos, const TMouseEvent &) override { + if (getViewer() && getViewer()->getGuidedStrokePickerMode()) { + getViewer()->doPickGuideStroke(pos); + return; + } + TVectorImageP vi = TImageP(getImage(true)); if (!vi) return; QMutexLocker sl(vi->getMutex()); @@ -314,7 +319,11 @@ public: m_cursorId = ToolCursor::CURSOR_NO; } - int getCursorId() const override { return m_cursorId; } + int getCursorId() const override { + if (m_viewer && m_viewer->getGuidedStrokePickerMode()) + return m_viewer->getGuidedStrokePickerCursor(); + return m_cursorId; + } } cutterTool; diff --git a/toonz/sources/tnztools/geometrictool.cpp b/toonz/sources/tnztools/geometrictool.cpp index 7d3f5f7..1ae4d35 100644 --- a/toonz/sources/tnztools/geometrictool.cpp +++ b/toonz/sources/tnztools/geometrictool.cpp @@ -2,6 +2,7 @@ #include "toonz/tpalettehandle.h" #include "tools/toolhandle.h" +#include "tools/toolcommandids.h" #include "toonz/tobjecthandle.h" #include "toonz/txsheethandle.h" #include "toonz/txshlevelhandle.h" @@ -28,6 +29,7 @@ #include "toonz/trasterimageutils.h" #include "toonz/preferences.h" #include "historytypes.h" +#include "toonzvectorbrushtool.h" // For Qt translation support #include @@ -850,6 +852,11 @@ public: } void leftButtonDown(const TPointD &p, const TMouseEvent &e) override { + if (getViewer() && getViewer()->getGuidedStrokePickerMode()) { + getViewer()->doPickGuideStroke(p); + return; + } + /* m_active = getApplication()->getCurrentObject()->isSpline() || (bool) getImage(true);*/ if (!getApplication()->getCurrentObject()->isSpline()) @@ -953,7 +960,11 @@ public: if (m_primitive) m_primitive->draw(); } - int getCursorId() const override { return ToolCursor::PenCursor; } + int getCursorId() const override { + if (m_viewer && m_viewer->getGuidedStrokePickerMode()) + return m_viewer->getGuidedStrokePickerCursor(); + return ToolCursor::PenCursor; + } int getColorClass() const { return 1; } @@ -1106,11 +1117,29 @@ public: new std::vector; ImageUtils::getFillingInformationOverlappingArea(vi, *fillInformation, stroke->getBBox()); - vi->addStroke(stroke); - TUndoManager::manager()->add(new UndoPencil( - vi->getStroke(vi->getStrokeCount() - 1), fillInformation, sl, id, - m_isFrameCreated, m_isLevelCreated, m_param.m_autogroup.getValue(), - m_param.m_autofill.getValue())); + + bool strokeAdded = false; + if ((Preferences::instance()->getGuidedDrawing() == 1 || + Preferences::instance()->getGuidedDrawing() == 2) && + Preferences::instance()->getGuidedAutoInbetween()) { + TTool *tool = + TTool::getTool(T_Brush, TTool::ToolTargetType::VectorImage); + ToonzVectorBrushTool *vbTool = (ToonzVectorBrushTool *)tool; + if (vbTool) { + vbTool->setViewer(m_viewer); + strokeAdded = vbTool->doGuidedAutoInbetween( + id, vi, stroke, false, m_param.m_autogroup.getValue(), + m_param.m_autofill.getValue(), true); + } + } + + if (!strokeAdded) { + vi->addStroke(stroke); + TUndoManager::manager()->add(new UndoPencil( + vi->getStroke(vi->getStrokeCount() - 1), fillInformation, sl, id, + m_isFrameCreated, m_isLevelCreated, m_param.m_autogroup.getValue(), + m_param.m_autofill.getValue())); + } } if (m_param.m_autogroup.getValue() && stroke->isSelfLoop()) { int index = vi->getStrokeCount() - 1; @@ -2066,7 +2095,7 @@ TStroke *EllipsePrimitive::makeStroke() const { return 0; return makeEllipticStroke( - getThickness(), + getThickness(), TPointD(0.5 * (m_selectingRect.x0 + m_selectingRect.x1), 0.5 * (m_selectingRect.y0 + m_selectingRect.y1)), fabs(0.5 * (m_selectingRect.x1 - m_selectingRect.x0)), diff --git a/toonz/sources/tnztools/irontool.cpp b/toonz/sources/tnztools/irontool.cpp index fe65726..a52b1f5 100644 --- a/toonz/sources/tnztools/irontool.cpp +++ b/toonz/sources/tnztools/irontool.cpp @@ -87,6 +87,11 @@ public: } void leftButtonDown(const TPointD &pos, const TMouseEvent &) override { + if (getViewer() && getViewer()->getGuidedStrokePickerMode()) { + getViewer()->doPickGuideStroke(pos); + return; + } + if (m_active) return; assert(m_undo == 0); m_active = false; @@ -505,7 +510,11 @@ Altrimenti non si fa altro che aumentarli i punti di controllo void onLeave() override { m_draw = false; } - int getCursorId() const override { return m_cursorId; } + int getCursorId() const override { + if (m_viewer && m_viewer->getGuidedStrokePickerMode()) + return m_viewer->getGuidedStrokePickerCursor(); + return m_cursorId; + } void onEnter() override { m_draw = true; if ((TVectorImageP)getImage(false)) diff --git a/toonz/sources/tnztools/magnettool.cpp b/toonz/sources/tnztools/magnettool.cpp index f6438f2..7dede52 100644 --- a/toonz/sources/tnztools/magnettool.cpp +++ b/toonz/sources/tnztools/magnettool.cpp @@ -165,6 +165,11 @@ public: void leftButtonDown(const TPointD &pos, const TMouseEvent &e) override { TPointD p(pos); + if (getViewer() && getViewer()->getGuidedStrokePickerMode()) { + getViewer()->doPickGuideStroke(p); + return; + } + m_oldPos = pos; m_pointAtMouseDown = p; @@ -438,7 +443,11 @@ lefrightButtonDown(p); TPropertyGroup *getProperties(int targetType) override { return &m_prop; } - int getCursorId() const override { return m_cursorId; } + int getCursorId() const override { + if (m_viewer && m_viewer->getGuidedStrokePickerMode()) + return m_viewer->getGuidedStrokePickerCursor(); + return m_cursorId; + } bool onPropertyChanged(std::string propertyName) override { if (propertyName == m_toolSize.getName()) { diff --git a/toonz/sources/tnztools/pinchtool.cpp b/toonz/sources/tnztools/pinchtool.cpp index 445c633..55b5d53 100644 --- a/toonz/sources/tnztools/pinchtool.cpp +++ b/toonz/sources/tnztools/pinchtool.cpp @@ -177,6 +177,9 @@ void PinchTool::updateStrokeStatus(TStroke *stroke, double w) { //----------------------------------------------------------------------------- int PinchTool::updateCursor() const { + if (m_viewer && m_viewer->getGuidedStrokePickerMode()) + return m_viewer->getGuidedStrokePickerCursor(); + if (!(TVectorImageP)getImage(false)) return ToolCursor::CURSOR_NO; return m_deformation->getCursorId(); @@ -185,6 +188,11 @@ int PinchTool::updateCursor() const { //--------------------------------------------------------------------------- void PinchTool::leftButtonDown(const TPointD &pos, const TMouseEvent &event) { + if (getViewer() && getViewer()->getGuidedStrokePickerMode()) { + getViewer()->doPickGuideStroke(pos); + return; + } + m_curr = m_down = pos; if (!m_active && !m_selector.isSelected()) { diff --git a/toonz/sources/tnztools/pumptool.cpp b/toonz/sources/tnztools/pumptool.cpp index f6f8fa8..5c2de43 100644 --- a/toonz/sources/tnztools/pumptool.cpp +++ b/toonz/sources/tnztools/pumptool.cpp @@ -115,7 +115,11 @@ public: void mouseMove(const TPointD &pos, const TMouseEvent &e) override; bool moveCursor(const TPointD &pos); - int getCursorId() const override { return m_cursorId; } + int getCursorId() const override { + if (m_viewer && m_viewer->getGuidedStrokePickerMode()) + return m_viewer->getGuidedStrokePickerCursor(); + return m_cursorId; + } void invalidateCursorArea(); void onDeactivate() override; @@ -258,6 +262,11 @@ void PumpTool::draw() { //---------------------------------------------------------------------- void PumpTool::leftButtonDown(const TPointD &pos, const TMouseEvent &) { + if (getViewer() && getViewer()->getGuidedStrokePickerMode()) { + getViewer()->doPickGuideStroke(pos); + return; + } + if (m_active || !m_enabled) return; assert(m_undo == 0); diff --git a/toonz/sources/tnztools/rasterselectiontool.cpp b/toonz/sources/tnztools/rasterselectiontool.cpp index 8d22d41..649c88c 100644 --- a/toonz/sources/tnztools/rasterselectiontool.cpp +++ b/toonz/sources/tnztools/rasterselectiontool.cpp @@ -397,7 +397,7 @@ void DragSelectionTool::RasterMoveSelectionTool::leftButtonDrag( //----------------------------------------------------------------------------- DragSelectionTool::RasterScaleTool::RasterScaleTool(RasterSelectionTool *tool, - int type) + ScaleType type) : RasterDeformTool(tool, true) { m_scale = new Scale(this, type); } diff --git a/toonz/sources/tnztools/rasterselectiontool.h b/toonz/sources/tnztools/rasterselectiontool.h index b29c29c..e0f6035 100644 --- a/toonz/sources/tnztools/rasterselectiontool.h +++ b/toonz/sources/tnztools/rasterselectiontool.h @@ -167,7 +167,7 @@ class RasterScaleTool final : public RasterDeformTool { Scale *m_scale; public: - RasterScaleTool(RasterSelectionTool *tool, int type); + RasterScaleTool(RasterSelectionTool *tool, ScaleType type); /*! Return scale value. */ TPointD transform(int index, TPointD newPos) override; void leftButtonDown(const TPointD &pos, const TMouseEvent &e) override; diff --git a/toonz/sources/tnztools/selectiontool.cpp b/toonz/sources/tnztools/selectiontool.cpp index b6f04fc..48c302a 100644 --- a/toonz/sources/tnztools/selectiontool.cpp +++ b/toonz/sources/tnztools/selectiontool.cpp @@ -13,6 +13,8 @@ #include +#include + using namespace ToolUtils; using namespace DragSelectionTool; @@ -20,50 +22,30 @@ TEnv::StringVar SelectionType("SelectionType", "Rectangular"); //----------------------------------------------------------------------------- -DragSelectionTool::DragTool *createNewMoveSelectionTool(SelectionTool *st) { +template DragSelectionTool::DragTool* createNewDragTool(SelectionTool* st, Args... args) { VectorSelectionTool *vst = dynamic_cast(st); RasterSelectionTool *rst = dynamic_cast(st); if (vst) - return new DragSelectionTool::VectorMoveSelectionTool(vst); + return new Tv(vst, args...); else if (rst) - return new DragSelectionTool::RasterMoveSelectionTool(rst); - return 0; + return new Tr(rst, args...); + return nullptr; } -//----------------------------------------------------------------------------- +DragSelectionTool::DragTool *createNewMoveSelectionTool(SelectionTool *st) { + return createNewDragTool(st); +} DragSelectionTool::DragTool *createNewRotationTool(SelectionTool *st) { - VectorSelectionTool *vst = dynamic_cast(st); - RasterSelectionTool *rst = dynamic_cast(st); - if (vst) - return new DragSelectionTool::VectorRotationTool(vst); - else if (rst) - return new DragSelectionTool::RasterRotationTool(rst); - return 0; + return createNewDragTool(st); } -//----------------------------------------------------------------------------- - DragSelectionTool::DragTool *createNewFreeDeformTool(SelectionTool *st) { - VectorSelectionTool *vst = dynamic_cast(st); - RasterSelectionTool *rst = dynamic_cast(st); - if (vst) - return new DragSelectionTool::VectorFreeDeformTool(vst); - else if (rst) - return new DragSelectionTool::RasterFreeDeformTool(rst); - return 0; + return createNewDragTool(st); } -//----------------------------------------------------------------------------- - -DragSelectionTool::DragTool *createNewScaleTool(SelectionTool *st, int type) { - VectorSelectionTool *vst = dynamic_cast(st); - RasterSelectionTool *rst = dynamic_cast(st); - if (vst) - return new DragSelectionTool::VectorScaleTool(vst, type); - else if (rst) - return new DragSelectionTool::RasterScaleTool(rst, type); - return 0; +DragSelectionTool::DragTool *createNewScaleTool(SelectionTool *st, ScaleType type) { + return createNewDragTool(st, type); } //============================================================================= @@ -559,7 +541,7 @@ void DragSelectionTool::MoveSelection::leftButtonDrag(const TPointD &pos, // Scale //----------------------------------------------------------------------------- -DragSelectionTool::Scale::Scale(DeformTool *deformTool, int type) +DragSelectionTool::Scale::Scale(DeformTool *deformTool, ScaleType type) : m_deformTool(deformTool) , m_startCenter(deformTool->getTool()->getCenter()) , m_type(type) @@ -800,7 +782,7 @@ void DragSelectionTool::Scale::leftButtonDrag(const TPointD &pos, } TPointD newPos = pos; int selectedIndex = tool->getSelectedPoint(); - if (m_isShiftPressed && m_type == GLOBAL) { + if (m_isShiftPressed && m_type == ScaleType::GLOBAL) { TPointD point = tool->getBBox().getPoint(selectedIndex); TPointD delta; if (!isBboxReset) @@ -1069,11 +1051,11 @@ void SelectionTool::leftButtonDown(const TPointD &pos, const TMouseEvent &e) { else if (m_what == MOVE_CENTER) m_dragTool = new MoveCenterTool(this); else if (m_what == SCALE) - m_dragTool = createNewScaleTool(this, 0); + m_dragTool = createNewScaleTool(this, ScaleType::GLOBAL); else if (m_what == SCALE_X) - m_dragTool = createNewScaleTool(this, 1); + m_dragTool = createNewScaleTool(this, ScaleType::HORIZONTAL); else if (m_what == SCALE_Y) - m_dragTool = createNewScaleTool(this, 2); + m_dragTool = createNewScaleTool(this, ScaleType::VERTICAL); else if (m_what == DEFORM) m_dragTool = createNewFreeDeformTool(this); else if (m_what == GLOBAL_THICKNESS) @@ -1150,15 +1132,13 @@ bool SelectionTool::keyDown(QKeyEvent *event) { if (!ti && !vi && !ri) return false; - DragTool *dragTool = createNewMoveSelectionTool(this); + std::unique_ptr dragTool(createNewMoveSelectionTool(this)); TAffine aff = TTranslation(delta); dragTool->transform(aff); double factor = 1.0 / Stage::inch; m_deformValues.m_moveValue += factor * delta; dragTool->addTransformUndo(); TTool::getApplication()->getCurrentTool()->notifyToolChanged(); - delete dragTool; - dragTool = 0; invalidate(); return true; @@ -1394,4 +1374,4 @@ bool SelectionTool::isEventAcceptable(QEvent *e) { int key = keyEvent->key(); return (key == Qt::Key_Up || key == Qt::Key_Down || key == Qt::Key_Left || key == Qt::Key_Right); -} \ No newline at end of file +} diff --git a/toonz/sources/tnztools/selectiontool.h b/toonz/sources/tnztools/selectiontool.h index ac0d5e3..ea33176 100644 --- a/toonz/sources/tnztools/selectiontool.h +++ b/toonz/sources/tnztools/selectiontool.h @@ -152,10 +152,10 @@ public: SelectionTool *getTool() const { return m_tool; } - virtual void transform(TAffine aff, double angle){}; - virtual void transform(TAffine aff){}; - virtual TPointD transform(int index, TPointD newPos) { return TPointD(); }; - virtual void addTransformUndo(){}; + virtual void transform(TAffine aff, double angle){} + virtual void transform(TAffine aff){} + virtual TPointD transform(int index, TPointD newPos) { return TPointD(); } + virtual void addTransformUndo(){} virtual void leftButtonDown(const TPointD &pos, const TMouseEvent &) = 0; virtual void leftButtonDrag(const TPointD &pos, const TMouseEvent &) = 0; @@ -254,6 +254,12 @@ public: // Scale //----------------------------------------------------------------------------- +enum class ScaleType { + GLOBAL = 0, + HORIZONTAL, + VERTICAL +}; + class Scale { TPointD m_startCenter; bool m_isShiftPressed; @@ -264,9 +270,9 @@ class Scale { DeformTool *m_deformTool; public: - enum Type { GLOBAL = 0, HORIZONTAL = 1, VERTICAL = 2 }; - int m_type; - Scale(DeformTool *deformTool, int type); + + ScaleType m_type; + Scale(DeformTool *deformTool, ScaleType type); /*! Return intersection between straight line in \b point0, \b point1 and straight line for @@ -309,7 +315,7 @@ compute scaleValue. */ DragSelectionTool::DragTool *createNewMoveSelectionTool(SelectionTool *st); DragSelectionTool::DragTool *createNewRotationTool(SelectionTool *st); DragSelectionTool::DragTool *createNewFreeDeformTool(SelectionTool *st); -DragSelectionTool::DragTool *createNewScaleTool(SelectionTool *st, int type); +DragSelectionTool::DragTool *createNewScaleTool(SelectionTool *st, DragSelectionTool::ScaleType type); //============================================================================= // SelectionTool @@ -347,6 +353,7 @@ protected: GLOBAL_THICKNESS, ADD_SELECTION } m_what; // RV + enum { P00 = 0, P10 = 1, @@ -400,7 +407,7 @@ public: DragSelectionTool::DeformValues m_deformValues; SelectionTool(int targetType); - ~SelectionTool(); + ~SelectionTool() override; ToolType getToolType() const override { return TTool::LevelWriteTool; } diff --git a/toonz/sources/tnztools/tnztools.qrc b/toonz/sources/tnztools/tnztools.qrc index 8d16347..7370ccc 100644 --- a/toonz/sources/tnztools/tnztools.qrc +++ b/toonz/sources/tnztools/tnztools.qrc @@ -83,5 +83,9 @@ Resources/brush_large.png Resources/brush_crosshair.png Resources/tracker.png + Resources/ex_prev.png + Resources/ex_prev_left.png + Resources/ex_next.png + Resources/ex_next_left.png \ No newline at end of file diff --git a/toonz/sources/tnztools/tool.cpp b/toonz/sources/tnztools/tool.cpp index 461ceb3..9abf8bf 100644 --- a/toonz/sources/tnztools/tool.cpp +++ b/toonz/sources/tnztools/tool.cpp @@ -7,6 +7,7 @@ #include "tools/toolhandle.h" #include "tools/cursors.h" #include "tools/tooloptions.h" +#include "tools/toolutils.h" // TnzQt includes #include "toonzqt/icongenerator.h" @@ -32,6 +33,7 @@ #include "toonz/tstageobjecttree.h" #include "toonz/dpiscale.h" #include "toonz/palettecontroller.h" +#include "toonz/tonionskinmaskhandle.h" // TnzCore includes #include "tvectorimage.h" @@ -40,6 +42,10 @@ #include "tcolorstyles.h" #include "ttoonzimage.h" #include "trasterimage.h" +#include "strokeselection.h" +#include "tundo.h" + +#include "toonzvectorbrushtool.h" //***************************************************************************************** // Local namespace @@ -102,6 +108,27 @@ TFrameId getNewFrameId(TXshSimpleLevel *sl, int row) { return fid; } +TFrameId getDesiredFId(TXshCellColumn *column, int r0, TXshSimpleLevel *sl, + int row, TFrameId &maxFId) { + // search upper cells in the current column and return the next fids to be + // inserted if the maximum fid has no suffix it returns next number, otherwise + // returns next suffix. + maxFId = TFrameId(0); + // in case inserting a new frame on the top + if (row <= r0) return TFrameId(1); + TFrameId neighborFId; + for (int r = row - 1; r >= r0; r--) { + if (sl != column->getCell(r).getSimpleLevel()) continue; + TFrameId tmpFId = column->getCell(r).getFrameId(); + if (neighborFId.isEmptyFrame()) neighborFId = tmpFId; + if (maxFId < tmpFId) maxFId = tmpFId; + } + if (maxFId.getLetter() && maxFId.getLetter() < 'z' && maxFId == neighborFId) + return TFrameId(maxFId.getNumber(), maxFId.getLetter() + 1); + else + return TFrameId(maxFId.getNumber() + 1); +} + } // namespace //***************************************************************************************** @@ -112,6 +139,7 @@ TTool::Application *TTool::m_application = 0; std::set TTool::m_selectedFrames = std::set(); bool TTool::m_isLevelCreated = false; bool TTool::m_isFrameCreated = false; +bool TTool::m_isLevelRenumbererd = false; // m_cellsData // brutto brutto. fix quick & dirty del baco #6213 (undo con animation sheet) @@ -126,7 +154,9 @@ bool TTool::m_isFrameCreated = false; // cfr. il codice di TTool::touchImage() // ToolUtils::TToolUndo::removeLevelAndFrameIfNeeded() -std::vector TTool::m_cellsData; +std::vector TTool::m_cellsData; +std::vector TTool::m_oldFids; +std::vector TTool::m_newFids; //***************************************************************************************** // TTool implementation @@ -259,14 +289,19 @@ TImage *TTool::touchImage() { if (!m_application) return 0; m_cellsData.clear(); + m_oldFids.clear(); + m_newFids.clear(); - m_isLevelCreated = false; - m_isFrameCreated = false; - Preferences *pref = Preferences::instance(); + m_isLevelCreated = false; + m_isFrameCreated = false; + m_isLevelRenumbererd = false; + Preferences *pref = Preferences::instance(); - bool isAutoCreateEnabled = pref->isAutoCreateEnabled(); - bool animationSheetEnabled = pref->isAnimationSheetEnabled(); - bool isAutoStretchEnabled = pref->isAutoStretchEnabled(); + bool isAutoCreateEnabled = pref->isAutoCreateEnabled(); + bool animationSheetEnabled = pref->isAnimationSheetEnabled(); + bool isAutoStretchEnabled = pref->isAutoStretchEnabled(); + bool isAutoRenumberEnabled = pref->isAutorenumberEnabled(); + bool isCreateInHoldCellsEnabled = pref->isCreationInHoldCellsEnabled(); TFrameHandle *currentFrame = m_application->getCurrentFrame(); TXshLevelHandle *currentLevel = m_application->getCurrentLevel(); @@ -294,132 +329,167 @@ TImage *TTool::touchImage() { m_isFrameCreated = true; } return img.getPointer(); - } else { - // editing xsheet - if (m_application->getCurrentObject()->isSpline()) return 0; - - TSceneHandle *currentScene = m_application->getCurrentScene(); - ToonzScene *scene = currentScene->getScene(); - int row = currentFrame->getFrame(); - int col = m_application->getCurrentColumn()->getColumnIndex(); - if (col < 0) return 0; + } - TXsheetHandle *currentXsheet = m_application->getCurrentXsheet(); - TXsheet *xsh = currentXsheet->getXsheet(); - if (!xsh) return 0; + //- - - - editing xsheet case starts here - - - - - TXshCell cell = xsh->getCell(row, col); - TXshSimpleLevel *sl = cell.getSimpleLevel(); + if (m_application->getCurrentObject()->isSpline()) return 0; - if (sl != 0) { - // current cell is not empty - if (isAutoCreateEnabled && animationSheetEnabled && row > 0 && - xsh->getCell(row - 1, col) == xsh->getCell(row, col)) { - // animationSheet is enabled and the current cell is a "hold". We must - // create a new drawing. - // measure the hold length (starting from the current row) : r0-r1 - int r0 = row, r1 = row; - if (isAutoStretchEnabled) - while (xsh->getCell(r1 + 1, col) == cell) r1++; - // find the proper frameid (possibly addisng suffix, in order to avoid a - // fid already used) - TFrameId fid = getNewFrameId(sl, row); - // create the new drawing - TImageP img = sl->createEmptyFrame(); - m_isFrameCreated = true; - // insert the drawing in the level - sl->setFrame(fid, img); - // update the cell - cell = TXshCell(sl, fid); - // update the xsheet (change the current cell and possibly all the - // following "hold") - for (int r = r0; r <= r1; r++) xsh->setCell(r, col, cell); - // notify - currentXsheet->notifyXsheetChanged(); - currentScene->notifyCastChange(); - currentLevel->notifyLevelChange(); - m_cellsData.push_back(r0); - m_cellsData.push_back(r1); - m_cellsData.push_back(0); - } - // we've found the image. return it. - return cell.getImage(true).getPointer(); + TSceneHandle *currentScene = m_application->getCurrentScene(); + ToonzScene *scene = currentScene->getScene(); + int row = currentFrame->getFrame(); + int col = m_application->getCurrentColumn()->getColumnIndex(); + if (col < 0) return 0; + + TXsheetHandle *currentXsheet = m_application->getCurrentXsheet(); + TXsheet *xsh = currentXsheet->getXsheet(); + if (!xsh) return 0; + + TXshCell cell = xsh->getCell(row, col); + TXshSimpleLevel *sl = cell.getSimpleLevel(); + + if (sl) { + // current cell is not empty + if (isCreateInHoldCellsEnabled && row > 0 && + xsh->getCell(row - 1, col) == xsh->getCell(row, col)) { + // CreateInHoldCells is enabled and the current cell is a "hold". + // We must create a new drawing. + // measure the hold length (starting from the current row) : r0-r1 + int r0 = row, r1 = row; + if (isAutoStretchEnabled) + while (xsh->getCell(r1 + 1, col) == cell) r1++; + // find the proper frameid (possibly addisng suffix, in order to avoid a + // fid already used) + // find the proper frameid + TFrameId fid; + TXshCellColumn *column = xsh->getColumn(col)->getCellColumn(); + if (isAutoRenumberEnabled && column) { + TFrameId maxFid; + if (animationSheetEnabled) { + fid = TFrameId(row + 1); + maxFid = TFrameId(row); + } else { + int r_begin, r_end; + column->getRange(r_begin, r_end); + fid = getDesiredFId(column, r_begin, sl, row, maxFid); + } + // renumber fids + sl->getFids(m_oldFids); + m_isLevelRenumbererd = ToolUtils::renumberForInsertFId( + sl, fid, maxFid, scene->getTopXsheet()); + if (m_isLevelRenumbererd) sl->getFids(m_newFids); + } else + fid = (animationSheetEnabled) ? getNewFrameId(sl, row) + : sl->index2fid(sl->getFrameCount()); + // create the new drawing + TImageP img = sl->createEmptyFrame(); + m_isFrameCreated = true; + // insert the drawing in the level + sl->setFrame(fid, img); + // update the cell + cell = TXshCell(sl, fid); + // update the xsheet (change the current cell and possibly all the + // following "hold") + for (int r = r0; r <= r1; r++) xsh->setCell(r, col, cell); + // notify + currentXsheet->notifyXsheetChanged(); + currentScene->notifyCastChange(); + currentLevel->notifyLevelChange(); + m_cellsData.push_back({r0, r1, CellOps::ExistingToNew}); + } + // if the level does not contain a frame in the current cell + // (i.e. drawing on the cell with red numbers) + else if (!sl->isFid(cell.getFrameId())) { + // no drawing found + if (sl->isSubsequence() || sl->isReadOnly() || !isAutoCreateEnabled) + return 0; + // create a new drawing + TImageP img = sl->createEmptyFrame(); + sl->setFrame(cell.getFrameId(), img); + currentXsheet->notifyXsheetChanged(); + currentLevel->notifyLevelChange(); + m_isFrameCreated = true; + return img.getPointer(); } - // current cell is empty. - if (!isAutoCreateEnabled) return 0; - - // get the column range - int r0, r1; - xsh->getCellRange(col, r0, r1); - - if (animationSheetEnabled && r0 <= r1) { - // animation sheet enabled and not empty column. We must create a new - // drawing in the column level and possibly add "holds" - - // find the last not-empty cell before the current one (a) and the first - // after (b) - int a = row - 1, b = row + 1; - while (a >= r0 && xsh->getCell(a, col).isEmpty()) a--; - while (b <= r1 && xsh->getCell(b, col).isEmpty()) b++; - - // find the level we must attach to - if (a >= r0) { - // there is a not-emtpy cell before the current one - sl = xsh->getCell(a, col).getSimpleLevel(); - } else if (b <= r1) { - sl = xsh->getCell(b, col).getSimpleLevel(); - } - if (sl) { - // note: sl should be always !=0 (the column is not empty) - // if - for some reason - it is ==0 then we skip to the standard (i.e. - // !animationSheetEnabled) beahviour - - // create the drawing - // find the proper frameid (possibly addisng suffix, in order to avoid a - // fid already used) - TFrameId fid = getNewFrameId(sl, row); - // create the new drawing - TImageP img = sl->createEmptyFrame(); - m_isFrameCreated = true; - // insert the drawing in the level - sl->setFrame(fid, img); - // update the cell - cell = TXshCell(sl, fid); - xsh->setCell(row, col, cell); - - // create holds - if (!isAutoStretchEnabled) { - m_cellsData.push_back(row); - m_cellsData.push_back(row); - m_cellsData.push_back(2); // vuoto => nuovo - } else { - if (a >= r0) { - // create a hold before : [a+1, row-1] - TXshCell aCell = xsh->getCell(a, col); - for (int i = a + 1; i < row; i++) xsh->setCell(i, col, aCell); - m_cellsData.push_back(a + 1); - m_cellsData.push_back(row - 1); - m_cellsData.push_back(1); // vuoto => vecchio - - if (b <= r1 && xsh->getCell(b, col).getSimpleLevel() == sl) { - // create also a hold after - for (int i = row + 1; i < b; i++) xsh->setCell(i, col, cell); - m_cellsData.push_back(row); - m_cellsData.push_back(b - 1); - m_cellsData.push_back(2); // vuoto => nuovo - } else { - m_cellsData.push_back(row); - m_cellsData.push_back(row); - m_cellsData.push_back(2); // vuoto => nuovo - } - } else if (b <= r1) { - // create a hold after + // we've found the image. return it. + return cell.getImage(true).getPointer(); + } + + // current cell is empty. + if (!isAutoCreateEnabled) return 0; + + // get the column range + int r0, r1; + xsh->getCellRange(col, r0, r1); + // in case the column is not empty + if (r0 <= r1) { + // We must create a new drawing in the column level and possibly add "holds" + + // find the last not-empty cell before the current one (a) and the first + // after (b) + int a = row - 1, b = row + 1; + while (a >= r0 && xsh->getCell(a, col).isEmpty()) a--; + while (b <= r1 && xsh->getCell(b, col).isEmpty()) b++; + + // find the level we must attach to + if (a >= r0) { + // there is a not-empty cell before the current one + sl = xsh->getCell(a, col).getSimpleLevel(); + } else if (b <= r1) { + sl = xsh->getCell(b, col).getSimpleLevel(); + } + if (sl && !sl->isSubsequence() && !sl->isReadOnly()) { + // note: sl should be always !=0 (the column is not empty) + // if - for some reason - it is == 0 or it is not editable, + // then we skip to empty-column behaviour + + // create the drawing + // find the proper frameid + TFrameId fid; + TXshCellColumn *column = xsh->getColumn(col)->getCellColumn(); + if (isAutoRenumberEnabled && column) { + TFrameId maxFid(row); + fid = (animationSheetEnabled) + ? TFrameId(row + 1) + : getDesiredFId(column, r0, sl, row, maxFid); + sl->getFids(m_oldFids); + m_isLevelRenumbererd = ToolUtils::renumberForInsertFId( + sl, fid, maxFid, scene->getTopXsheet()); + if (m_isLevelRenumbererd) sl->getFids(m_newFids); + } else + fid = (animationSheetEnabled) ? getNewFrameId(sl, row) + : sl->index2fid(sl->getFrameCount()); + // create the new drawing + TImageP img = sl->createEmptyFrame(); + m_isFrameCreated = true; + // insert the drawing in the level + sl->setFrame(fid, img); + // update the cell + cell = TXshCell(sl, fid); + xsh->setCell(row, col, cell); + + // create holds + if (!isAutoStretchEnabled) { + m_cellsData.push_back({row, row, CellOps::BlankToNew}); + } else { + if (a >= r0) { + // create a hold before : [a+1, row-1] + TXshCell aCell = xsh->getCell(a, col); + for (int i = a + 1; i < row; i++) xsh->setCell(i, col, aCell); + m_cellsData.push_back({a + 1, row - 1, CellOps::BlankToExisting}); + + if (b <= r1 && xsh->getCell(b, col).getSimpleLevel() == sl) { + // create also a hold after for (int i = row + 1; i < b; i++) xsh->setCell(i, col, cell); - m_cellsData.push_back(row); - m_cellsData.push_back(b - 1); - m_cellsData.push_back(2); // vuoto => nuovo + m_cellsData.push_back({row, b - 1, CellOps::BlankToNew}); + } else { + m_cellsData.push_back({row, row, CellOps::BlankToNew}); } + } else if (b <= r1) { + // create a hold after + for (int i = row + 1; i < b; i++) xsh->setCell(i, col, cell); + m_cellsData.push_back({row, b - 1, CellOps::BlankToNew}); } } // notify & return @@ -428,55 +498,27 @@ TImage *TTool::touchImage() { currentLevel->notifyLevelChange(); return cell.getImage(true).getPointer(); } - - if (row > 0 && xsh->getCell(row - 1, col).getSimpleLevel() != 0 && - !animationSheetEnabled) { - sl = xsh->getCell(row - 1, col).getSimpleLevel(); - if (sl->getType() != OVL_XSHLEVEL || - sl->getPath().getFrame() != TFrameId::NO_FRAME) { - // la cella precedente contiene un drawing di un livello. animationSheet - // e' disabilitato - // creo un nuovo frame - currentLevel->setLevel(sl); - if (sl->isSubsequence() || sl->isReadOnly()) return 0; - TFrameId fid = sl->index2fid(sl->getFrameCount()); - TImageP img = sl->createEmptyFrame(); - m_isFrameCreated = true; - sl->setFrame(fid, img); - cell = TXshCell(sl, fid); - xsh->setCell(row, col, cell); - currentXsheet->notifyXsheetChanged(); - currentScene->notifyCastChange(); - currentLevel->notifyLevelChange(); - return img.getPointer(); - } - } - - // animation sheet disabled or empty column. autoCreate is enabled: we must - // create a new level - int levelType = pref->getDefLevelType(); - TXshLevel *xl = scene->createNewLevel(levelType); - sl = xl->getSimpleLevel(); - m_isLevelCreated = true; - - // create the drawing - TFrameId fid = animationSheetEnabled ? getNewFrameId(sl, row) : TFrameId(1); - TImageP img = sl->createEmptyFrame(); - m_isFrameCreated = true; - sl->setFrame(fid, img); - cell = TXshCell(sl, fid); - xsh->setCell(row, col, cell); - if (animationSheetEnabled) { - m_cellsData.push_back(row); - m_cellsData.push_back(row); - m_cellsData.push_back(2); // vuoto => nuovo - } - - currentXsheet->notifyXsheetChanged(); - currentScene->notifyCastChange(); - currentLevel->notifyLevelChange(); - return img.getPointer(); } + + // - - - - empty column case starts here - - - - + // autoCreate is enabled: we must create a new level + int levelType = pref->getDefLevelType(); + TXshLevel *xl = scene->createNewLevel(levelType); + sl = xl->getSimpleLevel(); + m_isLevelCreated = true; + + // create the drawing + TFrameId fid = animationSheetEnabled ? getNewFrameId(sl, row) : TFrameId(1); + TImageP img = sl->createEmptyFrame(); + m_isFrameCreated = true; + sl->setFrame(fid, img); + cell = TXshCell(sl, fid); + xsh->setCell(row, col, cell); + m_cellsData.push_back({row, row, CellOps::BlankToNew}); // vuoto => nuovo + currentXsheet->notifyXsheetChanged(); + currentScene->notifyCastChange(); + currentLevel->notifyLevelChange(); + return img.getPointer(); } //----------------------------------------------------------------------------- @@ -813,8 +855,7 @@ QString TTool::updateEnabled(int rowIndex, int columnIndex) { levelType = cell.isEmpty() ? NO_XSHLEVEL : cell.m_level->getType(); } - if (Preferences::instance()->isAutoCreateEnabled() && - Preferences::instance()->isAnimationSheetEnabled()) { + if (Preferences::instance()->isAutoCreateEnabled()) { // If not in Level editor, let's use our current cell from the xsheet to // find the nearest level before it if (levelType == NO_XSHLEVEL && @@ -1023,3 +1064,346 @@ void TTool::setSelectedFrames(const std::set &selectedFrames) { m_selectedFrames = selectedFrames; onSelectedFramesChanged(); } + +//------------------------------------------------------------------------------------------------------------- + +void TTool::Viewer::getGuidedFrameIdx(int *backIdx, int *frontIdx) { + OnionSkinMask osMask = + m_application->getCurrentOnionSkin()->getOnionSkinMask(); + + if (!osMask.isEnabled() || osMask.isEmpty()) return; + + TFrameHandle *currentFrame = getApplication()->getCurrentFrame(); + + int cidx = currentFrame->getFrameIndex(); + int mosBack = 0; + int mosFront = 0; + int mosCount = osMask.getMosCount(); + int fosBack = -1; + int fosFront = -1; + int fosCount = osMask.getFosCount(); + + // Find onion-skinned drawing that is being used for guided auto inbetween + if (Preferences::instance()->getGuidedDrawing() == 1) { + // Get closest moving unionskin + for (int i = 0; i < mosCount; i++) { + int cmos = osMask.getMos(i); + if (cmos == 0) continue; // skip current + if (cmos < 0 && (!mosBack || cmos > mosBack)) mosBack = cmos; + if (cmos > 0 && (!mosFront || cmos < mosFront)) mosFront = cmos; + } + if (mosBack) *backIdx = mosBack + cidx; + if (mosFront) *frontIdx = mosFront + cidx; + + // Get closest fixed onionskin + for (int i = 0; i < fosCount; i++) { + int cfos = osMask.getFos(i); + if (cfos == cidx) continue; // skip current + if (cfos < cidx && (fosBack == -1 || cfos > fosBack)) fosBack = cfos; + if (cfos > cidx && (fosFront == -1 || cfos < fosFront)) fosFront = cfos; + } + + if (*backIdx == -1) + *backIdx = fosBack; + else if (fosBack != -1) + *backIdx = std::max(*backIdx, fosBack); + if (*frontIdx == -1) + *frontIdx = fosFront; + else if (fosFront != -1) + *frontIdx = std::min(*frontIdx, fosFront); + } else if (Preferences::instance()->getGuidedDrawing() == + 2) { // Furthest drawing + // Get moving unionskin + for (int i = 0; i < mosCount; i++) { + int cmos = osMask.getMos(i); + if (cmos == 0) continue; // skip current + if (cmos < 0 && (!mosBack || cmos < mosBack)) mosBack = cmos; + if (cmos > 0 && (!mosFront || cmos > mosFront)) mosFront = cmos; + } + if (mosBack) *backIdx = mosBack + cidx; + if (mosFront) *frontIdx = mosFront + cidx; + + // Get fixed onionskin + for (int i = 0; i < fosCount; i++) { + int cfos = osMask.getFos(i); + if (cfos == cidx) continue; // skip current + if (cfos < cidx && (fosBack == -1 || cfos < fosBack)) fosBack = cfos; + if (cfos > cidx && (fosFront == -1 || cfos > fosFront)) fosFront = cfos; + } + + if (*backIdx == -1) + *backIdx = fosBack; + else if (fosBack != -1) + *backIdx = std::min(*backIdx, fosBack); + if (*frontIdx == -1) + *frontIdx = fosFront; + else if (fosFront != -1) + *frontIdx = std::max(*frontIdx, fosFront); + } +} + +//------------------------------------------------------------------------------------------------------------- + +void TTool::Viewer::doPickGuideStroke(const TPointD &pos) { + int pickerMode = getGuidedStrokePickerMode(); + + if (!pickerMode) return; + + if (pickerMode >= -2 && pickerMode <= 2) setGuidedStrokePickerMode(0); + + int osBack = -1; + int osFront = -1; + int os = -1; + + getGuidedFrameIdx(&osBack, &osFront); + + if (pickerMode < 0) // Previous Frame + os = osBack; + else if (pickerMode > 0) // Next Frame + os = osFront; + + TFrameId fid; + TFrameHandle *currentFrame = getApplication()->getCurrentFrame(); + TXshSimpleLevel *sl = + getApplication()->getCurrentLevel()->getLevel()->getSimpleLevel(); + if (!sl) return; + + if (currentFrame->isEditingScene()) { + TXsheet *xsh = getApplication()->getCurrentXsheet()->getXsheet(); + int col = getApplication()->getCurrentColumn()->getColumnIndex(); + if (xsh && col >= 0) { + TXshCell cell = xsh->getCell(os, col); + if (!cell.isEmpty()) fid = cell.getFrameId(); + } + } else + fid = sl->getFrameId(os); + + if (fid.isEmptyFrame()) return; + + TVectorImageP fvi = sl->getFrame(fid, false); + if (!fvi) return; + + UINT index; + double t, dist2 = 0; + double pixelSize = getPixelSize(); + TAffine aff = getViewMatrix(); + double maxDist = 5 * pixelSize; + double maxDist2 = maxDist * maxDist; + double checkDist = maxDist2 * 4; + TStroke *strokeRef; + if (fvi->getNearestStroke(pos, t, index, dist2)) { + strokeRef = fvi->getStroke(index); + TThickPoint cursor = strokeRef->getThickPoint(t); + double len = cursor.thick * pixelSize * sqrt(aff.det()); + checkDist = std::max(checkDist, (len * len)); + } + + if (dist2 >= checkDist) + index = -1; + else { + if (pickerMode < 0) // Previous Frame + setGuidedBackStroke(index); + else if (pickerMode > 0) // Next Frame + setGuidedFrontStroke(index); + } + + if (pickerMode <= -2) { + if (index != -1) setGuidedStrokePickerMode(pickerMode * -1); + } else if (pickerMode >= 2) { + if (pickerMode >= 3 && index != -1) { + TTool *tool = TTool::getTool(T_Brush, TTool::ToolTargetType::VectorImage); + ToonzVectorBrushTool *vbTool = (ToonzVectorBrushTool *)tool; + if (vbTool) { + vbTool->setViewer(this); + vbTool->doGuidedAutoInbetween(fid, fvi, strokeRef, false, false, false, + false); + } + + setGuidedStrokePickerMode(pickerMode * -1); + } + } +} + +//------------------------------------------------------------------------------------------------------------- + +void TTool::tweenSelectedGuideStrokes() { + if (!getViewer() || !m_application) return; + + TXshSimpleLevel *sl = + m_application->getCurrentLevel()->getLevel()->getSimpleLevel(); + if (!sl) return; + + int backIdx = -1, frontIdx = -1; + + getViewer()->getGuidedFrameIdx(&backIdx, &frontIdx); + + if (backIdx == -1 || frontIdx == -1) return; + + TFrameHandle *currentFrame = getApplication()->getCurrentFrame(); + int row = currentFrame->getFrameIndex(); + TFrameId bFid, cFid, fFid; + + cFid = getCurrentFid(); + if (cFid.isEmptyFrame()) return; + + TVectorImageP cvi = sl->getFrame(cFid, false); + if (!cvi) return; + + int cStrokeCount = cvi->getStrokeCount(); + + if (currentFrame->isEditingScene()) { + TXsheet *xsh = m_application->getCurrentXsheet()->getXsheet(); + int col = m_application->getCurrentColumn()->getColumnIndex(); + if (xsh && col >= 0) { + TXshCell cell = xsh->getCell(backIdx, col); + if (!cell.isEmpty()) bFid = cell.getFrameId(); + cell = xsh->getCell(frontIdx, col); + if (!cell.isEmpty()) fFid = cell.getFrameId(); + } + } else { + bFid = sl->getFrameId(backIdx); + fFid = sl->getFrameId(frontIdx); + } + if (bFid.isEmptyFrame() || fFid.isEmptyFrame()) return; + + TVectorImageP bvi = sl->getFrame(bFid, false); + TVectorImageP fvi = sl->getFrame(fFid, false); + + if (!bvi || !fvi) return; + + int bStrokeCount = bvi->getStrokeCount(); + int fStrokeCount = fvi->getStrokeCount(); + + if (!bStrokeCount || !fStrokeCount) return; + + int bStrokeIdx = getViewer()->getGuidedBackStroke() != -1 + ? getViewer()->getGuidedBackStroke() + : cStrokeCount; + int fStrokeIdx = getViewer()->getGuidedFrontStroke() != -1 + ? getViewer()->getGuidedFrontStroke() + : cStrokeCount; + + if (bStrokeIdx >= bStrokeCount || fStrokeIdx >= fStrokeCount) return; + + TStroke *bStroke = bvi->getStroke(bStrokeIdx); + TStroke *fStroke = fvi->getStroke(fStrokeIdx); + + if (!bStroke || !fStroke) return; + + TTool *tool = TTool::getTool(T_Brush, TTool::ToolTargetType::VectorImage); + ToonzVectorBrushTool *vbTool = (ToonzVectorBrushTool *)tool; + if (vbTool) { + vbTool->setViewer(m_viewer); + vbTool->doFrameRangeStrokes( + bFid, bStroke, fFid, fStroke, + Preferences::instance()->getGuidedInterpolation(), false, false, false, + false, false, true); + } +} + +//------------------------------------------------------------------------------------------------------------- + +void TTool::tweenGuideStrokeToSelected() { + if (!getViewer() || !m_application) return; + + TXshSimpleLevel *sl = + m_application->getCurrentLevel()->getLevel()->getSimpleLevel(); + if (!sl) return; + + int backIdx = -1, frontIdx = -1; + + getViewer()->getGuidedFrameIdx(&backIdx, &frontIdx); + + TFrameHandle *currentFrame = getApplication()->getCurrentFrame(); + int row = currentFrame->getFrameIndex(); + TFrameId bFid, cFid, fFid; + TVectorImageP bvi, cvi, fvi; + + cFid = getCurrentFid(); + if (cFid.isEmptyFrame()) return; + + cvi = sl->getFrame(cFid, false); + if (!cvi) return; + + int cStrokeCount = cvi->getStrokeCount(); + if (!cStrokeCount) return; + + StrokeSelection *strokeSelection = + dynamic_cast(getSelection()); + if (!strokeSelection || strokeSelection->isEmpty()) return; + const std::set &selectedStrokeIdxs = strokeSelection->getSelection(); + const std::set::iterator it = selectedStrokeIdxs.begin(); + int cStrokeIdx = *it; + + TStroke *cStroke = cvi->getStroke(cStrokeIdx); + if (!cStroke) return; + + if (backIdx != -1) { + if (currentFrame->isEditingScene()) { + TXsheet *xsh = m_application->getCurrentXsheet()->getXsheet(); + int col = m_application->getCurrentColumn()->getColumnIndex(); + if (xsh && col >= 0) { + TXshCell cell = xsh->getCell(backIdx, col); + if (!cell.isEmpty()) bFid = cell.getFrameId(); + } + } else + bFid = sl->getFrameId(backIdx); + + if (!bFid.isEmptyFrame()) bvi = sl->getFrame(bFid, false); + } + + if (frontIdx != -1) { + if (currentFrame->isEditingScene()) { + TXsheet *xsh = m_application->getCurrentXsheet()->getXsheet(); + int col = m_application->getCurrentColumn()->getColumnIndex(); + if (xsh && col >= 0) { + TXshCell cell = xsh->getCell(frontIdx, col); + if (!cell.isEmpty()) fFid = cell.getFrameId(); + } + } else + fFid = sl->getFrameId(frontIdx); + + if (!fFid.isEmptyFrame()) fvi = sl->getFrame(fFid, false); + } + + if (!bvi && !fvi) return; + + int bStrokeCount = bvi ? bvi->getStrokeCount() : 0; + int fStrokeCount = fvi ? fvi->getStrokeCount() : 0; + + if (!bStrokeCount && !fStrokeCount) return; + + int bStrokeIdx = getViewer()->getGuidedBackStroke() != -1 + ? getViewer()->getGuidedBackStroke() + : cStrokeCount; + int fStrokeIdx = getViewer()->getGuidedFrontStroke() != -1 + ? getViewer()->getGuidedFrontStroke() + : cStrokeCount; + + if ((bStrokeCount && bStrokeIdx >= bStrokeCount) || + (fStrokeCount && fStrokeIdx >= fStrokeCount)) + return; + + TStroke *bStroke = bvi ? bvi->getStroke(bStrokeIdx) : 0; + TStroke *fStroke = fvi ? fvi->getStroke(fStrokeIdx) : 0; + + if (!bStroke && !fStroke) return; + + TTool *tool = TTool::getTool(T_Brush, TTool::ToolTargetType::VectorImage); + ToonzVectorBrushTool *vbTool = (ToonzVectorBrushTool *)tool; + if (vbTool) { + vbTool->setViewer(m_viewer); + TUndoManager::manager()->beginBlock(); + if (bStroke) + vbTool->doFrameRangeStrokes( + bFid, bStroke, cFid, cStroke, + Preferences::instance()->getGuidedInterpolation(), false, false, + false, false, false, false); + if (fStroke) + vbTool->doFrameRangeStrokes( + cFid, cStroke, fFid, fStroke, + Preferences::instance()->getGuidedInterpolation(), false, false, + false, false, false, false); + TUndoManager::manager()->endBlock(); + } +} diff --git a/toonz/sources/tnztools/tooloptionscontrols.cpp b/toonz/sources/tnztools/tooloptionscontrols.cpp index 06335a3..d797097 100644 --- a/toonz/sources/tnztools/tooloptionscontrols.cpp +++ b/toonz/sources/tnztools/tooloptionscontrols.cpp @@ -1595,10 +1595,11 @@ SelectionScaleField::SelectionScaleField(SelectionTool *tool, int id, bool SelectionScaleField::applyChange(bool addToUndo) { if (!m_tool || (m_tool->isSelectionEmpty() && !m_tool->isLevelType())) return false; - DragSelectionTool::DragTool *scaleTool = createNewScaleTool(m_tool, 0); + using namespace DragSelectionTool; + DragTool *scaleTool = createNewScaleTool(m_tool, ScaleType::GLOBAL); double p = getValue(); if (p == 0) p = 0.00001; - DragSelectionTool::FourPoints points = m_tool->getBBox(); + FourPoints points = m_tool->getBBox(); TPointD center = m_tool->getCenter(); TPointD p0M = points.getPoint(7); TPointD p1M = points.getPoint(5); @@ -1866,4 +1867,4 @@ void ClickableLabel::mouseMoveEvent(QMouseEvent *event) { void ClickableLabel::mouseReleaseEvent(QMouseEvent *event) { emit onMouseRelease(event); -} \ No newline at end of file +} diff --git a/toonz/sources/tnztools/toolutils.cpp b/toonz/sources/tnztools/toolutils.cpp index ebc08ae..1ceff93 100644 --- a/toonz/sources/tnztools/toolutils.cpp +++ b/toonz/sources/tnztools/toolutils.cpp @@ -32,6 +32,7 @@ #include "toonz/toonzscene.h" #include "toonz/preferences.h" #include "toonz/palettecontroller.h" +#include "toonz/txshchildlevel.h" #include "toonzqt/tselectionhandle.h" #include "toonzqt/icongenerator.h" @@ -459,16 +460,18 @@ ToolUtils::TToolUndo::TToolUndo(TXshSimpleLevel *level, const TFrameId &frameId, , m_isEditingLevel(false) , m_createdFrame(createdFrame) , m_createdLevel(createdLevel) + , m_renumberedLevel(TTool::m_isLevelRenumbererd) , m_imageId("") { - m_animationSheetEnabled = Preferences::instance()->isAnimationSheetEnabled(); TTool::Application *app = TTool::getApplication(); m_isEditingLevel = app->getCurrentFrame()->isEditingLevel(); if (!m_isEditingLevel) { - m_col = app->getCurrentColumn()->getColumnIndex(); - m_row = app->getCurrentFrame()->getFrameIndex(); - if (m_animationSheetEnabled) { - m_cellsData = TTool::m_cellsData; - } + m_col = app->getCurrentColumn()->getColumnIndex(); + m_row = app->getCurrentFrame()->getFrameIndex(); + m_cellsData = TTool::m_cellsData; + } + if (m_renumberedLevel) { + m_oldFids = TTool::m_oldFids; + m_newFids = TTool::m_newFids; } if (createdFrame) { m_imageId = "TToolUndo" + std::to_string(m_idCount++); @@ -487,6 +490,14 @@ ToolUtils::TToolUndo::~TToolUndo() { void ToolUtils::TToolUndo::insertLevelAndFrameIfNeeded() const { TTool::Application *app = TTool::getApplication(); + if (m_renumberedLevel) { + TXsheet *xsh = app->getCurrentScene()->getScene()->getTopXsheet(); + std::vector childLevels; + ToolUtils::doUpdateXSheet(m_level.getPointer(), m_oldFids, m_newFids, xsh, + childLevels); + m_level->renumber(m_newFids); + app->getCurrentXsheet()->notifyXsheetChanged(); + } if (m_createdLevel) { TLevelSet *levelSet = app->getCurrentScene()->getScene()->getLevelSet(); if (levelSet) { @@ -499,22 +510,14 @@ void ToolUtils::TToolUndo::insertLevelAndFrameIfNeeded() const { TImageP img = TImageCache::instance()->get(m_imageId, false); m_level->setFrame(m_frameId, img); if (!m_isEditingLevel) { - if (m_animationSheetEnabled) { - int m = m_cellsData.size() / 3; - for (int i = 0; i < m; i++) { - int r0 = m_cellsData[i * 3]; - int r1 = m_cellsData[i * 3 + 1]; - int type = m_cellsData[i * 3 + 2]; - TXshCell cell; - if (type == 1) - cell = xsh->getCell(r0 - 1, m_col); - else - cell = TXshCell(m_level.getPointer(), m_frameId); - for (int r = r0; r <= r1; r++) xsh->setCell(r, m_col, cell); - } - } else { - TXshCell cell(m_level.getPointer(), m_frameId); - xsh->setCell(m_row, m_col, cell); + for (const TTool::CellOps &cellOps : m_cellsData) { + TXshCell cell; + if (cellOps.type == TTool::CellOps::BlankToExisting) + cell = xsh->getCell(cellOps.r0 - 1, m_col); + else + cell = TXshCell(m_level.getPointer(), m_frameId); + for (int r = cellOps.r0; r <= cellOps.r1; r++) + xsh->setCell(r, m_col, cell); } } app->getCurrentLevel()->notifyLevelChange(); @@ -529,18 +532,12 @@ void ToolUtils::TToolUndo::removeLevelAndFrameIfNeeded() const { m_level->eraseFrame(m_frameId); if (!m_isEditingLevel) { TXsheet *xsh = app->getCurrentXsheet()->getXsheet(); - if (m_animationSheetEnabled) { - int m = m_cellsData.size() / 3; - for (int i = 0; i < m; i++) { - int r0 = m_cellsData[i * 3]; - int r1 = m_cellsData[i * 3 + 1]; - int type = m_cellsData[i * 3 + 2]; - TXshCell cell; - if (type == 0) cell = xsh->getCell(r0 - 1, m_col); - for (int r = r0; r <= r1; r++) xsh->setCell(r, m_col, cell); - } - } else { - xsh->clearCells(m_row, m_col); + for (const TTool::CellOps &cellOps : m_cellsData) { + TXshCell cell; + if (cellOps.type == TTool::CellOps::ExistingToNew) + cell = xsh->getCell(cellOps.r0 - 1, m_col); + for (int r = cellOps.r0; r <= cellOps.r1; r++) + xsh->setCell(r, m_col, cell); } } if (m_createdLevel) { @@ -559,6 +556,14 @@ void ToolUtils::TToolUndo::removeLevelAndFrameIfNeeded() const { ->getCurrentLevelPalette() ->notifyPaletteChanged(); } + if (m_renumberedLevel) { + TXsheet *xsh = app->getCurrentScene()->getScene()->getTopXsheet(); + std::vector childLevels; + ToolUtils::doUpdateXSheet(m_level.getPointer(), m_newFids, m_oldFids, xsh, + childLevels); + m_level->renumber(m_oldFids); + app->getCurrentXsheet()->notifyXsheetChanged(); + } } //------------------------------------------------------------------------------------------ @@ -1757,3 +1762,104 @@ TRasterPT ToolUtils::rotate90(const TRasterPT &ras, bool toRight) } return workRas; }*/ + +//----------------------------------------------------------------------------- + +bool ToolUtils::doUpdateXSheet(TXshSimpleLevel *sl, + std::vector oldFids, + std::vector newFids, TXsheet *xsh, + std::vector &childLevels) { + bool ret = false; + for (int c = 0; c < xsh->getColumnCount(); ++c) { + int r0, r1; + int n = xsh->getCellRange(c, r0, r1); + if (n > 0) { + bool changed = false; + std::vector cells(n); + xsh->getCells(r0, c, n, &cells[0]); + for (int i = 0; i < n; i++) { + TXshCell currCell = cells[i]; + // check the sub xsheets too + if (!cells[i].isEmpty() && + 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()) { + childLevels.push_back(level); + TXsheet *subXsh = level->getXsheet(); + ret |= doUpdateXSheet(sl, oldFids, newFids, subXsh, childLevels); + } + } + for (int j = 0; j < oldFids.size(); j++) { + if (oldFids.at(j) == newFids.at(j)) continue; + TXshCell tempCell(sl, oldFids.at(j)); + bool sameSl = tempCell.getSimpleLevel() == currCell.getSimpleLevel(); + bool sameFid = tempCell.getFrameId() == currCell.getFrameId(); + if (sameSl && sameFid) { + TXshCell newCell(sl, newFids.at(j)); + cells[i] = newCell; + changed = true; + break; + } + } + } + if (changed) { + xsh->setCells(r0, c, n, &cells[0]); + ret = true; + // TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); + } + } + } + return ret; +} + +//----------------------------------------------------------------------------- + +bool ToolUtils::renumberForInsertFId(TXshSimpleLevel *sl, const TFrameId &fid, + const TFrameId &maxFid, TXsheet *xsh) { + std::vector fids; + std::vector oldFrames; + sl->getFids(oldFrames); + sl->getFids(fids); + std::vector::iterator it = std::find(fids.begin(), fids.end(), fid); + if (it == fids.end()) return false; + + std::set fidsSet(fids.begin(), fids.end()); + QList fIdsToBeShifted; + TFrameId tmpFid = fid; + for (auto itr = fidsSet.upper_bound(maxFid); itr != fidsSet.end(); ++itr) { + if (*itr > tmpFid) break; + fIdsToBeShifted.push_back(*itr); + if (fid.getLetter()) { + if ((*itr).getLetter() < 'z') + tmpFid = TFrameId((*itr).getNumber(), + ((*itr).getLetter()) ? (*itr).getLetter() + 1 : 'a'); + else + tmpFid = TFrameId((*itr).getNumber() + 1); + } else + tmpFid = TFrameId((*itr).getNumber() + 1, (*itr).getLetter()); + } + + if (fIdsToBeShifted.isEmpty()) return false; + + for (TFrameId &tmpFid : fids) { + if (fIdsToBeShifted.contains(tmpFid)) { + if (fid.getLetter()) { + if (tmpFid.getLetter() < 'z') + tmpFid = + TFrameId(tmpFid.getNumber(), + (tmpFid.getLetter()) ? tmpFid.getLetter() + 1 : 'a'); + else + tmpFid = TFrameId(tmpFid.getNumber() + 1); + } else + tmpFid = TFrameId(tmpFid.getNumber() + 1, tmpFid.getLetter()); + } + } + + std::vector childLevels; + doUpdateXSheet(sl, oldFrames, fids, xsh, childLevels); + sl->renumber(fids); + + return true; +} diff --git a/toonz/sources/tnztools/toonzvectorbrushtool.cpp b/toonz/sources/tnztools/toonzvectorbrushtool.cpp index 9acdabb..7d2c85f 100644 --- a/toonz/sources/tnztools/toonzvectorbrushtool.cpp +++ b/toonz/sources/tnztools/toonzvectorbrushtool.cpp @@ -28,6 +28,7 @@ #include "toonz/palettecontroller.h" #include "toonz/stage2.h" #include "toonz/preferences.h" +#include "toonz/tonionskinmaskhandle.h" // TnzCore includes #include "tstream.h" @@ -335,8 +336,9 @@ static void findMaxCurvPoints(TStroke *stroke, const float &angoloLim, } static void addStroke(TTool::Application *application, const TVectorImageP &vi, - TStroke *stroke, bool breakAngles, bool frameCreated, - bool levelCreated, TXshSimpleLevel *sLevel = NULL, + TStroke *stroke, bool breakAngles, bool autoGroup, + bool autoFill, bool frameCreated, bool levelCreated, + TXshSimpleLevel *sLevel = NULL, TFrameId fid = TFrameId::NO_FRAME) { QMutexLocker lock(vi->getMutex()); @@ -380,7 +382,8 @@ static void addStroke(TTool::Application *application, const TVectorImageP &vi, TStroke *str = new TStroke(*strokes[i]); vi->addStroke(str); TUndoManager::manager()->add(new UndoPencil(str, fillInformation, sl, id, - frameCreated, levelCreated)); + frameCreated, levelCreated, + autoGroup, autoFill)); } TUndoManager::manager()->endBlock(); } else { @@ -391,7 +394,24 @@ static void addStroke(TTool::Application *application, const TVectorImageP &vi, TStroke *str = new TStroke(*stroke); vi->addStroke(str); TUndoManager::manager()->add(new UndoPencil(str, fillInformation, sl, id, - frameCreated, levelCreated)); + frameCreated, levelCreated, + autoGroup, autoFill)); + } + + if (autoGroup && stroke->isSelfLoop()) { + int index = vi->getStrokeCount() - 1; + vi->group(index, 1); + if (autoFill) { + // to avoid filling other strokes, I enter into the new stroke group + int currentGroup = vi->exitGroup(); + vi->enterGroup(index); + vi->selectFill(stroke->getBBox().enlarge(1, 1), 0, stroke->getStyle(), + false, true, false); + if (currentGroup != -1) + vi->enterGroup(currentGroup); + else + vi->exitGroup(); + } } // Update regions. It will call roundStroke() in @@ -423,12 +443,13 @@ namespace { //------------------------------------------------------------------- void addStrokeToImage(TTool::Application *application, const TVectorImageP &vi, - TStroke *stroke, bool breakAngles, bool frameCreated, - bool levelCreated, TXshSimpleLevel *sLevel = NULL, + TStroke *stroke, bool breakAngles, bool autoGroup, + bool autoFill, bool frameCreated, bool levelCreated, + TXshSimpleLevel *sLevel = NULL, TFrameId id = TFrameId::NO_FRAME) { QMutexLocker lock(vi->getMutex()); - addStroke(application, vi.getPointer(), stroke, breakAngles, frameCreated, - levelCreated, sLevel, id); + addStroke(application, vi.getPointer(), stroke, breakAngles, autoGroup, + autoFill, frameCreated, levelCreated, sLevel, id); // la notifica viene gia fatta da addStroke! // getApplication()->getCurrentTool()->getTool()->notifyImageChanged(); } @@ -630,6 +651,8 @@ void ToonzVectorBrushTool::onDeactivate() { //-------------------------------------------------------------------------------------------------- bool ToonzVectorBrushTool::preLeftButtonDown() { + if (getViewer() && getViewer()->getGuidedStrokePickerMode()) return false; + touchImage(); if (m_isFrameCreated) { // When the xsheet frame is selected, whole viewer will be updated from @@ -647,6 +670,11 @@ void ToonzVectorBrushTool::leftButtonDown(const TPointD &pos, TTool::Application *app = TTool::getApplication(); if (!app) return; + if (getViewer() && getViewer()->getGuidedStrokePickerMode()) { + getViewer()->doPickGuideStroke(pos); + return; + } + int col = app->getCurrentColumn()->getColumnIndex(); m_isPath = app->getCurrentObject()->isSpline(); m_enabled = col >= 0 || m_isPath || app->getCurrentFrame()->isEditingLevel(); @@ -912,9 +940,10 @@ void ToonzVectorBrushTool::leftButtonUp(const TPointD &pos, curCol = application->getCurrentColumn()->getColumnIndex(); curFrame = application->getCurrentFrame()->getFrame(); } - bool success = - doFrameRangeStrokes(m_firstFrameId, m_firstStroke, getFrameId(), - stroke, m_firstFrameRange); + bool success = doFrameRangeStrokes( + m_firstFrameId, m_firstStroke, getFrameId(), stroke, + m_frameRange.getIndex(), m_breakAngles.getValue(), false, false, + m_firstFrameRange); if (e.isCtrlPressed()) { if (application) { if (m_firstFrameId > currentId) { @@ -950,9 +979,29 @@ void ToonzVectorBrushTool::leftButtonUp(const TPointD &pos, stroke->setSelfLoop(true); m_snapSelf = false; } - addStrokeToImage(getApplication(), vi, stroke, m_breakAngles.getValue(), - m_isFrameCreated, m_isLevelCreated); + + bool strokeAdded = false; + + if ((Preferences::instance()->getGuidedDrawing() == 1 || + Preferences::instance()->getGuidedDrawing() == 2) && + Preferences::instance()->getGuidedAutoInbetween()) { + int fidx = getApplication()->getCurrentFrame()->getFrameIndex(); + TFrameId fId = getFrameId(); + + strokeAdded = doGuidedAutoInbetween( + fId, vi, stroke, m_breakAngles.getValue(), false, false, true); + + if (getApplication()->getCurrentFrame()->isEditingScene()) + getApplication()->getCurrentFrame()->setFrame(fidx); + else + getApplication()->getCurrentFrame()->setFid(fId); + } + + if (!strokeAdded) + addStrokeToImage(getApplication(), vi, stroke, m_breakAngles.getValue(), + false, false, m_isFrameCreated, m_isLevelCreated); TRectD bbox = stroke->getBBox().enlarge(2) + m_track.getModifiedRegion(); + invalidate(); // should use bbox? } assert(stroke); @@ -971,11 +1020,11 @@ bool ToonzVectorBrushTool::keyDown(QKeyEvent *event) { //-------------------------------------------------------------------------------------------------- -bool ToonzVectorBrushTool::doFrameRangeStrokes(TFrameId firstFrameId, - TStroke *firstStroke, - TFrameId lastFrameId, - TStroke *lastStroke, - bool drawFirstStroke) { +bool ToonzVectorBrushTool::doFrameRangeStrokes( + TFrameId firstFrameId, TStroke *firstStroke, TFrameId lastFrameId, + TStroke *lastStroke, int interpolationType, bool breakAngles, + bool autoGroup, bool autoFill, bool drawFirstStroke, bool drawLastStroke, + bool withUndo) { TXshSimpleLevel *sl = TTool::getApplication()->getCurrentLevel()->getLevel()->getSimpleLevel(); TStroke *first = new TStroke(); @@ -1009,7 +1058,11 @@ bool ToonzVectorBrushTool::doFrameRangeStrokes(TFrameId firstFrameId, int m = fids.size(); assert(m > 0); - TUndoManager::manager()->beginBlock(); + if (withUndo) TUndoManager::manager()->beginBlock(); + int row = getApplication()->getCurrentFrame()->isEditingScene() + ? getApplication()->getCurrentFrame()->getFrameIndex() + : -1; + TFrameId cFid = getApplication()->getCurrentFrame()->getFid(); for (int i = 0; i < m; ++i) { TFrameId fid = fids[i]; assert(firstFrameId <= fid && fid <= lastFrameId); @@ -1017,57 +1070,145 @@ bool ToonzVectorBrushTool::doFrameRangeStrokes(TFrameId firstFrameId, // This is an attempt to divide the tween evenly double t = m > 1 ? (double)i / (double)(m - 1) : 0.5; double s = t; - switch (m_frameRange.getIndex()) { + switch (interpolationType) { case 1: // LINEAR_WSTR break; case 2: // EASEIN_WSTR - s = t * t; - break; // s'(0) = 0 - case 3: // EASEOUT_WSTR s = t * (2 - t); break; // s'(1) = 0 + case 3: // EASEOUT_WSTR + s = t * t; + break; // s'(0) = 0 case 4: // EASEINOUT_WSTR: s = t * t * (3 - 2 * t); break; // s'(0) = s'(1) = 0 } TTool::Application *app = TTool::getApplication(); - if (app) { - if (app->getCurrentFrame()->isEditingScene()) - app->getCurrentFrame()->setFrame(fid.getNumber() - 1); - else - app->getCurrentFrame()->setFid(fid); - } + if (app) app->getCurrentFrame()->setFid(fid); TVectorImageP img = sl->getFrame(fid, true); if (t == 0) { if (!swapped && !drawFirstStroke) { } else addStrokeToImage(getApplication(), img, firstImage->getStroke(0), - m_breakAngles.getValue(), m_isFrameCreated, + breakAngles, autoGroup, autoFill, m_isFrameCreated, m_isLevelCreated, sl, fid); } else if (t == 1) { if (swapped && !drawFirstStroke) { - } else + } else if (drawLastStroke) addStrokeToImage(getApplication(), img, lastImage->getStroke(0), - m_breakAngles.getValue(), m_isFrameCreated, + breakAngles, autoGroup, autoFill, m_isFrameCreated, m_isLevelCreated, sl, fid); } else { assert(firstImage->getStrokeCount() == 1); assert(lastImage->getStrokeCount() == 1); TVectorImageP vi = TInbetween(firstImage, lastImage).tween(s); assert(vi->getStrokeCount() == 1); - addStrokeToImage(getApplication(), img, vi->getStroke(0), - m_breakAngles.getValue(), m_isFrameCreated, - m_isLevelCreated, sl, fid); + addStrokeToImage(getApplication(), img, vi->getStroke(0), breakAngles, + autoGroup, autoFill, m_isFrameCreated, m_isLevelCreated, + sl, fid); } } - TUndoManager::manager()->endBlock(); + if (row != -1) + getApplication()->getCurrentFrame()->setFrame(row); + else + getApplication()->getCurrentFrame()->setFid(cFid); + + if (withUndo) TUndoManager::manager()->endBlock(); notifyImageChanged(); return true; } //-------------------------------------------------------------------------------------------------- +bool ToonzVectorBrushTool::doGuidedAutoInbetween( + TFrameId cFid, const TVectorImageP &cvi, TStroke *cStroke, bool breakAngles, + bool autoGroup, bool autoFill, bool drawStroke) { + TApplication *app = TTool::getApplication(); + + if (cFid.isEmptyFrame() || cFid.isNoFrame() || !cvi || !cStroke) return false; + + TXshSimpleLevel *sl = app->getCurrentLevel()->getLevel()->getSimpleLevel(); + if (!sl) return false; + + int osBack = -1; + int osFront = -1; + + getViewer()->getGuidedFrameIdx(&osBack, &osFront); + + TFrameHandle *currentFrame = getApplication()->getCurrentFrame(); + bool resultBack = false; + bool resultFront = false; + TFrameId oFid; + int cStrokeIdx = cvi->getStrokeCount(); + int cStrokeCount = cStrokeIdx + 1; + + TUndoManager::manager()->beginBlock(); + if (osBack != -1) { + if (currentFrame->isEditingScene()) { + TXsheet *xsh = app->getCurrentXsheet()->getXsheet(); + int col = app->getCurrentColumn()->getColumnIndex(); + if (xsh && col >= 0) { + TXshCell cell = xsh->getCell(osBack, col); + if (!cell.isEmpty()) oFid = cell.getFrameId(); + } + } else + oFid = sl->getFrameId(osBack); + + TVectorImageP fvi = sl->getFrame(oFid, false); + int fStrokeCount = fvi ? fvi->getStrokeCount() : 0; + + int strokeIdx = getViewer()->getGuidedBackStroke() != -1 + ? getViewer()->getGuidedBackStroke() + : cStrokeIdx; + + if (!oFid.isEmptyFrame() && oFid != cFid && fvi && fStrokeCount && + strokeIdx < fStrokeCount) { + TStroke *fStroke = fvi->getStroke(strokeIdx); + + resultBack = doFrameRangeStrokes( + oFid, fStroke, cFid, cStroke, + Preferences::instance()->getGuidedInterpolation(), breakAngles, + autoGroup, autoFill, false, drawStroke, false); + } + } + + if (osFront != -1) { + bool drawFirstStroke = (osBack != -1 && resultBack) ? false : true; + + if (currentFrame->isEditingScene()) { + TXsheet *xsh = app->getCurrentXsheet()->getXsheet(); + int col = app->getCurrentColumn()->getColumnIndex(); + if (xsh && col >= 0) { + TXshCell cell = xsh->getCell(osFront, col); + if (!cell.isEmpty()) oFid = cell.getFrameId(); + } + } else + oFid = sl->getFrameId(osFront); + + TVectorImageP fvi = sl->getFrame(oFid, false); + int fStrokeCount = fvi ? fvi->getStrokeCount() : 0; + + int strokeIdx = getViewer()->getGuidedFrontStroke() != -1 + ? getViewer()->getGuidedFrontStroke() + : cStrokeIdx; + + if (!oFid.isEmptyFrame() && oFid != cFid && fvi && fStrokeCount && + strokeIdx < fStrokeCount) { + TStroke *fStroke = fvi->getStroke(strokeIdx); + + resultFront = doFrameRangeStrokes( + cFid, cStroke, oFid, fStroke, + Preferences::instance()->getGuidedInterpolation(), breakAngles, + autoGroup, autoFill, drawFirstStroke, false, false); + } + } + TUndoManager::manager()->endBlock(); + + return resultBack || resultFront; +} + +//-------------------------------------------------------------------------------------------------- void ToonzVectorBrushTool::addTrackPoint(const TThickPoint &point, double pixelSize2) { @@ -1375,6 +1516,9 @@ void ToonzVectorBrushTool::draw() { // If toggled off, don't draw brush outline if (!Preferences::instance()->isCursorOutlineEnabled()) return; + // Don't draw brush outline if picking guiding stroke + if (getViewer()->getGuidedStrokePickerMode()) return; + // Draw the brush outline - change color when the Ink / Paint check is // activated if ((ToonzCheck::instance()->getChecks() & ToonzCheck::eInk) || diff --git a/toonz/sources/tnztools/toonzvectorbrushtool.h b/toonz/sources/tnztools/toonzvectorbrushtool.h index ea53182..9b36af7 100644 --- a/toonz/sources/tnztools/toonzvectorbrushtool.h +++ b/toonz/sources/tnztools/toonzvectorbrushtool.h @@ -107,7 +107,11 @@ public: void onEnter() override; void onLeave() override; - int getCursorId() const override { return ToolCursor::PenCursor; } + int getCursorId() const override { + if (m_viewer && m_viewer->getGuidedStrokePickerMode()) + return m_viewer->getGuidedStrokePickerCursor(); + return ToolCursor::PenCursor; + } TPropertyGroup *getProperties(int targetType) override; bool onPropertyChanged(std::string propertyName) override; @@ -128,9 +132,16 @@ public: void flushTrackPoint(); bool doFrameRangeStrokes(TFrameId firstFrameId, TStroke *firstStroke, TFrameId lastFrameId, TStroke *lastStroke, - bool drawFirstStroke = true); + int interpolationType, bool breakAngles, + bool autoGroup = false, bool autoFill = false, + bool drawFirstStroke = true, + bool drawLastStroke = true, bool withUndo = true); void checkGuideSnapping(bool beforeMousePress, bool invertCheck); void checkStrokeSnapping(bool beforeMousePress, bool invertCheck); + bool doGuidedAutoInbetween(TFrameId cFid, const TVectorImageP &cvi, + TStroke *cStroke, bool breakAngles, + bool autoGroup = false, bool autoFill = false, + bool drawStroke = true); protected: TPropertyGroup m_prop[2]; diff --git a/toonz/sources/tnztools/typetool.cpp b/toonz/sources/tnztools/typetool.cpp index bfeafc7..ff198d6 100644 --- a/toonz/sources/tnztools/typetool.cpp +++ b/toonz/sources/tnztools/typetool.cpp @@ -388,7 +388,11 @@ public: void onDeactivate() override; void onImageChanged() override; - int getCursorId() const override { return m_cursorId; } + int getCursorId() const override { + if (m_viewer && m_viewer->getGuidedStrokePickerMode()) + return m_viewer->getGuidedStrokePickerCursor(); + return m_cursorId; + } bool onPropertyChanged(std::string propertyName) override; @@ -1200,6 +1204,11 @@ void TypeTool::mouseMove(const TPointD &pos, const TMouseEvent &) { void TypeTool::leftButtonDown(const TPointD &pos, const TMouseEvent &) { TSelection::setCurrent(0); + if (getViewer() && getViewer()->getGuidedStrokePickerMode()) { + getViewer()->doPickGuideStroke(pos); + return; + } + if (!m_validFonts) return; TImageP img; diff --git a/toonz/sources/tnztools/vectorselectiontool.cpp b/toonz/sources/tnztools/vectorselectiontool.cpp index b77b843..114d7a7 100644 --- a/toonz/sources/tnztools/vectorselectiontool.cpp +++ b/toonz/sources/tnztools/vectorselectiontool.cpp @@ -841,7 +841,7 @@ void DragSelectionTool::VectorMoveSelectionTool::leftButtonDrag( //----------------------------------------------------------------------------- DragSelectionTool::VectorScaleTool::VectorScaleTool(VectorSelectionTool *tool, - int type) + ScaleType type) : VectorDeformTool(tool), m_scale(new Scale(this, type)) {} //----------------------------------------------------------------------------- @@ -1617,6 +1617,18 @@ void VectorSelectionTool::leftButtonDrag(const TPointD &pos, //----------------------------------------------------------------------------- +void VectorSelectionTool::leftButtonDown(const TPointD &pos, + const TMouseEvent &e) { + if (getViewer() && getViewer()->getGuidedStrokePickerMode()) { + getViewer()->doPickGuideStroke(pos); + return; + } + + SelectionTool::leftButtonDown(pos, e); +} + +//----------------------------------------------------------------------------- + void VectorSelectionTool::leftButtonUp(const TPointD &pos, const TMouseEvent &e) { m_leftButtonMousePressed = false; diff --git a/toonz/sources/tnztools/vectorselectiontool.h b/toonz/sources/tnztools/vectorselectiontool.h index 7e10b60..29df53b 100644 --- a/toonz/sources/tnztools/vectorselectiontool.h +++ b/toonz/sources/tnztools/vectorselectiontool.h @@ -8,6 +8,7 @@ // TnzTools includes #include "tools/strokeselection.h" #include "tools/levelselection.h" +#include "tools/cursors.h" // TnzCore includes #include "tstroke.h" @@ -222,7 +223,7 @@ class VectorScaleTool final : public VectorDeformTool { std::unique_ptr m_scale; public: - VectorScaleTool(VectorSelectionTool *tool, int type); + VectorScaleTool(VectorSelectionTool *tool, ScaleType type); TPointD transform(int index, TPointD newPos) override; //!< Returns scale value. @@ -318,6 +319,7 @@ protected: void onDeactivate() override; void leftButtonDrag(const TPointD &pos, const TMouseEvent &) override; + void leftButtonDown(const TPointD &pos, const TMouseEvent &) override; void leftButtonUp(const TPointD &pos, const TMouseEvent &) override; void leftButtonDoubleClick(const TPointD &, const TMouseEvent &e) override; void addContextMenuItems(QMenu *menu) override; @@ -330,6 +332,12 @@ protected: bool onPropertyChanged(std::string propertyName) override; void onImageChanged() override; + int getCursorId() const override { + if (m_viewer && m_viewer->getGuidedStrokePickerMode()) + return m_viewer->getGuidedStrokePickerCursor(); + return m_cursorId; + } + private: class AttachedLevelSelection final : public LevelSelection { StrokeSelection &m_strokeSelection; //!< Selection of strokes to be seen at diff --git a/toonz/sources/toonz/CMakeLists.txt b/toonz/sources/toonz/CMakeLists.txt index 4ea4287..02d3286 100644 --- a/toonz/sources/toonz/CMakeLists.txt +++ b/toonz/sources/toonz/CMakeLists.txt @@ -120,8 +120,17 @@ set(MOC_HEADERS xshnoteviewer.h xshrowviewer.h xshtoolbar.h + xdtsimportpopup.h ) +if(WITH_STOPMOTION) +set(MOC_HEADERS + ${MOC_HEADERS} + ../stopmotion/stopmotion.h + ../stopmotion/stopmotioncontroller.h +) +endif() + set(HEADERS ${MOC_HEADERS} celldata.h @@ -165,6 +174,7 @@ set(HEADERS ../include/cellposition.h ../include/orientation.h ../include/saveloadqsettings.h + xdtsio.h # Tracker file ObjectTracker.h dummyprocessor.h @@ -339,6 +349,8 @@ set(SOURCES boardsettingspopup.cpp separatecolorsswatch.cpp separatecolorspopup.cpp + xdtsio.cpp + xdtsimportpopup.cpp # Tracker file dummyprocessor.cpp metnum.cpp @@ -346,6 +358,14 @@ set(SOURCES predict3d.cpp ) +if(WITH_STOPMOTION) +set(SOURCES + ${SOURCES} + ../stopmotion/stopmotion.cpp + ../stopmotion/stopmotioncontroller.cpp +) +endif() + add_translation(toonz ${HEADERS} ${SOURCES}) set(OBJCSOURCES filebrowsermodel.cpp) @@ -400,6 +420,11 @@ include_directories( ../../sources/toonzqt ) +if (WITH_STOPMOTION) +include_directories(../../sources/stopmotion) + add_definitions(-DWITH_STOPMOTION) +endif() + if(BUILD_ENV_APPLE) include_directories(../../sources/mousedragfilter) endif() @@ -415,7 +440,15 @@ if(BUILD_TARGET_WIN) endif() endif() -if(BUILD_ENV_MSVC) +if(BUILD_ENV_MSVC AND WITH_STOPMOTION) + target_link_libraries(OpenToonz + Qt5::WinMain Qt5::Core Qt5::Gui Qt5::Network Qt5::OpenGL Qt5::Svg Qt5::Xml + Qt5::Script Qt5::Widgets Qt5::PrintSupport Qt5::Multimedia + ${GL_LIB} ${GLUT_LIB} + ${CANON_LIB} ${TURBOJPEG_LIB} ${OpenCV_LIBS} strmiids + tnzcore tnzbase toonzlib colorfx tnzext image sound toonzqt tnztools tnzstdfx tfarm + ) +elseif(BUILD_ENV_MSVC) target_link_libraries(OpenToonz Qt5::WinMain Qt5::Core Qt5::Gui Qt5::Network Qt5::OpenGL Qt5::Svg Qt5::Xml Qt5::Script Qt5::Widgets Qt5::PrintSupport Qt5::Multimedia diff --git a/toonz/sources/toonz/Resources/xdts.svg b/toonz/sources/toonz/Resources/xdts.svg new file mode 100644 index 0000000..83e43cc --- /dev/null +++ b/toonz/sources/toonz/Resources/xdts.svg @@ -0,0 +1,191 @@ + + + +image/svg+xml + + + + + + + + + \ No newline at end of file diff --git a/toonz/sources/toonz/cellselection.cpp b/toonz/sources/toonz/cellselection.cpp index e8b2937..d41ec6b 100644 --- a/toonz/sources/toonz/cellselection.cpp +++ b/toonz/sources/toonz/cellselection.cpp @@ -1254,6 +1254,45 @@ public: //----------------------------------------------------------------------------- +class DuplicateDrawingUndo final : public ToolUtils::TToolUndo { + TFrameId origFrameId; + TFrameId dupFrameId; + +public: + DuplicateDrawingUndo(TXshSimpleLevel *level, const TFrameId &srcFrameId, + const TFrameId &tgtFrameId) + : TToolUndo(level, tgtFrameId, true) { + origFrameId = srcFrameId; + dupFrameId = tgtFrameId; + } + + ~DuplicateDrawingUndo() {} + + void undo() const override { + removeLevelAndFrameIfNeeded(); + TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); + notifyImageChanged(); + } + + void redo() const override { + insertLevelAndFrameIfNeeded(); + + TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); + notifyImageChanged(); + } + + int getSize() const override { return sizeof(*this); } + + QString getHistoryString() override { + return QObject::tr("Duplicate Drawing"); + } + + int getHistoryType() override { return HistoryType::Xsheet; } + //----------------------------------------------------------------------------- +}; + +//----------------------------------------------------------------------------- + class FillEmptyCellUndo final : public TUndo { TCellSelection *m_selection; TXshCell m_cell; @@ -1408,6 +1447,10 @@ void TCellSelection::enableCommands() { enableCommand(this, MI_CloneLevel, &TCellSelection::cloneLevel); enableCommand(this, MI_SetKeyframes, &TCellSelection::setKeyframes); + enableCommand(this, MI_ShiftKeyframesDown, + &TCellSelection::shiftKeyframesDown); + enableCommand(this, MI_ShiftKeyframesUp, &TCellSelection::shiftKeyframesUp); + enableCommand(this, MI_Copy, &TCellSelection::copyCells); enableCommand(this, MI_Paste, &TCellSelection::pasteCells); @@ -1436,7 +1479,7 @@ void TCellSelection::enableCommands() { enableCommand(this, MI_PasteNumbers, &TCellSelection::overwritePasteNumbers); enableCommand(this, MI_CreateBlankDrawing, &TCellSelection::createBlankDrawings); - enableCommand(this, MI_Duplicate, &TCellSelection::duplicateFrame); + enableCommand(this, MI_Duplicate, &TCellSelection::duplicateFrames); } //----------------------------------------------------------------------------- // Used in RenameCellField::eventFilter() @@ -1462,6 +1505,8 @@ bool TCellSelection::isEnabledCommand( MI_TimeStretch, MI_CloneLevel, MI_SetKeyframes, + MI_ShiftKeyframesDown, + MI_ShiftKeyframesUp, MI_Copy, MI_Paste, MI_PasteInto, @@ -2011,7 +2056,12 @@ void TCellSelection::createBlankDrawing(int row, int col, bool multiple) { // If autocreate disabled, let's turn it on temporarily bool isAutoCreateEnabled = Preferences::instance()->isAutoCreateEnabled(); if (!isAutoCreateEnabled) - Preferences::instance()->setValue(AutocreationType, 1, false); + Preferences::instance()->setValue(EnableAutocreation, true, false); + // Enable inserting in the hold cells temporarily too. + bool isCreationInHoldCellsEnabled = + Preferences::instance()->isCreationInHoldCellsEnabled(); + if (!isCreationInHoldCellsEnabled) + Preferences::instance()->setValue(EnableCreationInHoldCells, true, false); TImage *img = toolHandle->getTool()->touchImage(); @@ -2020,13 +2070,25 @@ void TCellSelection::createBlankDrawing(int row, int col, bool multiple) { if (!img || !sl) { if (!isAutoCreateEnabled) - Preferences::instance()->setValue(AutocreationType, 0, false); + Preferences::instance()->setValue(EnableAutocreation, false, false); + if (!isCreationInHoldCellsEnabled) + Preferences::instance()->setValue(EnableCreationInHoldCells, false, + false); if (!multiple) DVGui::warning(QObject::tr( "Unable to create a blank drawing on the current column")); return; } + if (!toolHandle->getTool()->m_isFrameCreated) { + if (!multiple) + DVGui::warning(QObject::tr( + "Unable to replace the current drawing with a blank drawing")); + return; + } + + sl->setDirtyFlag(true); + TPalette *palette = sl->getPalette(); TFrameId frame = cell.getFrameId(); @@ -2036,7 +2098,9 @@ void TCellSelection::createBlankDrawing(int row, int col, bool multiple) { // Reset back to what these were if (!isAutoCreateEnabled) - Preferences::instance()->setValue(AutocreationType, 0, false); + Preferences::instance()->setValue(EnableAutocreation, false, false); + if (!isCreationInHoldCellsEnabled) + Preferences::instance()->setValue(EnableCreationInHoldCells, false, false); } //----------------------------------------------------------------------------- @@ -2064,99 +2128,150 @@ void TCellSelection::createBlankDrawings() { //----------------------------------------------------------------------------- -void TCellSelection::duplicateFrame() { - if (!Preferences::instance()->isSyncLevelRenumberWithXsheetEnabled()) { - DVGui::warning( - QObject::tr("Please enable \"Sync Level Strip Drawing Number Changes " - "with the XSheet\" preference option\nto use the duplicate " - "command in the xsheet / timeline.")); - return; - } - +void TCellSelection::duplicateFrame(int row, int col, bool multiple) { TXsheet *xsh = TApp::instance()->getCurrentXsheet()->getXsheet(); - // TApp::instance()->getCurrentScene()->getScene()->g - int r0, c0, r1, c1; - getSelectedCells(r0, c0, r1, c1); - // check for cases that won't work - if (c1 > c0) { - DVGui::error( - QObject::tr("Please select only one layer to duplicate a frame.")); + + if (col < 0) { + if (!multiple) + DVGui::warning(QObject::tr( + "There are no drawings in the camera column to duplicate")); return; } - if (r1 > r0) { - DVGui::error(QObject::tr("Please select only one frame to duplicate.")); + + TXshColumn *column = xsh->getColumn(col); + if (column && column->isLocked()) { + if (!multiple) DVGui::warning(QObject::tr("The current column is locked")); return; } - r0 = TTool::getApplication()->getCurrentFrame()->getFrame(); - c0 = TTool::getApplication()->getCurrentColumn()->getColumnIndex(); - - TXshCell cell = xsh->getCell(r0, c0); - TXshCell prevCell = xsh->getCell(r0 - 1, c0); - TXshCell nextCell = xsh->getCell(r0 + 1, c0); - TFrameId selectedFrameId = cell.getFrameId(); - TXshSimpleLevel *sl = cell.getSimpleLevel(); - bool usePreviousCell = false; - bool goForward = false; + TApp::instance()->getCurrentColumn()->setColumnIndex(col); + TApp::instance()->getCurrentFrame()->setCurrentFrame(row + 1); - // check if we use the current cell to duplicate or the previous cell - if (cell.isEmpty()) { - if (prevCell.isEmpty() || !(prevCell.m_level->getSimpleLevel())) { + TXshLevel *level = TApp::instance()->getCurrentLevel()->getLevel(); + if (!level && Preferences::instance()->isAutoCreateEnabled() && + Preferences::instance()->isAnimationSheetEnabled()) { + int r0, r1; + xsh->getCellRange(col, r0, r1); + for (int r = std::min(r1, row); r > r0; r--) { + TXshCell cell = xsh->getCell(r, col); + if (cell.isEmpty()) continue; + level = cell.m_level.getPointer(); + if (!level) continue; + break; + } + } + if (level) { + int levelType = level->getType(); + if (levelType == ZERARYFX_XSHLEVEL || levelType == PLT_XSHLEVEL || + levelType == SND_XSHLEVEL || levelType == SND_TXT_XSHLEVEL || + levelType == MESH_XSHLEVEL) { + if (!multiple) + DVGui::warning( + QObject::tr("Cannot duplicate a drawing in the current column")); + return; + } else if (level->getSimpleLevel() && + level->getSimpleLevel()->isReadOnly()) { + if (!multiple) + DVGui::warning(QObject::tr("The current level is not editable")); return; } - usePreviousCell = true; - selectedFrameId = prevCell.getFrameId(); - sl = prevCell.getSimpleLevel(); } + + TXshCell targetCell = xsh->getCell(row, col); + TXshCell prevCell = xsh->getCell(row - 1, col); + ; + + // check if we use the current cell to duplicate or the previous cell + if (!targetCell.isEmpty() && targetCell != prevCell) { + // Current cell has a drawing to duplicate and it's not a hold shift focus + // to next cell as if they selected that one to duplicate into + prevCell = targetCell; + TApp::instance()->getCurrentFrame()->setCurrentFrame(row + 2); + row++; + } + + if (prevCell.isEmpty() || !(prevCell.m_level->getSimpleLevel())) return; + + TXshSimpleLevel *sl = prevCell.getSimpleLevel(); if (!sl || sl->isSubsequence() || sl->isReadOnly()) return; - // check whether to change the next cell or replace the current cell if it is - // a hold from a previous frame - if (!usePreviousCell) { - // use the current cell - if (prevCell.m_level == cell.m_level && - prevCell.m_frameId == cell.m_frameId) { - // the current frame is a hold from a previous frame - // change this frame and any sequential frames part of the same hold - bool hold = true; - r1 = r0 + 1; - while (hold) { - TXshCell testCell = xsh->getCell(r1, c0); - if (testCell.m_frameId == cell.m_frameId && - testCell.m_level == cell.m_level) { - r1 += 1; - } else { - r1 -= 1; - hold = false; - } - } + ToolHandle *toolHandle = TApp::instance()->getCurrentTool(); - } else { - // This is not part of a hold, use the next cell. - // make sure we are not going to overwrite a non-empty cell - if (nextCell.isEmpty()) { - r0 += 1; - cell = nextCell; - goForward = true; - } else - return; - } - } else { - // cell = prevCell; + // If autocreate disabled, let's turn it on temporarily + bool isAutoCreateEnabled = Preferences::instance()->isAutoCreateEnabled(); + if (!isAutoCreateEnabled) + Preferences::instance()->setValue(EnableAutocreation, true, false); + // Enable inserting in the hold cells temporarily too. + bool isCreationInHoldCellsEnabled = + Preferences::instance()->isCreationInHoldCellsEnabled(); + if (!isCreationInHoldCellsEnabled) + Preferences::instance()->setValue(EnableCreationInHoldCells, true, false); + + TImage *img = toolHandle->getTool()->touchImage(); + if (!img) { + if (!isAutoCreateEnabled) + Preferences::instance()->setValue(EnableAutocreation, false, false); + if (!isCreationInHoldCellsEnabled) + Preferences::instance()->setValue(EnableCreationInHoldCells, false, + false); + if (!multiple) + DVGui::warning( + QObject::tr("Unable to duplicate a drawing on the current column")); + return; } + bool frameCreated = toolHandle->getTool()->m_isFrameCreated; + if (!frameCreated) { + if (!multiple) + DVGui::warning( + QObject::tr("Unable to replace the current or next drawing with a " + "duplicate drawing")); + return; + } + + targetCell = xsh->getCell(row, col); + TPalette *palette = sl->getPalette(); + TFrameId srcFrame = prevCell.getFrameId(); + TFrameId targetFrame = targetCell.getFrameId(); std::set frames; - frames.insert(selectedFrameId); - TUndoManager::manager()->beginBlock(); - FilmstripCmd::duplicate(sl, frames, true); - TXshCell newCell; - newCell.m_level = sl; - newCell.m_frameId = selectedFrameId + 1; - DuplicateInXSheetUndo *undo = - new DuplicateInXSheetUndo(r0, r1, c0, cell, newCell, goForward); + + FilmstripCmd::duplicateFrameWithoutUndo(sl, srcFrame, targetFrame); + + TApp::instance()->getCurrentLevel()->notifyLevelChange(); + + DuplicateDrawingUndo *undo = + new DuplicateDrawingUndo(sl, srcFrame, targetFrame); TUndoManager::manager()->add(undo); + + if (!isAutoCreateEnabled) + Preferences::instance()->setValue(EnableAutocreation, false, false); + if (!isCreationInHoldCellsEnabled) + Preferences::instance()->setValue(EnableCreationInHoldCells, false, false); +} + +//----------------------------------------------------------------------------- + +void TCellSelection::duplicateFrames() { + int col = TApp::instance()->getCurrentColumn()->getColumnIndex(); + int row = TApp::instance()->getCurrentFrame()->getFrameIndex(); + + int r0, c0, r1, c1; + getSelectedCells(r0, c0, r1, c1); + + bool multiple = (r1 - r0 > 1) || (c1 - c0 > 1); + + TUndoManager::manager()->beginBlock(); + for (int c = c0; c <= c1; c++) { + for (int r = r0; r <= r1; r++) { + duplicateFrame(r, c, multiple); + } + } TUndoManager::manager()->endBlock(); - undo->redo(); + + if (multiple) { + TApp::instance()->getCurrentColumn()->setColumnIndex(col); + TApp::instance()->getCurrentFrame()->setCurrentFrame(row + 1); + } } //----------------------------------------------------------------------------- diff --git a/toonz/sources/toonz/cellselection.h b/toonz/sources/toonz/cellselection.h index 0c7c5ee..cf002db 100644 --- a/toonz/sources/toonz/cellselection.h +++ b/toonz/sources/toonz/cellselection.h @@ -92,6 +92,10 @@ public: void setKeyframes(); void pasteKeyframesInto(); + void shiftKeyframes(int direction); + void shiftKeyframesUp() { shiftKeyframes(-1); } + void shiftKeyframesDown() { shiftKeyframes(1); } + void cloneLevel(); void insertCells(); @@ -109,7 +113,8 @@ public: void convertVectortoVector(); void reframeWithEmptyInbetweens(); - void duplicateFrame(); + void duplicateFrame(int row, int col, bool multiple); + void duplicateFrames(); void renameCells(TXshCell &cell); // rename cells for each columns with correspondent item in the list diff --git a/toonz/sources/toonz/cellselectioncommand.cpp b/toonz/sources/toonz/cellselectioncommand.cpp index 7a94a49..f22f16a 100644 --- a/toonz/sources/toonz/cellselectioncommand.cpp +++ b/toonz/sources/toonz/cellselectioncommand.cpp @@ -1,6 +1,9 @@ #include #include "cellselection.h" +#include "cellkeyframeselection.h" +#include "keyframeselection.h" +#include "keyframedata.h" // Tnz6 includes #include "tapp.h" @@ -1676,3 +1679,47 @@ void TCellSelection::cloneLevel() { if (undo->redo(), undo->m_ok) TUndoManager::manager()->add(undo.release()); } + +//============================================================================= + +void TCellSelection::shiftKeyframes(int direction) { + if (isEmpty() || areAllColSelectedLocked()) return; + + int shift = m_range.getRowCount() * direction; + if (!shift) return; + + TXsheetHandle *xsheet = TApp::instance()->getCurrentXsheet(); + TXsheet *xsh = xsheet->getXsheet(); + TCellKeyframeSelection *cellKeyframeSelection = new TCellKeyframeSelection( + new TCellSelection(), new TKeyframeSelection()); + + cellKeyframeSelection->setXsheetHandle(xsheet); + + TUndoManager::manager()->beginBlock(); + for (int col = m_range.m_c0; col <= m_range.m_c1; col++) { + TXshColumn *column = xsh->getColumn(col); + if (!column || column->isLocked()) continue; + + TStageObjectId colId = + col < 0 ? TStageObjectId::ColumnId(xsh->getCameraColumnIndex()) + : TStageObjectId::ColumnId(col); + TStageObject *colObj = xsh->getStageObject(colId); + TStageObject::KeyframeMap keyframes; + colObj->getKeyframes(keyframes); + if (!keyframes.size()) continue; + int row = m_range.m_r0; + for (TStageObject::KeyframeMap::iterator it = keyframes.begin(); + it != keyframes.end(); it++) { + if (it->first < m_range.m_r0) continue; + row = it->first; + cellKeyframeSelection->selectCellsKeyframes(row, col, + xsh->getFrameCount(), col); + cellKeyframeSelection->getKeyframeSelection()->shiftKeyframes( + row, row + shift, col, col); + break; + } + } + TUndoManager::manager()->endBlock(); + + delete cellKeyframeSelection; +} diff --git a/toonz/sources/toonz/dvitemview.cpp b/toonz/sources/toonz/dvitemview.cpp index e5c7240..c5c0b96 100644 --- a/toonz/sources/toonz/dvitemview.cpp +++ b/toonz/sources/toonz/dvitemview.cpp @@ -1301,6 +1301,7 @@ void DvItemViewerPanel::mouseReleaseEvent(QMouseEvent *) {} void DvItemViewerPanel::mouseDoubleClickEvent(QMouseEvent *event) { int index = pos2index(event->pos()); if (index < 0 || index >= getItemCount()) return; + if (m_viewer) m_viewer->notifyDoubleClick(index); if (!getModel()->canRenameItem(index)) return; QRect captionRect = getCaptionRect(index); if (!captionRect.contains(event->pos())) return; @@ -1941,4 +1942,4 @@ void DvItemViewerButtonBar::onPreferenceChanged(const QString &prefName) { addAction(refreshAct); addSeparator(); } -} \ No newline at end of file +} diff --git a/toonz/sources/toonz/dvitemview.h b/toonz/sources/toonz/dvitemview.h index 6ce4dcb..c3bbb36 100644 --- a/toonz/sources/toonz/dvitemview.h +++ b/toonz/sources/toonz/dvitemview.h @@ -412,6 +412,10 @@ public: emit clickedItem(index); emit selectedItems(m_panel->getSelectedIndices()); } + void notifyDoubleClick(int index) { + emit doubleClickedItem(index); + emit selectedItems(m_panel->getSelectedIndices()); + } void enableGlobalSelection(bool enabled) { m_panel->enableGlobalSelection(enabled); @@ -425,6 +429,7 @@ protected: signals: void clickedItem(int index); + void doubleClickedItem(int index); void selectedItems(const std::set &indexes); }; diff --git a/toonz/sources/toonz/filebrowser.cpp b/toonz/sources/toonz/filebrowser.cpp index edcc53a..a5efd7a 100644 --- a/toonz/sources/toonz/filebrowser.cpp +++ b/toonz/sources/toonz/filebrowser.cpp @@ -240,6 +240,8 @@ FileBrowser::FileBrowser(QWidget *parent, Qt::WFlags flags, bool noContextMenu, ret = ret && connect(m_itemViewer, SIGNAL(clickedItem(int)), this, SLOT(onClickedItem(int))); + ret = ret && connect(m_itemViewer, SIGNAL(doubleClickedItem(int)), this, + SLOT(onDoubleClickedItem(int))); ret = ret && connect(m_itemViewer, SIGNAL(selectedItems(const std::set &)), this, SLOT(onSelectedItems(const std::set &))); @@ -297,7 +299,7 @@ FileBrowser::~FileBrowser() {} //----------------------------------------------------------------------------- /*! when the m_folderName is edited, move the current folder accordingly -*/ + */ void FileBrowser::onFolderEdited() { TFilePath inputPath(m_folderName->text().toStdWString()); QModelIndex index = DvDirModel::instance()->getIndexByPath(inputPath); @@ -397,18 +399,18 @@ void FileBrowser::onFwdButtonPushed() { //----------------------------------------------------------------------------- /*! clear the history when the tree date is replaced -*/ + */ void FileBrowser::clearHistory() { int size = m_indexHistoryList.size(); // leave the last item - for (int i = 1; i < size; i++) m_indexHistoryList.removeLast(); + for (int i = 1; i < size; i++) m_indexHistoryList.removeLast(); m_currentPosition = 0; refreshHistoryButtons(); } //----------------------------------------------------------------------------- /*! update the current folder when changes detected from QFileSystemWatcher -*/ + */ void FileBrowser::onFileSystemChanged(const QString &folderPath) { if (folderPath != m_folder.getQString()) return; // changes may create/delete of folder, so update the DvDirModel @@ -819,7 +821,7 @@ void FileBrowser::setHistoryDay(std::string dayDateString) { //----------------------------------------------------------------------------- /*! for all items in the folder, retrieve the file names(m_name) from the * paths(m_path) -*/ + */ void FileBrowser::refreshData() { std::vector::iterator it; for (it = m_items.begin(); it != m_items.end(); ++it) { @@ -1155,7 +1157,7 @@ QMenu *FileBrowser::getContextMenu(QWidget *parent, int index) { for (i = 0; i < (int)files.size(); i++) { TFileType::Type type = TFileType::getInfo(files[i]); if (areResources && !TFileType::isResource(type)) areResources = false; - if (!areScenes && TFileType::isScene(type)) areScenes = true; + if (!areScenes && TFileType::isScene(type)) areScenes = true; } bool areFullcolor = true; @@ -1176,7 +1178,7 @@ QMenu *FileBrowser::getContextMenu(QWidget *parent, int index) { if (clickedFile != TFilePath() && clickedFile.getType() == "tnz") title = tr("Load As Sub-xsheet"); else - title = tr("Load"); + title = tr("Load"); QAction *action = new QAction(title, menu); ret = ret && connect(action, SIGNAL(triggered()), this, SLOT(loadResources())); @@ -1701,7 +1703,7 @@ namespace { bool parsePathName(const QString &fullpath, QString &parentPath, QString &name, QString &format) { - int index = fullpath.lastIndexOf('\\'); + int index = fullpath.lastIndexOf('\\'); if (index == -1) index = fullpath.lastIndexOf('/'); QString filename; @@ -2067,14 +2069,17 @@ void FileBrowser::convertToPaintedTlv() { //----------------------------------------------------------------------------- void FileBrowser::onSelectedItems(const std::set &indexes) { - if (indexes.empty()) return; - std::set filePaths; std::set::const_iterator it; // pass the frameId list for reuse std::list> frameIDs; + if (indexes.empty()) { // inform selection is released + emit filePathsSelected(filePaths, frameIDs); + return; + } + for (it = indexes.begin(); it != indexes.end(); ++it) { filePaths.insert(m_items[*it].m_path); frameIDs.insert(frameIDs.begin(), m_items[*it].m_frameIds); @@ -2102,6 +2107,22 @@ void FileBrowser::onClickedItem(int index) { //----------------------------------------------------------------------------- +void FileBrowser::onDoubleClickedItem(int index) { + // TODO: Avoid duplicate code with onClickedItem(). + if (0 <= index && index < (int)m_items.size()) { + // if the folder is clicked, then move the current folder + TFilePath fp = m_items[index].m_path; + if (m_items[index].m_isFolder) { + setFolder(fp, true); + QModelIndex index = m_folderTreeView->currentIndex(); + if (index.isValid()) m_folderTreeView->scrollTo(index); + } else + emit filePathDoubleClicked(fp); + } +} + +//----------------------------------------------------------------------------- + void FileBrowser::refreshFolder(const TFilePath &folderPath) { std::set::iterator it; for (it = activeBrowsers.begin(); it != activeBrowsers.end(); ++it) { @@ -2282,6 +2303,22 @@ void FileBrowser::enableGlobalSelection(bool enabled) { void FileBrowser::selectNone() { m_itemViewer->selectNone(); } +//----------------------------------------------------------------------------- + +void FileBrowser::enableDoubleClickToOpenScenes() { + // perhaps this should disconnect existing signal handlers first + connect(this, SIGNAL(filePathDoubleClicked(const TFilePath &)), + this, SLOT(tryToOpenScene(const TFilePath &))); +} + +//----------------------------------------------------------------------------- + +void FileBrowser::tryToOpenScene(const TFilePath &filePath) { + if (filePath.getType() == "tnz") { + IoCmd::loadScene(filePath); + } +} + //============================================================================= // FCData methods //----------------------------------------------------------------------------- diff --git a/toonz/sources/toonz/filebrowser.h b/toonz/sources/toonz/filebrowser.h index 1ff501b..b36d838 100644 --- a/toonz/sources/toonz/filebrowser.h +++ b/toonz/sources/toonz/filebrowser.h @@ -124,6 +124,12 @@ types to be displayed in the file browser. QSplitter *getMainSplitter() const { return m_mainSplitter; } + // Enable double-click to open a scene. + // This is not always desirable (e.g. if a user double-clicks on a file in + // a "Save As" dialog, they expect the file will be saved to, not opened). + // So it is disabled by default. + void enableDoubleClickToOpenScenes(); + protected: int findIndexWithPath(TFilePath path); void getExpandedFolders(DvDirModelNode *node, @@ -159,6 +165,7 @@ protected slots: const QModelIndex &bottomRight); void loadResources(); void onClickedItem(int index); + void onDoubleClickedItem(int index); void onSelectedItems(const std::set &indexes); void folderUp(); void newFolder(); @@ -197,9 +204,13 @@ protected slots: void onFileSystemChanged(const QString &folderPath); + // If filePath is a valid scene file, open it. Otherwise do nothing. + void tryToOpenScene(const TFilePath &filePath); + signals: void filePathClicked(const TFilePath &); + void filePathDoubleClicked(const TFilePath &); // reuse the list of TFrameId in order to skip loadInfo() when loading the // level with sequencial frames. void filePathsSelected(const std::set &, diff --git a/toonz/sources/toonz/filebrowserpopup.cpp b/toonz/sources/toonz/filebrowserpopup.cpp index 8b4f296..9e127c7 100644 --- a/toonz/sources/toonz/filebrowserpopup.cpp +++ b/toonz/sources/toonz/filebrowserpopup.cpp @@ -44,6 +44,7 @@ #include "toonz/tframehandle.h" #include "toonz/levelset.h" #include "toonz/palettecmd.h" +#include "toonz/stage.h" // TnzCore includes #include "tsystem.h" @@ -270,7 +271,7 @@ void FileBrowserPopup::onOkPressed() { //----------------------------------------------------------------------------- /*! process without closing the browser -*/ + */ void FileBrowserPopup::onApplyPressed() { TFilePath folder = m_browser->getFolder(); std::set pathSet; @@ -325,14 +326,11 @@ void FileBrowserPopup::onFilePathClicked(const TFilePath &fp) { void FileBrowserPopup::onFilePathsSelected( const std::set &paths, const std::list> &fIds) { - if (paths.empty()) return; - - const TFilePath &fp = *paths.begin(); - m_selectedPaths = paths; m_currentFIdsSet = fIds; if (paths.size() == 1) { + const TFilePath &fp = *paths.begin(); QString text; if (!m_isDirectoryOnly) text = QString::fromStdWString(fp.getLevelNameW()); @@ -346,6 +344,12 @@ void FileBrowserPopup::onFilePathsSelected( //----------------------------------------------------------------------------- +void FileBrowserPopup::onFilePathDoubleClicked(const TFilePath &) { + // do nothing by default +} + +//----------------------------------------------------------------------------- + void FileBrowserPopup::setOkText(const QString &text) { m_okButton->setText(text); } @@ -492,9 +496,13 @@ TFilePath GenericSaveFilePopup::getPath() { LoadScenePopup::LoadScenePopup() : FileBrowserPopup(tr("Load Scene")) { setOkText(tr("Load")); addFilterType("tnz"); + addFilterType("xdts"); // set the initial current path according to the current module setInitialFolderByCurrentRoom(); + + connect(m_browser, SIGNAL(filePathDoubleClicked(const TFilePath &)), this, + SLOT(onFilePathDoubleClicked(const TFilePath &))); } bool LoadScenePopup::execute() { @@ -502,7 +510,7 @@ bool LoadScenePopup::execute() { const TFilePath &fp = *m_selectedPaths.begin(); - if (fp.getType() != "tnz") { + if (fp.getType() != "tnz" && fp.getType() != "xdts") { DVGui::error(toQString(fp) + tr(" is not a scene file.")); return false; } @@ -535,6 +543,11 @@ void LoadScenePopup::showEvent(QShowEvent *e) { FileBrowserPopup::showEvent(e); } +void LoadScenePopup::onFilePathDoubleClicked(const TFilePath &path) { + Q_UNUSED(path); + onOkPressed(); +} + //============================================================================= // LoadSubScenePopup @@ -632,82 +645,90 @@ void SaveSubSceneAsPopup::initFolder() { //============================================================================= // LoadLevelPopup +namespace { +QPushButton *createShowButton(QWidget *parent) { + QPushButton *button = new QPushButton(parent); + button->setObjectName("LoadLevelShowButton"); + button->setFixedSize(15, 15); + button->setCheckable(true); + button->setChecked(false); + button->setAutoDefault(false); + return button; +} +} // namespace LoadLevelPopup::LoadLevelPopup() : FileBrowserPopup(tr("Load Level"), Options(MULTISELECTION | WITH_APPLY_BUTTON), "", - new QFrame(0)) { + new QWidget(0)) { setModal(false); setOkText(tr("Load")); - QFrame *optionFrame = (QFrame *)m_customWidget; + QWidget *optionWidget = (QWidget *)m_customWidget; // choose tlv caching behavior QLabel *cacheBehaviorLabel = new QLabel(tr("TLV Caching Behavior"), this); m_loadTlvBehaviorComboBox = new QComboBox(this); //----Load Subsequence Level - QPushButton *showSubsequenceButton = new QPushButton("", this); + QPushButton *showSubsequenceButton = createShowButton(this); QLabel *subsequenceLabel = new QLabel(tr("Load Subsequence Level"), this); m_subsequenceFrame = new QFrame(this); - m_fromFrame = new DVGui::LineEdit(this); - m_toFrame = new DVGui::LineEdit(this); + m_fromFrame = new DVGui::IntLineEdit(this, 1, 1); + m_toFrame = new DVGui::IntLineEdit(this, 1, 1); //----Arrangement in Xsheet - QPushButton *showArrangementButton = new QPushButton("", this); - QLabel *arrangementLabel = new QLabel(tr("Arrangement in Xsheet"), this); - m_arrangementFrame = new QFrame(this); - m_xFrom = new DVGui::LineEdit(this); - m_xTo = new DVGui::LineEdit(this); - m_stepCombo = new QComboBox(this); - m_incCombo = new QComboBox(this); - m_levelName = new DVGui::LineEdit(this); - m_posFrom = new DVGui::LineEdit(this); - m_posTo = new DVGui::LineEdit(this); + m_arrLvlPropWidget = new QWidget(this); + QPushButton *showArrangementButton = createShowButton(this); + QLabel *arrangementLabel = + new QLabel(tr("Level Settings & Arrangement in Xsheet"), this); + m_arrangementFrame = new QFrame(this); + m_xFrom = new DVGui::IntLineEdit(this, 1, 1); + m_xTo = new DVGui::IntLineEdit(this, 1, 1); + m_stepCombo = new QComboBox(this); + m_incCombo = new QComboBox(this); + m_posFrom = new DVGui::IntLineEdit(this, 1, 1); + m_posTo = new DVGui::IntLineEdit(this, 1, 1); + + //----Level Properties + m_levelPropertiesFrame = new QFrame(this); + m_levelName = new DVGui::LineEdit(this); + m_dpiWidget = new QWidget(this); + m_dpiPolicy = new QComboBox(this); + m_dpi = new DVGui::DoubleLineEdit(this); + m_subsampling = new DVGui::IntLineEdit(this, 1, 1); + m_antialias = new DVGui::IntLineEdit(this, 10, 0, 100); + m_premultiply = new DVGui::CheckBox(tr("Premultiply"), this); + m_whiteTransp = new DVGui::CheckBox(tr("White As Transparent"), this); m_notExistLabel = new QLabel(tr("(FILE DOES NOT EXIST)")); //---- - QStringList behaviorList; - behaviorList << QString(tr("On Demand")) << QString(tr("All Icons")) - << QString(tr("All Icons & Images")); - m_loadTlvBehaviorComboBox->addItems(behaviorList); + m_loadTlvBehaviorComboBox->addItem(tr("On Demand"), + IoCmd::LoadResourceArguments::ON_DEMAND); + m_loadTlvBehaviorComboBox->addItem(tr("All Icons"), + IoCmd::LoadResourceArguments::ALL_ICONS); + m_loadTlvBehaviorComboBox->addItem( + tr("All Icons & Images"), + IoCmd::LoadResourceArguments::ALL_ICONS_AND_IMAGES); // use the default value set in the preference m_loadTlvBehaviorComboBox->setCurrentIndex( - Preferences::instance()->getInitialLoadTlvCachingBehavior()); + m_loadTlvBehaviorComboBox->findData( + Preferences::instance()->getInitialLoadTlvCachingBehavior())); cacheBehaviorLabel->setObjectName("TitleTxtLabel"); - QIntValidator *validator = new QIntValidator(this); - validator->setBottom(1); - //----Load Subsequence Level - subsequenceLabel->setObjectName("TitleTxtLabel"); - showSubsequenceButton->setObjectName("LoadLevelShowButton"); - showSubsequenceButton->setFixedSize(15, 15); - showSubsequenceButton->setCheckable(true); - showSubsequenceButton->setChecked(false); - - showSubsequenceButton->setAutoDefault(false); - m_subsequenceFrame->setObjectName("LoadLevelFrame"); + subsequenceLabel->setObjectName("TitleTxtLabel"); m_subsequenceFrame->hide(); m_fromFrame->setMaximumWidth(50); m_toFrame->setMaximumWidth(50); - m_fromFrame->setValidator(validator); - m_toFrame->setValidator(validator); //----Arrangement in Xsheet - arrangementLabel->setObjectName("TitleTxtLabel"); - showArrangementButton->setObjectName("LoadLevelShowButton"); - showArrangementButton->setFixedSize(15, 15); - showArrangementButton->setCheckable(true); - showArrangementButton->setChecked(false); - - showArrangementButton->setAutoDefault(false); - m_arrangementFrame->setObjectName("LoadLevelFrame"); - m_arrangementFrame->hide(); - m_arrangementFrame->setMaximumWidth(356); + m_levelPropertiesFrame->setObjectName("LoadLevelFrame"); + arrangementLabel->setObjectName("TitleTxtLabel"); + m_arrLvlPropWidget->hide(); QStringList sList; sList << QString("Auto") << QString("1") << QString("2") << QString("3") @@ -716,23 +737,37 @@ LoadLevelPopup::LoadLevelPopup() m_stepCombo->addItems(sList); m_incCombo->addItems(sList); - m_xFrom->setValidator(validator); - m_xTo->setValidator(validator); - m_posFrom->setValidator(validator); - m_posTo->setValidator(validator); + //----Level Properties + m_dpiPolicy->addItem(QObject::tr("Image DPI"), LevelOptions::DP_ImageDpi); + m_dpiPolicy->addItem(QObject::tr("Custom DPI"), LevelOptions::DP_CustomDpi); + m_dpi->setRange(1, (std::numeric_limits::max)()); + m_dpi->setFixedWidth(54); + + // initialize with the default value + LevelOptions options; + setLevelProperties(options); //"FILE DOES NOT EXIST" lavel m_notExistLabel->setObjectName("FileDoesNotExistLabel"); m_notExistLabel->hide(); //----layout - QVBoxLayout *mainLayout = new QVBoxLayout(); - mainLayout->setMargin(5); - mainLayout->setSpacing(3); + auto createVBoxLayout = [](int margin, int spacing) { + QVBoxLayout *layout = new QVBoxLayout(); + layout->setMargin(margin); + layout->setSpacing(spacing); + return layout; + }; + auto createHBoxLayout = [](int margin, int spacing) { + QHBoxLayout *layout = new QHBoxLayout(); + layout->setMargin(margin); + layout->setSpacing(spacing); + return layout; + }; + + QVBoxLayout *mainLayout = createVBoxLayout(5, 3); { - QHBoxLayout *cacheLay = new QHBoxLayout(); - cacheLay->setMargin(0); - cacheLay->setSpacing(5); + QHBoxLayout *cacheLay = createHBoxLayout(0, 5); { cacheLay->addStretch(1); cacheLay->addWidget(cacheBehaviorLabel, 0); @@ -741,9 +776,8 @@ LoadLevelPopup::LoadLevelPopup() mainLayout->addLayout(cacheLay, 0); //----Load Subsequence Level - QHBoxLayout *subsequenceHeadLay = new QHBoxLayout(); - subsequenceHeadLay->setMargin(0); - subsequenceHeadLay->setSpacing(5); + + QHBoxLayout *subsequenceHeadLay = createHBoxLayout(0, 5); { QFontMetrics metrics(font()); subsequenceHeadLay->addSpacing(metrics.width("File name:") + 3); @@ -755,30 +789,20 @@ LoadLevelPopup::LoadLevelPopup() } mainLayout->addLayout(subsequenceHeadLay, 0); - QHBoxLayout *tmpLay = new QHBoxLayout(); - tmpLay->setMargin(0); - tmpLay->setSpacing(0); + QHBoxLayout *subsequenceLay = createHBoxLayout(5, 5); { - tmpLay->addStretch(1); - - QHBoxLayout *subsequenceLay = new QHBoxLayout(); - subsequenceLay->setMargin(5); - subsequenceLay->setSpacing(5); - { - subsequenceLay->addWidget(new QLabel(tr("From:"), this), 0); - subsequenceLay->addWidget(m_fromFrame, 0); - subsequenceLay->addWidget(new QLabel(tr(" To:"), this), 0); - subsequenceLay->addWidget(m_toFrame, 0); - } - m_subsequenceFrame->setLayout(subsequenceLay); - tmpLay->addWidget(m_subsequenceFrame, 0); + subsequenceLay->addWidget(new QLabel(tr("From:"), this), 0); + subsequenceLay->addWidget(m_fromFrame, 0); + subsequenceLay->addWidget(new QLabel(tr(" To:"), this), 0); + subsequenceLay->addWidget(m_toFrame, 0); } - mainLayout->addLayout(tmpLay, 0); + m_subsequenceFrame->setLayout(subsequenceLay); + mainLayout->addWidget(m_subsequenceFrame, 0, + Qt::AlignRight | Qt::AlignVCenter); //----Arrangement in Xsheet - QHBoxLayout *arrangementHeadLay = new QHBoxLayout(); - arrangementHeadLay->setMargin(0); - arrangementHeadLay->setSpacing(3); + + QHBoxLayout *arrangementHeadLay = createHBoxLayout(0, 3); { arrangementHeadLay->addWidget(arrangementLabel, 1, Qt::AlignRight | Qt::AlignVCenter); @@ -786,43 +810,75 @@ LoadLevelPopup::LoadLevelPopup() } mainLayout->addLayout(arrangementHeadLay); - QVBoxLayout *arrangementLay = new QVBoxLayout(); - arrangementLay->setMargin(5); - arrangementLay->setSpacing(5); + QHBoxLayout *bottomLay = createHBoxLayout(0, 10); { - QHBoxLayout *upLay = new QHBoxLayout(); - upLay->setMargin(0); - upLay->setSpacing(5); + QGridLayout *levelLay = new QGridLayout(); + levelLay->setMargin(5); + levelLay->setSpacing(5); { - upLay->addWidget(new QLabel(tr("From:"), this), 0); - upLay->addWidget(m_xFrom, 1); - upLay->addWidget(new QLabel(tr(" To:"), this), 0); - upLay->addWidget(m_xTo, 1); - upLay->addWidget(new QLabel(tr(" Step:"), this), 0); - upLay->addWidget(m_stepCombo, 1); - upLay->addWidget(new QLabel(tr(" Inc:"), this), 0); - upLay->addWidget(m_incCombo, 1); + levelLay->addWidget(new QLabel(tr("Level Name:"), this), 0, 0, + Qt::AlignRight | Qt::AlignVCenter); + levelLay->addWidget(m_levelName, 0, 1); + QHBoxLayout *dpiLay = createHBoxLayout(0, 5); + { + dpiLay->addSpacing(10); + dpiLay->addWidget(new QLabel(tr("DPI:"), this), 0, + Qt::AlignRight | Qt::AlignVCenter); + dpiLay->addWidget(m_dpiPolicy, 0); + dpiLay->addWidget(m_dpi, 1); + } + m_dpiWidget->setLayout(dpiLay); + levelLay->addWidget(m_dpiWidget, 0, 2, 1, 3); + + levelLay->addWidget(m_premultiply, 1, 0, 1, 2); + levelLay->addWidget(m_whiteTransp, 2, 0, 1, 2); + + // levelLay->addWidget(m_doAntialias, 1, 3, 1, 2); + levelLay->addWidget(new QLabel(tr("Antialias Softness:"), this), 1, 2, + 1, 2, Qt::AlignRight | Qt::AlignVCenter); + levelLay->addWidget(m_antialias, 1, 4); + levelLay->addWidget(new QLabel(tr("Subsampling:"), this), 2, 2, 1, 2, + Qt::AlignRight | Qt::AlignVCenter); + levelLay->addWidget(m_subsampling, 2, 4); } - arrangementLay->addLayout(upLay); - - QHBoxLayout *bottomLay = new QHBoxLayout(); - bottomLay->setMargin(0); - bottomLay->setSpacing(5); + levelLay->setColumnStretch(1, 1); + levelLay->setColumnStretch(4, 1); + m_levelPropertiesFrame->setLayout(levelLay); + bottomLay->addWidget(m_levelPropertiesFrame, 0); + + QGridLayout *arrLay = new QGridLayout(); + arrLay->setMargin(5); + arrLay->setSpacing(5); { - bottomLay->addWidget(new QLabel(tr("Level Name:"), this), 0); - bottomLay->addWidget(m_levelName, 3); - bottomLay->addWidget(new QLabel(tr(" Frames:"), this), 0); - bottomLay->addWidget(m_posFrom, 1); - bottomLay->addWidget(new QLabel(tr("::"), this), 0); - bottomLay->addWidget(m_posTo, 1); + arrLay->addWidget(new QLabel(tr("From:"), this), 0, 0, + Qt::AlignRight | Qt::AlignVCenter); + arrLay->addWidget(m_xFrom, 0, 1); + arrLay->addWidget(new QLabel(tr(" To:"), this), 0, 2, + Qt::AlignRight | Qt::AlignVCenter); + arrLay->addWidget(m_xTo, 0, 3); + arrLay->addWidget(new QLabel(tr(" Step:"), this), 1, 0, + Qt::AlignRight | Qt::AlignVCenter); + arrLay->addWidget(m_stepCombo, 1, 1); + arrLay->addWidget(new QLabel(tr(" Inc:"), this), 1, 2, + Qt::AlignRight | Qt::AlignVCenter); + arrLay->addWidget(m_incCombo, 1, 3); + arrLay->addWidget(new QLabel(tr(" Frames:"), this), 2, 0, + Qt::AlignRight | Qt::AlignVCenter); + arrLay->addWidget(m_posFrom, 2, 1); + arrLay->addWidget(new QLabel(tr("::"), this), 2, 2, Qt::AlignCenter); + arrLay->addWidget(m_posTo, 2, 3); } - arrangementLay->addLayout(bottomLay); + arrLay->setColumnStretch(1, 1); + arrLay->setColumnStretch(3, 1); + m_arrangementFrame->setLayout(arrLay); + bottomLay->addWidget(m_arrangementFrame, 0); } - m_arrangementFrame->setLayout(arrangementLay); - mainLayout->addWidget(m_arrangementFrame, 0, + m_arrLvlPropWidget->setLayout(bottomLay); + + mainLayout->addWidget(m_arrLvlPropWidget, 0, Qt::AlignRight | Qt::AlignVCenter); } - optionFrame->setLayout(mainLayout); + optionWidget->setLayout(mainLayout); //----signal-slot connections //----Load Subsequence Level @@ -834,7 +890,7 @@ LoadLevelPopup::LoadLevelPopup() SLOT(onSubsequentFrameChanged())); //----Arrangement in Xsheet - connect(showArrangementButton, SIGNAL(toggled(bool)), m_arrangementFrame, + connect(showArrangementButton, SIGNAL(toggled(bool)), m_arrLvlPropWidget, SLOT(setVisible(bool))); connect(m_xFrom, SIGNAL(editingFinished()), SLOT(updatePosTo())); connect(m_xTo, SIGNAL(editingFinished()), SLOT(updatePosTo())); @@ -846,51 +902,53 @@ LoadLevelPopup::LoadLevelPopup() SLOT(onNameSetEditted())); connect(m_browser, SIGNAL(treeFolderChanged(const TFilePath &)), this, SLOT(onNameSetEditted())); + connect(m_browser, SIGNAL(filePathDoubleClicked(const TFilePath &)), this, + SLOT(onFilePathDoubleClicked(const TFilePath &))); + //----Level Properties + connect(m_dpiPolicy, SIGNAL(activated(int)), this, + SLOT(onDpiPolicyActivated())); + connect(m_premultiply, SIGNAL(clicked(bool)), this, + SLOT(onDoPremultiplyClicked())); + connect(m_whiteTransp, SIGNAL(clicked(bool)), this, + SLOT(onWhiteTranspClicked())); } //----------------------------------------------------------------------- void LoadLevelPopup::onNameSetEditted() { getCurrentPathSet().clear(); - TFilePath path = - m_browser->getFolder() + TFilePath(m_nameField->text().toStdString()); - getCurrentPathSet().insert(path); - getCurrentFIdsSet().clear(); // if nothing input if (m_nameField->text() == "") { - m_fromFrame->setText(""); - m_toFrame->setText(""); - m_subsequenceFrame->setEnabled(false); - - m_xFrom->setText("1"); - m_xTo->setText("1"); - - m_levelName->setText(""); - - updatePosTo(); - } - // if the path exists - else if (TSystem::doesExistFileOrLevel(path)) { m_notExistLabel->hide(); - updateBottomGUI(); - } else { - m_notExistLabel->show(); - - m_fromFrame->setText("1"); - m_toFrame->setText("1"); - m_subsequenceFrame->setEnabled(true); + } + // if the path exists + else { + TFilePath path = + m_browser->getFolder() + TFilePath(m_nameField->text().toStdString()); + getCurrentPathSet().insert(path); + if (TSystem::doesExistFileOrLevel(path)) { + m_notExistLabel->hide(); + updateBottomGUI(); + } else { + m_notExistLabel->show(); - m_xFrom->setText("1"); - m_xTo->setText("1"); + m_fromFrame->setText("1"); + m_toFrame->setText("1"); + m_subsequenceFrame->setEnabled(true); - m_levelName->setText(QString::fromStdString(path.getName())); + m_xFrom->setText("1"); + m_xTo->setText("1"); - m_arrangementFrame->setEnabled(true); + m_levelName->setText(QString::fromStdString(path.getName())); - updatePosTo(); + m_arrangementFrame->setEnabled(true); + m_levelName->setEnabled(true); + m_levelPropertiesFrame->setEnabled(true); + updatePosTo(); + } } update(); @@ -1030,7 +1088,7 @@ void LoadLevelPopup::updatePosTo() { } //----------------------------------------------------------------------- /*! if the from / to values in the subsequent box, update m_xFrom and m_xTo -*/ + */ void LoadLevelPopup::onSubsequentFrameChanged() { m_xFrom->setText(m_fromFrame->text()); m_xTo->setText(m_toFrame->text()); @@ -1044,17 +1102,25 @@ void LoadLevelPopup::showEvent(QShowEvent *e) { FileBrowserPopup::showEvent(e); + bool ret = true; TFrameHandle *fh = TApp::instance()->getCurrentFrame(); - connect(fh, SIGNAL(frameSwitched()), this, SLOT(onFrameSwitched())); - connect(fh, SIGNAL(frameTypeChanged()), this, SLOT(onFrameSwitched())); + ret = ret && + connect(fh, SIGNAL(frameSwitched()), this, SLOT(onFrameSwitched())); + ret = ret && + connect(fh, SIGNAL(frameTypeChanged()), this, SLOT(onFrameSwitched())); TSelectionHandle *sh = TApp::instance()->getCurrentSelection(); - connect(sh, SIGNAL(selectionChanged(TSelection *)), this, - SLOT(onSelectionChanged(TSelection *))); + ret = ret && connect(sh, SIGNAL(selectionChanged(TSelection *)), this, + SLOT(onSelectionChanged(TSelection *))); + ret = ret && connect(TApp::instance()->getCurrentScene(), + SIGNAL(preferenceChanged(const QString &)), this, + SLOT(onPreferenceChanged(const QString &))); + assert(ret); onFrameSwitched(); - onSelectionChanged(sh->getSelection()); + onPreferenceChanged(""); + onNameSetEditted(); // clear currentPathSet } //----------------------------------------------------------------------- @@ -1069,6 +1135,9 @@ void LoadLevelPopup::hideEvent(QHideEvent *e) { TSelectionHandle *sh = TApp::instance()->getCurrentSelection(); disconnect(sh, SIGNAL(selectionChanged(TSelection *)), this, SLOT(onSelectionChanged(TSelection *))); + disconnect(TApp::instance()->getCurrentScene(), + SIGNAL(preferenceChanged(const QString &)), this, + SLOT(onPreferenceChanged(const QString &))); } //----------------------------------------------------------------------- @@ -1125,12 +1194,12 @@ bool LoadLevelPopup::execute() { setLoadingLevelRange(firstFrameNumber, lastFrameNumber); } - int frameCount = m_posTo->text().toInt() - m_posFrom->text().toInt() + 1; - IoCmd::LoadResourceArguments args(fp); args.row0 = m_posFrom->text().toInt() - 1; + args.frameCount = m_posTo->text().toInt() - m_posFrom->text().toInt() + 1; + if ((int)getCurrentFIdsSet().size() != 0) args.frameIdsSet.push_back(*getCurrentFIdsSet().begin()); @@ -1145,21 +1214,29 @@ bool LoadLevelPopup::execute() { args.frameIdsSet.push_back(tmp_fids); } - int xFrom = m_xFrom->text().toInt(); - if (!xFrom) xFrom = -1; - int xTo = m_xTo->text().toInt(); - if (!xTo) xTo = -1; - - return 0 < IoCmd::loadResources( - args, - true, // updateRecentFile - 0, xFrom, xTo, m_levelName->text().toStdWString(), - m_stepCombo->currentIndex(), m_incCombo->currentIndex(), - frameCount, - !m_notExistLabel - ->isVisible(), // this flag is true if the level exists - (IoCmd::CacheTlvBehavior) - m_loadTlvBehaviorComboBox->currentIndex()); + int xFrom = m_xFrom->text().toInt(); + if (xFrom) args.xFrom = xFrom; + int xTo = m_xTo->text().toInt(); + if (xTo) args.xTo = xTo; + + args.levelName = m_levelName->text().toStdWString(); + args.step = m_stepCombo->currentIndex(); + args.inc = m_incCombo->currentIndex(); + args.doesFileActuallyExist = !m_notExistLabel->isVisible(); + args.cachingBehavior = IoCmd::LoadResourceArguments::CacheTlvBehavior( + m_loadTlvBehaviorComboBox->currentData().toInt()); + + if (m_arrLvlPropWidget->isVisible() && + m_levelPropertiesFrame->isEnabled()) { + for (IoCmd::LoadResourceArguments::ResourceData &rd : + args.resourceDatas) { + rd.m_options = LevelOptions(); + getLevelProperties(*rd.m_options); + } + } + + return 0 < IoCmd::loadResources(args, true, 0); + } else { std::set::const_iterator it; IoCmd::LoadResourceArguments args; @@ -1176,12 +1253,19 @@ bool LoadLevelPopup::execute() { args.frameIdsSet.insert(args.frameIdsSet.begin(), *fIdIt); } - return 0 < - IoCmd::loadResources(args, true, - 0, // setbeginEndUndoBlock - -1, -1, L"", -1, -1, -1, true, - (IoCmd::CacheTlvBehavior) - m_loadTlvBehaviorComboBox->currentIndex()); + args.cachingBehavior = IoCmd::LoadResourceArguments::CacheTlvBehavior( + m_loadTlvBehaviorComboBox->currentData().toInt()); + + if (m_arrLvlPropWidget->isVisible() && + m_levelPropertiesFrame->isEnabled()) { + for (IoCmd::LoadResourceArguments::ResourceData &rd : + args.resourceDatas) { + rd.m_options = LevelOptions(); + getLevelProperties(*rd.m_options); + } + } + + return 0 < IoCmd::loadResources(args, true, 0); } } @@ -1199,6 +1283,14 @@ void LoadLevelPopup::initFolder() { setFolder(fp); onFilePathsSelected(getCurrentPathSet(), getCurrentFIdsSet()); } + +//---------------------------------------------------------------------------- + +void LoadLevelPopup::onFilePathDoubleClicked(const TFilePath &path) { + Q_UNUSED(path); + onOkPressed(); +} + //---------------------------------------------------------------------------- void LoadLevelPopup::onFilePathsSelected( @@ -1212,9 +1304,7 @@ void LoadLevelPopup::onFilePathsSelected( //---------------------------------------------------------------------------- void LoadLevelPopup::updateBottomGUI() { - std::set paths = getCurrentPathSet(); - std::list> fIdsSet = getCurrentFIdsSet(); - if (paths.empty()) { + auto disableAll = [&]() { m_fromFrame->setText(""); m_toFrame->setText(""); m_subsequenceFrame->setEnabled(false); @@ -1224,17 +1314,18 @@ void LoadLevelPopup::updateBottomGUI() { m_levelName->setText(""); m_posTo->setText(""); m_arrangementFrame->setEnabled(false); - return; - } - if (paths.size() > 1) { - m_fromFrame->setText(""); - m_toFrame->setText(""); - m_subsequenceFrame->setEnabled(false); + m_levelPropertiesFrame->setEnabled(false); + }; - m_xTo->setText(""); - m_levelName->setText(""); - m_posTo->setText(""); - m_arrangementFrame->setEnabled(false); + std::set paths = getCurrentPathSet(); + std::list> fIdsSet = getCurrentFIdsSet(); + + if (paths.empty() || paths.size() > 1) { + disableAll(); + if (paths.size() > 1) { + m_levelName->setEnabled(false); + m_levelPropertiesFrame->setEnabled(true); + } return; } @@ -1245,15 +1336,7 @@ void LoadLevelPopup::updateBottomGUI() { // initialize if (fp.isEmpty() || ext == "") { - m_fromFrame->setText(""); - m_toFrame->setText(""); - m_subsequenceFrame->setEnabled(false); - - m_xFrom->setText(""); - m_xTo->setText(""); - m_levelName->setText(""); - m_posTo->setText(""); - m_arrangementFrame->setEnabled(false); + disableAll(); return; } else if (ext == "tpl") { QString str; @@ -1266,6 +1349,7 @@ void LoadLevelPopup::updateBottomGUI() { m_levelName->setText(QString::fromStdString(fp.getName())); m_posTo->setText(m_posFrom->text()); m_arrangementFrame->setEnabled(false); + m_levelPropertiesFrame->setEnabled(false); } else if (ext == "tnz") { ToonzScene scene; scene.setScenePath(fp); @@ -1281,6 +1365,7 @@ void LoadLevelPopup::updateBottomGUI() { m_stepCombo->setCurrentIndex(0); m_incCombo->setCurrentIndex(0); m_arrangementFrame->setEnabled(false); + m_levelPropertiesFrame->setEnabled(false); } else { TFrameId firstFrame; TFrameId lastFrame; @@ -1298,15 +1383,7 @@ void LoadLevelPopup::updateBottomGUI() { firstFrame = level->begin()->first; lastFrame = (--level->end())->first; } catch (...) { - m_fromFrame->setText(""); - m_toFrame->setText(""); - m_subsequenceFrame->setEnabled(false); - - m_xFrom->setText(""); - m_xTo->setText(""); - m_levelName->setText(""); - m_posTo->setText(""); - m_arrangementFrame->setEnabled(false); + disableAll(); return; } } @@ -1333,6 +1410,9 @@ void LoadLevelPopup::updateBottomGUI() { m_stepCombo->setCurrentIndex(1); m_arrangementFrame->setEnabled(true); + + m_levelName->setEnabled(true); + m_levelPropertiesFrame->setEnabled(true); } updatePosTo(); } @@ -1372,7 +1452,7 @@ QString LoadLevelPopup::getLevelNameWithoutSceneNumber(std::string orgName) { //---------------------------------------------------------------------------- /*! if the x-sheet cells are selected, load levels at the upper-left corner of * the selection -*/ + */ void LoadLevelPopup::onSelectionChanged(TSelection *selection) { TCellSelection *cellSelection = dynamic_cast(selection); @@ -1386,6 +1466,63 @@ void LoadLevelPopup::onSelectionChanged(TSelection *selection) { updatePosTo(); } +//---------------------------------------------------------------------------- + +void LoadLevelPopup::onPreferenceChanged(const QString &propertyName) { + if (!propertyName.isEmpty() && propertyName != "pixelsOnly") return; + bool pixelsMode = Preferences::instance()->getBoolValue(pixelsOnly); + m_dpiWidget->setHidden(pixelsMode); + if (pixelsMode) { + m_dpiPolicy->setCurrentIndex( + m_dpiPolicy->findData(LevelOptions::DP_ImageDpi)); + m_dpi->setValue(Stage::standardDpi); + m_dpi->setEnabled(false); + } +} + +//---------------------------------------------------------------------------- + +void LoadLevelPopup::setLevelProperties(LevelOptions &options) { + m_dpiPolicy->setCurrentIndex(m_dpiPolicy->findData(options.m_dpiPolicy)); + m_dpi->setValue(options.m_dpi); + m_subsampling->setValue(options.m_subsampling); + m_antialias->setValue(options.m_antialias); + m_whiteTransp->setChecked(options.m_whiteTransp); + m_premultiply->setChecked(options.m_premultiply); + onDpiPolicyActivated(); +} + +//---------------------------------------------------------------------------- + +void LoadLevelPopup::getLevelProperties(LevelOptions &options) { + options.m_dpiPolicy = + LevelOptions::DpiPolicy(m_dpiPolicy->currentData().toInt()); + options.m_dpi = m_dpi->getValue(); + options.m_subsampling = m_subsampling->getValue(); + options.m_antialias = m_antialias->getValue(); + options.m_whiteTransp = m_whiteTransp->isChecked(); + options.m_premultiply = m_premultiply->isChecked(); +} + +//---------------------------------------------------------------------------- + +void LoadLevelPopup::onDpiPolicyActivated() { + m_dpi->setEnabled(m_dpiPolicy->currentData().toInt() == + LevelOptions::DP_CustomDpi); +} + +//---------------------------------------------------------------------------- +// exclusive with the whiteTransp option +void LoadLevelPopup::onDoPremultiplyClicked() { + if (m_whiteTransp->isChecked()) m_whiteTransp->setChecked(false); +} + +//---------------------------------------------------------------------------- +// exclusive with the doPremultiply option +void LoadLevelPopup::onWhiteTranspClicked() { + if (m_premultiply->isChecked()) m_premultiply->setChecked(false); +} + //============================================================================= // SaveLevelAsPopup @@ -1430,7 +1567,7 @@ bool SaveLevelAsPopup::execute() { TXshSimpleLevel *sl = dynamic_cast( TApp::instance()->getCurrentLevel()->getLevel()); if (!sl) return false; - std::string ext = sl->getPath().getType(); + std::string ext = sl->getPath().getType(); if (fp.getType() == "") fp = fp.withType(ext); IoCmd::LoadResourceArguments args(fp); @@ -1904,7 +2041,7 @@ void LoadColorModelPopup::showEvent(QShowEvent *e) { //============================================================================= /*! replace the parent folder path of the levels in the selected cells -*/ + */ ReplaceParentDirectoryPopup::ReplaceParentDirectoryPopup() : FileBrowserPopup(tr("Replace Parent Directory")) { @@ -2086,7 +2223,7 @@ void BrowserPopup::initFolder(TFilePath path) { } if (!TFileStatus(path).doesExist()) { ToonzScene *scene = TApp::instance()->getCurrentScene()->getScene(); - if (scene) path = scene->decodeFilePath(path); + if (scene) path = scene->decodeFilePath(path); } if (!path.getType().empty()) path = path.getParentDir(); @@ -2146,8 +2283,8 @@ void BrowserPopupController::openPopup(QStringList filters, QString BrowserPopupController::getPath(bool codePath) { m_isExecute = false; if (!m_browserPopup) return QString(); - ToonzScene *scene = TApp::instance()->getCurrentScene()->getScene(); - TFilePath fp = m_browserPopup->getPath(); + ToonzScene *scene = TApp::instance()->getCurrentScene()->getScene(); + TFilePath fp = m_browserPopup->getPath(); if (scene && codePath) fp = scene->codeFilePath(fp); std::cout << ::to_string(fp) << std::endl; return toQString(fp); @@ -2177,4 +2314,4 @@ OpenPopupCommandHandler importMagpieFilePopupCommand( OpenReplaceFilePopupHandler replaceLevelPopupCommand( MI_ReplaceLevel); OpenReplaceFilePopupHandler - replaceParentFolderPopupCommand(MI_ReplaceParentDirectory); \ No newline at end of file + replaceParentFolderPopupCommand(MI_ReplaceParentDirectory); diff --git a/toonz/sources/toonz/filebrowserpopup.h b/toonz/sources/toonz/filebrowserpopup.h index a74d202..cd97d9e 100644 --- a/toonz/sources/toonz/filebrowserpopup.h +++ b/toonz/sources/toonz/filebrowserpopup.h @@ -25,6 +25,7 @@ class FileBrowser; class TDoubleParam; class TCamera; class TPropertyGroup; +class LevelOptions; class QShowEvent; class QFrame; class QPushButton; @@ -111,7 +112,7 @@ protected: else return *m_selectedPaths.begin(); } - std::set getCurrentPathSet() { return m_selectedPaths; } + std::set &getCurrentPathSet() { return m_selectedPaths; } std::vector getCurrentFIds() { std::vector tmp; @@ -121,7 +122,7 @@ protected: else return *m_currentFIdsSet.begin(); } - std::list> getCurrentFIdsSet() { + std::list> &getCurrentFIdsSet() { return m_currentFIdsSet; } @@ -144,6 +145,7 @@ protected slots: virtual void onFilePathsSelected( const std::set &paths, const std::list> &fIds); + virtual void onFilePathDoubleClicked(const TFilePath &); // utility function public: @@ -209,6 +211,9 @@ public: protected: void showEvent(QShowEvent *) override; + +protected slots: + void onFilePathDoubleClicked(const TFilePath &path); }; //----------------------------------------------------------------------------- @@ -256,17 +261,21 @@ class LoadLevelPopup final : public FileBrowserPopup { Q_OBJECT QFrame *m_subsequenceFrame; - DVGui::LineEdit *m_fromFrame; - DVGui::LineEdit *m_toFrame; + DVGui::IntLineEdit *m_fromFrame, *m_toFrame; + QWidget *m_arrLvlPropWidget; QFrame *m_arrangementFrame; - DVGui::LineEdit *m_xFrom; - DVGui::LineEdit *m_xTo; - QComboBox *m_stepCombo; - QComboBox *m_incCombo; + DVGui::IntLineEdit *m_xFrom, *m_xTo; + QComboBox *m_stepCombo, *m_incCombo; + DVGui::IntLineEdit *m_posFrom, *m_posTo; + + QFrame *m_levelPropertiesFrame; DVGui::LineEdit *m_levelName; - DVGui::LineEdit *m_posFrom; - DVGui::LineEdit *m_posTo; + QWidget *m_dpiWidget; // hide on pixels only mode + QComboBox *m_dpiPolicy; + DVGui::DoubleLineEdit *m_dpi; + DVGui::IntLineEdit *m_subsampling, *m_antialias; + DVGui::CheckBox *m_premultiply, *m_whiteTransp; // , *m_doAntialias; QLabel *m_notExistLabel; QComboBox *m_loadTlvBehaviorComboBox; @@ -282,7 +291,7 @@ protected: void showEvent(QShowEvent *) override; void hideEvent(QHideEvent *) override; -public slots: +protected slots: void onFilePathsSelected( const std::set &paths, const std::list> &fIds) override; @@ -299,12 +308,23 @@ public slots: // the selection void onSelectionChanged(TSelection *selection); + void onFilePathDoubleClicked(const TFilePath &path); + + void onPreferenceChanged(const QString &); + + void onDpiPolicyActivated(); + void onDoPremultiplyClicked(); + void onWhiteTranspClicked(); + private: // update the fields acording to the current Path void updateBottomGUI(void); // if some option in the preferences is selected, load the level with removing // six letters of the scene name from the level name QString getLevelNameWithoutSceneNumber(std::string orgName); + + void setLevelProperties(LevelOptions &options); + void getLevelProperties(LevelOptions &options); }; //----------------------------------------------------------------------------- @@ -390,7 +410,7 @@ protected: //----------------------------------------------------------------------------- /*! replace the parent folder path of the levels in the selected cells -*/ + */ class ReplaceParentDirectoryPopup final : public FileBrowserPopup { Q_OBJECT diff --git a/toonz/sources/toonz/filmstripcommand.cpp b/toonz/sources/toonz/filmstripcommand.cpp index da4bc84..dc79cef 100644 --- a/toonz/sources/toonz/filmstripcommand.cpp +++ b/toonz/sources/toonz/filmstripcommand.cpp @@ -52,7 +52,7 @@ TFrameId operator+(const TFrameId &fid, int d) { } //----------------------------------------------------------------------------- - +/* void doUpdateXSheet(TXshSimpleLevel *sl, std::vector oldFids, std::vector newFids, TXsheet *xsh, std::vector &childLevels) { @@ -97,7 +97,7 @@ void doUpdateXSheet(TXshSimpleLevel *sl, std::vector oldFids, } } } - +*/ //----------------------------------------------------------------------------- static void updateXSheet(TXshSimpleLevel *sl, std::vector oldFids, @@ -105,7 +105,9 @@ static void updateXSheet(TXshSimpleLevel *sl, std::vector oldFids, std::vector childLevels; TXsheet *xsh = TApp::instance()->getCurrentScene()->getScene()->getTopXsheet(); - doUpdateXSheet(sl, oldFids, newFids, xsh, childLevels); + bool changed = + ToolUtils::doUpdateXSheet(sl, oldFids, newFids, xsh, childLevels); + if (changed) TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); } //============================================================================= @@ -2226,6 +2228,27 @@ public: // duplicate //----------------------------------------------------------------------------- +void FilmstripCmd::duplicateFrameWithoutUndo(TXshSimpleLevel *sl, + TFrameId srcFrame, + TFrameId targetFrame) { + if (srcFrame.isNoFrame() || targetFrame.isNoFrame()) return; + if (srcFrame.isEmptyFrame()) return; + + std::set frames; + + frames.insert(srcFrame); + DrawingData *data = new DrawingData(); + data->setLevelFrames(sl, frames); + + frames.clear(); + frames.insert(targetFrame); + + bool keepOriginalPalette = true; + + pasteFramesWithoutUndo(data, sl, frames, DrawingData::OVER_SELECTION, true, + keepOriginalPalette); +} + void FilmstripCmd::duplicate(TXshSimpleLevel *sl, std::set &frames, bool withUndo) { if (frames.empty() || !sl || sl->isSubsequence() || sl->isReadOnly()) return; @@ -2434,16 +2457,16 @@ public: .arg(QString::fromStdWString(m_level->getName())); switch (m_interpolation) { case FilmstripCmd::II_Linear: - str += QString("Linear Interporation"); + str += QString("Linear Interpolation"); break; case FilmstripCmd::II_EaseIn: - str += QString("Ease In Interporation"); + str += QString("Ease In Interpolation"); break; case FilmstripCmd::II_EaseOut: - str += QString("Ease Out Interporation"); + str += QString("Ease Out Interpolation"); break; case FilmstripCmd::II_EaseInOut: - str += QString("Ease In-Out Interporation"); + str += QString("Ease In-Out Interpolation"); break; } return str; @@ -2486,11 +2509,11 @@ void FilmstripCmd::inbetweenWithoutUndo( case II_Linear: break; case II_EaseIn: - s = t * t; - break; // s'(0) = 0 - case II_EaseOut: s = t * (2 - t); break; // s'(1) = 0 + case II_EaseOut: + s = t * t; + break; // s'(0) = 0 case II_EaseInOut: s = t * t * (3 - 2 * t); break; // s'(0) = s'(1) = 0 diff --git a/toonz/sources/toonz/filmstripcommand.h b/toonz/sources/toonz/filmstripcommand.h index b15355c..25ecce0 100644 --- a/toonz/sources/toonz/filmstripcommand.h +++ b/toonz/sources/toonz/filmstripcommand.h @@ -40,6 +40,8 @@ void swing(TXshSimpleLevel *sl, std::set &frames); void step(TXshSimpleLevel *sl, std::set &frames, int step); void each(TXshSimpleLevel *sl, std::set &frames, int each); +void duplicateFrameWithoutUndo(TXshSimpleLevel *sl, TFrameId srcFrame, + TFrameId targetFrame); void duplicate(TXshSimpleLevel *sl, std::set &frames, bool withUndo); // TODO vanno spostati in un altro posto @@ -57,7 +59,7 @@ void inbetween(TXshSimpleLevel *sl, const TFrameId &fid0, const TFrameId &fid1, void renumberDrawing(TXshSimpleLevel *sl, const TFrameId &oldFid, const TFrameId &desiredNewFid); -} +} // namespace FilmstripCmd TFrameId operator+(const TFrameId &fid, int d); diff --git a/toonz/sources/toonz/iocommand.cpp b/toonz/sources/toonz/iocommand.cpp index 63e796c..7e056ed 100644 --- a/toonz/sources/toonz/iocommand.cpp +++ b/toonz/sources/toonz/iocommand.cpp @@ -19,6 +19,7 @@ #include "filebrowser.h" #include "versioncontrol.h" #include "cachefxcommand.h" +#include "xdtsio.h" // TnzTools includes #include "tools/toolhandle.h" @@ -1758,8 +1759,9 @@ bool IoCmd::loadScene(const TFilePath &path, bool updateRecentFile, assert(!path.isEmpty()); TFilePath scenePath = path; bool importScene = false; + bool isXdts = scenePath.getType() == "xdts"; if (scenePath.getType() == "") scenePath = scenePath.withType("tnz"); - if (scenePath.getType() != "tnz") { + if (scenePath.getType() != "tnz" && !isXdts) { QString msg; msg = QObject::tr("File %1 doesn't look like a TOONZ Scene") .arg(QString::fromStdWString(scenePath.getWideString())); @@ -1846,8 +1848,11 @@ bool IoCmd::loadScene(const TFilePath &path, bool updateRecentFile, TImageStyle::setCurrentScene(scene); printf("%s:%s Progressing:\n", __FILE__, __FUNCTION__); try { - /*-- プログレス表示を行いながらLoad --*/ - scene->load(scenePath); + if (isXdts) + XdtsIo::loadXdtsScene(scene, scenePath); + else + /*-- プログレス表示を行いながらLoad --*/ + scene->load(scenePath); // import if needed TProjectManager *pm = TProjectManager::instance(); TProjectP currentProject = pm->getCurrentProject(); @@ -1912,7 +1917,7 @@ bool IoCmd::loadScene(const TFilePath &path, bool updateRecentFile, scene->getProperties()->getFieldGuideAspectRatio()); IconGenerator::instance()->invalidateSceneIcon(); DvDirModel::instance()->refreshFolder(scenePath.getParentDir()); - TApp::instance()->getCurrentScene()->setDirtyFlag(false); + TApp::instance()->getCurrentScene()->setDirtyFlag(isXdts); History::instance()->addItem(scenePath); if (updateRecentFile) RecentFiles::instance()->addFilePath( @@ -1994,11 +1999,9 @@ bool IoCmd::loadScene() { static LoadScenePopup *popup = 0; if (!popup) { popup = new LoadScenePopup(); - popup->addFilterType("tnz"); } int ret = popup->exec(); if (ret == QDialog::Accepted) { - TApp::instance()->getCurrentScene()->setDirtyFlag(false); return true; } else { TApp::instance()->getCurrentSelection()->setSelection(oldSelection); @@ -2247,10 +2250,7 @@ DVGui::ProgressDialog &LoadScopedBlock::progressDialog() const { //============================================================================= int IoCmd::loadResources(LoadResourceArguments &args, bool updateRecentFile, - LoadScopedBlock *sb, int xFrom, int xTo, - std::wstring levelName, int step, int inc, - int frameCount, bool doesFileActuallyExist, - CacheTlvBehavior cachingBehavior) { + LoadScopedBlock *sb) { struct locals { static bool isDir(const LoadResourceArguments::ResourceData &rd) { return QFileInfo(rd.m_path.getQString()).isDir(); @@ -2282,7 +2282,7 @@ int IoCmd::loadResources(LoadResourceArguments &args, bool updateRecentFile, bool isSoundLevel = false; // show wait cursor in case of caching all images because it is time consuming - if (cachingBehavior == ALL_ICONS_AND_IMAGES) + if (args.cachingBehavior == LoadResourceArguments::ALL_ICONS_AND_IMAGES) QApplication::setOverrideCursor(Qt::WaitCursor); // Initialize progress dialog @@ -2441,15 +2441,15 @@ int IoCmd::loadResources(LoadResourceArguments &args, bool updateRecentFile, } try { - xl = ::loadResource(scene, rd, args.castFolder, row0, col0, row1, col1, - args.expose, + xl = ::loadResource( + scene, rd, args.castFolder, row0, col0, row1, col1, args.expose, #if (__cplusplus > 199711L) - std::move(fIds), + std::move(fIds), #else - fIds, + fIds, #endif - xFrom, xTo, levelName, step, inc, frameCount, - doesFileActuallyExist); + args.xFrom, args.xTo, args.levelName, args.step, args.inc, + args.frameCount, args.doesFileActuallyExist); if (updateRecentFile) { RecentFiles::instance()->addFilePath( toQString(scene->decodeFilePath(path)), RecentFiles::Level); @@ -2466,10 +2466,12 @@ int IoCmd::loadResources(LoadResourceArguments &args, bool updateRecentFile, ++loadedCount; // load the image data of all frames to cache at the beginning - if (cachingBehavior != ON_DEMAND) { + if (args.cachingBehavior != LoadResourceArguments::ON_DEMAND) { TXshSimpleLevel *simpleLevel = xl->getSimpleLevel(); if (simpleLevel && simpleLevel->getType() == TZP_XSHLEVEL) { - bool cacheImagesAsWell = (cachingBehavior == ALL_ICONS_AND_IMAGES); + bool cacheImagesAsWell = + (args.cachingBehavior == + LoadResourceArguments::ALL_ICONS_AND_IMAGES); simpleLevel->loadAllIconsAndPutInCache(cacheImagesAsWell); } } @@ -2483,7 +2485,7 @@ int IoCmd::loadResources(LoadResourceArguments &args, bool updateRecentFile, sb->data().m_hasSoundLevel = sb->data().m_hasSoundLevel || isSoundLevel; // revert the cursor - if (cachingBehavior == ALL_ICONS_AND_IMAGES) + if (args.cachingBehavior == LoadResourceArguments::ALL_ICONS_AND_IMAGES) QApplication::restoreOverrideCursor(); return loadedCount; @@ -2677,9 +2679,9 @@ bool IoCmd::takeCareSceneFolderItemsOnSaveSceneAs( 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?"); + 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"), diff --git a/toonz/sources/toonz/iocommand.h b/toonz/sources/toonz/iocommand.h index 9053328..6348782 100644 --- a/toonz/sources/toonz/iocommand.h +++ b/toonz/sources/toonz/iocommand.h @@ -126,19 +126,22 @@ public: std::vector loadedLevels; //!< [\p Out] Levels loaded by //! resource loading procedures. + + int xFrom, xTo; + std::wstring levelName; + int step, inc, frameCount; + bool doesFileActuallyExist; + + enum CacheTlvBehavior { + ON_DEMAND = 0, // image data will be loaded when needed + ALL_ICONS, // icon data of all frames will be cached at the begininng + ALL_ICONS_AND_IMAGES // both icon and image data of all frames will be + // cached at the begininng + } cachingBehavior; //! Multiple //! levels \a may be loaded for a single resource data. public: - LoadResourceArguments() - : row0(-1) - , col0(-1) - , row1(-1) - , col1(-1) - , importPolicy(static_cast( - Preferences::instance()->getDefaultImportPolicy())) - , expose(Preferences::instance()->isAutoExposeEnabled()) {} - - LoadResourceArguments(const TFilePath &fp, + LoadResourceArguments(const TFilePath &fp = TFilePath(), const TFilePath &cast = TFilePath()) : castFolder(cast) , row0(-1) @@ -147,8 +150,16 @@ public: , col1(-1) , importPolicy(static_cast( Preferences::instance()->getDefaultImportPolicy())) - , expose(Preferences::instance()->isAutoExposeEnabled()) { - resourceDatas.push_back(fp); + , expose(Preferences::instance()->isAutoExposeEnabled()) + , xFrom(-1) + , xTo(-1) + , levelName(L"") + , step(-1) + , inc(-1) + , frameCount(-1) + , doesFileActuallyExist(true) + , cachingBehavior(ON_DEMAND) { + if (!fp.isEmpty()) resourceDatas.push_back(fp); } }; @@ -203,25 +214,16 @@ bool saveSound(TXshSoundLevel *sc); /*! \note Will fallback to loadResourceFolders() in case all argument paths are folders. */ -enum CacheTlvBehavior { - ON_DEMAND = 0, // image data will be loaded when needed - ALL_ICONS, // icon data of all frames will be cached at the begininng - ALL_ICONS_AND_IMAGES // both icon and image data of all frames will be cached - // at the begininng -}; - int loadResources( LoadResourceArguments &args, //!< Resources to be loaded. bool updateRecentFiles = true, //!< Whether Toonz's Recent Files list must be updated. LoadResourceArguments::ScopedBlock *sb = - 0, //!< Load block. May be nonzero in order to extend block data - //! 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, - CacheTlvBehavior cachingBehavior = ON_DEMAND); + 0 //!< Load block. May be nonzero in order to extend block data + //! access and finalization. + //!< Loads a group of resources by path. + //! \return The actually loaded levels count. +); int loadResourceFolders( LoadResourceArguments &args, //!< Resource folders to be loaded. diff --git a/toonz/sources/toonz/keyframeselection.cpp b/toonz/sources/toonz/keyframeselection.cpp index 1b35b1e..e8bdac8 100644 --- a/toonz/sources/toonz/keyframeselection.cpp +++ b/toonz/sources/toonz/keyframeselection.cpp @@ -7,6 +7,7 @@ #include "cellkeyframedata.h" #include "tapp.h" #include "menubarcommandids.h" +#include "xsheetviewer.h" // TnzQt includes #include "toonzqt/menubarcommand.h" @@ -40,7 +41,8 @@ struct PegbarArgument { //----------------------------------------------------------------------------- -bool shiftKeyframesWithoutUndo(int r0, int r1, int c0, int c1, bool cut) { +bool shiftKeyframesWithoutUndo(int r0, int r1, int c0, int c1, bool cut, + bool shiftFollowing) { int delta = cut ? -(r1 - r0 + 1) : r1 - r0 + 1; if (delta == 0) return false; TXsheet *xsh = TApp::instance()->getCurrentXsheet()->getXsheet(); @@ -55,7 +57,10 @@ bool shiftKeyframesWithoutUndo(int r0, int r1, int c0, int c1, bool cut) { stObj->getKeyframeRange(kr0, kr1); int i = r0; while (i <= kr1) { - if (stObj->isKeyframe(i)) keyToShift.insert(i); + if (stObj->isKeyframe(i)) { + keyToShift.insert(i); + if (!shiftFollowing) break; + } i++; } isShifted = stObj->moveKeyframes(keyToShift, delta); @@ -156,13 +161,13 @@ public: new TKeyframeSelection(m_selection->getSelection()); deleteKeyframesWithoutUndo(&selection->getSelection()); if (-(m_r1 - m_r0 + 1) != 0) - shiftKeyframesWithoutUndo(m_r0, m_r1, m_c0, m_c1, true); + shiftKeyframesWithoutUndo(m_r0, m_r1, m_c0, m_c1, true, true); if (m_oldData) setXshFromData(m_oldData); TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); } void redo() const override { if (m_r1 - m_r0 + 1 != 0) - shiftKeyframesWithoutUndo(m_r0, m_r1, m_c0, m_c1, false); + shiftKeyframesWithoutUndo(m_r0, m_r1, m_c0, m_c1, false, true); // Delete merged data setXshFromData(m_newData); TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); @@ -201,7 +206,7 @@ public: void undo() const override { const TKeyframeData *keyframeData = dynamic_cast(m_data); if (m_r1 - m_r0 + 1 != 0) - shiftKeyframesWithoutUndo(m_r0, m_r1, m_c0, m_c1, false); + shiftKeyframesWithoutUndo(m_r0, m_r1, m_c0, m_c1, false, true); if (keyframeData) pasteKeyframesWithoutUndo(keyframeData, &m_selection->getSelection()); TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); @@ -212,7 +217,7 @@ public: new TKeyframeSelection(m_selection->getSelection()); deleteKeyframesWithoutUndo(&tempSelection->getSelection()); if (m_r1 - m_r0 + 1 != 0) - shiftKeyframesWithoutUndo(m_r0, m_r1, m_c0, m_c1, true); + shiftKeyframesWithoutUndo(m_r0, m_r1, m_c0, m_c1, true, true); TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); } @@ -223,6 +228,51 @@ public: } }; +//============================================================================= +// ShiftKeyframesUndo +//----------------------------------------------------------------------------- + +class ShiftKeyframesUndo final : public TUndo { + int m_r0, m_r1, m_c0, m_c1; + bool m_shiftFollowing; + +public: + ShiftKeyframesUndo(int r0, int r1, int c0, int c1, bool shiftFollowing) + : m_r0(r0) + , m_r1(r1) + , m_c0(c0) + , m_c1(c1) + , m_shiftFollowing(shiftFollowing) {} + + ~ShiftKeyframesUndo() {} + void undo() const override { + if (m_r0 != m_r1) { + int r1adj = m_r0 < m_r1 ? m_r1 - 1 : m_r0 + (m_r0 - m_r1) - 1; + int rshift = m_r0 < m_r1 ? 0 : -(r1adj - m_r0 + 1); + bool cut = m_r0 < m_r1 ? true : false; + + shiftKeyframesWithoutUndo(m_r0 + rshift, r1adj + rshift, m_c0, m_c1, cut, + m_shiftFollowing); + } + TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); + } + void redo() const override { + if (m_r0 != m_r1) { + int r1adj = m_r0 < m_r1 ? m_r1 - 1 : m_r0 + (m_r0 - m_r1) - 1; + bool cut = m_r0 < m_r1 ? false : true; + + shiftKeyframesWithoutUndo(m_r0, r1adj, m_c0, m_c1, cut, m_shiftFollowing); + } + TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); + } + int getSize() const override { return sizeof(*this); } + + QString getHistoryString() override { + if (m_r0 < m_r1) return QObject::tr("Shift Key Frames Down"); + return QObject::tr("Shift Key Frames Up"); + } +}; + //----------------------------------------------------------------------------- } // namespace //----------------------------------------------------------------------------- @@ -236,6 +286,10 @@ void TKeyframeSelection::enableCommands() { enableCommand(this, MI_Paste, &TKeyframeSelection::pasteKeyframes); enableCommand(this, MI_Cut, &TKeyframeSelection::cutKeyframes); enableCommand(this, MI_Clear, &TKeyframeSelection::deleteKeyframes); + enableCommand(this, MI_ShiftKeyframesDown, + &TKeyframeSelection::shiftKeyframesDown); + enableCommand(this, MI_ShiftKeyframesUp, + &TKeyframeSelection::shiftKeyframesUp); } //----------------------------------------------------------------------------- @@ -335,6 +389,43 @@ void TKeyframeSelection::cutKeyframes() { //----------------------------------------------------------------------------- +void TKeyframeSelection::shiftKeyframes(int direction) { + copyKeyframes(); + if (isEmpty()) return; + + std::set positions = m_positions; + + int r0 = positions.begin()->first; + int c0 = positions.begin()->second; + + TXsheet *xsh = TApp::instance()->getCurrentXsheet()->getXsheet(); + TKeyframeData *data = new TKeyframeData(); + data->setKeyframes(positions, xsh); + + TUndoManager::manager()->beginBlock(); + + XsheetViewer *viewer = TApp::instance()->getCurrentXsheetViewer(); + TKeyframeSelection *selection = viewer->getKeyframeSelection(); + selection->selectNone(); + + std::set::iterator it = positions.begin(), itEnd = positions.end(); + for(; it != itEnd; ++it) { + Position position = *it; + int r = position.first; + int c = position.second; + + TXshColumn *column = xsh->getColumn(c); + if (!column || column->isLocked()) continue; + + shiftKeyframes(r, r + direction, c, c, false); + selection->select(r + direction, c); + } + + TUndoManager::manager()->endBlock(); +} + +//----------------------------------------------------------------------------- + void TKeyframeSelection::pasteKeyframesWithShift(int r0, int r1, int c0, int c1) { unselectLockedColumn(); @@ -358,7 +449,7 @@ void TKeyframeSelection::pasteKeyframesWithShift(int r0, int r1, int c0, TXsheet *xsh = TApp::instance()->getCurrentXsheet()->getXsheet(); oldData->setKeyframes(positions, xsh); - bool isShift = shiftKeyframesWithoutUndo(r0, r1, c0, c1, false); + bool isShift = shiftKeyframesWithoutUndo(r0, r1, c0, c1, false, true); bool isPaste = pasteKeyframesWithoutUndo(data, &m_positions); if (!isPaste && !isShift) { delete oldData; @@ -389,7 +480,7 @@ void TKeyframeSelection::deleteKeyframesWithShift(int r0, int r1, int c0, } TKeyframeSelection *selection = new TKeyframeSelection(m_positions); bool deleteKeyFrame = deleteKeyframesWithoutUndo(&m_positions); - bool isShift = shiftKeyframesWithoutUndo(r0, r1, c0, c1, true); + bool isShift = shiftKeyframesWithoutUndo(r0, r1, c0, c1, true, true); if (!deleteKeyFrame && !isShift) { delete selection; delete data; @@ -400,3 +491,22 @@ void TKeyframeSelection::deleteKeyframesWithShift(int r0, int r1, int c0, TApp::instance()->getCurrentScene()->setDirtyFlag(true); TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); } + +//----------------------------------------------------------------------------- + +void TKeyframeSelection::shiftKeyframes(int r0, int r1, int c0, int c1, + bool shiftFollowing) { + unselectLockedColumn(); + + int r1adj = r0 < r1 ? r1 - 1 : r0 + (r0 - r1) - 1; + bool cut = r0 < r1 ? false : true; + + bool isShift = + shiftKeyframesWithoutUndo(r0, r1adj, c0, c1, cut, shiftFollowing); + if (!isShift) return; + + TUndoManager::manager()->add( + new ShiftKeyframesUndo(r0, r1, c0, c1, shiftFollowing)); + TApp::instance()->getCurrentScene()->setDirtyFlag(true); + TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); +} diff --git a/toonz/sources/toonz/keyframeselection.h b/toonz/sources/toonz/keyframeselection.h index ca5dfe6..63ed47d 100644 --- a/toonz/sources/toonz/keyframeselection.h +++ b/toonz/sources/toonz/keyframeselection.h @@ -68,9 +68,14 @@ public: void pasteKeyframes(); void deleteKeyframes(); void cutKeyframes(); + void shiftKeyframes(int direction); + void shiftKeyframesDown() { shiftKeyframes(1); } + void shiftKeyframesUp() { shiftKeyframes(-1); } void pasteKeyframesWithShift(int r0, int r1, int c0, int c1); void deleteKeyframesWithShift(int r0, int r1, int c0, int c1); + void shiftKeyframes(int r0, int r1, int c0, int c1, + bool shiftFollowing = true); }; #endif // TKEYFRAMESELECTION_H diff --git a/toonz/sources/toonz/levelsettingspopup.cpp b/toonz/sources/toonz/levelsettingspopup.cpp index 348f1db..af3684d 100644 --- a/toonz/sources/toonz/levelsettingspopup.cpp +++ b/toonz/sources/toonz/levelsettingspopup.cpp @@ -49,6 +49,7 @@ #include "tfiletype.h" #include "tlevel.h" #include "tstream.h" +#include "tundo.h" // Qt includes #include @@ -68,6 +69,8 @@ namespace { QString dpiToString(const TPointD &dpi) { if (dpi.x == 0.0 || dpi.y == 0.0) return QString("none"); + else if (dpi.x < 0.0 || dpi.y < 0.0) + return LevelSettingsPopup::tr("[Various]"); else if (areAlmostEqual(dpi.x, dpi.y, 0.01)) return QString::number(dpi.x); else @@ -84,52 +87,263 @@ TPointD getCurrentCameraDpi() { return TPointD(res.lx / size.lx, res.ly / size.ly); } +void uniteValue(QString &oldValue, QString &newValue, bool isFirst) { + if (isFirst) + oldValue = newValue; + else if (oldValue != newValue && + oldValue != LevelSettingsPopup::tr("[Various]")) + oldValue = LevelSettingsPopup::tr("[Various]"); +} + +void uniteValue(int &oldValue, int &newValue, bool isFirst) { + if (isFirst) + oldValue = newValue; + else if (oldValue != -1 && oldValue != newValue) + oldValue = -1; +} + +void uniteValue(TPointD &oldValue, TPointD &newValue, bool isFirst) { + if (isFirst) + oldValue = newValue; + else if (oldValue != TPointD(-1, -1) && oldValue != newValue) + oldValue = TPointD(-1, -1); +} + +void uniteValue(Qt::CheckState &oldValue, Qt::CheckState &newValue, + bool isFirst) { + if (isFirst) + oldValue = newValue; + else if (oldValue != Qt::PartiallyChecked && oldValue != newValue) + oldValue = Qt::PartiallyChecked; +} + +void uniteValue(double &oldValue, double &newValue, bool isFirst) { + if (isFirst) + oldValue = newValue; + else if (oldValue != -1.0 && oldValue != newValue) + oldValue = -1.0; +} + +class LevelSettingsUndo final : public TUndo { +public: + enum Type { + Name, + Path, + ScanPath, + DpiType, + Dpi, + DoPremulti, + WhiteTransp, + Softness, + Subsampling, + LevelType + }; + +private: + TXshLevelP m_xl; + const Type m_type; + const QVariant m_before; + const QVariant m_after; + + void setName(const QString name) const { + TLevelSet *levelSet = + TApp::instance()->getCurrentScene()->getScene()->getLevelSet(); + levelSet->renameLevel(m_xl.getPointer(), name.toStdWString()); + TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); + TApp::instance()->getCurrentScene()->notifyCastChange(); + } + + void setPath(const TFilePath path) const { + TXshSoundLevelP sdl = m_xl->getSoundLevel(); + if (sdl) { + sdl->setPath(path); + sdl->loadSoundTrack(); + TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); + TApp::instance()->getCurrentXsheet()->notifyXsheetSoundChanged(); + return; + } + + TXshSimpleLevelP sl = m_xl->getSimpleLevel(); + TXshPaletteLevelP pl = m_xl->getPaletteLevel(); + if (!sl && !pl) return; + if (sl) { + sl->setPath(path); + TApp::instance() + ->getPaletteController() + ->getCurrentLevelPalette() + ->setPalette(sl->getPalette()); + sl->invalidateFrames(); + std::vector frames; + sl->getFids(frames); + for (auto const &fid : frames) { + IconGenerator::instance()->invalidate(sl.getPointer(), fid); + } + } else if (pl) { + pl->setPath(path); + TApp::instance() + ->getPaletteController() + ->getCurrentLevelPalette() + ->setPalette(pl->getPalette()); + pl->load(); + } + TApp::instance()->getCurrentLevel()->notifyLevelChange(); + TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); + } + + void setScanPath(const TFilePath path) const { + TXshSimpleLevelP sl = m_xl->getSimpleLevel(); + if (!sl || sl->getType() != TZP_XSHLEVEL) return; + sl->setScannedPath(path); + TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); + } + + void setDpiType(LevelProperties::DpiPolicy policy) const { + TXshSimpleLevelP sl = m_xl->getSimpleLevel(); + if (!sl || sl->getType() == PLI_XSHLEVEL) return; + sl->getProperties()->setDpiPolicy(policy); + TApp::instance()->getCurrentScene()->setDirtyFlag(true); + TApp::instance()->getCurrentLevel()->notifyLevelChange(); + } + + void setDpi(TPointD dpi) const { + TXshSimpleLevelP sl = m_xl->getSimpleLevel(); + if (!sl || sl->getType() == PLI_XSHLEVEL) return; + sl->getProperties()->setDpi(dpi); + TApp::instance()->getCurrentScene()->setDirtyFlag(true); + TApp::instance()->getCurrentLevel()->notifyLevelChange(); + } + + void setSubsampling(int subsampling) const { + TXshSimpleLevelP sl = m_xl->getSimpleLevel(); + if (!sl || sl->getType() == PLI_XSHLEVEL) return; + sl->getProperties()->setSubsampling(subsampling); + sl->invalidateFrames(); + TApp::instance()->getCurrentScene()->setDirtyFlag(true); + TApp::instance() + ->getCurrentXsheet() + ->getXsheet() + ->getStageObjectTree() + ->invalidateAll(); + TApp::instance()->getCurrentLevel()->notifyLevelChange(); + } + + void setDoPremulti(bool on) const { + TXshSimpleLevelP sl = m_xl->getSimpleLevel(); + if (!sl || sl->getType() == PLI_XSHLEVEL) return; + sl->getProperties()->setDoPremultiply(on); + TApp::instance()->getCurrentLevel()->notifyLevelChange(); + } + + void setSoftness(int softness) const { + TXshSimpleLevelP sl = m_xl->getSimpleLevel(); + if (!sl || sl->getType() == PLI_XSHLEVEL) return; + sl->getProperties()->setDoAntialias(softness); + TApp::instance()->getCurrentLevel()->notifyLevelChange(); + } + + void setWhiteTransp(bool on) const { + TXshSimpleLevelP sl = m_xl->getSimpleLevel(); + if (!sl || sl->getType() == PLI_XSHLEVEL) return; + sl->getProperties()->setWhiteTransp(on); + TApp::instance()->getCurrentLevel()->notifyLevelChange(); + } + + void setValue(const QVariant value) const { + switch (m_type) { + case Name: + setName(value.toString()); + break; + case Path: + setPath(TFilePath(value.toString())); + break; + case ScanPath: + setScanPath(TFilePath(value.toString())); + break; + case DpiType: + setDpiType(LevelProperties::DpiPolicy(value.toInt())); + break; + case Dpi: { + QPointF dpi = value.toPointF(); + setDpi(TPointD(dpi.x(), dpi.y())); + break; + } + case Subsampling: + setSubsampling(value.toInt()); + break; + case DoPremulti: + setDoPremulti(value.toBool()); + break; + case Softness: + setSoftness(value.toInt()); + break; + case WhiteTransp: + setWhiteTransp(value.toBool()); + break; + } + // This signal is for updating the level settings + TApp::instance()->getCurrentScene()->notifySceneChanged(); + } + +public: + LevelSettingsUndo(TXshLevel *xl, Type type, const QVariant before, + const QVariant after) + : m_xl(xl), m_type(type), m_before(before), m_after(after) {} + + void undo() const override { setValue(m_before); } + + void redo() const override { setValue(m_after); } + + int getSize() const override { return sizeof *this; } + + QString getHistoryString() override { + return QObject::tr("Edit Level Settings : %1") + .arg(QString::fromStdWString(m_xl->getName())); + } +}; + //----------------------------------------------------------------------------- } // anonymous namespace //----------------------------------------------------------------------------- //============================================================================= /*! \class LevelSettingsPopup - \brief The LevelSettingsPopup class provides a dialog to show - and change - current level settings. - - Inherits \b Dialog. + \brief The LevelSettingsPopup class provides a dialog to show + and change current level settings. + Inherits \b Dialog. */ //----------------------------------------------------------------------------- LevelSettingsPopup::LevelSettingsPopup() : Dialog(TApp::instance()->getMainWindow(), false, false, "LevelSettings") , m_whiteTransp(0) - , m_scanPathLabel(0) , m_scanPathFld(0) { setWindowTitle(tr("Level Settings")); - m_nameFld = new LineEdit(); - m_pathFld = new FileField(); // Path - m_scanPathLabel = new QLabel(tr("Scan Path:")); - m_scanPathFld = new FileField(); // ScanPath - m_typeLabel = new QLabel(); // Level Type + m_nameFld = new LineEdit(); + m_pathFld = new FileField(); // Path + m_scanPathFld = new FileField(); // ScanPath + QLabel *scanPathLabel = new QLabel(tr("Scan Path:"), this); + m_typeLabel = new QLabel(); // Level Type // Type m_dpiTypeOm = new QComboBox(); // DPI - m_dpiLabel = new QLabel(tr("DPI:")); - m_dpiFld = new DoubleLineEdit(); - m_squarePixCB = new CheckBox(tr("Forced Squared Pixel")); - - m_widthLabel = new QLabel(tr("Width:")); - m_widthFld = new MeasuredDoubleLineEdit(); - m_heightLabel = new QLabel(tr("Height:")); - m_heightFld = new MeasuredDoubleLineEdit(); + QLabel *dpiLabel = new QLabel(tr("DPI:")); + m_dpiFld = new DoubleLineEdit(); + m_squarePixCB = new CheckBox(tr("Forced Squared Pixel")); + + QLabel *widthLabel = new QLabel(tr("Width:")); + m_widthFld = new MeasuredDoubleLineEdit(); + QLabel *heightLabel = new QLabel(tr("Height:")); + m_heightFld = new MeasuredDoubleLineEdit(); // Use Camera Dpi m_useCameraDpiBtn = new QPushButton(tr("Use Camera DPI")); - m_cameraDpiLabel = new QLabel(tr("")); - m_imageDpiLabel = new QLabel(tr("")); - m_imageResLabel = new QLabel(tr("")); - m_cameraDpiTitle = new QLabel(tr("Camera DPI:")); - m_imageDpiTitle = new QLabel(tr("Image DPI:")); - m_imageResTitle = new QLabel(tr("Resolution:")); + m_cameraDpiLabel = new QLabel(tr("")); + m_imageDpiLabel = new QLabel(tr("")); + m_imageResLabel = new QLabel(tr("")); + QLabel *cameraDpiTitle = new QLabel(tr("Camera DPI:")); + QLabel *imageDpiTitle = new QLabel(tr("Image DPI:")); + QLabel *imageResTitle = new QLabel(tr("Resolution:")); // subsampling m_subsamplingLabel = new QLabel(tr("Subsampling:")); @@ -140,6 +354,7 @@ LevelSettingsPopup::LevelSettingsPopup() m_whiteTransp = new CheckBox(tr("White As Transparent"), this); m_doAntialias = new CheckBox(tr("Add Antialiasing"), this); + m_softnessLabel = new QLabel(tr("Antialias Softness:"), this); m_antialiasSoftness = new DVGui::IntLineEdit(0, 10, 0, 100); //---- @@ -150,9 +365,8 @@ LevelSettingsPopup::LevelSettingsPopup() m_dpiTypeOm->addItem(tr("Image DPI"), "Image DPI"); m_dpiTypeOm->addItem(tr("Custom DPI"), "Custom DPI"); - m_squarePixCB->setChecked(true); + m_squarePixCB->setCheckState(Qt::Checked); - /*--- Levelサイズの単位はCameraUnitにする --*/ m_widthFld->setMeasure("camera.lx"); m_heightFld->setMeasure("camera.ly"); @@ -161,15 +375,52 @@ LevelSettingsPopup::LevelSettingsPopup() m_heightFld->setDecimals(0); } - m_doPremultiply->setChecked(false); + m_doPremultiply->setTristate(); + m_doPremultiply->setCheckState(Qt::Unchecked); - m_doAntialias->setChecked(false); + m_doAntialias->setTristate(); + m_doAntialias->setCheckState(Qt::Unchecked); m_antialiasSoftness->setEnabled(false); - m_whiteTransp->setChecked(false); + m_whiteTransp->setTristate(); + m_whiteTransp->setCheckState(Qt::Unchecked); + + // register activation flags + m_activateFlags[m_nameFld] = AllTypes; + m_activateFlags[m_pathFld] = SimpleLevel | Palette | Sound; + m_activateFlags[m_scanPathFld] = ToonzRaster; + m_activateFlags[scanPathLabel] = ToonzRaster | MultiSelection; + // m_activateFlags[m_typeLabel] = AllTypes | MultiSelection; + + unsigned int dpiWidgetsFlag = HasDPILevel | HideOnPixelMode | MultiSelection; + m_activateFlags[m_dpiTypeOm] = dpiWidgetsFlag; + m_activateFlags[dpiLabel] = dpiWidgetsFlag; + m_activateFlags[m_dpiFld] = dpiWidgetsFlag; + m_activateFlags[m_squarePixCB] = dpiWidgetsFlag; + + unsigned int rasterWidgetsFlag = ToonzRaster | Raster | MultiSelection; + m_activateFlags[widthLabel] = rasterWidgetsFlag; + m_activateFlags[m_widthFld] = rasterWidgetsFlag; + m_activateFlags[heightLabel] = rasterWidgetsFlag; + m_activateFlags[m_heightFld] = rasterWidgetsFlag; + m_activateFlags[m_useCameraDpiBtn] = dpiWidgetsFlag; + m_activateFlags[m_cameraDpiLabel] = + AllTypes | HideOnPixelMode | MultiSelection; + m_activateFlags[m_imageDpiLabel] = dpiWidgetsFlag; + m_activateFlags[m_imageResLabel] = dpiWidgetsFlag; + m_activateFlags[cameraDpiTitle] = AllTypes | HideOnPixelMode | MultiSelection; + m_activateFlags[imageDpiTitle] = dpiWidgetsFlag; + m_activateFlags[imageResTitle] = dpiWidgetsFlag; + + m_activateFlags[m_doPremultiply] = Raster | MultiSelection; + m_activateFlags[m_whiteTransp] = Raster | MultiSelection; + m_activateFlags[m_doAntialias] = rasterWidgetsFlag; + m_activateFlags[m_softnessLabel] = rasterWidgetsFlag; + m_activateFlags[m_antialiasSoftness] = rasterWidgetsFlag; + m_activateFlags[m_subsamplingLabel] = rasterWidgetsFlag; + m_activateFlags[m_subsamplingFld] = rasterWidgetsFlag; //----layout - m_topLayout->setMargin(5); m_topLayout->setSpacing(5); { @@ -185,7 +436,7 @@ LevelSettingsPopup::LevelSettingsPopup() nameLayout->addWidget(new QLabel(tr("Path:"), this), 1, 0, Qt::AlignRight | Qt::AlignVCenter); nameLayout->addWidget(m_pathFld, 1, 1); - nameLayout->addWidget(m_scanPathLabel, 2, 0, + nameLayout->addWidget(scanPathLabel, 2, 0, Qt::AlignRight | Qt::AlignVCenter); nameLayout->addWidget(m_scanPathFld, 2, 1); nameLayout->addWidget(m_typeLabel, 3, 1); @@ -201,30 +452,29 @@ LevelSettingsPopup::LevelSettingsPopup() if (Preferences::instance()->getUnits() == "pixel") dpiBox = new QGroupBox(tr("Resolution"), this); else - dpiBox = new QGroupBox(tr("DPI && Resolution"), this); + dpiBox = new QGroupBox(tr("DPI && Resolution"), this); QGridLayout *dpiLayout = new QGridLayout(); dpiLayout->setMargin(5); dpiLayout->setSpacing(5); { dpiLayout->addWidget(m_dpiTypeOm, 0, 1, 1, 3); - dpiLayout->addWidget(m_dpiLabel, 1, 0, Qt::AlignRight | Qt::AlignVCenter); + dpiLayout->addWidget(dpiLabel, 1, 0, Qt::AlignRight | Qt::AlignVCenter); dpiLayout->addWidget(m_dpiFld, 1, 1); dpiLayout->addWidget(m_squarePixCB, 1, 2, 1, 2, Qt::AlignRight | Qt::AlignVCenter); - dpiLayout->addWidget(m_widthLabel, 2, 0, - Qt::AlignRight | Qt::AlignVCenter); + dpiLayout->addWidget(widthLabel, 2, 0, Qt::AlignRight | Qt::AlignVCenter); dpiLayout->addWidget(m_widthFld, 2, 1); - dpiLayout->addWidget(m_heightLabel, 2, 2, + dpiLayout->addWidget(heightLabel, 2, 2, Qt::AlignRight | Qt::AlignVCenter); dpiLayout->addWidget(m_heightFld, 2, 3); dpiLayout->addWidget(m_useCameraDpiBtn, 3, 1, 1, 3); - dpiLayout->addWidget(m_cameraDpiTitle, 4, 0, + dpiLayout->addWidget(cameraDpiTitle, 4, 0, Qt::AlignRight | Qt::AlignVCenter); dpiLayout->addWidget(m_cameraDpiLabel, 4, 1, 1, 3); - dpiLayout->addWidget(m_imageDpiTitle, 5, 0, + dpiLayout->addWidget(imageDpiTitle, 5, 0, Qt::AlignRight | Qt::AlignVCenter); dpiLayout->addWidget(m_imageDpiLabel, 5, 1, 1, 3); - dpiLayout->addWidget(m_imageResTitle, 6, 0, + dpiLayout->addWidget(imageResTitle, 6, 0, Qt::AlignRight | Qt::AlignVCenter); dpiLayout->addWidget(m_imageResLabel, 6, 1, 1, 3); } @@ -247,7 +497,7 @@ LevelSettingsPopup::LevelSettingsPopup() bottomLay->setMargin(3); bottomLay->setSpacing(3); { - bottomLay->addWidget(new QLabel(tr("Antialias Softness:"), this), 0, 0); + bottomLay->addWidget(m_softnessLabel, 0, 0); bottomLay->addWidget(m_antialiasSoftness, 0, 1); bottomLay->addWidget(m_subsamplingLabel, 1, 0); @@ -264,28 +514,25 @@ LevelSettingsPopup::LevelSettingsPopup() //----signal/slot connections connect(m_nameFld, SIGNAL(editingFinished()), SLOT(onNameChanged())); connect(m_pathFld, SIGNAL(pathChanged()), SLOT(onPathChanged())); - connect(m_dpiTypeOm, SIGNAL(currentIndexChanged(int)), - SLOT(onDpiTypeChanged(int))); + connect(m_dpiTypeOm, SIGNAL(activated(int)), SLOT(onDpiTypeChanged(int))); connect(m_dpiFld, SIGNAL(editingFinished()), SLOT(onDpiFieldChanged())); connect(m_squarePixCB, SIGNAL(stateChanged(int)), SLOT(onSquarePixelChanged(int))); - connect(m_widthFld, SIGNAL(editingFinished()), SLOT(onWidthFieldChanged())); - connect(m_heightFld, SIGNAL(editingFinished()), SLOT(onHeightFieldChanged())); + connect(m_widthFld, SIGNAL(valueChanged()), SLOT(onWidthFieldChanged())); + connect(m_heightFld, SIGNAL(valueChanged()), SLOT(onHeightFieldChanged())); connect(m_useCameraDpiBtn, SIGNAL(clicked()), SLOT(useCameraDpi())); connect(m_subsamplingFld, SIGNAL(editingFinished()), SLOT(onSubsamplingChanged())); /*--- ScanPathの入力に対応 ---*/ connect(m_scanPathFld, SIGNAL(pathChanged()), SLOT(onScanPathChanged())); - connect(m_doPremultiply, SIGNAL(stateChanged(int)), - SLOT(onDoPremultiplyChanged(int))); - connect(m_doAntialias, SIGNAL(stateChanged(int)), - SLOT(onDoAntialiasChanged(int))); + connect(m_doPremultiply, SIGNAL(clicked(bool)), + SLOT(onDoPremultiplyClicked())); + connect(m_doAntialias, SIGNAL(clicked(bool)), SLOT(onDoAntialiasClicked())); connect(m_antialiasSoftness, SIGNAL(editingFinished()), SLOT(onAntialiasSoftnessChanged())); - connect(m_whiteTransp, SIGNAL(stateChanged(int)), - SLOT(onWhiteTranspChanged(int))); + connect(m_whiteTransp, SIGNAL(clicked(bool)), SLOT(onWhiteTranspClicked())); updateLevelSettings(); } @@ -307,39 +554,16 @@ void LevelSettingsPopup::showEvent(QShowEvent *e) { ret = ret && connect(castSelection, SIGNAL(itemSelectionChanged()), this, SLOT(onCastSelectionChanged())); - /*--- Cleanupが行われたときに表示を更新するため ---*/ + // update level settings after cleanup by this connection ret = ret && connect(TApp::instance()->getCurrentScene(), SIGNAL(sceneChanged()), SLOT(onSceneChanged())); + ret = ret && connect(TApp::instance()->getCurrentScene(), + SIGNAL(preferenceChanged(const QString &)), + SLOT(onPreferenceChanged(const QString &))); assert(ret); updateLevelSettings(); - if (Preferences::instance()->getUnits() == "pixel") { - m_dpiTypeOm->hide(); - m_dpiLabel->hide(); - m_dpiFld->hide(); - m_squarePixCB->hide(); - m_useCameraDpiBtn->hide(); - m_cameraDpiLabel->hide(); - m_imageDpiLabel->hide(); - m_imageDpiTitle->hide(); - m_cameraDpiTitle->hide(); - m_widthFld->setDecimals(0); - m_heightFld->setDecimals(0); - } else { - m_dpiTypeOm->show(); - m_dpiLabel->show(); - m_dpiFld->show(); - m_squarePixCB->show(); - m_useCameraDpiBtn->show(); - m_cameraDpiLabel->show(); - m_imageDpiLabel->show(); - m_imageDpiTitle->show(); - m_cameraDpiTitle->show(); - m_imageResTitle->show(); - m_imageResLabel->show(); - m_widthFld->setDecimals(4); - m_heightFld->setDecimals(4); - } + onPreferenceChanged(""); } //----------------------------------------------------------------------------- @@ -361,6 +585,9 @@ void LevelSettingsPopup::hideEvent(QHideEvent *e) { ret = ret && disconnect(TApp::instance()->getCurrentScene(), SIGNAL(sceneChanged()), this, SLOT(onSceneChanged())); + ret = ret && disconnect(TApp::instance()->getCurrentScene(), + SIGNAL(preferenceChanged(const QString &)), this, + SLOT(onPreferenceChanged(const QString &))); assert(ret); Dialog::hideEvent(e); @@ -372,6 +599,21 @@ void LevelSettingsPopup::onSceneChanged() { updateLevelSettings(); } //----------------------------------------------------------------------------- +void LevelSettingsPopup::onPreferenceChanged(const QString &propertyName) { + if (!propertyName.isEmpty() && propertyName != "pixelsOnly") return; + bool pixelsMode = Preferences::instance()->getBoolValue(pixelsOnly); + QMap::iterator i = m_activateFlags.begin(); + while (i != m_activateFlags.end()) { + if (i.value() & HideOnPixelMode) i.key()->setHidden(pixelsMode); + ++i; + } + int decimals = (pixelsMode) ? 0 : 4; + m_widthFld->setDecimals(decimals); + m_heightFld->setDecimals(decimals); +} + +//----------------------------------------------------------------------------- + void LevelSettingsPopup::onCastSelectionChanged() { updateLevelSettings(); } //----------------------------------------------------------------------------- @@ -391,13 +633,133 @@ void LevelSettingsPopup::onSelectionSwitched(TSelection *oldSelection, SLOT(onCastSelectionChanged())); } +SelectedLevelType LevelSettingsPopup::getType(TXshLevelP level_p) { + if (!level_p) return None; + switch (level_p->getType()) { + case TZP_XSHLEVEL: + return ToonzRaster; + case OVL_XSHLEVEL: + return Raster; + case MESH_XSHLEVEL: + return Mesh; + case PLI_XSHLEVEL: + return ToonzVector; + case PLT_XSHLEVEL: + return Palette; + case CHILD_XSHLEVEL: + return SubXsheet; + case SND_XSHLEVEL: + return Sound; + default: // Other types are not supported + return Others; + } +} + +LevelSettingsValues LevelSettingsPopup::getValues(TXshLevelP level) { + LevelSettingsValues values; + + values.name = QString::fromStdWString(level->getName()); + + TXshSimpleLevelP sl = level->getSimpleLevel(); + TXshPaletteLevelP pl = level->getPaletteLevel(); + TXshChildLevelP cl = level->getChildLevel(); + TXshSoundLevelP sdl = level->getSoundLevel(); + SelectedLevelType levelType = getType(level); + // path + if (sl) { + values.path = toQString(sl->getPath()); + values.scanPath = toQString(sl->getScannedPath()); + } else if (pl) + values.path = toQString(pl->getPath()); + else if (sdl) + values.path = toQString(sdl->getPath()); + + // leveltype + switch (levelType) { + case ToonzRaster: + values.typeStr = tr("Toonz Raster level"); + break; + case Raster: + values.typeStr = tr("Raster level"); + break; + case Mesh: + values.typeStr = tr("Mesh level"); + break; + case ToonzVector: + values.typeStr = tr("Toonz Vector level"); + break; + case Palette: + values.typeStr = tr("Palette level"); + break; + case SubXsheet: + values.typeStr = tr("SubXsheet Level"); + break; + case Sound: + values.typeStr = tr("Sound Column"); + break; + default: + values.typeStr = tr("Another Level Type"); + break; + } + + // dpi & res & resampling + if (levelType & HasDPILevel) { + LevelProperties::DpiPolicy dpiPolicy = sl->getProperties()->getDpiPolicy(); + assert(dpiPolicy == LevelProperties::DP_ImageDpi || + dpiPolicy == LevelProperties::DP_CustomDpi); + values.dpiType = (dpiPolicy == LevelProperties::DP_ImageDpi) ? 0 : 1; + + // dpi field + values.dpi = sl->getDpi(); + // image dpi + values.imageDpi = dpiToString(sl->getImageDpi()); + + if (levelType == ToonzRaster || levelType == Raster) { + // size field + TDimensionD size(0, 0); + TDimension res = sl->getResolution(); + if (res.lx > 0 && res.ly > 0 && values.dpi.x > 0 && values.dpi.y > 0) { + size.lx = res.lx / values.dpi.x; + size.ly = res.ly / values.dpi.y; + values.width = tround(size.lx * 100.0) / 100.0; + values.height = tround(size.ly * 100.0) / 100.0; + } else { + values.width = -1.0; + values.height = -1.0; + } + + // image res + TDimension imgRes = sl->getResolution(); + values.imageRes = + QString::number(imgRes.lx) + "x" + QString::number(imgRes.ly); + + // subsampling + values.subsampling = sl->getProperties()->getSubsampling(); + + values.doPremulti = + (sl->getProperties()->doPremultiply()) ? Qt::Checked : Qt::Unchecked; + values.whiteTransp = + (sl->getProperties()->whiteTransp()) ? Qt::Checked : Qt::Unchecked; + values.doAntialias = (sl->getProperties()->antialiasSoftness() > 0) + ? Qt::Checked + : Qt::Unchecked; + values.softness = sl->getProperties()->antialiasSoftness(); + } + } + + // gather dirty flags (subsampling is editable for only non-dirty levels) + if (sl && sl->getProperties()->getDirtyFlag()) values.isDirty = Qt::Checked; + + return values; +} + //----------------------------------------------------------------------------- /*! Update popup value. Take current level and act on level type set popup value. */ void LevelSettingsPopup::updateLevelSettings() { TApp *app = TApp::instance(); - TXshLevelP selectedLevel; + m_selectedLevels.clear(); CastSelection *castSelection = dynamic_cast(app->getCurrentSelection()->getSelection()); TCellSelection *cellSelection = dynamic_cast( @@ -406,58 +768,46 @@ void LevelSettingsPopup::updateLevelSettings() { app->getCurrentSelection()->getSelection()); FxSelection *fxSelection = dynamic_cast(app->getCurrentSelection()->getSelection()); - - /*--セル選択の場合--*/ + // - - - Cell Selection if (cellSelection) { TXsheet *currentXsheet = app->getCurrentXsheet()->getXsheet(); if (currentXsheet && !cellSelection->isEmpty()) { - selectedLevel = 0; int r0, c0, r1, c1; cellSelection->getSelectedCells(r0, c0, r1, c1); - for (int c = c0; c <= c1; c++) { - for (int r = r0; r <= r1; r++) { - if (currentXsheet->getCell(r, c).m_level) { - selectedLevel = currentXsheet->getCell(r, c).m_level; - break; - } - } - if (selectedLevel) break; - } + for (int c = c0; c <= c1; c++) + for (int r = r0; r <= r1; r++) + if (TXshLevelP level = currentXsheet->getCell(r, c).m_level) + m_selectedLevels.insert(level); } else - selectedLevel = app->getCurrentLevel()->getLevel(); + m_selectedLevels.insert(app->getCurrentLevel()->getLevel()); } - /*--カラム選択の場合--*/ + // - - - Column Selection else if (columnSelection) { TXsheet *currentXsheet = app->getCurrentXsheet()->getXsheet(); if (currentXsheet && !columnSelection->isEmpty()) { - selectedLevel = 0; - int sceneLength = currentXsheet->getFrameCount(); - + int sceneLength = currentXsheet->getFrameCount(); std::set columnIndices = columnSelection->getIndices(); std::set::iterator it; - /*-- 選択Columnを探索、最初に見つかったLevelの内容を表示 --*/ for (it = columnIndices.begin(); it != columnIndices.end(); ++it) { int columnIndex = *it; - for (int r = 0; r < sceneLength; r++) { - if (currentXsheet->getCell(r, columnIndex).m_level) { - selectedLevel = currentXsheet->getCell(r, columnIndex).m_level; - break; - } - } - if (selectedLevel) break; + int r0, r1; + currentXsheet->getCellRange(columnIndex, r0, r1); + if (r1 < 0) continue; // skip empty column + for (int r = r0; r <= r1; r++) + if (TXshLevelP level = currentXsheet->getCell(r, columnIndex).m_level) + m_selectedLevels.insert(level); } } else - selectedLevel = app->getCurrentLevel()->getLevel(); - } else if (castSelection) { + m_selectedLevels.insert(app->getCurrentLevel()->getLevel()); + } + // - - - Cast Selection + else if (castSelection) { std::vector levels; castSelection->getSelectedLevels(levels); - - int selectedLevelSize = levels.size(); - if (selectedLevelSize > 0) selectedLevel = levels[selectedLevelSize - 1]; + for (TXshLevel *level : levels) m_selectedLevels.insert(level); } - /*-- Fx選択(Schematicノード選択)の場合 --*/ + // - - - Schematic Nodes Selection else if (fxSelection) { - selectedLevel = 0; TXsheet *currentXsheet = app->getCurrentXsheet()->getXsheet(); QList selectedFxs = fxSelection->getFxs(); if (currentXsheet && !selectedFxs.isEmpty()) { @@ -465,192 +815,120 @@ void LevelSettingsPopup::updateLevelSettings() { TLevelColumnFx *lcfx = dynamic_cast(selectedFxs.at(f).getPointer()); if (lcfx) { - int firstRow = lcfx->getXshColumn()->getCellColumn()->getFirstRow(); - TXshLevelP levelP = - lcfx->getXshColumn()->getCellColumn()->getCell(firstRow).m_level; - if (levelP) { - selectedLevel = levelP; - break; - } + int r0, r1; + int firstRow = + lcfx->getXshColumn()->getCellColumn()->getRange(r0, r1); + for (int r = r0; r <= r1; r++) + if (TXshLevelP level = + lcfx->getXshColumn()->getCellColumn()->getCell(r).m_level) + m_selectedLevels.insert(level); } } - if (!selectedLevel) selectedLevel = app->getCurrentLevel()->getLevel(); + if (m_selectedLevels.isEmpty()) + m_selectedLevels.insert(app->getCurrentLevel()->getLevel()); } else - selectedLevel = app->getCurrentLevel()->getLevel(); - // std::cout<<"fxSelection is current!"<getCurrentLevel()->getLevel()); } else - selectedLevel = app->getCurrentLevel()->getLevel(); - - m_sl = dynamic_cast(selectedLevel.getPointer()); - m_pl = dynamic_cast(selectedLevel.getPointer()); - m_cl = dynamic_cast(selectedLevel.getPointer()); - m_sdl = dynamic_cast(selectedLevel.getPointer()); - - bool isSimpleLevel = m_sl; - bool isChildLevel = m_cl; - bool isRasterLevel = m_sl && (m_sl->getType() & RASTER_TYPE); - bool isTzpLevel = m_sl && (m_sl->getType() == TZP_XSHLEVEL); - bool isMeshLevel = m_sl && (m_sl->getType() == MESH_XSHLEVEL); - - bool hasDpiEditing = (isRasterLevel || isMeshLevel); - - // name - if (selectedLevel) { - m_nameFld->setText(::to_string(selectedLevel->getName()).c_str()); - m_nameFld->setEnabled(true); - } else { - m_nameFld->setText(tr("")); - m_nameFld->setEnabled(false); + m_selectedLevels.insert(app->getCurrentLevel()->getLevel()); + + // Unite flags, Remove unsupported items + unsigned int levelTypeFlag = 0; + QSet::iterator lvl_itr = m_selectedLevels.begin(); + while (lvl_itr != m_selectedLevels.end()) { + SelectedLevelType type = getType(*lvl_itr); + if (type == None || type == Others) + lvl_itr = m_selectedLevels.erase(lvl_itr); + else { + levelTypeFlag |= type; + ++lvl_itr; + } } - - // path - if (m_sl) { - m_pathFld->setPath(toQString(m_sl->getPath())); - if (m_scanPathFld) - m_scanPathFld->setPath(toQString(m_sl->getScannedPath())); - } else if (m_pl) { - m_pathFld->setPath(toQString(m_pl->getPath())); - if (m_scanPathFld) m_scanPathFld->setPath(tr("")); - } else if (m_sdl) { - m_pathFld->setPath(toQString(m_sdl->getPath())); - if (m_scanPathFld) m_scanPathFld->setPath(tr("")); - } else { - m_pathFld->setPath(tr("")); - if (m_scanPathFld) m_scanPathFld->setPath(tr("")); + if (m_selectedLevels.count() >= 2) + levelTypeFlag |= MultiSelection; + else if (m_selectedLevels.isEmpty()) + levelTypeFlag |= NoSelection; + + // Enable / Disable all widgets + QMap::iterator w_itr = m_activateFlags.begin(); + while (w_itr != m_activateFlags.end()) { + unsigned int activateFlag = w_itr.value(); + w_itr.key()->setEnabled((levelTypeFlag & activateFlag) == levelTypeFlag); + ++w_itr; } - // leveltype - QString levelTypeString = QString(tr("")); - if (m_sl) { - switch (m_sl->getType()) { - case TZI_XSHLEVEL: - levelTypeString = tr("Scan level"); - break; - case PLI_XSHLEVEL: - levelTypeString = tr("Toonz Vector level"); - break; - case TZP_XSHLEVEL: - levelTypeString = tr("Toonz Raster level"); - break; - case OVL_XSHLEVEL: - levelTypeString = tr("Raster level"); - break; - case MESH_XSHLEVEL: - levelTypeString = tr("Mesh level"); - break; - default: - levelTypeString = "?"; - break; - } - } else if (m_pl) - levelTypeString = tr("Palette level"); - else if (m_sdl) - levelTypeString = tr("Sound Column"); - - m_typeLabel->setText(levelTypeString); - - // dpi & res & resampling - if (hasDpiEditing) { - LevelProperties::DpiPolicy dpiPolicy = - m_sl->getProperties()->getDpiPolicy(); - assert(dpiPolicy == LevelProperties::DP_ImageDpi || - dpiPolicy == LevelProperties::DP_CustomDpi); - m_dpiTypeOm->setCurrentIndex( - (dpiPolicy == LevelProperties::DP_ImageDpi) ? 0 : 1); - - // dpi field - TPointD dpi = m_sl->getDpi(); - m_dpiFld->setText(dpiToString(dpi)); - m_dpiFld->setCursorPosition(0); - - // image dpi - m_imageDpiLabel->setText(dpiToString(m_sl->getImageDpi())); - - if (isRasterLevel) { - // size field - TDimensionD size(0, 0); - TDimension res = m_sl->getResolution(); - if (res.lx > 0 && res.ly > 0 && dpi.x > 0 && dpi.y > 0) { - size.lx = res.lx / dpi.x; - size.ly = res.ly / dpi.y; - m_widthFld->setValue(tround(size.lx * 100.0) / 100.0); - m_heightFld->setValue(tround(size.ly * 100.0) / 100.0); - } else { - m_widthFld->setText(tr("")); - m_heightFld->setText(tr("")); - } - - // image res - TDimension imageRes = m_sl->getResolution(); - m_imageResLabel->setText(QString::number(imageRes.lx) + "x" + - QString::number(imageRes.ly)); - - // subsampling - m_subsamplingFld->setValue(m_sl->getProperties()->getSubsampling()); - - // doPremultiply - m_doPremultiply->setChecked(m_sl->getProperties()->doPremultiply()); - if (m_whiteTransp) - m_whiteTransp->setChecked(m_sl->getProperties()->whiteTransp()); - - m_antialiasSoftness->setValue(m_sl->getProperties()->antialiasSoftness()); - m_doAntialias->setChecked(m_sl->getProperties()->antialiasSoftness() > 0); - } - } else { - m_dpiFld->setText(tr("")); - m_widthFld->setText(tr("")); - m_heightFld->setText(tr("")); - - m_cameraDpiLabel->setText(tr("")); - m_imageDpiLabel->setText(tr("")); - m_imageResLabel->setText(tr("")); - - m_subsamplingFld->setText(tr("")); - - m_doPremultiply->setChecked(false); - m_doAntialias->setChecked(false); - if (m_whiteTransp) m_whiteTransp->setChecked(false); + // Gather values + LevelSettingsValues values; + lvl_itr = m_selectedLevels.begin(); + while (lvl_itr != m_selectedLevels.end()) { + TXshLevelP level = *lvl_itr; + bool isFirst = (lvl_itr == m_selectedLevels.begin()); + LevelSettingsValues new_val = getValues(level); + + uniteValue(values.name, new_val.name, isFirst); + uniteValue(values.path, new_val.path, isFirst); + uniteValue(values.scanPath, new_val.scanPath, isFirst); + uniteValue(values.typeStr, new_val.typeStr, isFirst); + uniteValue(values.dpiType, new_val.dpiType, isFirst); + uniteValue(values.dpi, new_val.dpi, isFirst); + uniteValue(values.width, new_val.width, isFirst); + uniteValue(values.height, new_val.height, isFirst); + uniteValue(values.imageDpi, new_val.imageDpi, isFirst); + uniteValue(values.imageRes, new_val.imageRes, isFirst); + uniteValue(values.doPremulti, new_val.doPremulti, isFirst); + uniteValue(values.whiteTransp, new_val.whiteTransp, isFirst); + uniteValue(values.doAntialias, new_val.doAntialias, isFirst); + uniteValue(values.softness, new_val.softness, isFirst); + uniteValue(values.subsampling, new_val.subsampling, isFirst); + uniteValue(values.isDirty, new_val.isDirty, isFirst); + + ++lvl_itr; } - // camera dpi - m_cameraDpiLabel->setText(dpiToString(getCurrentCameraDpi())); + m_nameFld->setText(values.name); + m_pathFld->setPath(values.path); + m_scanPathFld->setPath(values.scanPath); + m_typeLabel->setText(values.typeStr); + m_dpiTypeOm->setCurrentIndex(values.dpiType); + m_dpiFld->setText(dpiToString(values.dpi)); + if (values.width <= 0.0) { + m_widthFld->setValue(0.0); + m_widthFld->setText((values.width < 0.0) ? tr("[Various]") : tr("")); + } else + m_widthFld->setValue(values.width); + if (values.height <= 0.0) { + m_heightFld->setValue(0.0); + m_heightFld->setText((values.height < 0.0) ? tr("[Various]") : tr("")); + } else + m_heightFld->setValue(values.height); - m_nameFld->setEnabled((isSimpleLevel || isChildLevel || !!m_pl || !!m_sdl)); - m_pathFld->setEnabled((isSimpleLevel || !!m_sdl || !!m_pl)); - if (m_scanPathLabel) m_scanPathLabel->setEnabled(isTzpLevel); - if (m_scanPathFld) m_scanPathFld->setEnabled(isTzpLevel); - m_typeLabel->setEnabled(isSimpleLevel || !!m_pl || !!m_sdl); - m_dpiTypeOm->setEnabled((isSimpleLevel && m_sl->getImageDpi() != TPointD())); - m_squarePixCB->setEnabled(hasDpiEditing); - m_dpiLabel->setEnabled(hasDpiEditing); - m_dpiFld->setEnabled(hasDpiEditing); - m_widthLabel->setEnabled(isRasterLevel); - m_widthFld->setEnabled(isRasterLevel); - m_heightLabel->setEnabled(isRasterLevel); - m_heightFld->setEnabled(isRasterLevel); - m_useCameraDpiBtn->setEnabled(hasDpiEditing); - m_subsamplingLabel->setEnabled( - (isRasterLevel && m_sl && !m_sl->getProperties()->getDirtyFlag())); - m_subsamplingFld->setEnabled( - (isRasterLevel && m_sl && !m_sl->getProperties()->getDirtyFlag())); - m_doPremultiply->setEnabled(m_sl && isRasterLevel && !isTzpLevel); - m_doAntialias->setEnabled(m_sl && isRasterLevel); - if (m_whiteTransp) - m_whiteTransp->setEnabled(m_sl && isRasterLevel && !isTzpLevel); + m_cameraDpiLabel->setText(dpiToString(getCurrentCameraDpi())); + m_imageDpiLabel->setText(values.imageDpi); + m_imageResLabel->setText(values.imageRes); + + m_doPremultiply->setCheckState(values.doPremulti); + m_whiteTransp->setCheckState(values.whiteTransp); + m_doAntialias->setCheckState(values.doAntialias); + if (values.softness < 0) + m_antialiasSoftness->setText(""); + else + m_antialiasSoftness->setValue(values.softness); + if (values.subsampling < 0) + m_subsamplingFld->setText(""); + else + m_subsamplingFld->setValue(values.subsampling); + // disable the softness field when the antialias is not active + if (m_doAntialias->checkState() != Qt::Checked) + m_antialiasSoftness->setDisabled(true); + // disable the subsampling field when dirty level is selected + if (values.isDirty != Qt::Unchecked) m_subsamplingFld->setDisabled(true); } //----------------------------------------------------------------------------- void LevelSettingsPopup::onNameChanged() { - QString text = m_nameFld->text(); - TXshLevel *level = 0; - if (m_sl) - level = m_sl.getPointer(); - else if (m_cl) - level = m_cl.getPointer(); - else - return; - + assert(m_selectedLevels.size() == 1); + if (m_selectedLevels.size() != 1) return; + QString text = m_nameFld->text(); if (text.length() == 0) { error("The name " + text + " you entered for the level is not valid.\n Please enter a different " @@ -659,11 +937,12 @@ void LevelSettingsPopup::onNameChanged() { return; } - /*-- Level名に変更がない場合 --*/ - if (level->getName() == text.toStdWString()) { - // warning("Level name unchanged."); - return; - } + TXshLevel *level = m_selectedLevels.begin()->getPointer(); + if ((getType(level) & (SimpleLevel | SubXsheet)) == 0) return; + + // in case the level name is not changed + QString oldName = QString::fromStdWString(level->getName()); + if (oldName == text) return; TLevelSet *levelSet = TApp::instance()->getCurrentScene()->getScene()->getLevelSet(); @@ -676,6 +955,9 @@ void LevelSettingsPopup::onNameChanged() { return; } + TUndoManager::manager()->add( + new LevelSettingsUndo(level, LevelSettingsUndo::Name, oldName, text)); + TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); TApp::instance()->getCurrentScene()->notifyCastChange(); } @@ -683,21 +965,31 @@ void LevelSettingsPopup::onNameChanged() { //----------------------------------------------------------------------------- void LevelSettingsPopup::onPathChanged() { + assert(m_selectedLevels.size() == 1); + if (m_selectedLevels.size() != 1) return; + TXshLevelP levelP = *m_selectedLevels.begin(); + if ((m_activateFlags[m_pathFld] & getType(levelP)) == 0) return; + QString text = m_pathFld->getPath(); TFilePath newPath(text.toStdWString()); newPath = TApp::instance()->getCurrentScene()->getScene()->codeFilePath(newPath); m_pathFld->setPath(QString::fromStdWString(newPath.getWideString())); - if (!m_sl && !!m_sdl) { + + TXshSoundLevelP sdl = levelP->getSoundLevel(); + if (sdl) { // old level is a sound level TFileType::Type levelType = TFileType::getInfo(newPath); if (levelType == TFileType::AUDIO_LEVEL) { - TFilePath oldPath = m_sdl->getPath(); + TFilePath oldPath = sdl->getPath(); if (oldPath == newPath) return; - m_sdl->setPath(newPath); - m_sdl->loadSoundTrack(); + sdl->setPath(newPath); + sdl->loadSoundTrack(); TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); TApp::instance()->getCurrentXsheet()->notifyXsheetSoundChanged(); + TUndoManager::manager()->add( + new LevelSettingsUndo(levelP.getPointer(), LevelSettingsUndo::Path, + oldPath.getQString(), newPath.getQString())); } else { error(tr("The file %1 is not a sound level.") .arg(QString::fromStdWString(newPath.getLevelNameW()))); @@ -706,36 +998,39 @@ void LevelSettingsPopup::onPathChanged() { return; } - if (!m_sl) return; - TFilePath oldPath = m_sl->getPath(); + TXshSimpleLevelP sl = levelP->getSimpleLevel(); + TXshPaletteLevelP pl = levelP->getPaletteLevel(); + if (!sl && !pl) return; + TFilePath oldPath = (sl) ? sl->getPath() : pl->getPath(); if (oldPath == newPath) return; TLevelSet *levelSet = TApp::instance()->getCurrentScene()->getScene()->getLevelSet(); - TXshSimpleLevel *sl = 0; + TXshLevel *lvlWithSamePath = nullptr; for (int i = 0; i < levelSet->getLevelCount(); i++) { - TXshLevel *xl = levelSet->getLevel(i); - if (!xl) continue; - sl = xl->getSimpleLevel(); - if (!sl) continue; - if (sl == m_sl.getPointer()) { - sl = 0; - continue; + TXshLevel *tmpLvl = levelSet->getLevel(i); + if (!tmpLvl) continue; + if (tmpLvl == levelP.getPointer()) continue; + TXshSimpleLevelP tmpSl = tmpLvl->getSimpleLevel(); + TXshPaletteLevelP tmpPl = tmpLvl->getPaletteLevel(); + if (!tmpSl && !tmpPl) continue; + TFilePath tmpPath = (tmpSl) ? tmpSl->getPath() : tmpPl->getPath(); + if (tmpPath == newPath) { + lvlWithSamePath = tmpLvl; + break; } - if (sl->getPath() == newPath) break; - sl = 0; } - if (sl) { + if (lvlWithSamePath) { QString question; question = "The path you entered for the level " + - QString(::to_string(sl->getName()).c_str()) + + QString(::to_string(lvlWithSamePath->getName()).c_str()) + "is already used: this may generate some conflicts in the file " "management.\nAre you sure you want to assign the same path to " "two different levels?"; int ret = DVGui::MsgBox(question, QObject::tr("Yes"), QObject::tr("No")); if (ret == 0 || ret == 2) { - m_pathFld->setPath(toQString(m_sl->getPath())); + m_pathFld->setPath(toQString(oldPath)); return; } } @@ -743,65 +1038,91 @@ void LevelSettingsPopup::onPathChanged() { TFileType::Type oldType = TFileType::getInfo(oldPath); TFileType::Type newType = TFileType::getInfo(newPath); - if (m_sl->getType() == TZP_XSHLEVEL && - m_sl->getScannedPath() != TFilePath()) { - if (newPath == TFilePath() || newPath == m_sl->getScannedPath()) { - newPath = m_sl->getScannedPath(); - m_sl->setType(OVL_XSHLEVEL); - m_sl->setScannedPath(TFilePath()); - m_sl->setPath(newPath); + if (sl && sl->getType() == TZP_XSHLEVEL && + sl->getScannedPath() != TFilePath()) { + if (newPath == TFilePath() || newPath == sl->getScannedPath()) { + newPath = sl->getScannedPath(); + sl->setType(OVL_XSHLEVEL); + sl->setScannedPath(TFilePath()); + sl->setPath(newPath); TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); TApp::instance()->getCurrentScene()->notifyCastChange(); updateLevelSettings(); - m_sl->invalidateFrames(); + sl->invalidateFrames(); std::vector frames; - m_sl->getFids(frames); + sl->getFids(frames); for (auto const &fid : frames) { - IconGenerator::instance()->invalidate(m_sl.getPointer(), fid); + IconGenerator::instance()->invalidate(sl.getPointer(), fid); } + TUndoManager::manager()->beginBlock(); + TUndoManager::manager()->add( + new LevelSettingsUndo(levelP.getPointer(), LevelSettingsUndo::Path, + oldPath.getQString(), newPath.getQString())); + TUndoManager::manager()->add(new LevelSettingsUndo( + levelP.getPointer(), LevelSettingsUndo::ScanPath, + newPath.getQString(), QString())); + TUndoManager::manager()->add(new LevelSettingsUndo( + levelP.getPointer(), LevelSettingsUndo::LevelType, TZP_XSHLEVEL, + OVL_XSHLEVEL)); + TUndoManager::manager()->endBlock(); return; } } if (oldType != newType || - m_sl->getType() == TZP_XSHLEVEL && newPath.getType() != "tlv" || - m_sl->getType() != TZP_XSHLEVEL && newPath.getType() == "tlv") { + (sl && sl->getType() == TZP_XSHLEVEL && newPath.getType() != "tlv") || + (sl && sl->getType() != TZP_XSHLEVEL && newPath.getType() == "tlv") || + (pl && newPath.getType() != "tpl")) { error("Wrong path"); - m_pathFld->setPath(toQString(m_sl->getPath())); + m_pathFld->setPath(toQString(oldPath)); return; } - /*-- ここでPathを更新 --*/ - m_sl->setPath(newPath); - TApp::instance() - ->getPaletteController() - ->getCurrentLevelPalette() - ->setPalette(m_sl->getPalette()); - + //-- update the path here + if (sl) { + sl->setPath(newPath); + TApp::instance() + ->getPaletteController() + ->getCurrentLevelPalette() + ->setPalette(sl->getPalette()); + sl->invalidateFrames(); + std::vector frames; + sl->getFids(frames); + for (auto const &fid : frames) { + IconGenerator::instance()->invalidate(sl.getPointer(), fid); + } + } else if (pl) { + pl->setPath(newPath); + TApp::instance() + ->getPaletteController() + ->getCurrentLevelPalette() + ->setPalette(pl->getPalette()); + pl->load(); + } TApp::instance()->getCurrentLevel()->notifyLevelChange(); TApp::instance()->getCurrentScene()->notifySceneChanged(); TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); - m_sl->invalidateFrames(); - std::vector frames; - m_sl->getFids(frames); - for (auto const &fid : frames) { - IconGenerator::instance()->invalidate(m_sl.getPointer(), fid); - } updateLevelSettings(); + TUndoManager::manager()->add( + new LevelSettingsUndo(levelP.getPointer(), LevelSettingsUndo::Path, + oldPath.getQString(), newPath.getQString())); } //----------------------------------------------------------------------------- void LevelSettingsPopup::onScanPathChanged() { + assert(m_selectedLevels.size() == 1); + if (m_selectedLevels.size() != 1) return; + TXshLevelP levelP = *m_selectedLevels.begin(); + TXshSimpleLevelP sl = levelP->getSimpleLevel(); + if (!sl || sl->getType() != TZP_XSHLEVEL) return; + QString text = m_scanPathFld->getPath(); TFilePath newScanPath(text.toStdWString()); - /*--対応する拡張子で無い場合は、表示を元に戻してreturn--*/ - /* TODO: - * 他のFormatはDPI情報が無いため省いているが、ラスタ画像なら問題ないか?後で検討のこと - * 2016/1/30 shun_iwasawa */ + // limit the avaiable formats for now if (newScanPath.getType() != "tif" && newScanPath.getType() != "tiff" && newScanPath.getType() != "tzi") { - m_scanPathFld->setPath(toQString(m_sl->getScannedPath())); + m_scanPathFld->setPath(toQString(sl->getScannedPath())); return; } @@ -809,13 +1130,11 @@ void LevelSettingsPopup::onScanPathChanged() { newScanPath); m_scanPathFld->setPath(QString::fromStdWString(newScanPath.getWideString())); - if (!m_sl || m_sl->getType() != TZP_XSHLEVEL) return; - - /*-- 入力されたScanPathに変更がなければreturn--*/ - TFilePath oldScanPath = m_sl->getScannedPath(); + TFilePath oldScanPath = sl->getScannedPath(); if (oldScanPath == newScanPath) return; - /*-- CleanupSettingsのSaveInが今のLevelと一致しているかどうかをチェック --*/ + // check if the "Cleanup Settings > SaveIn" value is the same as the current + // level TFilePath settingsPath = (newScanPath.getParentDir() + newScanPath.getName()).withType("cln"); settingsPath = @@ -842,8 +1161,8 @@ void LevelSettingsPopup::onScanPathChanged() { TFilePath codedCleanupLevelPath = TApp::instance()->getCurrentScene()->getScene()->codeFilePath( cleanupLevelPath); - if (m_sl->getPath().getParentDir() != cleanupLevelPath && - m_sl->getPath().getParentDir() != codedCleanupLevelPath) + if (sl->getPath().getParentDir() != cleanupLevelPath && + sl->getPath().getParentDir() != codedCleanupLevelPath) DVGui::warning( "\"Save In\" path of the Cleanup Settings does not match."); } else @@ -851,30 +1170,43 @@ void LevelSettingsPopup::onScanPathChanged() { } else DVGui::warning(".cln file for the Scanned Level not found."); - m_sl->setScannedPath(newScanPath); + sl->setScannedPath(newScanPath); TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); updateLevelSettings(); + TUndoManager::manager()->add(new LevelSettingsUndo( + levelP.getPointer(), LevelSettingsUndo::ScanPath, + oldScanPath.getQString(), newScanPath.getQString())); } //----------------------------------------------------------------------------- void LevelSettingsPopup::onDpiTypeChanged(int index) { - if (!m_sl || m_sl->getType() == PLI_XSHLEVEL) return; - QString dpiPolicyStr = m_dpiTypeOm->itemData(index).toString(); - assert(dpiPolicyStr == "Custom DPI" || dpiPolicyStr == "Image DPI"); - LevelProperties *prop = m_sl->getProperties(); - - // dpiPolicyStr ==> dpiPolicy - LevelProperties::DpiPolicy dpiPolicy = dpiPolicyStr == "Custom DPI" - ? LevelProperties::DP_CustomDpi - : LevelProperties::DP_ImageDpi; - // se ImageDpi, ma l'immagine non ha dpi -> CustomDpi - assert(dpiPolicy == LevelProperties::DP_CustomDpi || - m_sl->getImageDpi().x > 0.0 && m_sl->getImageDpi().y > 0.0); - - if (prop->getDpiPolicy() == dpiPolicy) return; - prop->setDpiPolicy(dpiPolicy); + TUndoManager::manager()->beginBlock(); + QSetIterator levelItr(m_selectedLevels); + while (levelItr.hasNext()) { + TXshLevelP levelP = levelItr.next(); + TXshSimpleLevelP sl = levelP->getSimpleLevel(); + if (!sl || sl->getType() == PLI_XSHLEVEL) continue; + QString dpiPolicyStr = m_dpiTypeOm->itemData(index).toString(); + assert(dpiPolicyStr == "Custom DPI" || dpiPolicyStr == "Image DPI"); + LevelProperties *prop = sl->getProperties(); + // dpiPolicyStr ==> dpiPolicy + LevelProperties::DpiPolicy dpiPolicy = dpiPolicyStr == "Custom DPI" + ? LevelProperties::DP_CustomDpi + : LevelProperties::DP_ImageDpi; + // se ImageDpi, ma l'immagine non ha dpi -> CustomDpi + assert(dpiPolicy == LevelProperties::DP_CustomDpi || + sl->getImageDpi().x > 0.0 && sl->getImageDpi().y > 0.0); + + if (prop->getDpiPolicy() == dpiPolicy) continue; + LevelProperties::DpiPolicy oldPolicy = prop->getDpiPolicy(); + prop->setDpiPolicy(dpiPolicy); + TUndoManager::manager()->add(new LevelSettingsUndo( + levelP.getPointer(), LevelSettingsUndo::DpiType, oldPolicy, dpiPolicy)); + } + TUndoManager::manager()->endBlock(); + TApp::instance()->getCurrentScene()->setDirtyFlag(true); TApp::instance()->getCurrentLevel()->notifyLevelChange(); @@ -884,9 +1216,7 @@ void LevelSettingsPopup::onDpiTypeChanged(int index) { //----------------------------------------------------------------------------- void LevelSettingsPopup::onDpiFieldChanged() { - QString w = m_dpiFld->text(); - if (!m_sl || m_sl->getType() == PLI_XSHLEVEL) return; - + QString w = m_dpiFld->text(); std::string s = w.toStdString(); TPointD dpi; @@ -908,12 +1238,33 @@ void LevelSettingsPopup::onDpiFieldChanged() { dpi.y = std::stod(s.substr(i)); } } - - if (dpi.x > 0.0) { - if (dpi.y == 0.0) dpi.y = dpi.x; - m_sl->getProperties()->setDpiPolicy(LevelProperties::DP_CustomDpi); - m_sl->getProperties()->setDpi(dpi); + if (dpi.x <= 0.0) { + updateLevelSettings(); + return; } + if (dpi.y == 0.0) dpi.y = dpi.x; + + TUndoManager::manager()->beginBlock(); + QSetIterator levelItr(m_selectedLevels); + while (levelItr.hasNext()) { + TXshLevelP levelP = levelItr.next(); + TXshSimpleLevelP sl = levelP->getSimpleLevel(); + if (!sl || sl->getType() == PLI_XSHLEVEL) continue; + TPointD oldDpi = sl->getProperties()->getDpi(); + if (oldDpi == dpi) continue; + + LevelProperties::DpiPolicy oldPolicy = sl->getProperties()->getDpiPolicy(); + sl->getProperties()->setDpiPolicy(LevelProperties::DP_CustomDpi); + sl->getProperties()->setDpi(dpi); + + TUndoManager::manager()->add( + new LevelSettingsUndo(levelP.getPointer(), LevelSettingsUndo::DpiType, + oldPolicy, LevelProperties::DP_CustomDpi)); + TUndoManager::manager()->add(new LevelSettingsUndo( + levelP.getPointer(), LevelSettingsUndo::Dpi, + QPointF(oldDpi.x, oldDpi.y), QPointF(dpi.x, dpi.y))); + } + TUndoManager::manager()->endBlock(); updateLevelSettings(); TApp::instance()->getCurrentScene()->setDirtyFlag(true); TApp::instance()->getCurrentLevel()->notifyLevelChange(); @@ -922,14 +1273,28 @@ void LevelSettingsPopup::onDpiFieldChanged() { //----------------------------------------------------------------------------- void LevelSettingsPopup::onSquarePixelChanged(int value) { - if (!m_sl || m_sl->getType() == PLI_XSHLEVEL) return; if (!value) return; - TPointD dpi = m_sl->getDpi(); - if (areAlmostEqual(dpi.x, dpi.y)) return; - TDimension res = m_sl->getResolution(); - dpi.y = dpi.x; - m_sl->getProperties()->setDpiPolicy(LevelProperties::DP_CustomDpi); - m_sl->getProperties()->setDpi(dpi); + TUndoManager::manager()->beginBlock(); + QSetIterator levelItr(m_selectedLevels); + while (levelItr.hasNext()) { + TXshLevelP levelP = levelItr.next(); + TXshSimpleLevelP sl = levelP->getSimpleLevel(); + if (!sl || sl->getType() == PLI_XSHLEVEL) continue; + TPointD oldDpi = sl->getDpi(); + if (areAlmostEqual(oldDpi.x, oldDpi.y)) continue; + TPointD dpi(oldDpi.x, oldDpi.x); + LevelProperties::DpiPolicy oldPolicy = sl->getProperties()->getDpiPolicy(); + sl->getProperties()->setDpiPolicy(LevelProperties::DP_CustomDpi); + sl->getProperties()->setDpi(dpi); + + TUndoManager::manager()->add( + new LevelSettingsUndo(levelP.getPointer(), LevelSettingsUndo::DpiType, + oldPolicy, LevelProperties::DP_CustomDpi)); + TUndoManager::manager()->add(new LevelSettingsUndo( + levelP.getPointer(), LevelSettingsUndo::Dpi, + QPointF(oldDpi.x, oldDpi.y), QPointF(dpi.x, dpi.y))); + } + TUndoManager::manager()->endBlock(); updateLevelSettings(); TApp::instance()->getCurrentScene()->setDirtyFlag(true); TApp::instance()->getCurrentLevel()->notifyLevelChange(); @@ -938,29 +1303,38 @@ void LevelSettingsPopup::onSquarePixelChanged(int value) { //----------------------------------------------------------------------------- void LevelSettingsPopup::onWidthFieldChanged() { - if (!m_sl || m_sl->getType() == PLI_XSHLEVEL) return; - TDimension res = m_sl->getResolution(); - TPointD dpi = m_sl->getDpi(); - if (dpi.x <= 0) return; - double oldLx = res.lx / dpi.x; - double lx = m_widthFld->getValue(); - double ly = m_heightFld->getValue(); + double lx = m_widthFld->getValue(); if (lx <= 0) { - lx = oldLx; - m_widthFld->setValue(oldLx); + updateLevelSettings(); + return; } - if (m_squarePixCB->isChecked()) { - ly = (double)(res.ly * lx) / (double)res.lx; - m_heightFld->setValue(ly); + TUndoManager::manager()->beginBlock(); + QSetIterator levelItr(m_selectedLevels); + while (levelItr.hasNext()) { + TXshLevelP levelP = levelItr.next(); + TXshSimpleLevelP sl = levelP->getSimpleLevel(); + if (!sl || sl->getType() == PLI_XSHLEVEL) continue; + TPointD dpi = sl->getDpi(); + if (dpi.x <= 0) continue; + TDimension res = sl->getResolution(); + if (res.lx <= 0) continue; + dpi.x = res.lx / lx; + if (m_squarePixCB->isChecked()) dpi.y = dpi.x; + + LevelProperties::DpiPolicy oldPolicy = sl->getProperties()->getDpiPolicy(); + sl->getProperties()->setDpiPolicy(LevelProperties::DP_CustomDpi); + TPointD oldDpi = sl->getProperties()->getDpi(); + sl->getProperties()->setDpi(dpi); + + TUndoManager::manager()->add( + new LevelSettingsUndo(levelP.getPointer(), LevelSettingsUndo::DpiType, + oldPolicy, LevelProperties::DP_CustomDpi)); + TUndoManager::manager()->add(new LevelSettingsUndo( + levelP.getPointer(), LevelSettingsUndo::Dpi, + QPointF(oldDpi.x, oldDpi.y), QPointF(dpi.x, dpi.y))); } - - dpi.x = res.lx / lx; - dpi.y = res.ly / ly; - - m_sl->getProperties()->setDpiPolicy(LevelProperties::DP_CustomDpi); - m_sl->getProperties()->setDpi(dpi); - + TUndoManager::manager()->endBlock(); updateLevelSettings(); TApp::instance()->getCurrentScene()->setDirtyFlag(true); TApp::instance()->getCurrentLevel()->notifyLevelChange(); @@ -969,30 +1343,38 @@ void LevelSettingsPopup::onWidthFieldChanged() { //----------------------------------------------------------------------------- void LevelSettingsPopup::onHeightFieldChanged() { - if (!m_sl || m_sl->getType() == PLI_XSHLEVEL) return; - TDimension res = m_sl->getResolution(); - if (res.ly == 0 || res.ly <= 0) return; - TPointD dpi = m_sl->getDpi(); - if (dpi.y <= 0) return; - double oldLy = res.ly / dpi.y; - double lx = m_widthFld->getValue(); - double ly = m_heightFld->getValue(); + double ly = m_heightFld->getValue(); if (ly <= 0) { - ly = oldLy; - m_heightFld->setValue(oldLy); + updateLevelSettings(); + return; } - if (m_squarePixCB->isChecked()) { - lx = (double)(res.lx * ly) / (double)res.ly; - m_widthFld->setValue(lx); + TUndoManager::manager()->beginBlock(); + QSetIterator levelItr(m_selectedLevels); + while (levelItr.hasNext()) { + TXshLevelP levelP = levelItr.next(); + TXshSimpleLevelP sl = levelP->getSimpleLevel(); + if (!sl || sl->getType() == PLI_XSHLEVEL) continue; + TPointD dpi = sl->getDpi(); + if (dpi.y <= 0) continue; + TDimension res = sl->getResolution(); + if (res.ly <= 0) continue; + dpi.y = res.ly / ly; + if (m_squarePixCB->isChecked()) dpi.x = dpi.y; + + LevelProperties::DpiPolicy oldPolicy = sl->getProperties()->getDpiPolicy(); + sl->getProperties()->setDpiPolicy(LevelProperties::DP_CustomDpi); + TPointD oldDpi = sl->getProperties()->getDpi(); + sl->getProperties()->setDpi(dpi); + + TUndoManager::manager()->add( + new LevelSettingsUndo(levelP.getPointer(), LevelSettingsUndo::DpiType, + oldPolicy, LevelProperties::DP_CustomDpi)); + TUndoManager::manager()->add(new LevelSettingsUndo( + levelP.getPointer(), LevelSettingsUndo::Dpi, + QPointF(oldDpi.x, oldDpi.y), QPointF(dpi.x, dpi.y))); } - - dpi.x = res.lx / lx; - dpi.y = res.ly / ly; - - m_sl->getProperties()->setDpiPolicy(LevelProperties::DP_CustomDpi); - m_sl->getProperties()->setDpi(dpi); - + TUndoManager::manager()->endBlock(); updateLevelSettings(); TApp::instance()->getCurrentScene()->setDirtyFlag(true); TApp::instance()->getCurrentLevel()->notifyLevelChange(); @@ -1001,10 +1383,27 @@ void LevelSettingsPopup::onHeightFieldChanged() { //----------------------------------------------------------------------------- void LevelSettingsPopup::useCameraDpi() { - if (!m_sl) return; - LevelProperties *prop = m_sl->getProperties(); - prop->setDpiPolicy(LevelProperties::DP_CustomDpi); - prop->setDpi(getCurrentCameraDpi()); + TUndoManager::manager()->beginBlock(); + QSetIterator levelItr(m_selectedLevels); + while (levelItr.hasNext()) { + TXshLevelP levelP = levelItr.next(); + TXshSimpleLevelP sl = levelP->getSimpleLevel(); + if (!sl) continue; + LevelProperties *prop = sl->getProperties(); + LevelProperties::DpiPolicy oldPolicy = prop->getDpiPolicy(); + prop->setDpiPolicy(LevelProperties::DP_CustomDpi); + TPointD oldDpi = prop->getDpi(); + TPointD dpi = getCurrentCameraDpi(); + prop->setDpi(dpi); + + TUndoManager::manager()->add( + new LevelSettingsUndo(levelP.getPointer(), LevelSettingsUndo::DpiType, + oldPolicy, LevelProperties::DP_CustomDpi)); + TUndoManager::manager()->add(new LevelSettingsUndo( + levelP.getPointer(), LevelSettingsUndo::Dpi, + QPointF(oldDpi.x, oldDpi.y), QPointF(dpi.x, dpi.y))); + } + TUndoManager::manager()->endBlock(); TApp::instance()->getCurrentScene()->setDirtyFlag(true); TApp::instance()->getCurrentLevel()->notifyLevelChange(); @@ -1014,16 +1413,30 @@ void LevelSettingsPopup::useCameraDpi() { //----------------------------------------------------------------------------- void LevelSettingsPopup::onSubsamplingChanged() { - if (!m_sl || m_sl->getType() == PLI_XSHLEVEL) return; - if (m_sl->getProperties()->getDirtyFlag()) return; - - /*-- subSamplingの値に変更が無い場合はreturn --*/ - if (m_sl->getProperties()->getSubsampling() == - (int)m_subsamplingFld->getValue()) + int subsampling = (int)m_subsamplingFld->getValue(); + if (subsampling <= 0) { + updateLevelSettings(); return; + } - m_sl->getProperties()->setSubsampling((int)m_subsamplingFld->getValue()); - m_sl->invalidateFrames(); + TUndoManager::manager()->beginBlock(); + QSetIterator levelItr(m_selectedLevels); + while (levelItr.hasNext()) { + TXshLevelP levelP = levelItr.next(); + TXshSimpleLevelP sl = levelP->getSimpleLevel(); + if (!sl || sl->getType() == PLI_XSHLEVEL) continue; + if (sl->getProperties()->getDirtyFlag()) continue; + + int oldSubsampling = sl->getProperties()->getSubsampling(); + if (oldSubsampling == subsampling) continue; + + sl->getProperties()->setSubsampling(subsampling); + sl->invalidateFrames(); + TUndoManager::manager()->add(new LevelSettingsUndo( + levelP.getPointer(), LevelSettingsUndo::Subsampling, oldSubsampling, + subsampling)); + } + TUndoManager::manager()->endBlock(); TApp::instance()->getCurrentScene()->setDirtyFlag(true); TApp::instance() @@ -1036,45 +1449,107 @@ void LevelSettingsPopup::onSubsamplingChanged() { //----------------------------------------------------------------------------- -void LevelSettingsPopup::onDoPremultiplyChanged(int value) { - if (!m_sl || m_sl->getType() == PLI_XSHLEVEL) return; - if (value) { - if (m_whiteTransp) m_whiteTransp->setChecked(false); - m_sl->getProperties()->setWhiteTransp(false); +void LevelSettingsPopup::onDoPremultiplyClicked() { + Qt::CheckState state = m_doPremultiply->checkState(); + bool on = (state == Qt::Checked || state == Qt::PartiallyChecked); + + TUndoManager::manager()->beginBlock(); + QSetIterator levelItr(m_selectedLevels); + while (levelItr.hasNext()) { + TXshLevelP levelP = levelItr.next(); + TXshSimpleLevel *sl = levelP->getSimpleLevel(); + if (!sl || sl->getType() == PLI_XSHLEVEL) continue; + LevelProperties *prop = sl->getProperties(); + if (on == prop->doPremultiply()) continue; + if (on && prop->whiteTransp()) { + prop->setWhiteTransp(false); + TUndoManager::manager()->add(new LevelSettingsUndo( + levelP.getPointer(), LevelSettingsUndo::WhiteTransp, true, false)); + } + prop->setDoPremultiply(on); + TUndoManager::manager()->add(new LevelSettingsUndo( + levelP.getPointer(), LevelSettingsUndo::DoPremulti, !on, on)); } - m_sl->getProperties()->setDoPremultiply(value); + TUndoManager::manager()->endBlock(); TApp::instance()->getCurrentLevel()->notifyLevelChange(); + updateLevelSettings(); } //----------------------------------------------------------------------------- void LevelSettingsPopup::onAntialiasSoftnessChanged() { - m_sl->getProperties()->setDoAntialias( - m_doAntialias->isChecked() ? m_antialiasSoftness->getValue() : 0); + int softness = m_antialiasSoftness->getValue(); + TUndoManager::manager()->beginBlock(); + QSetIterator levelItr(m_selectedLevels); + while (levelItr.hasNext()) { + TXshLevelP levelP = levelItr.next(); + TXshSimpleLevel *sl = levelP->getSimpleLevel(); + if (!sl) continue; + int oldSoftness = sl->getProperties()->antialiasSoftness(); + sl->getProperties()->setDoAntialias(softness); + TUndoManager::manager()->add( + new LevelSettingsUndo(levelP.getPointer(), LevelSettingsUndo::Softness, + oldSoftness, softness)); + } + TUndoManager::manager()->endBlock(); TApp::instance()->getCurrentLevel()->notifyLevelChange(); } //---------------------------- -void LevelSettingsPopup::onDoAntialiasChanged(int value) { - if (!m_sl || m_sl->getType() == PLI_XSHLEVEL) return; - m_antialiasSoftness->setEnabled(value != 0); - - m_sl->getProperties()->setDoAntialias( - value == 0 ? 0 : m_antialiasSoftness->getValue()); +void LevelSettingsPopup::onDoAntialiasClicked() { + Qt::CheckState state = m_doAntialias->checkState(); + bool on = (state == Qt::Checked || state == Qt::PartiallyChecked); + int softness = on ? m_antialiasSoftness->getValue() : 0; + + TUndoManager::manager()->beginBlock(); + QSetIterator levelItr(m_selectedLevels); + while (levelItr.hasNext()) { + TXshLevelP levelP = levelItr.next(); + TXshSimpleLevel *sl = levelP->getSimpleLevel(); + if (!sl || sl->getType() == PLI_XSHLEVEL) continue; + + int oldSoftness = sl->getProperties()->antialiasSoftness(); + sl->getProperties()->setDoAntialias(softness); + TUndoManager::manager()->add( + new LevelSettingsUndo(levelP.getPointer(), LevelSettingsUndo::Softness, + oldSoftness, softness)); + } + TUndoManager::manager()->endBlock(); TApp::instance()->getCurrentLevel()->notifyLevelChange(); + updateLevelSettings(); + if (on) { + m_doAntialias->setCheckState(Qt::Checked); + m_antialiasSoftness->setEnabled(true); + } } //----------------------------------------------------------------------------- -void LevelSettingsPopup::onWhiteTranspChanged(int value) { - if (!m_sl || m_sl->getType() == PLI_XSHLEVEL) return; - if (value) { - m_doPremultiply->setChecked(false); - m_sl->getProperties()->setDoPremultiply(false); +void LevelSettingsPopup::onWhiteTranspClicked() { + Qt::CheckState state = m_whiteTransp->checkState(); + bool on = (state == Qt::Checked || state == Qt::PartiallyChecked); + + TUndoManager::manager()->beginBlock(); + QSetIterator levelItr(m_selectedLevels); + while (levelItr.hasNext()) { + TXshLevelP levelP = levelItr.next(); + TXshSimpleLevel *sl = levelP->getSimpleLevel(); + if (!sl || sl->getType() == PLI_XSHLEVEL) continue; + LevelProperties *prop = sl->getProperties(); + if (on == prop->whiteTransp()) continue; + if (on && prop->doPremultiply()) { + prop->setDoPremultiply(false); + TUndoManager::manager()->add(new LevelSettingsUndo( + levelP.getPointer(), LevelSettingsUndo::DoPremulti, true, false)); + } + prop->setWhiteTransp(on); + TUndoManager::manager()->add(new LevelSettingsUndo( + levelP.getPointer(), LevelSettingsUndo::WhiteTransp, !on, on)); } - m_sl->getProperties()->setWhiteTransp(value); + TUndoManager::manager()->endBlock(); TApp::instance()->getCurrentLevel()->notifyLevelChange(); + updateLevelSettings(); } //----------------------------------------------------------------------------- diff --git a/toonz/sources/toonz/levelsettingspopup.h b/toonz/sources/toonz/levelsettingspopup.h index 33fd2b0..e10d36d 100644 --- a/toonz/sources/toonz/levelsettingspopup.h +++ b/toonz/sources/toonz/levelsettingspopup.h @@ -10,6 +10,8 @@ #include "toonz/txshchildlevel.h" #include "toonz/txshsoundlevel.h" +#include + // forward declaration class QLabel; class QComboBox; @@ -25,7 +27,36 @@ class IntLineEdit; class DoubleLineEdit; class MeasuredDoubleLineEdit; class CheckBox; -} +} // namespace DVGui + +enum SelectedLevelType { + None = 0x0, + ToonzRaster = 0x1, + Raster = 0x2, + Mesh = 0x4, + ToonzVector = 0x8, + Palette = 0x10, + SubXsheet = 0x20, + Sound = 0x40, + Others = 0x80, + + MultiSelection = 0x100, + HideOnPixelMode = 0x200, + NoSelection = 0x400, + + SimpleLevel = ToonzRaster | Raster | Mesh | ToonzVector, + HasDPILevel = ToonzRaster | Raster | Mesh, + AllTypes = SimpleLevel | Palette | SubXsheet | Sound +}; + +struct LevelSettingsValues { + QString name, path, scanPath, typeStr, imageDpi, imageRes; + int dpiType = -1, softness = -1, subsampling = -1; + TPointD dpi = TPointD(0, 0); + Qt::CheckState doPremulti = Qt::Unchecked, whiteTransp = Qt::Unchecked, + doAntialias = Qt::Unchecked, isDirty = Qt::Unchecked; + double width = 0.0, height = 0.0; +}; //============================================================================= // LevelSettingsPopup @@ -34,39 +65,34 @@ class CheckBox; class LevelSettingsPopup final : public DVGui::Dialog { Q_OBJECT - TXshSimpleLevelP m_sl; - TXshPaletteLevelP m_pl; - TXshChildLevelP m_cl; - TXshSoundLevelP m_sdl; + QSet m_selectedLevels; + QMap m_activateFlags; DVGui::LineEdit *m_nameFld; DVGui::FileField *m_pathFld; - QLabel *m_scanPathLabel; DVGui::FileField *m_scanPathFld; QLabel *m_typeLabel; QComboBox *m_dpiTypeOm; - QLabel *m_dpiLabel; DVGui::DoubleLineEdit *m_dpiFld; DVGui::CheckBox *m_squarePixCB; - QLabel *m_widthLabel; DVGui::MeasuredDoubleLineEdit *m_widthFld; - QLabel *m_heightLabel; DVGui::MeasuredDoubleLineEdit *m_heightFld; QPushButton *m_useCameraDpiBtn; QLabel *m_cameraDpiLabel; QLabel *m_imageDpiLabel; QLabel *m_imageResLabel; - QLabel *m_cameraDpiTitle; - QLabel *m_imageDpiTitle; - QLabel *m_imageResTitle; DVGui::CheckBox *m_doPremultiply; DVGui::CheckBox *m_whiteTransp; DVGui::CheckBox *m_doAntialias; + QLabel *m_softnessLabel; DVGui::IntLineEdit *m_antialiasSoftness; QLabel *m_subsamplingLabel; DVGui::IntLineEdit *m_subsamplingFld; + SelectedLevelType getType(TXshLevelP); + LevelSettingsValues getValues(TXshLevelP); + public: LevelSettingsPopup(); @@ -74,7 +100,7 @@ protected: void showEvent(QShowEvent *e) override; void hideEvent(QHideEvent *e) override; -public slots: +protected slots: void onCastSelectionChanged(); void onSelectionSwitched(TSelection *oldSelection, TSelection *newSelection); @@ -89,13 +115,12 @@ public slots: void onSquarePixelChanged(int); void useCameraDpi(); void onSubsamplingChanged(); - void onDoPremultiplyChanged(int); - void onDoAntialiasChanged(int); + void onDoPremultiplyClicked(); + void onDoAntialiasClicked(); void onAntialiasSoftnessChanged(); - void onWhiteTranspChanged(int); - -protected slots: + void onWhiteTranspClicked(); void onSceneChanged(); + void onPreferenceChanged(const QString &); }; #endif // LEVELSETTINGSPOPUP_H diff --git a/toonz/sources/toonz/mainwindow.cpp b/toonz/sources/toonz/mainwindow.cpp index 1d972cf..839ca70 100644 --- a/toonz/sources/toonz/mainwindow.cpp +++ b/toonz/sources/toonz/mainwindow.cpp @@ -1603,6 +1603,8 @@ void MainWindow::defineActions() { preferencesAction->setIcon(QIcon(":Resources/preferences.svg")); createMenuFileAction(MI_ShortcutPopup, tr("&Configure Shortcuts..."), ""); createMenuFileAction(MI_PrintXsheet, tr("&Print Xsheet"), ""); + createMenuFileAction(MI_ExportXDTS, + tr("Export Exchange Digital Time Sheet (XDTS)"), ""); createMenuFileAction("MI_RunScript", tr("Run Script..."), ""); createMenuFileAction("MI_OpenScriptConsole", tr("Open Script Console..."), ""); @@ -1834,6 +1836,9 @@ void MainWindow::defineActions() { createMenuCellsAction(MI_FillEmptyCell, tr("&Fill In Empty Cells"), ""); createRightClickMenuAction(MI_SetKeyframes, tr("&Set Key"), "Z"); + createRightClickMenuAction(MI_ShiftKeyframesDown, tr("&Shift Keys Down"), ""); + createRightClickMenuAction(MI_ShiftKeyframesUp, tr("&Shift Keys Up"), ""); + createRightClickMenuAction(MI_PasteNumbers, tr("&Paste Numbers"), ""); createToggle(MI_ViewCamera, tr("&Camera Box"), "", @@ -1970,6 +1975,11 @@ void MainWindow::defineActions() { createMenuWindowsAction(MI_OpenToolbar, tr("&Toolbar"), ""); createMenuWindowsAction(MI_OpenToolOptionBar, tr("&Tool Option Bar"), ""); createMenuWindowsAction(MI_OpenCommandToolbar, tr("&Command Bar"), ""); +#ifdef WITH_STOPMOTION + createMenuWindowsAction(MI_OpenStopMotionPanel, tr("&Stop Motion Controls"), + ""); + +#endif createMenuWindowsAction(MI_OpenLevelView, tr("&Viewer"), ""); #ifdef LINETEST createMenuWindowsAction(MI_OpenLineTestCapture, tr("&LineTest Capture"), ""); @@ -2153,6 +2163,20 @@ void MainWindow::defineActions() { CommandManager::instance()->setToggleTexts(V_ShowHideFullScreen, tr("Full Screen Mode"), tr("Exit Full Screen Mode")); + createRightClickMenuAction(MI_SelectNextGuideStroke, + tr("Select Next Frame Guide Stroke"), ""); + createRightClickMenuAction(MI_SelectPrevGuideStroke, + tr("Select Previous Frame Guide Stroke"), ""); + createRightClickMenuAction(MI_SelectBothGuideStrokes, + tr("Select Prev && Next Frame Guide Strokes"), ""); + createRightClickMenuAction(MI_SelectGuideStrokeReset, + tr("Reset Guide Stroke Selections"), ""); + createRightClickMenuAction(MI_TweenGuideStrokes, + tr("Tween Selected Guide Strokes"), ""); + createRightClickMenuAction(MI_TweenGuideStrokeToSelected, + tr("Tween Guide Strokes to Selected"), ""); + createRightClickMenuAction(MI_SelectGuidesAndTweenMode, + tr("Select Guide Strokes && Tween Mode"), ""); // Following actions are for adding "Visualization" menu items to the command // bar. They are separated from the original actions in order to avoid @@ -2289,6 +2313,20 @@ void MainWindow::defineActions() { ToolCommandType); createMiscAction("A_FxSchematicToggle", tr("Toggle FX/Stage schematic"), ""); +#ifdef WITH_STOPMOTION + createAction(MI_StopMotionCapture, tr("Capture Stop Motion Frame"), ""); + createAction(MI_StopMotionRaiseOpacity, tr("Raise Stop Motion Opacity"), ""); + createAction(MI_StopMotionLowerOpacity, tr("Lower Stop Motion Opacity"), ""); + createAction(MI_StopMotionToggleLiveView, tr("Toggle Stop Motion Live View"), + ""); + createAction(MI_StopMotionToggleZoom, tr("Toggle Stop Motion Zoom"), ""); + createAction(MI_StopMotionLowerSubsampling, + tr("Lower Stop Motion Level Subsampling"), ""); + createAction(MI_StopMotionRaiseSubsampling, + tr("Raise Stop Motion Level Subsampling"), ""); + createAction(MI_StopMotionJumpToCamera, tr("Go to Stop Motion Insert Frame"), + ""); +#endif } //----------------------------------------------------------------------------- diff --git a/toonz/sources/toonz/menubar.cpp b/toonz/sources/toonz/menubar.cpp index 6594948..65a38f4 100644 --- a/toonz/sources/toonz/menubar.cpp +++ b/toonz/sources/toonz/menubar.cpp @@ -1423,6 +1423,9 @@ QMenuBar *StackedMenuBar::createFullMenuBar() { addMenuItem(windowsMenu, MI_OpenTMessage); addMenuItem(windowsMenu, MI_OpenHistoryPanel); addMenuItem(windowsMenu, MI_AudioRecording); +#ifdef WITH_STOPMOTION + addMenuItem(windowsMenu, MI_OpenStopMotionPanel); +#endif addMenuItem(windowsMenu, MI_StartupPopup); #ifdef LINETEST windowsMenu->addSeparator(); diff --git a/toonz/sources/toonz/menubarcommandids.h b/toonz/sources/toonz/menubarcommandids.h index f54c5c6..4460076 100644 --- a/toonz/sources/toonz/menubarcommandids.h +++ b/toonz/sources/toonz/menubarcommandids.h @@ -95,6 +95,7 @@ #define MI_OpenCommandToolbar "MI_OpenCommandToolbar" #define MI_OpenToolOptionBar "MI_OpenToolOptionBar" #define MI_OpenLevelView "MI_OpenLevelView" +#define MI_OpenStopMotionPanel "MI_OpenStopMotionPanel" #ifdef LINETEST #define MI_OpenExport "MI_OpenExport" #define MI_OpenLineTestView "MI_OpenLineTestView" @@ -276,6 +277,9 @@ #define MI_SelectFollowingKeysInRow "MI_SelectFollowingKeysInRow" #define MI_InvertKeyframeSelection "MI_InvertKeyframeSelection" +#define MI_ShiftKeyframesDown "MI_ShiftKeyframesDown" +#define MI_ShiftKeyframesUp "MI_ShiftKeyframesUp" + #define MI_SetAcceleration "MI_SetAcceleration" #define MI_SetDeceleration "MI_SetDeceleration" #define MI_SetConstantSpeed "MI_SetConstantSpeed" @@ -349,6 +353,25 @@ #define MI_TouchGestureControl "MI_TouchGestureControl" #define MI_SeparateColors "MI_SeparateColors" +#define MI_StopMotionCapture "MI_StopMotionCapture" +#define MI_StopMotionRaiseOpacity "MI_StopMotionRaiseOpacity" +#define MI_StopMotionLowerOpacity "MI_StopMotionLowerOpacity" +#define MI_StopMotionToggleLiveView "MI_StopMotionToggleLiveView" +#define MI_StopMotionToggleZoom "MI_StopMotionToggleZoom" +#define MI_StopMotionLowerSubsampling "MI_StopMotionLowerSubsampling" +#define MI_StopMotionRaiseSubsampling "MI_StopMotionRaiseSubsampling" +#define MI_StopMotionJumpToCamera "MI_StopMotionJumpToCamera" + #define MI_OpenOnlineManual "MI_OpenOnlineManual" #define MI_ClearCacheFolder "MI_ClearCacheFolder" + +#define MI_SelectNextGuideStroke "MI_SelectNextGuideStroke" +#define MI_SelectPrevGuideStroke "MI_SelectPrevGuideStroke" +#define MI_SelectGuideStrokeReset "MI_SelectGuideStrokeReset" +#define MI_TweenGuideStrokes "MI_TweenGuideStrokes" +#define MI_TweenGuideStrokeToSelected "MI_TweenGuideStrokeToSelected" +#define MI_SelectBothGuideStrokes "MI_SelectBothGuideStrokes" +#define MI_SelectGuidesAndTweenMode "MI_SelectGuidesAndTweenMode" + +#define MI_ExportXDTS "MI_ExportXDTS" #endif diff --git a/toonz/sources/toonz/preferencespopup.cpp b/toonz/sources/toonz/preferencespopup.cpp index f159533..834f7b5 100644 --- a/toonz/sources/toonz/preferencespopup.cpp +++ b/toonz/sources/toonz/preferencespopup.cpp @@ -417,6 +417,7 @@ void PreferencesPopup::onPixelsOnlyChanged() { defLevelHeight->setDecimals(4); defLevelWidth->setDecimals(4); } + TApp::instance()->getCurrentScene()->notifyPreferenceChanged("pixelsOnly"); } //----------------------------------------------------------------------------- @@ -449,13 +450,6 @@ void PreferencesPopup::onDefLevelTypeChanged() { //----------------------------------------------------------------------------- -void PreferencesPopup::onAutocreationTypeChanged() { - int autoCreationType = m_pref->getIntValue(AutocreationType); - m_controlIdMap.key(EnableAutoStretch)->setEnabled(autoCreationType == 2); -} - -//----------------------------------------------------------------------------- - void PreferencesPopup::onUseNumpadForSwitchingStylesClicked() { bool checked = m_pref->getBoolValue(useNumpadForSwitchingStyles); if (checked) { @@ -1010,8 +1004,11 @@ QString PreferencesPopup::getUIString(PreferencesItemId id) { {DefLevelWidth, tr("Width:")}, {DefLevelHeight, tr(" Height:")}, {DefLevelDpi, tr("DPI:")}, - {AutocreationType, tr("Autocreation:")}, - {EnableAutoStretch, tr("Enable auto-stretch frame")}, + {EnableAutocreation, tr("Enable Autocreation")}, + {NumberingSystem, tr("Numbering System:")}, + {EnableAutoStretch, tr("Enable Auto-stretch Frame")}, + {EnableCreationInHoldCells, tr("Enable Creation in Hold Cells")}, + {EnableAutoRenumber, tr("Enable Autorenumber")}, {vectorSnappingTarget, tr("Vector Snapping:")}, {saveUnpaintedInCleanup, tr("Keep Original Cleaned Up Drawings As Backup")}, @@ -1154,10 +1151,8 @@ QList PreferencesPopup::getComboItemList( {{tr("Toonz Vector Level"), PLI_XSHLEVEL}, {tr("Toonz Raster Level"), TZP_XSHLEVEL}, {tr("Raster Level"), OVL_XSHLEVEL}}}, - {AutocreationType, - {{tr("Disabled"), 0}, - {tr("Enabled"), 1}, - {tr("Use Xsheet as Animation Sheet"), 2}}}, + {NumberingSystem, + {{tr("Incremental"), 0}, {tr("Use Xsheet as Animation Sheet"), 1}}}, {vectorSnappingTarget, {{tr("Strokes"), 0}, {tr("Guides"), 1}, {tr("All"), 2}}}, {dropdownShortcutsCycleOptions, @@ -1593,8 +1588,14 @@ QWidget* PreferencesPopup::createDrawingPage() { insertUI(newLevelSizeToCameraSizeEnabled, lay); insertDualUIs(DefLevelWidth, DefLevelHeight, lay); insertUI(DefLevelDpi, lay); - insertDualUIs(AutocreationType, EnableAutoStretch, lay, - getComboItemList(AutocreationType)); + QGridLayout* autoCreationLay = insertGroupBoxUI(EnableAutocreation, lay); + { + insertUI(NumberingSystem, autoCreationLay, + getComboItemList(NumberingSystem)); + insertUI(EnableAutoStretch, autoCreationLay); + insertUI(EnableCreationInHoldCells, autoCreationLay); + insertUI(EnableAutoRenumber, autoCreationLay); + } insertUI(vectorSnappingTarget, lay, getComboItemList(vectorSnappingTarget)); insertUI(saveUnpaintedInCleanup, lay); insertUI(minimizeSaveboxAfterEditing, lay); @@ -1613,8 +1614,6 @@ QWidget* PreferencesPopup::createDrawingPage() { &PreferencesPopup::onDefLevelTypeChanged); m_onEditedFuncMap.insert(newLevelSizeToCameraSizeEnabled, &PreferencesPopup::onDefLevelTypeChanged); - m_onEditedFuncMap.insert(AutocreationType, - &PreferencesPopup::onAutocreationTypeChanged); onDefLevelTypeChanged(); @@ -1624,9 +1623,6 @@ QWidget* PreferencesPopup::createDrawingPage() { getUI(DefLevelHeight)->setDecimals(0); } - if (m_pref->getIntValue(AutocreationType) != 2) - m_controlIdMap.key(EnableAutoStretch)->setDisabled(true); - return widget; } diff --git a/toonz/sources/toonz/preferencespopup.h b/toonz/sources/toonz/preferencespopup.h index b950f04..08f10bb 100644 --- a/toonz/sources/toonz/preferencespopup.h +++ b/toonz/sources/toonz/preferencespopup.h @@ -122,7 +122,6 @@ private: void beforeRoomChoiceChanged(); // Drawing void onDefLevelTypeChanged(); - void onAutocreationTypeChanged(); void onUseNumpadForSwitchingStylesClicked(); // Tools void onLevelBasedToolsDisplayChanged(); diff --git a/toonz/sources/toonz/sceneviewer.cpp b/toonz/sources/toonz/sceneviewer.cpp index 2a545c0..909206f 100644 --- a/toonz/sources/toonz/sceneviewer.cpp +++ b/toonz/sources/toonz/sceneviewer.cpp @@ -11,6 +11,7 @@ #include "menubarcommandids.h" #include "ruler.h" #include "locatorpopup.h" +#include "../stopmotion/stopmotion.h" // TnzTools includes #include "tools/cursors.h" @@ -529,6 +530,141 @@ public: } } positionResetCommand; +class TSelectGuideStrokeNextCommand final : public MenuItemHandler { +public: + TSelectGuideStrokeNextCommand() : MenuItemHandler(MI_SelectNextGuideStroke) {} + void execute() override { + TVectorImageP vi = (TVectorImageP)TTool::getImage(false); + if (!vi) return; + + Preferences *pref = Preferences::instance(); + if (!pref->isOnionSkinEnabled() || + (pref->getGuidedDrawing() != 1 && pref->getGuidedDrawing() != 2)) + return; + + TTool *tool = TApp::instance()->getCurrentTool()->getTool(); + if (!tool) return; + + tool->getViewer()->setGuidedStrokePickerMode(1); + } +} selectGuideStrokeNextCommand; + +class TSelectGuideStrokePrevCommand final : public MenuItemHandler { +public: + TSelectGuideStrokePrevCommand() : MenuItemHandler(MI_SelectPrevGuideStroke) {} + void execute() override { + TVectorImageP vi = (TVectorImageP)TTool::getImage(false); + if (!vi) return; + + Preferences *pref = Preferences::instance(); + if (!pref->isOnionSkinEnabled() || + (pref->getGuidedDrawing() != 1 && pref->getGuidedDrawing() != 2)) + return; + + TTool *tool = TApp::instance()->getCurrentTool()->getTool(); + if (!tool) return; + + tool->getViewer()->setGuidedStrokePickerMode(-1); + } +} selectGuideStrokePrevCommand; + +class TSelectBothGuideStrokesCommand final : public MenuItemHandler { +public: + TSelectBothGuideStrokesCommand() + : MenuItemHandler(MI_SelectBothGuideStrokes) {} + void execute() override { + TVectorImageP vi = (TVectorImageP)TTool::getImage(false); + if (!vi) return; + + Preferences *pref = Preferences::instance(); + if (!pref->isOnionSkinEnabled() || + (pref->getGuidedDrawing() != 1 && pref->getGuidedDrawing() != 2)) + return; + + TTool *tool = TApp::instance()->getCurrentTool()->getTool(); + if (!tool) return; + + tool->getViewer()->setGuidedStrokePickerMode(-2); + } +} selectBothGuideStrokesCommand; + +class TSelectGuideStrokeResetCommand final : public MenuItemHandler { +public: + TSelectGuideStrokeResetCommand() + : MenuItemHandler(MI_SelectGuideStrokeReset) {} + void execute() override { + TVectorImageP vi = (TVectorImageP)TTool::getImage(false); + if (!vi) return; + + TTool *tool = TApp::instance()->getCurrentTool()->getTool(); + if (!tool) return; + + tool->getViewer()->setGuidedStrokePickerMode(0); + tool->getViewer()->setGuidedBackStroke(-1); + tool->getViewer()->setGuidedFrontStroke(-1); + tool->getViewer()->invalidateAll(); + } +} selectGuideStrokeResetCommand; + +class TTweenGuideStrokesCommand final : public MenuItemHandler { +public: + TTweenGuideStrokesCommand() : MenuItemHandler(MI_TweenGuideStrokes) {} + void execute() override { + TVectorImageP vi = (TVectorImageP)TTool::getImage(false); + if (!vi) return; + + Preferences *pref = Preferences::instance(); + if (!pref->isOnionSkinEnabled() || + (pref->getGuidedDrawing() != 1 && pref->getGuidedDrawing() != 2)) + return; + + TTool *tool = TApp::instance()->getCurrentTool()->getTool(); + if (!tool) return; + + tool->tweenSelectedGuideStrokes(); + } +} tweenGuideStrokesCommand; + +class TTweenGuideStrokeToSelectedCommand final : public MenuItemHandler { +public: + TTweenGuideStrokeToSelectedCommand() + : MenuItemHandler(MI_TweenGuideStrokeToSelected) {} + void execute() override { + TVectorImageP vi = (TVectorImageP)TTool::getImage(false); + if (!vi) return; + + Preferences *pref = Preferences::instance(); + if (!pref->isOnionSkinEnabled() || + (pref->getGuidedDrawing() != 1 && pref->getGuidedDrawing() != 2)) + return; + + TTool *tool = TApp::instance()->getCurrentTool()->getTool(); + if (!tool) return; + + tool->tweenGuideStrokeToSelected(); + } +} tweenGuideStrokeToSelectedCommand; + +class TSelectGuidesAndTweenCommand final : public MenuItemHandler { +public: + TSelectGuidesAndTweenCommand() + : MenuItemHandler(MI_SelectGuidesAndTweenMode) {} + void execute() override { + TVectorImageP vi = (TVectorImageP)TTool::getImage(false); + if (!vi) return; + + Preferences *pref = Preferences::instance(); + if (!pref->isOnionSkinEnabled() || + (pref->getGuidedDrawing() != 1 && pref->getGuidedDrawing() != 2)) + return; + + TTool *tool = TApp::instance()->getCurrentTool()->getTool(); + if (!tool) return; + + tool->getViewer()->setGuidedStrokePickerMode(-3); + } +} selectGuidesAndTweenCommand; + //============================================================================= // SceneViewer //----------------------------------------------------------------------------- @@ -577,6 +713,9 @@ SceneViewer::SceneViewer(ImageUtils::FullScreenWidget *parent) , m_isBusyOnTabletMove(false) { m_visualSettings.m_sceneProperties = TApp::instance()->getCurrentScene()->getScene()->getProperties(); +#ifdef WITH_STOPMOTION + m_stopMotion = StopMotion::instance(); +#endif // Enables multiple key input. setAttribute(Qt::WA_KeyCompression); // Enables input methods for Asian languages. @@ -847,6 +986,13 @@ void SceneViewer::showEvent(QShowEvent *) { connect(app, SIGNAL(tabletLeft()), this, SLOT(resetTabletStatus())); + if (m_stopMotion) { + connect(m_stopMotion, SIGNAL(newLiveViewImageReady()), this, + SLOT(onNewStopMotionImageReady())); + connect(m_stopMotion, SIGNAL(liveViewStopped()), this, + SLOT(onStopMotionLiveViewStopped())); + } + if (m_hRuler && m_vRuler) { if (!viewRulerToggle.getStatus()) { m_hRuler->hide(); @@ -901,6 +1047,14 @@ void SceneViewer::hideEvent(QHideEvent *) { if (toolHandle) toolHandle->disconnect(this); disconnect(app, SIGNAL(tabletLeft()), this, SLOT(resetTabletStatus())); + + if (!m_stopMotion == NULL) { + disconnect(m_stopMotion, SIGNAL(newImageReady()), this, + SLOT(onNewStopMotionImageReady())); + disconnect(m_stopMotion, SIGNAL(liveViewStopped()), this, + SLOT(onStopMotionLiveViewStopped())); + } + // hide locator if (m_locator && m_locator->isVisible()) m_locator->hide(); } @@ -923,6 +1077,41 @@ double SceneViewer::getHGuide(int index) { return m_hRuler->getGuide(index); } //----------------------------------------------------------------------------- +void SceneViewer::onNewStopMotionImageReady() { +#ifdef WITH_STOPMOTION + if (m_stopMotion->m_hasLineUpImage) { + // if (m_hasStopMotionLineUpImage) delete m_stopMotionLineUpImage; + // is there a way to do this without cloning the image twice? + // TRasterImageP image = m_stopMotion->m_lineUpImage->clone(); + m_stopMotionLineUpImage = + (TRasterImageP)m_stopMotion->m_lineUpImage->clone(); + // m_stopMotionLineUpImage = (TRasterImage *)image->cloneImage(); + m_stopMotionLineUpImage->setDpi(m_stopMotion->m_liveViewDpi.x, + m_stopMotion->m_liveViewDpi.y); + m_hasStopMotionLineUpImage = true; + } + if (m_stopMotion->m_hasLiveViewImage) { + // if (m_hasStopMotionImage) delete m_stopMotionImage; + // is there a way to do this without cloning the image twice? + // TRasterImageP image = m_stopMotion->m_liveViewImage->clone(); + m_stopMotionImage = m_stopMotion->m_liveViewImage->clone(); + // m_stopMotionImage = (TRasterImage *)image->cloneImage(); + m_stopMotionImage->setDpi(m_stopMotion->m_liveViewDpi.x, + m_stopMotion->m_liveViewDpi.y); + m_hasStopMotionImage = true; + if (m_stopMotion->m_pickLiveViewZoom) { + setToolCursor(this, ToolCursor::ZoomCursor); + } + onSceneChanged(); + } +#endif +} + +//----------------------------------------------------------------------------- + +void SceneViewer::onStopMotionLiveViewStopped() { onSceneChanged(); } + +//----------------------------------------------------------------------------- void SceneViewer::initializeGL() { initializeOpenGLFunctions(); @@ -1608,7 +1797,10 @@ void SceneViewer::drawScene() { TXshSimpleLevel::m_fillFullColorRaster = false; // Guided Drawing Check - int useGuidedDrawing = Preferences::instance()->getGuidedDrawing(); + int useGuidedDrawing = Preferences::instance()->getGuidedDrawing(); + TTool *tool = app->getCurrentTool()->getTool(); + int guidedFrontStroke = tool ? tool->getViewer()->getGuidedFrontStroke() : -1; + int guidedBackStroke = tool ? tool->getViewer()->getGuidedBackStroke() : -1; m_minZ = 0; if (is3DView()) { @@ -1639,6 +1831,8 @@ void SceneViewer::drawScene() { ->getCell(app->getCurrentFrame()->getFrame(), args.m_col) .getFrameId(); args.m_isGuidedDrawingEnabled = useGuidedDrawing; + args.m_guidedFrontStroke = guidedFrontStroke; + args.m_guidedBackStroke = guidedBackStroke; // args.m_currentFrameId = app->getCurrentFrame()->getFid(); Stage::visit(painter, args); @@ -1672,7 +1866,8 @@ void SceneViewer::drawScene() { Stage::visit(painter, app->getCurrentLevel()->getLevel(), app->getCurrentFrame()->getFid(), app->getCurrentOnionSkin()->getOnionSkinMask(), - frameHandle->isPlaying(), useGuidedDrawing); + frameHandle->isPlaying(), useGuidedDrawing, guidedBackStroke, + guidedFrontStroke); } else { std::pair xr; int xsheetLevel = 0; @@ -1697,9 +1892,35 @@ void SceneViewer::drawScene() { ->getCell(app->getCurrentFrame()->getFrame(), args.m_col) .getFrameId(); args.m_isGuidedDrawingEnabled = useGuidedDrawing; + args.m_guidedFrontStroke = guidedFrontStroke; + args.m_guidedBackStroke = guidedBackStroke; + Stage::visit(painter, args); } +#ifdef WITH_STOPMOTION + if (!frameHandle->isPlaying() && m_stopMotion->m_liveViewStatus == 2) { + if (m_hasStopMotionLineUpImage && m_stopMotion->m_showLineUpImage) { + Stage::Player smPlayer; + double dpiX, dpiY; + m_stopMotionLineUpImage->getDpi(dpiX, dpiY); + smPlayer.m_dpiAff = TScale(Stage::inch / dpiX, Stage::inch / dpiY); + smPlayer.m_opacity = 255; + painter.onRasterImage(m_stopMotionLineUpImage.getPointer(), smPlayer); + } + if (m_hasStopMotionImage) { + Stage::Player smPlayer; + double dpiX, dpiY; + m_stopMotionImage->getDpi(dpiX, dpiY); + smPlayer.m_dpiAff = TScale(Stage::inch / dpiX, Stage::inch / dpiY); + bool hide_opacity = + m_stopMotion->m_zooming || m_stopMotion->m_pickLiveViewZoom; + smPlayer.m_opacity = hide_opacity ? 255.0 : m_stopMotion->getOpacity(); + painter.onRasterImage(m_stopMotionImage.getPointer(), smPlayer); + } + } +#endif + assert(glGetError() == 0); painter.flushRasterImages(); diff --git a/toonz/sources/toonz/sceneviewer.h b/toonz/sources/toonz/sceneviewer.h index f8974bd..7d5eeca 100644 --- a/toonz/sources/toonz/sceneviewer.h +++ b/toonz/sources/toonz/sceneviewer.h @@ -38,6 +38,7 @@ class QGestureEvent; class QTouchEvent; class QOpenGLFramebufferObject; class LutCalibrator; +class StopMotion; namespace ImageUtils { class FullScreenWidget; @@ -144,6 +145,10 @@ class SceneViewer final : public GLWidgetForHighDpi, TRaster32P m_3DSideL; TRaster32P m_3DSideR; TRaster32P m_3DTop; + TRasterImageP m_stopMotionImage, m_stopMotionLineUpImage; + StopMotion *m_stopMotion = NULL; + bool m_hasStopMotionImage = false; + bool m_hasStopMotionLineUpImage = false; TPointD m_sideRasterPos; TPointD m_topRasterPos; @@ -438,6 +443,9 @@ public slots: void releaseBusyOnTabletMove() { m_isBusyOnTabletMove = false; } void onContextAboutToBeDestroyed(); + void onNewStopMotionImageReady(); + void onStopMotionLiveViewStopped(); + signals: void onZoomChanged(); diff --git a/toonz/sources/toonz/sceneviewercontextmenu.cpp b/toonz/sources/toonz/sceneviewercontextmenu.cpp index 97b3f47..e276dbd 100644 --- a/toonz/sources/toonz/sceneviewercontextmenu.cpp +++ b/toonz/sources/toonz/sceneviewercontextmenu.cpp @@ -155,7 +155,65 @@ SceneViewerContextMenu::SceneViewerContextMenu(SceneViewer *parent) action->setCheckable(true); action->setChecked(guidedDrawingStatus == 3); ret = ret && parent->connect(action, SIGNAL(triggered()), this, - SLOT(setGuidedDrawingAll())); + SLOT(setGuidedDrawingAll())); + guidedDrawingMenu->addSeparator(); + bool enableOption = guidedDrawingStatus == 1 || guidedDrawingStatus == 2; + action = guidedDrawingMenu->addAction(tr("Auto Inbetween")); + action->setCheckable(true); + action->setChecked(Preferences::instance()->getGuidedAutoInbetween()); + action->setEnabled(enableOption); + ret = ret && parent->connect(action, SIGNAL(triggered()), this, + SLOT(setGuidedAutoInbetween())); + guidedDrawingMenu->addSeparator(); + int guidedInterpolation = Preferences::instance()->getGuidedInterpolation(); + action = guidedDrawingMenu->addAction(tr("Linear Interpolation")); + action->setCheckable(true); + action->setChecked(guidedInterpolation == 1); + action->setEnabled(enableOption); + ret = ret && parent->connect(action, SIGNAL(triggered()), this, + SLOT(setGuidedInterpolationLinear())); + action = guidedDrawingMenu->addAction(tr("Ease In Interpolation")); + action->setCheckable(true); + action->setChecked(guidedInterpolation == 2); + action->setEnabled(enableOption); + ret = ret && parent->connect(action, SIGNAL(triggered()), this, + SLOT(setGuidedInterpolationEaseIn())); + action = guidedDrawingMenu->addAction(tr("Ease Out Interpolation")); + action->setCheckable(true); + action->setChecked(guidedInterpolation == 3); + action->setEnabled(enableOption); + ret = ret && parent->connect(action, SIGNAL(triggered()), this, + SLOT(setGuidedInterpolationEaseOut())); + action = guidedDrawingMenu->addAction(tr("Ease In/Out Interpolation")); + action->setCheckable(true); + action->setChecked(guidedInterpolation == 4); + action->setEnabled(enableOption); + ret = ret && parent->connect(action, SIGNAL(triggered()), this, + SLOT(setGuidedInterpolationEaseInOut())); + guidedDrawingMenu->addSeparator(); + action = CommandManager::instance()->getAction(MI_SelectPrevGuideStroke); + action->setEnabled(enableOption); + guidedDrawingMenu->addAction(action); + action = CommandManager::instance()->getAction(MI_SelectNextGuideStroke); + action->setEnabled(enableOption); + guidedDrawingMenu->addAction(action); + action = CommandManager::instance()->getAction(MI_SelectBothGuideStrokes); + action->setEnabled(enableOption); + guidedDrawingMenu->addAction(action); + action = CommandManager::instance()->getAction(MI_SelectGuideStrokeReset); + action->setEnabled(true); + guidedDrawingMenu->addAction(action); + guidedDrawingMenu->addSeparator(); + action = CommandManager::instance()->getAction(MI_TweenGuideStrokes); + action->setEnabled(enableOption); + guidedDrawingMenu->addAction(action); + action = CommandManager::instance()->getAction(MI_TweenGuideStrokeToSelected); + action->setEnabled(enableOption); + guidedDrawingMenu->addAction(action); + action = CommandManager::instance()->getAction(MI_SelectGuidesAndTweenMode); + action->setEnabled(enableOption); + guidedDrawingMenu->addAction(action); + // Zero Thick if (!parent->isPreviewEnabled()) ZeroThickToggleGui::addZeroThickCommand(this); @@ -386,6 +444,32 @@ void SceneViewerContextMenu::setGuidedDrawingAll() { } //----------------------------------------------------------------------------- +void SceneViewerContextMenu::setGuidedAutoInbetween() { + Preferences::instance()->setValue( + guidedAutoInbetween, !Preferences::instance()->getGuidedAutoInbetween()); +} + +//----------------------------------------------------------------------------- +void SceneViewerContextMenu::setGuidedInterpolationLinear() { + Preferences::instance()->setValue(guidedInterpolationType, 1); +} + +//----------------------------------------------------------------------------- +void SceneViewerContextMenu::setGuidedInterpolationEaseIn() { + Preferences::instance()->setValue(guidedInterpolationType, 2); +} + +//----------------------------------------------------------------------------- +void SceneViewerContextMenu::setGuidedInterpolationEaseOut() { + Preferences::instance()->setValue(guidedInterpolationType, 3); +} + +//----------------------------------------------------------------------------- +void SceneViewerContextMenu::setGuidedInterpolationEaseInOut() { + Preferences::instance()->setValue(guidedInterpolationType, 4); +} + +//----------------------------------------------------------------------------- void SceneViewerContextMenu::savePreviewedFrames() { Previewer::instance(m_viewer->getPreviewMode() == @@ -393,6 +477,7 @@ void SceneViewerContextMenu::savePreviewedFrames() { ->saveRenderedFrames(); } +//----------------------------------------------------------------------------- class ZeroThickToggle : public MenuItemHandler { public: ZeroThickToggle() : MenuItemHandler(MI_ZeroThick) {} diff --git a/toonz/sources/toonz/sceneviewercontextmenu.h b/toonz/sources/toonz/sceneviewercontextmenu.h index 41d9985..68be127 100644 --- a/toonz/sources/toonz/sceneviewercontextmenu.h +++ b/toonz/sources/toonz/sceneviewercontextmenu.h @@ -35,6 +35,11 @@ public slots: void setGuidedDrawingClosest(); void setGuidedDrawingFarthest(); void setGuidedDrawingAll(); + void setGuidedAutoInbetween(); + void setGuidedInterpolationLinear(); + void setGuidedInterpolationEaseIn(); + void setGuidedInterpolationEaseOut(); + void setGuidedInterpolationEaseInOut(); void onShowHide(); void onSetCurrent(); diff --git a/toonz/sources/toonz/sceneviewerevents.cpp b/toonz/sources/toonz/sceneviewerevents.cpp index f8af69c..add2680 100644 --- a/toonz/sources/toonz/sceneviewerevents.cpp +++ b/toonz/sources/toonz/sceneviewerevents.cpp @@ -17,6 +17,10 @@ #include "locatorpopup.h" #include "cellselection.h" +#ifdef WITH_STOPMOTION +#include "stopmotion.h" +#endif + // TnzQt includes #include "toonzqt/tselectionhandle.h" #include "toonzqt/styleselection.h" @@ -580,6 +584,11 @@ void SceneViewer::onMove(const TMouseEvent &event) { tool->mouseMove(pos, event); } if (!cursorSet) setToolCursor(this, tool->getCursorId()); + +#ifdef WITH_STOPMOTION + if (StopMotion::instance()->m_pickLiveViewZoom) + setToolCursor(this, ToolCursor::ZoomCursor); +#endif m_pos = curPos; m_tabletMove = false; m_toolSwitched = false; @@ -721,6 +730,17 @@ void SceneViewer::onPress(const TMouseEvent &event) { pos.x /= m_dpiScale.x; pos.y /= m_dpiScale.y; } + +#ifdef WITH_STOPMOTION + // grab screen picking for stop motion live view zoom + if (StopMotion::instance()->m_pickLiveViewZoom) { + StopMotion::instance()->m_pickLiveViewZoom = false; + StopMotion::instance()->makeZoomPoint(pos); + if (tool) setToolCursor(this, tool->getCursorId()); + if (m_mouseButton != Qt::RightButton) return; + } +#endif + // separate tablet and mouse events if (m_tabletEvent && m_tabletState == Touched) { TApp::instance()->getCurrentTool()->setToolBusy(true); @@ -1614,7 +1634,10 @@ void SceneViewer::onToolSwitched() { invalidateToolStatus(); TTool *tool = TApp::instance()->getCurrentTool()->getTool(); - if (tool) tool->updateMatrix(); + if (tool) { + tool->updateMatrix(); + if (tool->getViewer()) tool->getViewer()->setGuidedStrokePickerMode(0); + } onLevelChanged(); update(); diff --git a/toonz/sources/toonz/toonz.qrc b/toonz/sources/toonz/toonz.qrc index a542e2f..2a15dc3 100644 --- a/toonz/sources/toonz/toonz.qrc +++ b/toonz/sources/toonz/toonz.qrc @@ -484,5 +484,6 @@ Resources/flipvert_over.svg Resources/reset.svg Resources/reset_over.svg + Resources/xdts.svg diff --git a/toonz/sources/toonz/tpanels.cpp b/toonz/sources/toonz/tpanels.cpp index f800f34..a03604e 100644 --- a/toonz/sources/toonz/tpanels.cpp +++ b/toonz/sources/toonz/tpanels.cpp @@ -24,6 +24,10 @@ #include "historypane.h" #include "cleanupsettingspane.h" +#ifdef WITH_STOPMOTION +#include "stopmotioncontroller.h" +#endif + #ifdef LINETEST #include "linetestpane.h" #include "linetestcapturepane.h" @@ -1085,6 +1089,7 @@ public: TFilePath currentProjectFolder = TProjectManager::instance()->getCurrentProjectPath().getParentDir(); browser->setFolder(currentProjectFolder, true); + browser->enableDoubleClickToOpenScenes(); } } browserFactory; @@ -1361,6 +1366,34 @@ OpenFloatingPanel openHistoryPanelCommand(MI_OpenHistoryPanel, "HistoryPanel", QObject::tr("History")); //============================================================================= +#ifdef WITH_STOPMOTION +//============================================================================= +// StopMotion Controller +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- + +class StopMotionPanelFactory final : public TPanelFactory { +public: + StopMotionPanelFactory() : TPanelFactory("StopMotionController") {} + + void initialize(TPanel *panel) override { + StopMotionController *stopMotionController = + new StopMotionController(panel); + panel->setWidget(stopMotionController); + panel->setWindowTitle(QObject::tr("Stop Motion Controller")); + panel->setIsMaximizable(false); + } +} stopMotionPanelFactory; + +//============================================================================= +OpenFloatingPanel openStopMotionPanelCommand( + MI_OpenStopMotionPanel, "StopMotionController", + QObject::tr("Stop Motion Controller")); +//----------------------------------------------------------------------------- + +#endif + //============================================================================= // FxSettings //----------------------------------------------------------------------------- diff --git a/toonz/sources/toonz/tpanels.h b/toonz/sources/toonz/tpanels.h index 60e59cd..8b0aba6 100644 --- a/toonz/sources/toonz/tpanels.h +++ b/toonz/sources/toonz/tpanels.h @@ -17,6 +17,7 @@ class PaletteViewer; class TPaletteHandle; class StyleEditor; +class StopMotionController; class TLevel; class StudioPaletteViewer; class TPanelTitleBarButton; diff --git a/toonz/sources/toonz/xdtsimportpopup.cpp b/toonz/sources/toonz/xdtsimportpopup.cpp new file mode 100644 index 0000000..40f149e --- /dev/null +++ b/toonz/sources/toonz/xdtsimportpopup.cpp @@ -0,0 +1,152 @@ +#include "xdtsimportpopup.h" + +#include "tapp.h" +#include "tsystem.h" +#include "toonzqt/filefield.h" +#include "toonz/toonzscene.h" + +#include +#include +#include +#include +#include +#include + +using namespace DVGui; + +XDTSImportPopup::XDTSImportPopup(QStringList levelNames, ToonzScene* scene, + TFilePath scenePath) + : m_scene(scene) + , DVGui::Dialog(TApp::instance()->getMainWindow(), true, false, + "XDTSImport") { + setWindowTitle(tr("Importing XDTS file %1") + .arg(QString::fromStdString(scenePath.getLevelName()))); + QPushButton* loadButton = new QPushButton(tr("Load"), this); + QPushButton* cancelButton = new QPushButton(tr("Cancel"), this); + + QString description = + tr("Please specify the level locations. Suggested paths " + "are input in the fields with blue border."); + + m_topLayout->addWidget(new QLabel(description, this), 0); + m_topLayout->addSpacing(15); + + QScrollArea* fieldsArea = new QScrollArea(this); + fieldsArea->setWidgetResizable(true); + + QWidget* fieldsWidget = new QWidget(this); + + QGridLayout* fieldsLay = new QGridLayout(); + fieldsLay->setMargin(0); + fieldsLay->setHorizontalSpacing(10); + fieldsLay->setVerticalSpacing(10); + fieldsLay->addWidget(new QLabel(tr("Level Name"), this), 0, 0, + Qt::AlignLeft | Qt::AlignVCenter); + fieldsLay->addWidget(new QLabel(tr("Level Path"), this), 0, 1, + Qt::AlignLeft | Qt::AlignVCenter); + for (QString& levelName : levelNames) { + int row = fieldsLay->rowCount(); + fieldsLay->addWidget(new QLabel(levelName, this), row, 0, + Qt::AlignRight | Qt::AlignVCenter); + FileField* fileField = new FileField(this); + fieldsLay->addWidget(fileField, row, 1); + m_fields.insert(levelName, fileField); + fileField->setFileMode(QFileDialog::AnyFile); + fileField->setObjectName("SuggestiveFileField"); + connect(fileField, SIGNAL(pathChanged()), this, SLOT(onPathChanged())); + } + fieldsLay->setColumnStretch(1, 1); + fieldsLay->setRowStretch(fieldsLay->rowCount(), 1); + + fieldsWidget->setLayout(fieldsLay); + fieldsArea->setWidget(fieldsWidget); + m_topLayout->addWidget(fieldsArea, 1); + + connect(loadButton, SIGNAL(clicked()), this, SLOT(accept())); + connect(cancelButton, SIGNAL(clicked()), this, SLOT(reject())); + + addButtonBarWidget(cancelButton, loadButton); + + updateSuggestions(scenePath.getQString()); +} + +//----------------------------------------------------------------------------- + +void XDTSImportPopup::onPathChanged() { + FileField* fileField = dynamic_cast(sender()); + if (!fileField) return; + // make the field non-suggestive + m_pathSuggestedLevels.removeAll(m_fields.key(fileField)); + updateSuggestions(fileField->getPath()); +} + +//----------------------------------------------------------------------------- + +void XDTSImportPopup::updateSuggestions(const QString samplePath) { + TFilePath fp(samplePath); + fp = m_scene->decodeFilePath(fp).getParentDir(); + QDir suggestFolder(fp.getQString()); + QStringList filters; + filters << "*.bmp" + << "*.jpg" + << "*.nol" + << "*.pic" + << "*.pict" + << "*.pct" + << "*.png" + << "*.rgb" + << "*.sgi" + << "*.tga" + << "*.tif" + << "*.tiff" + << "*.tlv" + << "*.pli" + << "*.psd"; + suggestFolder.setNameFilters(filters); + suggestFolder.setFilter(QDir::Files); + TFilePathSet pathSet; + try { + TSystem::readDirectory(pathSet, suggestFolder, true); + } catch (...) { + return; + } + + QMap::iterator fieldsItr = m_fields.begin(); + while (fieldsItr != m_fields.end()) { + QString levelName = fieldsItr.key(); + FileField* fileField = fieldsItr.value(); + // check if the field can be filled with suggestion + if (fileField->getPath().isEmpty() || + m_pathSuggestedLevels.contains(levelName)) { + // input suggestion if there is a file with the same level name + for (TFilePath path : pathSet) { + if (path.getName() == levelName.toStdString()) { + TFilePath codedPath = m_scene->codeFilePath(path); + fileField->setPath(codedPath.getQString()); + if (!m_pathSuggestedLevels.contains(levelName)) + m_pathSuggestedLevels.append(levelName); + break; + } + } + } + ++fieldsItr; + } + + // repaint fields + fieldsItr = m_fields.begin(); + while (fieldsItr != m_fields.end()) { + if (m_pathSuggestedLevels.contains(fieldsItr.key())) + fieldsItr.value()->setStyleSheet( + QString("#SuggestiveFileField " + "QLineEdit{border-color:#2255aa;border-width:2px;}")); + else + fieldsItr.value()->setStyleSheet(QString("")); + ++fieldsItr; + } +} + +QString XDTSImportPopup::getLevelPath(QString levelName) { + FileField* field = m_fields.value(levelName); + if (!field) return QString(); + return field->getPath(); +} \ No newline at end of file diff --git a/toonz/sources/toonz/xdtsimportpopup.h b/toonz/sources/toonz/xdtsimportpopup.h new file mode 100644 index 0000000..a185d25 --- /dev/null +++ b/toonz/sources/toonz/xdtsimportpopup.h @@ -0,0 +1,30 @@ +#pragma once +#ifndef XDTSIMPORTPOPUP_H +#define XDTSIMPORTPOPUP_H + +#include "toonzqt/dvdialog.h" +#include "tfilepath.h" + +#include +namespace DVGui { +class FileField; +} +class ToonzScene; + +class XDTSImportPopup : public DVGui::Dialog { + Q_OBJECT + QMap m_fields; + QStringList m_pathSuggestedLevels; + ToonzScene *m_scene; + + void updateSuggestions(const QString samplePath); + +public: + XDTSImportPopup(QStringList levelNames, ToonzScene *scene, + TFilePath scenePath); + QString getLevelPath(QString levelName); +protected slots: + void onPathChanged(); +}; + +#endif \ No newline at end of file diff --git a/toonz/sources/toonz/xdtsio.cpp b/toonz/sources/toonz/xdtsio.cpp new file mode 100644 index 0000000..71f8caf --- /dev/null +++ b/toonz/sources/toonz/xdtsio.cpp @@ -0,0 +1,527 @@ +#include "xdtsio.h" + +#include "tsystem.h" +#include "toonz/toonzscene.h" +#include "toonz/tproject.h" +#include "toonz/levelset.h" +#include "toonz/txsheet.h" +#include "toonz/txshcell.h" +#include "toonz/txshsimplelevel.h" +#include "toonz/txsheethandle.h" +#include "toonz/tscenehandle.h" +#include "toonz/preferences.h" + +#include "toonzqt/menubarcommand.h" +#include "toonzqt/gutil.h" + +#include "tapp.h" +#include "menubarcommandids.h" +#include "xdtsimportpopup.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +using namespace XdtsIo; +namespace { +static QByteArray identifierStr("exchangeDigitalTimeSheet Save Data"); +} +//----------------------------------------------------------------------------- +void XdtsHeader::read(const QJsonObject &json) { + QRegExp rx("\\d{1,4}"); + // TODO: We could check if the keys are valid + // before attempting to read them with QJsonObject::contains(), + // but we assume that they are. + m_cut = json["cut"].toString(); + if (!rx.exactMatch(m_cut)) // TODO: should handle an error + std::cout << "The XdtsHeader value \"cut\" does not match the pattern." + << std::endl; + m_scene = json["scene"].toString(); + if (!rx.exactMatch(m_scene)) + std::cout << "The XdtsHeader value \"scene\" does not match the pattern." + << std::endl; +} + +void XdtsHeader::write(QJsonObject &json) const { + json["cut"] = m_cut; + json["scene"] = m_scene; +} + +//----------------------------------------------------------------------------- + +void XdtsFrameDataItem::read(const QJsonObject &json) { + m_id = DataId(qRound(json["id"].toDouble())); + QJsonArray valuesArray = json["values"].toArray(); + for (int vIndex = 0; vIndex < valuesArray.size(); ++vIndex) { + m_values.append(valuesArray[vIndex].toString()); + } +} + +void XdtsFrameDataItem::write(QJsonObject &json) const { + json["id"] = int(m_id); + QJsonArray valuesArray; + foreach (const QString &value, m_values) { valuesArray.append(value); } + json["values"] = valuesArray; +} + +//----------------------------------------------------------------------------- +void XdtsTrackFrameItem::read(const QJsonObject &json) { + QJsonArray dataArray = json["data"].toArray(); + for (int dataIndex = 0; dataIndex < dataArray.size(); ++dataIndex) { + QJsonObject dataObject = dataArray[dataIndex].toObject(); + XdtsFrameDataItem data; + data.read(dataObject); + m_data.append(data); + } + m_frame = json["frame"].toInt(); +} + +void XdtsTrackFrameItem::write(QJsonObject &json) const { + QJsonArray dataArray; + foreach (const XdtsFrameDataItem &data, m_data) { + QJsonObject dataObject; + data.write(dataObject); + dataArray.append(dataObject); + } + json["data"] = dataArray; + + json["frame"] = m_frame; +} + +//----------------------------------------------------------------------------- + +QPair XdtsTrackFrameItem::frameCellNumber() const { + return QPair(m_frame, m_data[0].getCellNumber()); +} + +//----------------------------------------------------------------------------- +void XdtsFieldTrackItem::read(const QJsonObject &json) { + QJsonArray frameArray = json["frames"].toArray(); + for (int frameIndex = 0; frameIndex < frameArray.size(); ++frameIndex) { + QJsonObject frameObject = frameArray[frameIndex].toObject(); + XdtsTrackFrameItem frame; + frame.read(frameObject); + m_frames.append(frame); + } + m_trackNo = json["trackNo"].toInt(); +} + +void XdtsFieldTrackItem::write(QJsonObject &json) const { + QJsonArray frameArray; + foreach (const XdtsTrackFrameItem &frame, m_frames) { + QJsonObject frameObject; + frame.write(frameObject); + frameArray.append(frameObject); + } + json["frames"] = frameArray; + + json["trackNo"] = m_trackNo; +} +//----------------------------------------------------------------------------- + +bool frameLessThan(const QPair &v1, const QPair &v2) { + return v1.first < v2.first; +} + +QVector XdtsFieldTrackItem::getCellNumberTrack() const { + QList> frameCellNumbers; + for (const XdtsTrackFrameItem &frame : m_frames) + frameCellNumbers.append(frame.frameCellNumber()); + qSort(frameCellNumbers.begin(), frameCellNumbers.end(), frameLessThan); + + QVector cells; + int currentFrame = 0; + for (QPair &frameCellNumber : frameCellNumbers) { + while (currentFrame < frameCellNumber.first) { + cells.append((cells.isEmpty()) ? 0 : cells.last()); + currentFrame++; + } + // ignore sheet symbols for now + int cellNumber = frameCellNumber.second; + if (cellNumber == -1) + cells.append((cells.isEmpty()) ? 0 : cells.last()); + else + cells.append(cellNumber); + currentFrame++; + } + return cells; +} + +QString XdtsFieldTrackItem::build(TXshCellColumn *column, int duration) { + // register the firstly-found level + TXshSimpleLevel *level = nullptr; + TXshCell prevCell; + int r0, r1; + column->getRange(r0, r1); + if (r0 > 0) addFrame(0, 0); + for (int row = r0; row <= r1; row++) { + TXshCell cell = column->getCell(row); + // try to register the level + if (!level && cell.getSimpleLevel()) level = cell.getSimpleLevel(); + // if the level does not match with the registered one, + // handle as the empty cell + if (!level || cell.m_level != level) cell = TXshCell(); + // continue if the cell is continuous + if (prevCell == cell) continue; + + if (cell.isEmpty()) + addFrame(row, 0); + else + addFrame(row, cell.getFrameId().getNumber()); + + prevCell = cell; + } + if (r1 + 1 < duration) addFrame(r1 + 1, 0); + if (level) + return QString::fromStdWString(level->getName()); + else { + m_frames.clear(); + return QString(); + } +} +//----------------------------------------------------------------------------- + +void XdtsTimeTableFieldItem::read(const QJsonObject &json) { + m_fieldId = FieldId(qRound(json["fieldId"].toDouble())); + QJsonArray trackArray = json["tracks"].toArray(); + for (int trackIndex = 0; trackIndex < trackArray.size(); ++trackIndex) { + QJsonObject trackObject = trackArray[trackIndex].toObject(); + XdtsFieldTrackItem track; + track.read(trackObject); + m_tracks.append(track); + } +} + +void XdtsTimeTableFieldItem::write(QJsonObject &json) const { + json["fieldId"] = int(m_fieldId); + QJsonArray trackArray; + foreach (const XdtsFieldTrackItem &track, m_tracks) { + QJsonObject trackObject; + track.write(trackObject); + trackArray.append(trackObject); + } + json["tracks"] = trackArray; +} + +QList XdtsTimeTableFieldItem::getOccupiedColumns() const { + QList ret; + for (const XdtsFieldTrackItem &track : m_tracks) { + if (!track.isEmpty()) ret.append(track.getTrackNo()); + } + return ret; +} + +QVector XdtsTimeTableFieldItem::getColumnTrack(int col) const { + for (const XdtsFieldTrackItem &track : m_tracks) { + if (track.getTrackNo() != col) continue; + return track.getCellNumberTrack(); + } + return QVector(); +} + +void XdtsTimeTableFieldItem::build(TXsheet *xsheet, int duration, + QStringList &columnLabels) { + m_fieldId = CELL; + for (int col = 0; col < xsheet->getFirstFreeColumnIndex(); col++) { + if (xsheet->isColumnEmpty(col)) { + columnLabels.append(""); + continue; + } + TXshCellColumn *column = xsheet->getColumn(col)->getCellColumn(); + if (!column) { + columnLabels.append(""); + continue; + } + XdtsFieldTrackItem track(col); + columnLabels.append(track.build(column, duration)); + if (!track.isEmpty()) m_tracks.append(track); + } +} +//----------------------------------------------------------------------------- + +void XdtsTimeTableHeaderItem::read(const QJsonObject &json) { + m_fieldId = FieldId(qRound(json["fieldId"].toDouble())); + QJsonArray namesArray = json["names"].toArray(); + for (int nIndex = 0; nIndex < namesArray.size(); ++nIndex) { + m_names.append(namesArray[nIndex].toString()); + } +} + +void XdtsTimeTableHeaderItem::write(QJsonObject &json) const { + json["fieldId"] = int(m_fieldId); + QJsonArray namesArray; + foreach (const QString name, m_names) { namesArray.append(name); } + json["names"] = namesArray; +} + +void XdtsTimeTableHeaderItem::build(QStringList &columnLabels) { + m_names.append(columnLabels); +} + +//----------------------------------------------------------------------------- + +void XdtsTimeTableItem::read(const QJsonObject &json) { + if (json.contains("fields")) { + QJsonArray fieldArray = json["fields"].toArray(); + for (int fieldIndex = 0; fieldIndex < fieldArray.size(); ++fieldIndex) { + QJsonObject fieldObject = fieldArray[fieldIndex].toObject(); + XdtsTimeTableFieldItem field; + field.read(fieldObject); + m_fields.append(field); + if (field.isCellField()) m_cellFieldIndex = fieldIndex; + } + } + m_duration = json["duration"].toInt(); + m_name = json["name"].toString(); + QJsonArray headerArray = json["timeTableHeaders"].toArray(); + for (int headerIndex = 0; headerIndex < headerArray.size(); ++headerIndex) { + QJsonObject headerObject = headerArray[headerIndex].toObject(); + XdtsTimeTableHeaderItem header; + header.read(headerObject); + m_timeTableHeaders.append(header); + if (header.isCellField()) m_cellHeaderIndex = headerIndex; + } +} + +void XdtsTimeTableItem::write(QJsonObject &json) const { + if (!m_fields.isEmpty()) { + QJsonArray fieldArray; + foreach (const XdtsTimeTableFieldItem &field, m_fields) { + QJsonObject fieldObject; + field.write(fieldObject); + fieldArray.append(fieldObject); + } + json["fields"] = fieldArray; + } + json["duration"] = m_duration; + json["name"] = m_name; + QJsonArray headerArray; + foreach (const XdtsTimeTableHeaderItem header, m_timeTableHeaders) { + QJsonObject headerObject; + header.write(headerObject); + headerArray.append(headerObject); + } + json["timeTableHeaders"] = headerArray; +} + +QStringList XdtsTimeTableItem::getLevelNames() const { + // obtain column labels from the header + assert(m_cellHeaderIndex >= 0); + QStringList labels = m_timeTableHeaders.at(m_cellHeaderIndex).getLayerNames(); + // obtain occupied column numbers in the field + assert(m_cellFieldIndex >= 0); + QList occupiedColumns = + m_fields.at(m_cellFieldIndex).getOccupiedColumns(); + // return the names of occupied columns + QStringList ret; + for (const int columnId : occupiedColumns) ret.append(labels.at(columnId)); + return ret; +} + +void XdtsTimeTableItem::build(TXsheet *xsheet, QString name) { + m_duration = xsheet->getFrameCount(); + m_name = name; + QStringList columnLabels; + XdtsTimeTableFieldItem field; + field.build(xsheet, m_duration, columnLabels); + m_fields.append(field); + while (columnLabels.last().isEmpty()) columnLabels.removeLast(); + XdtsTimeTableHeaderItem header; + header.build(columnLabels); + m_timeTableHeaders.append(header); + m_cellHeaderIndex = 0; + m_cellFieldIndex = 0; +} +//----------------------------------------------------------------------------- + +void XdtsData::read(const QJsonObject &json) { + if (json.contains("header")) { + QJsonObject headerObject = json["header"].toObject(); + m_header.read(headerObject); + } + QJsonArray tableArray = json["timeTables"].toArray(); + for (int tableIndex = 0; tableIndex < tableArray.size(); ++tableIndex) { + QJsonObject tableObject = tableArray[tableIndex].toObject(); + XdtsTimeTableItem table; + table.read(tableObject); + m_timeTables.append(table); + } + m_version = Version(qRound(json["version"].toDouble())); +} + +void XdtsData::write(QJsonObject &json) const { + if (!m_header.isEmpty()) { + QJsonObject headerObject; + m_header.write(headerObject); + json["header"] = headerObject; + } + QJsonArray tableArray; + foreach (const XdtsTimeTableItem &table, m_timeTables) { + QJsonObject tableObject; + table.write(tableObject); + tableArray.append(tableObject); + } + json["timeTables"] = tableArray; + json["version"] = int(m_version); +} + +QStringList XdtsData::getLevelNames() const { + // currently support only the first page of time tables + return m_timeTables.at(0).getLevelNames(); +} + +void XdtsData::build(TXsheet *xsheet, QString name) { + XdtsTimeTableItem timeTable; + timeTable.build(xsheet, name); + m_timeTables.append(timeTable); +} + +//----------------------------------------------------------------------------- + +bool XdtsIo::loadXdtsScene(ToonzScene *scene, const TFilePath &scenePath) { + QApplication::restoreOverrideCursor(); + // read the Json file + QFile loadFile(scenePath.getQString()); + if (!loadFile.open(QIODevice::ReadOnly)) { + qWarning("Couldn't open save file."); + return false; + } + + QByteArray dataArray = loadFile.readAll(); + + if (!dataArray.startsWith(identifierStr)) { + qWarning("The first line does not start with XDTS identifier string."); + return false; + } + // remove identifier + dataArray.remove(0, identifierStr.length()); + + QJsonDocument loadDoc(QJsonDocument::fromJson(dataArray)); + + XdtsData xdtsData; + xdtsData.read(loadDoc.object()); + + // obtain level names + QStringList levelNames = xdtsData.getLevelNames(); + + scene->clear(); + + TProjectManager *pm = TProjectManager::instance(); + TProjectP sceneProject = pm->loadSceneProject(scenePath); + if (!sceneProject) return false; + scene->setProject(sceneProject.getPointer()); + std::string sceneFileName = scenePath.getName() + ".tnz"; + scene->setScenePath(scenePath.getParentDir() + sceneFileName); + TApp::instance()->getCurrentScene()->setScene(scene); + + XDTSImportPopup popup(levelNames, scene, scenePath); + + int ret = popup.exec(); + if (ret == QDialog::Rejected) return false; + + QMap levels; + try { + for (QString name : levelNames) { + QString levelPath = popup.getLevelPath(name); + TXshLevel *level = nullptr; + if (!levelPath.isEmpty()) + level = scene->loadLevel(scene->decodeFilePath(TFilePath(levelPath)), + nullptr, name.toStdWString()); + if (!level) { + int levelType = Preferences::instance()->getDefLevelType(); + level = scene->createNewLevel(levelType, name.toStdWString()); + } + levels.insert(name, level); + } + } catch (...) { + return false; + } + + TXsheet *xsh = scene->getXsheet(); + XdtsTimeTableFieldItem cellField = xdtsData.timeTable().getCellField(); + XdtsTimeTableHeaderItem cellHeader = xdtsData.timeTable().getCellHeader(); + int duration = xdtsData.timeTable().getDuration(); + QStringList layerNames = cellHeader.getLayerNames(); + QList columns = cellField.getOccupiedColumns(); + for (int column : columns) { + QString levelName = layerNames.at(column); + TXshLevel *level = levels.value(levelName); + QVector track = cellField.getColumnTrack(column); + + int row = 0; + std::vector::iterator it; + for (int f : track) { + if (f == 0) // empty cell + row++; + else + xsh->setCell(row++, column, TXshCell(level, TFrameId(f))); + } + // if the last cell is not "SYMBOL_NULL_CELL", continue the cell + // to the end of the sheet + int lastFid = track.last(); + if (lastFid != 0) { + for (; row < duration; row++) + xsh->setCell(row, column, TXshCell(level, TFrameId(lastFid))); + } + } + xsh->updateFrameCount(); + + return true; +} + +class ExportXDTSCommand final : public MenuItemHandler { +public: + ExportXDTSCommand() : MenuItemHandler(MI_ExportXDTS) {} + void execute() override; +} exportXDTSCommand; + +void ExportXDTSCommand::execute() { + ToonzScene *scene = TApp::instance()->getCurrentScene()->getScene(); + TXsheet *xsheet = TApp::instance()->getCurrentXsheet()->getXsheet(); + TFilePath fp = scene->getScenePath().withType("xdts"); + if (TSystem::doesExistFileOrLevel(fp)) { + QString question = + QObject::tr("The file %1 already exists.\nDo you want to overwrite it?") + .arg(toQString(fp)); + int ret = DVGui::MsgBox(question, QObject::tr("Overwrite"), + QObject::tr("Cancel"), 0); + if (ret == 2 || ret == 0) return; + } + + XdtsData xdtsData; + xdtsData.build(xsheet, QString::fromStdString(fp.getName())); + + QFile saveFile(fp.getQString()); + + if (!saveFile.open(QIODevice::WriteOnly)) { + qWarning("Couldn't open save file."); + return; + } + + QJsonObject xdtsObject; + xdtsData.write(xdtsObject); + QJsonDocument saveDoc(xdtsObject); + QByteArray jsonByteArrayData = saveDoc.toJson(); + jsonByteArrayData.prepend(identifierStr + '\n'); + saveFile.write(jsonByteArrayData); + + QString str = QObject::tr("The file %1 has been exported successfully.") + .arg(QString::fromStdString(fp.getLevelName())); + + std::vector buttons = {QObject::tr("OK"), + QObject::tr("Open containing folder")}; + int ret = DVGui::MsgBox(DVGui::INFORMATION, str, buttons); + + if (ret == 2) { + TFilePath folderPath = fp.getParentDir(); + if (TSystem::isUNC(folderPath)) + QDesktopServices::openUrl(QUrl(folderPath.getQString())); + else + QDesktopServices::openUrl(QUrl::fromLocalFile(folderPath.getQString())); + } +} diff --git a/toonz/sources/toonz/xdtsio.h b/toonz/sources/toonz/xdtsio.h new file mode 100644 index 0000000..d1880a0 --- /dev/null +++ b/toonz/sources/toonz/xdtsio.h @@ -0,0 +1,242 @@ +#pragma once +#ifndef XDTSIO_H +#define XDTSIO_H + +#include +#include +#include +#include + +#include + +class ToonzScene; +class TFilePath; +class TXsheet; +class TXshCellColumn; +class QJsonObject; + +namespace XdtsIo { + +enum FieldId { CELL = 0, DIALOG = 3, CAMERAWORK = 5 }; +// (*1) Field: Input location of each timesheet instruction. +// Fields are divided into cells, dialog, and camerawork. +// [FieldId] [field name] [details] +// 0 Cell Field for cell numbers +// 3 Dialog Field for speaker names and line timing +// 5 Camerawork Field for camerawork instructions + +// "description": "Cut / scene information", +class XdtsHeader { + //"description": "Cut No." + //"pattern" : "\\d{1,4}" + QString m_cut; + //"description": "Scene No.", + //"pattern" : "\\d{1,4}" + QString m_scene; + + // "required": ["cut", "scene"] +public: + void read(const QJsonObject &json); + void write(QJsonObject &json) const; + bool isEmpty() const { return m_cut.isEmpty() && m_scene.isEmpty(); } +}; + +//"description": "Frame instruction information", +class XdtsFrameDataItem { + //"description": "Instruction type(*2)", + //*2 Currently only supports instructions with id=0. + enum DataId { Default = 0 } m_id; + + //"description": "Instruction value(*3)", + QList m_values; + // "minItems" : 1, + //"required": ["id", "values"] + + //(*3) Values are different depending on the field type. + // Values for each field are as follows. + // [Field name: Cell] + // Enter the cell number string and special instruction string(*4) + // (value element numbers: 1) + // [Field name: Dialog] + // In the dialog's first frame, enter the speaker name in the first + // element, and the dialog's string in the second element. + // When the line lasts for multiple frames, specify the character + // string "SYMBOL_HYPHEN" up to the end frame. + // (value element numbers: 1�`2) + // [Field name: Camerawork] + // In the camerawork's first frame, enter the camerawork instruction + // string When the camerawork lasts for multiple frames, specify the + // character string "SYMBOL_HYPHEN" up to the end frame. + // (value element numbers: 1) + + //(*4) Special instruction character strings + // [Character string] [Instruction] [Valid field] + // SYMBOL_TICK_1 Inbetween symbol(��) Cell + // SYMBOL_TICK_2 Reverse sheet symbol(��) Cell + // SYMBOL_NULL_CELL Empty cell symbol(�~) Cell + // SYMBOL_HYPHEN Continue previous All fields + // field instruction + +public: + XdtsFrameDataItem() : m_id(Default) {} + XdtsFrameDataItem(int cellNumber) : m_id(Default) { + m_values.append((cellNumber == 0) ? QString("SYMBOL_NULL_CELL") + : QString::number(cellNumber)); + } + void read(const QJsonObject &json); + void write(QJsonObject &json) const; + int getCellNumber() const { + if (m_values.isEmpty()) return 0; + QString val = m_values.at(0); + if (val == "SYMBOL_NULL_CELL") return 0; + // ignore sheet symbols for now + else if (val == "SYMBOL_HYPHEN" || val == "SYMBOL_TICK_1" || + val == "SYMBOL_TICK_2") + return -1; + // return cell number + return m_values.at(0).toInt(); + } +}; + +//"description": "Individual layer frame information", +class XdtsTrackFrameItem { + //"description": "Frame instruction information", + QList m_data; + + //"description": "Frame No.(*5)", + // (*5) Set as 0 when specifying the first frame. + //"minimum" : 0 + int m_frame; + + //"required": ["data", "frame"] +public: + XdtsTrackFrameItem() = default; + XdtsTrackFrameItem(int frame, int cellNumber) : m_frame(frame) { + m_data.append(XdtsFrameDataItem(cellNumber)); + } + void read(const QJsonObject &json); + void write(QJsonObject &json) const; + QPair frameCellNumber() const; +}; + +//"description": "Individual field layer info", +class XdtsFieldTrackItem { + //"description": "Individual layer frame information", + QList m_frames; + + //"description": "Layer No.(*6)", + // (*6) Set as 0 for the bottom layer. + // corresponds to column numbers in OT + int m_trackNo; + // "minimum" : 0 + + //"required": ["frames", "trackNo"] +public: + XdtsFieldTrackItem(int trackNo = 0) : m_trackNo(trackNo) {} + void read(const QJsonObject &json); + void write(QJsonObject &json) const; + bool isEmpty() const { return m_frames.isEmpty(); } + int getTrackNo() const { return m_trackNo; } + QVector getCellNumberTrack() const; + + QString build(TXshCellColumn *, int); + void addFrame(int frame, int cellNumber) { + m_frames.append(XdtsTrackFrameItem(frame, cellNumber)); + } +}; + +class XdtsTimeTableFieldItem { + // "description": "Field type(*1)", + FieldId m_fieldId; + + //"description": "Individual field layer info", + QList m_tracks; + + //"required": ["fieldId", "tracks"] +public: + XdtsTimeTableFieldItem(FieldId fieldId = CELL) : m_fieldId(fieldId) {} + void read(const QJsonObject &json); + void write(QJsonObject &json) const; + bool isCellField() { return m_fieldId == CELL; } + QList getOccupiedColumns() const; + QVector getColumnTrack(int col) const; + + void build(TXsheet *, int, QStringList &); +}; + +class XdtsTimeTableHeaderItem { + //"description": "Field type(*1)", + FieldId m_fieldId; + + //"description": "Layer name array(*7)", + //(*7) Specify layer names with trackNo's that match numbers counted as 0,1,2, + // etc. + QStringList m_names; + + //"required": ["fieldId", "names"] +public: + XdtsTimeTableHeaderItem(FieldId fieldId = CELL) : m_fieldId(fieldId) {} + void read(const QJsonObject &json); + void write(QJsonObject &json) const; + bool isCellField() { return m_fieldId == CELL; } + QStringList getLayerNames() const { return m_names; } + + void build(QStringList &); + void addName(QString name) { m_names.append(name); } +}; + +class XdtsTimeTableItem { + //"description": "Individual field info", + QList m_fields; + int m_cellFieldIndex = -1; + //"description": "Timesheet total frames", + //"minimum" : 1 + int m_duration; + + //"description": "Timesheet name", + QString m_name; + + // "description": "Individual field layer name", + QList m_timeTableHeaders; + int m_cellHeaderIndex = -1; + //"required": ["duration", "name", "timeTableHeaders"] + +public: + void read(const QJsonObject &json); + void write(QJsonObject &json) const; + QStringList getLevelNames() const; + XdtsTimeTableFieldItem getCellField() { return m_fields[m_cellFieldIndex]; } + XdtsTimeTableHeaderItem getCellHeader() { + return m_timeTableHeaders[m_cellHeaderIndex]; + } + int getDuration() { return m_duration; } + + void build(TXsheet *, QString); +}; + +// "$schema": "http://json-schema.org/draft-07/schema", +class XdtsData { + XdtsHeader m_header; + + //"description": "Timesheet info", + //"minItems" : 1, + QList m_timeTables; + + // "description": "XTDS file format version", + enum Version { Ver_2018_11_29 = 5 } m_version; + + //"required": ["timeTables", "version"] +public: + XdtsData(Version version = Ver_2018_11_29) : m_version(version) {} + void read(const QJsonObject &json); + void write(QJsonObject &json) const; + QStringList getLevelNames() const; + XdtsTimeTableItem &timeTable() { return m_timeTables[0]; } + void build(TXsheet *, QString); +}; + +bool loadXdtsScene(ToonzScene *scene, const TFilePath &scenePath); + +} // namespace XdtsIo + +#endif diff --git a/toonz/sources/toonz/xshcellviewer.cpp b/toonz/sources/toonz/xshcellviewer.cpp index e9cc51a..5456acc 100644 --- a/toonz/sources/toonz/xshcellviewer.cpp +++ b/toonz/sources/toonz/xshcellviewer.cpp @@ -277,6 +277,7 @@ void parse(const QString &text, std::wstring &levelName, TFrameId &fid) { QRegExp spaces("\\t|\\s"); QRegExp numbers("\\d+"); QRegExp caracters("[^\\d+]"); + QRegExp fidWithSuffix("([0-9]+)([a-z]?)"); QString str = text; // remove final spaces @@ -293,6 +294,11 @@ void parse(const QString &text, std::wstring &levelName, TFrameId &fid) { if (str.contains(numbers) && !str.contains(caracters)) { levelName = L""; fid = TFrameId(str.toInt()); + } else if (fidWithSuffix.exactMatch(str)) { + levelName = L""; + fid = TFrameId( + fidWithSuffix.cap(1).toInt(), + fidWithSuffix.cap(2) == "" ? 0 : fidWithSuffix.cap(2).toLatin1()[0]); } else if (str.contains(caracters)) { levelName = text.toStdWString(); fid = TFrameId::NO_FRAME; @@ -303,6 +309,12 @@ void parse(const QString &text, std::wstring &levelName, TFrameId &fid) { QString firstString = str.left(lastSpaceIndex); levelName = firstString.toStdWString(); fid = TFrameId(lastString.toInt()); + } else if (fidWithSuffix.exactMatch(lastString)) { + QString firstString = str.left(lastSpaceIndex); + levelName = firstString.toStdWString(); + fid = TFrameId( + fidWithSuffix.cap(1).toInt(), + fidWithSuffix.cap(2) == "" ? 0 : fidWithSuffix.cap(2).toLatin1()[0]); } else if (lastString.contains(caracters)) { levelName = text.toStdWString(); fid = TFrameId::NO_FRAME; @@ -318,46 +330,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 +382,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; } @@ -759,12 +751,13 @@ void RenameCellField::renameCell() { // Ex. 12 -> 1B 21 -> 2A 30 -> 3 if (Preferences::instance()->isShowFrameNumberWithLettersEnabled()) parse_with_letter(QString::fromStdWString(newName), levelName, fid); - else + else { parse(QString::fromStdWString(newName), levelName, fid); - + } bool animationSheetEnabled = Preferences::instance()->isAnimationSheetEnabled(); - bool levelDefined = + + /*bool levelDefined = xsheet->getCell(m_row, m_col).getSimpleLevel() != 0 || m_row > 0 && xsheet->getCell(m_row - 1, m_col).getSimpleLevel() != 0; @@ -785,8 +778,7 @@ void RenameCellField::renameCell() { } } return; - } - + }*/ TCellSelection *cellSelection = dynamic_cast( TApp::instance()->getCurrentSelection()->getSelection()); if (!cellSelection) return; @@ -1825,10 +1817,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 = @@ -1928,8 +1920,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(); @@ -2035,7 +2028,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); @@ -2067,7 +2060,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) @@ -2088,7 +2081,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(); @@ -2099,8 +2092,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)); @@ -2232,7 +2225,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); @@ -2791,10 +2784,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 && @@ -2929,10 +2921,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"); @@ -3325,6 +3316,8 @@ void CellArea::createCellMenu(QMenu &menu, bool isCellSelected, TXshCell cell) { replaceLevelMenu->addAction( cmdManager->getAction(MI_RevertToLastSaved)); menu.addAction(cmdManager->getAction(MI_SetKeyframes)); + menu.addAction(cmdManager->getAction(MI_ShiftKeyframesDown)); + menu.addAction(cmdManager->getAction(MI_ShiftKeyframesUp)); } menu.addSeparator(); } @@ -3389,6 +3382,8 @@ void CellArea::createCellMenu(QMenu &menu, bool isCellSelected, TXshCell cell) { if (cameraCellsSelected) { menu.addSeparator(); menu.addAction(cmdManager->getAction(MI_SetKeyframes)); + menu.addAction(cmdManager->getAction(MI_ShiftKeyframesDown)); + menu.addAction(cmdManager->getAction(MI_ShiftKeyframesUp)); } } menu.addSeparator(); @@ -3460,6 +3455,9 @@ void CellArea::createKeyMenu(QMenu &menu) { menu.addAction(cmdManager->getAction(MI_Paste)); menu.addAction(cmdManager->getAction(MI_Clear)); menu.addSeparator(); + menu.addAction(cmdManager->getAction(MI_ShiftKeyframesDown)); + menu.addAction(cmdManager->getAction(MI_ShiftKeyframesUp)); + menu.addSeparator(); menu.addAction(cmdManager->getAction(MI_OpenFunctionEditor)); } @@ -3511,6 +3509,8 @@ void CellArea::createKeyLineMenu(QMenu &menu, int row, int col) { if (col < 0) { menu.addSeparator(); menu.addAction(cmdManager->getAction(MI_SetKeyframes)); + menu.addAction(cmdManager->getAction(MI_ShiftKeyframesDown)); + menu.addAction(cmdManager->getAction(MI_ShiftKeyframesUp)); } #ifdef LINETEST diff --git a/toonz/sources/toonz/xshrowviewer.cpp b/toonz/sources/toonz/xshrowviewer.cpp index 092fb57..2a2d546 100644 --- a/toonz/sources/toonz/xshrowviewer.cpp +++ b/toonz/sources/toonz/xshrowviewer.cpp @@ -12,6 +12,7 @@ #include "cellselection.h" #include "menubarcommandids.h" #include "toonzqt/menubarcommand.h" +#include "../stopmotion/stopmotion.h" #include "toonz/toonzscene.h" #include "tconvert.h" @@ -370,8 +371,26 @@ void RowArea::drawCurrentRowGadget(QPainter &p, int r0, int r1) { p.fillRect(header, m_viewer->getCurrentRowBgColor()); } +#ifdef WITH_STOPMOTION //----------------------------------------------------------------------------- +void RowArea::drawStopMotionCameraIndicator(QPainter &p) { + int cameraRow = StopMotion::instance()->getXSheetFrameNumber() - 1; + if (cameraRow < 0) return; + + QPoint topLeft = m_viewer->positionToXY(CellPosition(cameraRow, 0)); + if (!m_viewer->orientation()->isVerticalTimeline()) topLeft.setY(0); + QRect header = m_viewer->orientation() + ->rect(PredefinedRect::FRAME_HEADER) + .translated(topLeft); + int frameAdj = m_viewer->getFrameZoomAdjustment(); + header.adjust(1, 1, -frameAdj, 0); + p.fillRect(header, Qt::GlobalColor::darkGreen); +} + +//----------------------------------------------------------------------------- +#endif + void RowArea::drawOnionSkinBackground(QPainter &p, int r0, int r1) { const Orientation *o = m_viewer->orientation(); @@ -830,6 +849,15 @@ void RowArea::paintEvent(QPaintEvent *event) { // current frame drawCurrentRowGadget(p, r0, r1); +#ifdef WITH_STOPMOTION + StopMotion *stopMotion = StopMotion::instance(); + if (stopMotion->getPlaceOnXSheet() && + (stopMotion->m_liveViewStatus > 0)) { + drawStopMotionCameraIndicator(p); + } + +#endif + if (TApp::instance()->getCurrentFrame()->isEditingScene() && Preferences::instance()->isCurrentTimelineIndicatorEnabled() && !m_viewer->orientation()->isVerticalTimeline()) diff --git a/toonz/sources/toonz/xshrowviewer.h b/toonz/sources/toonz/xshrowviewer.h index cb8e8e8..3bf9763 100644 --- a/toonz/sources/toonz/xshrowviewer.h +++ b/toonz/sources/toonz/xshrowviewer.h @@ -55,6 +55,10 @@ class RowArea final : public QWidget { void drawCurrentTimeLine(QPainter &p); void drawShiftTraceMarker(QPainter &p); +#ifdef WITH_STOPMOTION + void drawStopMotionCameraIndicator(QPainter &p); +#endif + DragTool *getDragTool() const; void setDragTool(DragTool *dragTool); diff --git a/toonz/sources/toonzfarm/tfarm/tfarmtask.cpp b/toonz/sources/toonzfarm/tfarm/tfarmtask.cpp index 66ffc5f..610df76 100644 --- a/toonz/sources/toonzfarm/tfarm/tfarmtask.cpp +++ b/toonz/sources/toonzfarm/tfarm/tfarmtask.cpp @@ -368,8 +368,7 @@ static QString getExeName(bool isComposer) { return name + ".exe "; #elif defined(MACOSX) TVER::ToonzVersion tver; - return "\"./" + QString::fromStdString(tver.getAppName()) + "_" + - QString::fromStdString(tver.getAppVersionString()) + + return "\"./" + QString::fromStdString(tver.getAppName()) + ".app/Contents/MacOS/" + name + "\" "; #else return name; diff --git a/toonz/sources/toonzfarm/tfarmcontroller/tfarmcontroller.cpp b/toonz/sources/toonzfarm/tfarmcontroller/tfarmcontroller.cpp index a1c038a..53ef038 100644 --- a/toonz/sources/toonzfarm/tfarmcontroller/tfarmcontroller.cpp +++ b/toonz/sources/toonzfarm/tfarmcontroller/tfarmcontroller.cpp @@ -70,8 +70,7 @@ TFilePath getGlobalRoot() { // Leggo la globalRoot da File txt #ifdef MACOSX // If MACOSX, change to MACOSX path - std::string unixpath = "./" + tver.getAppName() + "_" + - tver.getAppVersionString() + + std::string unixpath = "./" + tver.getAppName() + ".app/Contents/Resources/configfarmroot.txt"; #else // set path to something suitable for most linux (Unix?) systems @@ -106,8 +105,7 @@ TFilePath getLocalRoot() { TFilePath lroot; #ifdef _WIN32 -std: - string regpath = "SOFTWARE\\" + tver.getAppName() + "\\" + tver.getAppName() + + std::string regpath = "SOFTWARE\\" + tver.getAppName() + "\\" + tver.getAppName() + "\\" + tver.getAppVersionString() + "\\FARMROOT"; TFilePath name(regpath); lroot = TFilePath(TSystem::getSystemValue(name).toStdString()) + @@ -116,8 +114,7 @@ std: // Leggo la localRoot da File txt #ifdef MACOSX // If MACOSX, change to MACOSX path - std::string unixpath = "./" + tver.getAppName() + "_" + - tver.getAppVersionString() + + std::string unixpath = "./" + tver.getAppName() + ".app/Contents/Resources/configfarmroot.txt"; #else // set path to something suitable for most linux (Unix?) systems @@ -2253,8 +2250,7 @@ void ControllerService::onStart(int argc, char *argv[]) { TFilePath logFilePath = lRootDir + "controller.log"; m_userLog = new TUserLog(logFilePath); } -std: - string appverinfo = tver.getAppVersionInfo("Farm Controller") + "\n\n"; + std::string appverinfo = tver.getAppVersionInfo("Farm Controller") + "\n\n"; m_userLog->info(appverinfo.c_str()); TFilePath globalRoot = getGlobalRoot(); diff --git a/toonz/sources/toonzfarm/tfarmserver/tfarmserver.cpp b/toonz/sources/toonzfarm/tfarmserver/tfarmserver.cpp index be839a3..d40e6c0 100644 --- a/toonz/sources/toonzfarm/tfarmserver/tfarmserver.cpp +++ b/toonz/sources/toonzfarm/tfarmserver/tfarmserver.cpp @@ -76,8 +76,7 @@ TFilePath getGlobalRoot() { // Leggo la localRoot da File txt #ifdef MACOSX // If MACOSX, change to MACOSX path - std::string unixpath = "./" + tver.getAppName() + "_" + - tver.getAppVersionString() + + std::string unixpath = "./" + tver.getAppName() + ".app/Contents/Resources/configfarmroot.txt"; #else // set path to something suitable for most linux (Unix?) systems @@ -121,8 +120,7 @@ TFilePath getLocalRoot() { #else #ifdef MACOSX // If MACOSX, change to MACOSX path - std::string unixpath = "./" + tver.getAppName() + "_" + - tver.getAppVersionString() + + std::string unixpath = "./" + tver.getAppName() + ".app/Contents/Resources/configfarmroot.txt"; #else // set path to something suitable for most linux (Unix?) systems @@ -385,8 +383,7 @@ static QString getExeName(bool isComposer) { return name + ".exe "; #elif defined(MACOSX) TVER::ToonzVersion tver; - return "\"./" + QString::fromStdString(tver.getAppName()) + "_" + - QString::fromStdString(tver.getAppVersionString()) + + return "\"./" + QString::fromStdString(tver.getAppName()) + ".app/Contents/MacOS/" + name + "\" "; #else return name; @@ -879,8 +876,7 @@ void FarmServerService::onStart(int argc, char *argv[]) { m_userLog = new TUserLog(logFilePath); } -std: - string appverinfo = tver.getAppVersionInfo("Farm Server") + "\n\n"; + std::string appverinfo = tver.getAppVersionInfo("Farm Server") + "\n\n"; m_userLog->info(appverinfo.c_str()); // legge dal file di configurazione dei server il numero di porta da diff --git a/toonz/sources/toonzlib/fxcommand.cpp b/toonz/sources/toonzlib/fxcommand.cpp index aab8e07..e2a7bf5 100644 --- a/toonz/sources/toonzlib/fxcommand.cpp +++ b/toonz/sources/toonzlib/fxcommand.cpp @@ -141,7 +141,7 @@ void showFx(TXsheet *xsh, TFx *fx) { fx->getAttributes()->setIsOpened(xsh->getFxDag()->getDagGridDimension() == 0); if (TZeraryColumnFx *zcfx = dynamic_cast(fx)) - fx = zcfx->getZeraryFx(); + fx = zcfx->getZeraryFx(); fx->getAttributes()->passiveCacheDataIdx() = -1; } @@ -589,9 +589,8 @@ template TFx *FxCommandUndo::leftmostConnectedFx(TFx *fx, Pred pred) { assert(fx); - fx = rightmostConnectedFx( - fx, pred); // The rightmost fx should be discovered first, - // then, we'll descend from that + fx = rightmostConnectedFx(fx, pred); // The rightmost fx should be discovered + // first, then, we'll descend from that do { fx = ::getActualIn(fx); @@ -630,7 +629,7 @@ namespace { struct True_pred { bool operator()(TFx *fx) { return true; } }; -} +} // namespace TFx *FxCommandUndo::leftmostConnectedFx(TFx *fx) { return leftmostConnectedFx(fx, ::True_pred()); @@ -1155,7 +1154,7 @@ void ReplaceFxUndo::initialize() { } TZeraryColumnFx *zcrepfx = dynamic_cast(repFx); - if (zcrepfx) repFx = zcrepfx->getZeraryFx(); + if (zcrepfx) repFx = zcrepfx->getZeraryFx(); bool fxHasCol = has_fx_column(fx); bool repfxHasCol = has_fx_column(repFx); @@ -2577,6 +2576,10 @@ void UndoPasteFxs::initialize(const std::map &zeraryFxColumnSize, int ip, ipCount = macroFx->getInputPortCount(); for (ip = 0; ip != ipCount; ++ip) locals::renamePort(macroFx, ip, oldFxId, newFxId); + // node position of the macrofx is defined by dag-pos of inner fxs. + // so we need to reset them here or pasted node will be at the same + // position as the copied one. + locals::buildDagPos(inFx, inFx, copyDagPos, addOffset); } } diff --git a/toonz/sources/toonzlib/levelproperties.cpp b/toonz/sources/toonzlib/levelproperties.cpp index ebde85c..3ec1db9 100644 --- a/toonz/sources/toonzlib/levelproperties.cpp +++ b/toonz/sources/toonzlib/levelproperties.cpp @@ -15,7 +15,8 @@ LevelOptions::LevelOptions() , m_antialias(0) , m_dpiPolicy(DP_ImageDpi) , m_whiteTransp(false) - , m_premultiply(false) {} + , m_premultiply(false) + , m_isStopMotionLevel(false) {} //----------------------------------------------------------------------------- @@ -24,6 +25,7 @@ bool LevelOptions::operator==(const LevelOptions &other) const { m_whiteTransp == other.m_whiteTransp && m_dpiPolicy == other.m_dpiPolicy && m_antialias == other.m_antialias && + m_isStopMotionLevel == other.m_isStopMotionLevel && (m_dpiPolicy == LevelOptions::DP_ImageDpi || m_dpi == other.m_dpi)); } diff --git a/toonz/sources/toonzlib/preferences.cpp b/toonz/sources/toonzlib/preferences.cpp index e358591..6dd0aeb 100644 --- a/toonz/sources/toonzlib/preferences.cpp +++ b/toonz/sources/toonzlib/preferences.cpp @@ -226,6 +226,8 @@ Preferences::Preferences() { initializeOptions(); definePreferenceItems(); + // resolve compatibility for deprecated items + resolveCompatibility(); // initialize environment based on loaded preferences setUnits(); @@ -450,9 +452,15 @@ void Preferences::definePreferenceItems() { TCamera().getSize().ly, 0.1, std::numeric_limits::max()); define(DefLevelDpi, "DefLevelDpi", QMetaType::Double, TCamera().getDpi().x, 0.1, std::numeric_limits::max()); - define(AutocreationType, "AutocreationType", QMetaType::Int, - 2); // Use Xsheet as Animation Sheet + + define(EnableAutocreation, "EnableAutocreation", QMetaType::Bool, true); + define(NumberingSystem, "NumberingSystem", QMetaType::Int, + 0); // Incremental define(EnableAutoStretch, "EnableAutoStretch", QMetaType::Bool, true); + define(EnableCreationInHoldCells, "EnableCreationInHoldCells", + QMetaType::Bool, true); + define(EnableAutoRenumber, "EnableAutoRenumber", QMetaType::Bool, true); + define(vectorSnappingTarget, "vectorSnappingTarget", QMetaType::Int, (int)SnapAll); define(saveUnpaintedInCleanup, "saveUnpaintedInCleanup", QMetaType::Bool, @@ -576,6 +584,10 @@ void Preferences::definePreferenceItems() { define(shortcutPreset, "shortcutPreset", QMetaType::QString, "defopentoonz"); // Viewer context menu define(guidedDrawingType, "guidedDrawingType", QMetaType::Int, 0); // Off + define(guidedAutoInbetween, "guidedAutoInbetween", QMetaType::Bool, + false); // Off + define(guidedInterpolationType, "guidedInterpolationType", QMetaType::Int, + 1); // Linear #if defined(MACOSX) && defined(__LP64__) // OSX shared memory settings define(shmmax, "shmmax", QMetaType::Int, -1); @@ -666,6 +678,30 @@ void Preferences::setCallBack(const PreferencesItemId id, OnEditedFunc func) { //----------------------------------------------------------------- +void Preferences::resolveCompatibility() { + // autocreation type is divided into "EnableAutocreation" and + // "NumberingSystem" + if (m_settings->contains("AutocreationType") && + !m_settings->contains("EnableAutocreation")) { + int type = m_settings->value("AutocreationType").toInt(); + switch (type) { + case 0: // former "Disabled" + setValue(EnableAutocreation, false); + break; + case 1: // former "Enabled" + setValue(EnableAutocreation, true); + setValue(NumberingSystem, 0); // set numbering system to "Incremental" + break; + case 2: // former "Use Xsheet as Animation Sheet" + setValue(EnableAutocreation, true); + setValue(NumberingSystem, 1); + break; + } + } +} + +//----------------------------------------------------------------- + PreferencesItem &Preferences::getItem(const PreferencesItemId id) { assert(m_items.contains(id)); return m_items[id]; diff --git a/toonz/sources/toonzlib/stage.cpp b/toonz/sources/toonzlib/stage.cpp index 622bb34..e42ade2 100644 --- a/toonz/sources/toonzlib/stage.cpp +++ b/toonz/sources/toonzlib/stage.cpp @@ -77,7 +77,7 @@ void updateOnionSkinSize(const PlayerSet &players) { assert(Player::m_onionSkinFrontSize == 0 && Player::m_onionSkinBackSize == 0); int i; int maxOnionSkinFrontValue = 0, maxOnionSkinBackValue = 0, - firstBackOnionSkin = 0, lastBackVisibleSkin = 0; + firstFrontOnionSkin = 0, firstBackOnionSkin = 0, lastBackVisibleSkin = 0; for (i = 0; i < (int)players.size(); i++) { Player player = players[i]; if (player.m_onionSkinDistance == c_noOnionSkin) continue; @@ -87,6 +87,12 @@ void updateOnionSkinSize(const PlayerSet &players) { if (player.m_onionSkinDistance < 0 && maxOnionSkinBackValue > player.m_onionSkinDistance) maxOnionSkinBackValue = player.m_onionSkinDistance; + if (firstFrontOnionSkin == 0 && player.m_onionSkinDistance > 0) + firstFrontOnionSkin = player.m_onionSkinDistance; + else if (player.m_onionSkinDistance > 0 && + firstFrontOnionSkin > player.m_onionSkinDistance) + firstFrontOnionSkin = player.m_onionSkinDistance; + if (firstBackOnionSkin == 0 && player.m_onionSkinDistance < 0) firstBackOnionSkin = player.m_onionSkinDistance; else if (player.m_onionSkinDistance < 0 && @@ -99,6 +105,7 @@ void updateOnionSkinSize(const PlayerSet &players) { } Player::m_onionSkinFrontSize = maxOnionSkinFrontValue; Player::m_onionSkinBackSize = maxOnionSkinBackValue; + Player::m_firstFrontOnionSkin = firstFrontOnionSkin; Player::m_firstBackOnionSkin = firstBackOnionSkin; Player::m_lastBackVisibleSkin = lastBackVisibleSkin; } @@ -199,6 +206,8 @@ public: // for guided drawing TFrameId m_currentFrameId; int m_isGuidedDrawingEnabled; + int m_guidedFrontStroke = -1; + int m_guidedBackStroke = -1; std::vector m_ancestors; const ImagePainter::VisualSettings *m_vs; @@ -378,6 +387,8 @@ void StageBuilder::addCell(PlayerSet &players, ToonzScene *scene, TXsheet *xsh, player.m_frame = row; player.m_currentFrameId = m_currentFrameId; player.m_isGuidedDrawingEnabled = m_isGuidedDrawingEnabled; + player.m_guidedFrontStroke = m_guidedFrontStroke; + player.m_guidedBackStroke = m_guidedBackStroke; player.m_dpiAff = sl ? getDpiAffine(sl, cell.m_frameId) : TAffine(); player.m_onionSkinDistance = m_onionSkinDistance; player.m_isCurrentColumn = (m_currentColumnIndex == col); @@ -675,6 +686,8 @@ void StageBuilder::addSimpleLevelFrame(PlayerSet &players, player.m_isEditingLevel = true; player.m_currentFrameId = m_currentFrameId; player.m_isGuidedDrawingEnabled = m_isGuidedDrawingEnabled; + player.m_guidedFrontStroke = m_guidedFrontStroke; + player.m_guidedBackStroke = m_guidedBackStroke; player.m_isVisibleinOSM = ghostRow >= 0; player.m_onionSkinDistance = m_onionSkinDistance; player.m_dpiAff = getDpiAffine(level, ghostFid); @@ -753,6 +766,8 @@ void StageBuilder::addSimpleLevelFrame(PlayerSet &players, player.m_isEditingLevel = true; player.m_currentFrameId = m_currentFrameId; player.m_isGuidedDrawingEnabled = m_isGuidedDrawingEnabled; + player.m_guidedFrontStroke = m_guidedFrontStroke; + player.m_guidedBackStroke = m_guidedBackStroke; player.m_isVisibleinOSM = rows[i] >= 0; #ifdef NUOVO_ONION player.m_onionSkinDistance = rows[i] - row; @@ -842,8 +857,11 @@ void Stage::visit(Visitor &visitor, const VisitArgs &args) { sb.m_onionSkinMask = *osm; sb.m_currentFrameId = args.m_currentFrameId; sb.m_isGuidedDrawingEnabled = args.m_isGuidedDrawingEnabled; + sb.m_guidedFrontStroke = args.m_guidedFrontStroke; + sb.m_guidedBackStroke = args.m_guidedBackStroke; Player::m_onionSkinFrontSize = 0; Player::m_onionSkinBackSize = 0; + Player::m_firstFrontOnionSkin = 0; Player::m_firstBackOnionSkin = 0; Player::m_lastBackVisibleSkin = 0; Player::m_isShiftAndTraceEnabled = osm->isShiftTraceEnabled(); @@ -876,14 +894,18 @@ void Stage::visit(Visitor &visitor, ToonzScene *scene, TXsheet *xsh, int row) { */ void Stage::visit(Visitor &visitor, TXshSimpleLevel *level, const TFrameId &fid, const OnionSkinMask &osm, bool isPlaying, - int isGuidedDrawingEnabled) { + int isGuidedDrawingEnabled, int guidedBackStroke, + int guidedFrontStroke) { StageBuilder sb; sb.m_vs = &visitor.m_vs; sb.m_onionSkinMask = osm; sb.m_currentFrameId = fid; sb.m_isGuidedDrawingEnabled = isGuidedDrawingEnabled; + sb.m_guidedFrontStroke = guidedFrontStroke; + sb.m_guidedBackStroke = guidedBackStroke; Player::m_onionSkinFrontSize = 0; Player::m_onionSkinBackSize = 0; + Player::m_firstFrontOnionSkin = 0; Player::m_firstBackOnionSkin = 0; Player::m_lastBackVisibleSkin = 0; Player::m_isShiftAndTraceEnabled = osm.isShiftTraceEnabled(); @@ -896,8 +918,9 @@ void Stage::visit(Visitor &visitor, TXshSimpleLevel *level, const TFrameId &fid, void Stage::visit(Visitor &visitor, TXshLevel *level, const TFrameId &fid, const OnionSkinMask &osm, bool isPlaying, - double isGuidedDrawingEnabled) { + double isGuidedDrawingEnabled, int guidedBackStroke, + int guidedFrontStroke) { if (level && level->getSimpleLevel()) visit(visitor, level->getSimpleLevel(), fid, osm, isPlaying, - (int)isGuidedDrawingEnabled); + (int)isGuidedDrawingEnabled, guidedBackStroke, guidedFrontStroke); } diff --git a/toonz/sources/toonzlib/stageplayer.cpp b/toonz/sources/toonzlib/stageplayer.cpp index 2f7ff4e..fa80713 100644 --- a/toonz/sources/toonzlib/stageplayer.cpp +++ b/toonz/sources/toonzlib/stageplayer.cpp @@ -21,6 +21,7 @@ using namespace Stage; double Player::m_onionSkinFrontSize = 0; double Player::m_onionSkinBackSize = 0; +double Player::m_firstFrontOnionSkin = 0; double Player::m_firstBackOnionSkin = 0; double Player::m_lastBackVisibleSkin = 0; bool Player::m_isShiftAndTraceEnabled = false; diff --git a/toonz/sources/toonzlib/stagevisitor.cpp b/toonz/sources/toonzlib/stagevisitor.cpp index e62ff4b..e4711cb 100644 --- a/toonz/sources/toonzlib/stagevisitor.cpp +++ b/toonz/sources/toonzlib/stagevisitor.cpp @@ -467,6 +467,14 @@ void RasterPainter::flushRasterImages() { int lx = rect.getLx(), ly = rect.getLy(); TDimension dim(lx, ly); + // this is needed since a stop motion live view + // doesn't register as a node correctly + // there is probably a better way to do this. + if (rect.getLx() == 0 && lx == 0) { + rect = m_clipRect; + dim = m_dim; + } + // Build a raster buffer of sufficient size to hold said union. // The buffer is per-thread cached in order to improve the rendering speed. if (!threadBuffers.hasLocalData()) @@ -861,13 +869,15 @@ void RasterPainter::onVectorImage(TVectorImage *vi, rd.m_show0ThickStrokes = prefs.getShow0ThickLines(); rd.m_regionAntialias = prefs.getRegionAntialias(); rd.m_animatedGuidedDrawing = prefs.getAnimatedGuidedDrawing(); - if (player.m_onionSkinDistance < 0 && + if (player.m_onionSkinDistance != 0 && (player.m_isCurrentColumn || player.m_isCurrentXsheetLevel)) { if (player.m_isGuidedDrawingEnabled == 3 // show guides on all || (player.m_isGuidedDrawingEnabled == 1 && // show guides on closest - player.m_onionSkinDistance == player.m_firstBackOnionSkin) || + (player.m_onionSkinDistance == player.m_firstBackOnionSkin || + player.m_onionSkinDistance == player.m_firstFrontOnionSkin)) || (player.m_isGuidedDrawingEnabled == 2 && // show guides on farthest - player.m_onionSkinDistance == player.m_onionSkinBackSize) || + (player.m_onionSkinDistance == player.m_onionSkinBackSize || + player.m_onionSkinDistance == player.m_onionSkinFrontSize)) || (player.m_isEditingLevel && // fix for level editing mode sending extra // players player.m_isGuidedDrawingEnabled == 2 && @@ -881,7 +891,16 @@ void RasterPainter::onVectorImage(TVectorImage *vi, TImageP image = sl->getFrame(player.m_currentFrameId, false); TVectorImageP vecImage = image; if (vecImage) currentStrokeCount = vecImage->getStrokeCount(); - if (currentStrokeCount < totalStrokes) + if (currentStrokeCount < 0) currentStrokeCount = 0; + if (player.m_guidedFrontStroke != -1 && + (player.m_onionSkinDistance == player.m_onionSkinFrontSize || + player.m_onionSkinDistance == player.m_firstFrontOnionSkin)) + rd.m_indexToHighlight = player.m_guidedFrontStroke; + else if (player.m_guidedBackStroke != -1 && + (player.m_onionSkinDistance == player.m_onionSkinBackSize || + player.m_onionSkinDistance == player.m_firstBackOnionSkin)) + rd.m_indexToHighlight = player.m_guidedBackStroke; + else if (currentStrokeCount < totalStrokes) rd.m_indexToHighlight = currentStrokeCount; double guidedM[4] = {1.0, 1.0, 1.0, 1.0}, guidedC[4]; diff --git a/toonz/sources/toonzlib/txshsimplelevel.cpp b/toonz/sources/toonzlib/txshsimplelevel.cpp index 96596f9..e48b4fe 100644 --- a/toonz/sources/toonzlib/txshsimplelevel.cpp +++ b/toonz/sources/toonzlib/txshsimplelevel.cpp @@ -907,6 +907,7 @@ void TXshSimpleLevel::loadData(TIStream &is) { int doPremultiply = 0; int whiteTransp = 0; int antialiasSoftness = 0; + int isStopMotionLevel = 0; LevelProperties::DpiPolicy dpiPolicy = LevelProperties::DP_ImageDpi; if (is.getTagParam("dpix", v)) xdpi = std::stod(v); if (is.getTagParam("dpiy", v)) ydpi = std::stod(v); @@ -918,6 +919,9 @@ void TXshSimpleLevel::loadData(TIStream &is) { if (is.getTagParam("premultiply", v)) doPremultiply = std::stoi(v); if (is.getTagParam("antialias", v)) antialiasSoftness = std::stoi(v); if (is.getTagParam("whiteTransp", v)) whiteTransp = std::stoi(v); + if (is.getTagParam("isStopMotionLevel", v)) + isStopMotionLevel = std::stoi(v); + m_properties->setDpiPolicy(dpiPolicy); m_properties->setDpi(TPointD(xdpi, ydpi)); @@ -925,6 +929,8 @@ void TXshSimpleLevel::loadData(TIStream &is) { m_properties->setDoPremultiply(doPremultiply); m_properties->setDoAntialias(antialiasSoftness); m_properties->setWhiteTransp(whiteTransp); + m_properties->setIsStopMotion(isStopMotionLevel); + if (isStopMotionLevel == 1) setIsReadOnly(true); } else throw TException("unexpected tag " + tagName); } else { @@ -1366,6 +1372,9 @@ void TXshSimpleLevel::saveData(TOStream &os) { attr["premultiply"] = std::to_string(getProperties()->doPremultiply()); } else if (getProperties()->whiteTransp()) { attr["whiteTransp"] = std::to_string(getProperties()->whiteTransp()); + } else if (getProperties()->isStopMotionLevel()) { + attr["isStopMotionLevel"] = + std::to_string(getProperties()->isStopMotionLevel()); } if (m_type == TZI_XSHLEVEL) attr["type"] = "s"; @@ -2318,6 +2327,7 @@ bool TXshSimpleLevel::isFrameReadOnly(TFrameId fid) { // the OS level if (getType() == OVL_XSHLEVEL || getType() == TZI_XSHLEVEL || getType() == MESH_XSHLEVEL) { + if (getProperties()->isStopMotionLevel()) return true; TFilePath fullPath = getScene()->decodeFilePath(m_path); std::string fileType = fullPath.getType(); if (fileType == "psd" || fileType == "gif" || fileType == "mp4" || diff --git a/toonz/sources/toonzqt/icongenerator.cpp b/toonz/sources/toonzqt/icongenerator.cpp index 92c3e97..39f75b4 100644 --- a/toonz/sources/toonzqt/icongenerator.cpp +++ b/toonz/sources/toonzqt/icongenerator.cpp @@ -118,7 +118,7 @@ bool getIcon(const std::string &iconName, QPixmap &pix, ras->getSize().lx > standardSize.lx && ras->getSize().ly > standardSize.ly) isHighDpi = true; - pix = rasterToQPixmap(ras, false, isHighDpi); + pix = rasterToQPixmap(ras, false, isHighDpi); return true; } @@ -135,7 +135,7 @@ void setIcon(const std::string &iconName, const TRaster32P &icon) { //----------------------------------------------------------------------------- /*! Cache icon data in TToonzImage format if ToonzImageIconRenderer generates * them -*/ + */ void setIcon_TnzImg(const std::string &iconName, const TRasterCM32P &icon) { if (iconsMap.find(iconName) != iconsMap.end()) TImageCache::instance()->add( @@ -187,7 +187,7 @@ void makeChessBackground(const TRaster32P &ras) { int yCol = (y & 4); - for (int x = 0; pix != lineEnd; ++x, ++pix) + for (int x = 0; pix != lineEnd; ++x, ++pix) if (pix->m != 255) *pix = overPix((x & 4) == yCol ? gray1 : gray2, *pix); } @@ -605,8 +605,8 @@ TRaster32P SplineIconRenderer::generateRaster( double scaleX = 1, scaleY = 1; if (sbbox.getLx() > 0.0) scaleX = (double)iconSize.lx / sbbox.getLx(); if (sbbox.getLy() > 0.0) scaleY = (double)iconSize.ly / sbbox.getLy(); - double scale = 0.8 * std::min(scaleX, scaleY); - TPointD centerStroke = 0.5 * (sbbox.getP00() + sbbox.getP11()); + double scale = 0.8 * std::min(scaleX, scaleY); + TPointD centerStroke = 0.5 * (sbbox.getP00() + sbbox.getP11()); TPointD centerPixmap(iconSize.lx * 0.5, iconSize.ly * 0.5); glPushMatrix(); tglMultMatrix(TScale(scale).place(centerStroke, centerPixmap)); @@ -971,10 +971,10 @@ TRaster32P IconGenerator::generateVectorFileIcon(const TFilePath &path, TLevelReaderP lr(path); TLevelP level = lr->loadInfo(); if (level->begin() == level->end()) return TRaster32P(); - TFrameId frameId = fid; + TFrameId frameId = fid; if (fid == TFrameId::NO_FRAME) frameId = level->begin()->first; - TImageP img = lr->getFrameReader(frameId)->load(); - TVectorImageP vi = img; + TImageP img = lr->getFrameReader(frameId)->load(); + TVectorImageP vi = img; if (!vi) return TRaster32P(); vi->setPalette(level->getPalette()); VectorImageIconRenderer vir("", iconSize, vi.getPointer(), @@ -1112,7 +1112,7 @@ TRaster32P IconGenerator::generateMeshFileIcon(const TFilePath &path, TLevelP level = lr->loadInfo(); if (level->begin() == level->end()) return TRaster32P(); - TFrameId frameId = fid; + TFrameId frameId = fid; if (fid == TFrameId::NO_FRAME) frameId = level->begin()->first; TMeshImageP mi = lr->getFrameReader(frameId)->load(); @@ -1225,6 +1225,12 @@ void FileIconRenderer::run() { Qt::KeepAspectRatio)); setIcon(rasterFromQPixmap(magpie)); return; + } else if (type == "xdts") { + QPixmap xdts(svgToPixmap(":Resources/xdts.svg", + QSize(iconSize.lx, iconSize.ly), + Qt::KeepAspectRatio)); + setIcon(rasterFromQPixmap(xdts)); + return; } else if (type == "js") { QImage script(":Resources/scripticon.png"); setIcon(rasterFromQImage(script)); diff --git a/toonz/sources/translations/chinese/image.ts b/toonz/sources/translations/chinese/image.ts index b2b5de1..338887e 100644 --- a/toonz/sources/translations/chinese/image.ts +++ b/toonz/sources/translations/chinese/image.ts @@ -4,12 +4,12 @@ AviWriterProperties - + Codec 编码器 - + Uncompressed 未压缩 @@ -17,17 +17,17 @@ GifWriterProperties - + Scale 缩放 - + Looping 循环 - + Generate Palette 生成调色板 @@ -35,12 +35,12 @@ Mp4WriterProperties - + Quality 质量 - + Scale 缩放 @@ -342,12 +342,12 @@ Please try raising the FFmpeg timeout in Preferences. WebmWriterProperties - + Quality 质量 - + Scale 缩放 diff --git a/toonz/sources/translations/chinese/tnzcore.ts b/toonz/sources/translations/chinese/tnzcore.ts index 75b432d..8d27d99 100644 --- a/toonz/sources/translations/chinese/tnzcore.ts +++ b/toonz/sources/translations/chinese/tnzcore.ts @@ -43,7 +43,7 @@ Malformed frame name - 不合格的帧名 + 不合格的帧名 diff --git a/toonz/sources/translations/chinese/tnztools.ts b/toonz/sources/translations/chinese/tnztools.ts index 542ac10..0f473ab 100644 --- a/toonz/sources/translations/chinese/tnztools.ts +++ b/toonz/sources/translations/chinese/tnztools.ts @@ -1177,6 +1177,34 @@ Do you want to proceed? to Backward 向后 + + The selection cannot be updated. It is not editable. + + + + The selection cannot be deleted. It is not editable. + + + + The selection cannot be pasted. It is not editable. + + + + The selection cannot be grouped. It is not editable. + + + + The selection cannot be entered. It is not editable. + + + + The selection cannot be ungrouped. It is not editable. + + + + The selection cannot be moved. It is not editable. + + RGBPickerTool diff --git a/toonz/sources/translations/chinese/toonz.ts b/toonz/sources/translations/chinese/toonz.ts index c787ebb..2ae75ad 100644 --- a/toonz/sources/translations/chinese/toonz.ts +++ b/toonz/sources/translations/chinese/toonz.ts @@ -1224,7 +1224,7 @@ What do you want to do? Scene: - 场景: + 场景: :: Frame: @@ -1236,14 +1236,18 @@ What do you want to do? Level: - 层级: + 层级: (Flipped) (已翻转) - :: Project: + [SCENE]: + + + + [LEVEL]: @@ -1605,6 +1609,10 @@ contain the dpi information, then the current camera dpi will be used. 如果选择了“图像 DPI” 而源图像 没包含 DPI 信息,则采用当前摄影机的 DPI。 + + Level %1 converting to same file format; skipped. + + DVGui::ProgressDialog @@ -2391,6 +2399,10 @@ Hold F3 Key on the Viewer to Show This Frame Only no icon 无图标 + + Auto Inbetween + + FlipBook @@ -2557,7 +2569,7 @@ Do you want to overwrite it? ImportMagpieFilePopup Import Magpie File - 导入 MAGPIE 文件 + 导入 MAGPIE 文件 Load @@ -2567,6 +2579,10 @@ Do you want to overwrite it? %1 does not exist. %1 不存在。 + + Import Toonz Lip Sync File + + InbetweenDialog @@ -2963,7 +2979,7 @@ Do you want to create it? Scan level - 扫描层级 + 扫描层级 Raster level @@ -2989,6 +3005,18 @@ Do you want to create it? Toonz Raster level Toonz 光栅层级 + + [Various] + + + + SubXsheet Level + + + + Another Level Type + + LineTestCapturePane @@ -3337,7 +3365,7 @@ Please use the frame numbers for reference. Arrangement in Xsheet - 摄影表中的排列 + 摄影表中的排列 (FILE DOES NOT EXIST) @@ -3371,6 +3399,30 @@ Please use the frame numbers for reference. :: :: + + Level Settings & Arrangement in Xsheet + + + + Premultiply + 预乘 Alpha + + + White As Transparent + 将白色当作透明 + + + DPI: + DPI: + + + Antialias Softness: + 抗锯齿柔化度: + + + Subsampling: + 子采样: + LoadScenePopup @@ -3493,7 +3545,7 @@ Please use the frame numbers for reference. MagpieFileImportPopup Import Magpie File - 导入 MAGPIE 文件 + 导入 MAGPIE 文件 Frame Range @@ -3501,7 +3553,7 @@ Please use the frame numbers for reference. To: - 结束帧: + 结束帧: From: @@ -3531,6 +3583,14 @@ Please use the frame numbers for reference. The file path is missing. 文件路径丢失。 + + Import Toonz Lip Sync File + + + + To: + + MainWindow @@ -3616,7 +3676,7 @@ Please use the frame numbers for reference. &Import Magpie File... - 导入 MAGPIE 文件(&I)... + 导入 MAGPIE 文件(&I)... &New Project... @@ -3940,7 +4000,7 @@ Please use the frame numbers for reference. &Edit FX... - 编辑特效(&E)... + 编辑特效(&E)... Insert Frame @@ -5474,6 +5534,152 @@ Please use the frame numbers for reference. Brush Tool - Lock Alpha + + http://opentoonz.readthedocs.io + + + + &Import Toonz Lip Sync File... + + + + Export Exchange Digital Time Sheet (XDTS) + + + + &Clear Cache Folder + + + + Show/Hide Xsheet Camera Column + + + + &Create Blank Drawing + + + + &Shift Keys Down + + + + &Shift Keys Up + + + + Next Key + + + + Prev Key + + + + &FX Editor + + + + &Stop Motion Controls + + + + &Online Manual... + + + + Select Next Frame Guide Stroke + + + + Select Previous Frame Guide Stroke + + + + Select Prev && Next Frame Guide Strokes + + + + Reset Guide Stroke Selections + + + + Tween Selected Guide Strokes + + + + Tween Guide Strokes to Selected + + + + Select Guide Strokes && Tween Mode + + + + Capture Stop Motion Frame + + + + Raise Stop Motion Opacity + + + + Lower Stop Motion Opacity + + + + Toggle Stop Motion Live View + + + + Toggle Stop Motion Zoom + + + + Lower Stop Motion Level Subsampling + + + + Raise Stop Motion Level Subsampling + + + + Go to Stop Motion Insert Frame + + + + Clear Cache Folder + + + + There are no unused items in the cache folder. + + + + Deleting the following items: + + + + + <DIR> + + + + ... and %1 more items + + + + + +Are you sure? + +N.B. Make sure you are not running another process of OpenToonz, +or you may delete necessary files for it. + + + + Can't delete %1 : + + MatchlinesDialog @@ -6719,7 +6925,7 @@ Set the output folder path to the subfolder as well. Backup Animation Levels when Saving - 保存时备份动画层级 + 保存时备份动画层级 Cell-dragging Behaviour: @@ -6959,7 +7165,7 @@ Set the output folder path to the subfolder as well. Autocreation: - 自动创建: + 自动创建: Transparency Check @@ -7091,7 +7297,7 @@ Set the output folder path to the subfolder as well. X - X + X Viewer Shrink @@ -7199,11 +7405,11 @@ Set the output folder path to the subfolder as well. Disabled - 禁用 + 禁用 Enabled - 启用 + 启用 Use Xsheet as Animation Sheet @@ -7243,7 +7449,7 @@ Set the output folder path to the subfolder as well. Stuff Folder* - Stuff 文件夹 + Stuff 文件夹 Custom* @@ -7565,7 +7771,7 @@ if both are possible on coding file path. Enable auto-stretch frame - 打开自动拉伸帧 + 打开自动拉伸帧 Show Cursor Size Outlines @@ -7659,7 +7865,7 @@ Also the initial output destination for new scenes will be set to $scenefolder a Tablet Settings - 绘图板设定 + 绘图板设定 Enable Windows Ink Support* (EXPERIMENTAL) @@ -7698,6 +7904,66 @@ in non alpha-enabled image format. Current Column Color: 当前列的颜色: + + Backup Scene and Animation Levels when Saving + + + + # of backups to keep: + + + + Enable Autocreation + + + + Numbering System: + + + + Enable Auto-stretch Frame + + + + Enable Creation in Hold Cells + + + + Enable Autorenumber + + + + Toolbar Display Behaviour: + + + + Show Camera Column + + + + Level Editor Box Color + + + + Incremental + + + + Enable Tools For Level Only + + + + Show Tools For Level Only + + + + Touch/Tablet Settings + + + + Enable Touch Gesture Controls + + PreferencesPopup::FormatProperties @@ -9658,16 +9924,16 @@ Allow duplicate? Please enable "Sync Level Strip Drawing Number Changes with the XSheet" preference option to use the duplicate command in the xsheet / timeline. - 要在摄影表/时间轴上使用复制命令, + 要在摄影表/时间轴上使用复制命令, 请启用“与摄影表同步层级条绘图编号的变动”首选项。 Please select only one layer to duplicate a frame. - 请只选一个层来复制一个帧。 + 请只选一个层来复制一个帧。 Please select only one frame to duplicate. - 请只选择一个帧来复制。 + 请只选择一个帧来复制。 Timeline @@ -9923,67 +10189,161 @@ Do you want to overwrite it? %1 does not exist. %1 不存在。 - - - ReframePopup - Reframe with Empty Inbetweens - 添加空的中间画重排帧 + The file %1 already exists. +Do you want to overwrite it? + - OK - 确定 + The file %1 has been exported successfully. + - Cancel - 取消 + Open containing folder + - steps - 步长 + Please enable "Show Keyframes on Cell Area" to show or hide the camera column. + - with - 加入 + The chosen folder path does not exist. +Do you want to create it? + - empty inbetweens - 张空的中间画 + Create + 创建 - ( - + Edit Level Settings : %1 + - blank cells will be inserted.) - 张空白帧格将被插入。) + Shift Key Frames Down + - - - RenameAsToonzPopup - Delete Original Files - 删除原文件 + Shift Key Frames Up + - Level Name: - 层级名称: + Create Blank Drawing + - Rename - 重命名 + Duplicate Drawing + - Cancel - 取消 + Unable to create a blank drawing on the camera column + - Renaming File - 正在重命名文件 + The current column is locked + - Creating an animation level of %1 frames - 正在创建 %1 帧动画层级 + Cannot create a blank drawing on the current column + + + + The current level is not editable + + + + Unable to create a blank drawing on the current column + + + + Unable to replace the current drawing with a blank drawing + + + + There are no drawings in the camera column to duplicate + + + + Cannot duplicate a drawing in the current column + + + + Unable to duplicate a drawing on the current column + + + + Unable to replace the current or next drawing with a duplicate drawing + + + + Stop Motion Controller + + + + Camera Column Switch : + + + + + ReframePopup + + Reframe with Empty Inbetweens + 添加空的中间画重排帧 + + + OK + 确定 + + + Cancel + 取消 + + + steps + 步长 + + + with + 加入 + + + empty inbetweens + 张空的中间画 + + + ( + + + + blank cells will be inserted.) + 张空白帧格将被插入。) + + + + RenameAsToonzPopup + + Delete Original Files + 删除原文件 + + + Level Name: + 层级名称: + + + Rename + 重命名 + + + Cancel + 取消 + + + Renaming File + 正在重命名文件 + + + Creating an animation level of %1 frames + 正在创建 %1 帧动画层级 The file name cannot be empty or contain any of the following characters:(new line) \ / : * ? " | @@ -10127,7 +10487,11 @@ The audio file will not be included in the rendered clip. Click and drag to move guide - [点按并拖动]以移动参考线 + [点按并拖动]以移动参考线 + + + Left click and drag to move guide. Right click to delete guide + @@ -11271,6 +11635,26 @@ Please commit or revert changes first. Reset View 重置视图 + + Auto Inbetween + + + + Linear Interpolation + 线性插值 + + + Ease In Interpolation + + + + Ease Out Interpolation + + + + Ease In/Out Interpolation + + SceneViewerPanel @@ -11288,7 +11672,7 @@ Please commit or revert changes first. Scene: - 场景: + 场景: :: Frame: @@ -11300,7 +11684,7 @@ Please commit or revert changes first. Level: - 层级: + 层级: Freeze @@ -11335,7 +11719,11 @@ Please commit or revert changes first. (已翻转) - :: Project: + [SCENE]: + + + + [LEVEL]: @@ -11676,7 +12064,7 @@ Please commit or revert changes first. Playback Controls - 回放控制 + 回放控制 RGBA Channels @@ -11692,7 +12080,19 @@ Please commit or revert changes first. Playback - 回放 + 回放 + + + Play + 播放 + + + Render + 渲染 + + + Help + 帮助 @@ -11830,6 +12230,58 @@ Assign to '%3'? Failed to create menubar 创建菜单栏失败 + + Project Management + + + + Import + 导入 + + + Export + 导出 + + + Script + + + + Group + + + + Arrange + + + + New + 新建 + + + Adjust + + + + Optimize + + + + Convert + 转换 + + + Drawing Substitution + + + + Play + 播放 + + + Workspace + + StartupPopup @@ -11943,7 +12395,7 @@ Assign to '%3'? The chosen file path is not valid. - 所选的文件路径无效。 + 所选的文件路径无效。 The width must be 1 or more. @@ -12014,7 +12466,405 @@ Possibly the preset file has been corrupted - The selected scene project '%1' is not in the Current Project list and may not open automatically. + Failed to create the folder. + + + + + StopMotion + + No + frame id + + + + No level name specified: please choose a valid level name + 未指定层级名称: 请选择一个有效的层级名称 + + + The level name specified is already used: please choose a different level name. + 所指定的层级名称已经被使用: 请选择一个不同的层级名称。 + + + The save in path specified does not match with the existing level. + 指定的保存路径和已有层级补匹配。 + + + The captured image size does not match with the existing level. + 所拍摄的图像大小和已有层级不匹配。 + + + File %1 already exists. +Do you want to overwrite it? + 文件 %1 已经存在。 +要覆盖它吗? + + + Failed to load %1. + 加载 %1 失败。 + + + Folder %1 doesn't exist. +Do you want to create it? + 文件夹 %1不存在。 +要创建它吗? + + + Unable to create + 无法创建 + + + UNDEFINED WARNING + 为定义警告 + + + The level is not registered in the scene, but exists in the file system. + 该层级没在场景中注册,但存在于文件系统中。 + + + +WARNING : Image size mismatch. The saved image size is %1 x %2. + 警告: 图像大小不匹配。保存的图像大小是 %1 x %2。 + + + WARNING + + + + +Frame %1 exists. + 帧 %1 已存在。 + + + +Frames %1 exist. + 帧 %1 已存在。 + + + OVERWRITE 1 of + 覆盖 1 + + + ADD to + 添加到 + + + %1 frame + %1 帧 + + + %1 frames + %1 帧 + + + The level will be newly created. + 层级将被创建。 + + + NEW + 新建 + + + The level is already registered in the scene. + 层级已在场景中注册。 + + + +NOTE : The level is not saved. + 注: 层级未保存。 + + + +WARNING : Failed to get image size of the existing level %1. + 警告: 获取已有层级 %1 的图像大小失败。 + + + +WARNING : Image size mismatch. The existing level size is %1 x %2. + 警告: 图像大小不匹配。已有层级大小是 %1 x %2。 + + + WARNING : Level name conflicts. There already is a level %1 in the scene with the path + %2. + 警告: 层级名字冲突。在下面路径的场景中已经有名为 %1 的层级 + %2。 + + + +WARNING : Image size mismatch. The size of level with the same name is is %1 x %2. + 警告: 图像大小不匹配。同名层级的大小是 %1 x %2。 + + + WARNING : Level path conflicts. There already is a level with the path %1 + in the scene with the name %2. + 警告: 层级路径冲突。在名为 %2 的场景中,已经有个层级位于路径 %1 上。 + + + +WARNING : Image size mismatch. The size of level with the same path is %1 x %2. + 警告: 图像大小不匹配。同位置的层级大小是 %1 x %2。 + + + WARNING + 警告 + + + No camera selected. + + + + + StopMotionController + + Controls + + + + Settings + 设置 + + + Options + 选项 + + + Resolution: + + + + Refresh + 刷新 + + + File + + + + Webcam Settings... + + + + Capture + + + + Next Level + 下一层级 + + + Next New + + + + Previous Level + 前一个层级 + + + Next Frame + 下一帧 + + + Last Frame + 最后一帧 + + + Previous Frame + 上一帧 + + + Next XSheet Frame + + + + Previous XSheet Frame + + + + Current Frame + 当前帧 + + + Set to the Current Playhead Location + + + + Start Live View + + + + Zoom + + + + Pick Zoom + + + + < + + + + > + + + + << + + + + >> + + + + <<< + + + + >>> + + + + Camera: + 摄影机: + + + Name: + 名称: + + + Frame: + 帧: + + + File Type: + 文件类型: + + + Save In: + 保存位置: + + + XSheet Frame: + + + + Camera Model + + + + Camera Mode + + + + Temperature: + + + + Shutter Speed: + + + + Iso: + + + + Aperture: + + + + Exposure: + + + + Image Quality: + + + + Picture Style: + + + + White Balance: + + + + Webcam Options + + + + DSLR Options + + + + Place the frame in the XSheet + + + + Use Direct Show Webcam Drivers + + + + Black Screen for Capture + + + + Use Reduced Resolution Images + + + + Use MJPG with Webcam + + + + Place on XSheet + + + + Use Numpad Shortcuts When Active + + + + Show Live View on All Frames + + + + Capture Review Time: + + + + Level Subsampling: + + + + Opacity: + 不透明性: + + + No camera detected. + + + + No camera detected + + + + - Select camera - + - 选中摄影机 - + + + Mode: + + + + Auto + 自动 + + + Disabled + 禁用 + + + Stop Live View @@ -12497,6 +13347,17 @@ Click the arrow button to create a new sub-xsheet + Toolbar + + Collapse toolbar + + + + Expand toolbar + + + + TopBar Lock Rooms Tab @@ -12728,6 +13589,33 @@ Please refer to the user guide for details. + XDTSImportPopup + + Importing XDTS file %1 + + + + Load + 加载 + + + Cancel + 取消 + + + Please specify the level locations. Suggested paths are input in the fields with blue border. + + + + Level Name + + + + Level Path + + + + XsheetGUI::CellArea Click to select keyframe, drag to move it @@ -12932,6 +13820,14 @@ Please refer to the user guide for details. &Paste Insert Above 插入粘贴在上(&I) + + Hide Camera Column + + + + Show Camera Column + + XsheetGUI::ColumnTransparencyPopup @@ -13183,10 +14079,6 @@ Hold F3 Key on the Viewer to Show This Frame Only 放大/缩小时间轴 - :: Project: - - - Frame diff --git a/toonz/sources/translations/chinese/toonzlib.ts b/toonz/sources/translations/chinese/toonzlib.ts index 4867d67..3237ebb 100644 --- a/toonz/sources/translations/chinese/toonzlib.ts +++ b/toonz/sources/translations/chinese/toonzlib.ts @@ -606,6 +606,11 @@ Timeline 时间轴 + + Failed to save the following resources: + + + Rasterizer diff --git a/toonz/sources/translations/chinese/toonzqt.ts b/toonz/sources/translations/chinese/toonzqt.ts index c718f14..6714399 100644 --- a/toonz/sources/translations/chinese/toonzqt.ts +++ b/toonz/sources/translations/chinese/toonzqt.ts @@ -701,6 +701,30 @@ Possibly the preset file has been corrupted &Locator 定位器(&L) + + Viewer Controls + + + + &Zoom In + + + + &Zoom Out + + + + &Flip Horizontally + + + + &Flip Vertically + + + + &Reset View + + FontParamField @@ -1011,19 +1035,19 @@ Possibly the preset file has been corrupted Step 1 - 第 1 步 + 第 1 步 Step 2 - 第 2 步 + 第 2 步 Step 3 - 第 3 步 + 第 3 步 Step 4 - 第 4 步 + 第 4 步 Activate Cycle @@ -1049,6 +1073,10 @@ Possibly the preset file has been corrupted Change Step + + Similar Shape Interpolation + 相似形状插值 + FunctionToolbar @@ -1106,6 +1134,10 @@ Possibly the preset file has been corrupted Table 动画台 + + Hide Selected + + FxColumnPainter @@ -2267,6 +2299,10 @@ The second line should be "Mesh [Input bit depth] [Output bit depth]"< OK 确定 + + That is a reserved file name and cannot be used. + + QPushButton @@ -2287,6 +2323,17 @@ The second line should be "Mesh [Input bit depth] [Output bit depth]"< + RgbLinkButtons + + Copy RGB : %1 > %2 + + + + Swap %1 and %2 + + + + SchematicViewer &Fit to Window @@ -2336,6 +2383,18 @@ The second line should be "Mesh [Input bit depth] [Output bit depth]"< &Toggle node icons 开关节点图标(&T) + + &Selection Mode + + + + &Zoom Mode + + + + &Hand Mode + + SchematicWindowEditor @@ -2424,6 +2483,17 @@ The second line should be "Mesh [Input bit depth] [Output bit depth]"< + StageSchematicNode + + Toggle Autorotate Along Motion Path + + + + Toggle Link Motion Path to Control Points + + + + StageSchematicScene &New Pegbar diff --git a/toonz/sources/translations/czech/image.ts b/toonz/sources/translations/czech/image.ts index b5fd579..3c29cf4 100644 --- a/toonz/sources/translations/czech/image.ts +++ b/toonz/sources/translations/czech/image.ts @@ -4,12 +4,12 @@ AviWriterProperties - + Codec Kodek - + Uncompressed Nezkomprimovaný (nezabalený) @@ -17,17 +17,17 @@ GifWriterProperties - + Scale Měřítko - + Looping Smyčka - + Generate Palette Vytvořit paletu @@ -35,12 +35,12 @@ Mp4WriterProperties - + Quality Jakost - + Scale Měřítko @@ -340,12 +340,12 @@ zkuste, prosím, zvednout dobu pro vypršení pro FFmpeg v Nastavení. WebmWriterProperties - + Quality Jakost - + Scale Měřítko diff --git a/toonz/sources/translations/czech/tnzcore.ts b/toonz/sources/translations/czech/tnzcore.ts index f4d42db..8f8bf49 100644 --- a/toonz/sources/translations/czech/tnzcore.ts +++ b/toonz/sources/translations/czech/tnzcore.ts @@ -35,7 +35,7 @@ QObject - + colors barvy @@ -45,9 +45,8 @@ Přeskakuje se snímek. - Malformed frame name - Poškozený název snímku + Poškozený název snímku diff --git a/toonz/sources/translations/czech/tnztools.ts b/toonz/sources/translations/czech/tnztools.ts index b624c9a..a786363 100644 --- a/toonz/sources/translations/czech/tnztools.ts +++ b/toonz/sources/translations/czech/tnztools.ts @@ -106,133 +106,133 @@ BrushTool - + Size Velikost - + Accuracy: Přesnost: - + Smooth: Vyhlazení: - + Preset: Přednastavení: - - + + <custom> <vlastní> - + Break Zlomit ostré úhly - + Pressure Tlak - + Cap Čepice - + Join Spojit - + Miter: Zkosení: - + Range: Rozsah: - + Snap Zapadnout - + Off Vypnuto - + Linear Lineární - + In - + Out - + In&Out - + Low Nízký - + Med Střední - + High Vysoký - + Butt cap - + Round cap - + Projecting cap - + Miter join - + Round join - + Bevel join @@ -240,17 +240,17 @@ BrushToolOptionsBox - + Preset Name - + OK OK - + Cancel Zrušit @@ -279,7 +279,7 @@ DVGui::StyleIndexLineEdit - + current Nynější @@ -287,160 +287,160 @@ EditTool - + Scale Constraint: Omezení měřítka: - - + + None Žádné - + A/R - + Mass - + Auto Select Column Automaticky vybrat sloupec - + Column Sloupec - + Pegbar Pruh na kolíky - + Global Key Celkový klíč - + Lock Center E/W Uzmknout střed [X] - + Lock Center N/S Uzmknout střed [Y] - + Lock Position E/W Uzmknout polohu [X] - + Lock Position N/S Uzmknout polohu [Y] - + Lock Rotation Uzmknout otočení - + Lock Shear H Uzmknout střih vodorovně - + Lock Shear V Uzmknout střih svisle - + Lock Scale H Uzmknout měřítko vodorovně - + Lock Scale V Uzmknout měřítko svisle - + Lock Global Scale Uzmknout celkové měřítko - + E/W and N/S Positions Polohy X a Y - + Z Position Poloha Z - + SO SO - - + + Rotation Otočení - + Global Scale Celkové měřítko - + Horizontal and Vertical Scale Vodorovné a svislé měřítko - - + + Shear Stříhat - + Center Position Střední poloha - + Active Axis Činná osa - + Position Poloha - + Scale Měřítko - + Center Střed - + All Vše @@ -448,86 +448,86 @@ EraserTool - - + + Size: Velikost: - - + + Selective Výběrový - - + + Invert Obrátit - - + + Frame Range Rozsah snímku - - + + Type: Typ: - - + + Normal Normální - - + + Rectangular Obdélníkový - - + + Freehand Kreslení od ruky - - + + Polyline Lomená čára - + Hardness: Tvrdost: - + Mode: Režim: - + Lines Čáry - + Areas Plochy - + Lines & Areas Čáry a plochy - + Pencil Mode Režim tužky @@ -618,12 +618,12 @@ FingerTool - + Size: Velikost: - + Invert Obrátit @@ -631,44 +631,44 @@ FullColorBrushTool - - + + Size Velikost - + Pressure Tlak - - + + Opacity Neprůhlednost - + Hardness: Tvrdost: - + Preset: Přednastavení: - + Eraser Guma - + Lock Alpha Zamknout alfu - + <custom> <vlastní> @@ -676,52 +676,52 @@ FullColorEraserTool - + Size: Velikost: - + Opacity: Neprůhlednost: - + Hardness: Tvrdost: - + Type: Typ: - + Normal Normální - + Rectangular Obdélníkový - + Freehand Kreslení od ruky - + Polyline Lomená čára - + Invert Obrátit - + Frame Range Rozsah snímku @@ -737,7 +737,7 @@ HandToolOptionsBox - + Reset Position @@ -753,7 +753,7 @@ MagnetTool - + Size: Velikost: @@ -761,32 +761,32 @@ PaintBrushTool - + Size: Velikost: - + Mode: Režim: - + Lines Čáry - + Areas Plochy - + Lines & Areas Čáry a plochy - + Selective Výběrový @@ -794,17 +794,17 @@ PinchTool - + Size: Velikost: - + Corner: Roh: - + Manual Ruční @@ -1016,152 +1016,152 @@ Chcete pokračovat? PrimitiveParam - + Shape: Tvar: - + Rectangle Obdélník - + Circle Kruh - + Ellipse Elipsa - + Line Čára - + Polyline Lomená čára - + Arc Oblouk - + Polygon Mnohoúhelník - + Size: Velikost: - + Thickness: Tloušťka: - + Opacity: Neprůhlednost: - + Hardness: Tvrdost: - + Polygon Sides: Strany mnohoúhelníku: - + Auto Group Automatické seskupení - + Auto Fill Automatické vyplnění - + Selective Výběrový - + Pencil Mode Režim tužky - + Cap Čepice - + Butt cap - + Round cap - + Projecting cap - + Join Spojit - + Miter join - + Round join - + Bevel join - + Miter: - + Snap Zapadnout - + Low Nízký - + Med Střední - + High Vysoký @@ -1182,26 +1182,44 @@ Chcete pokračovat? QObject - - + + Yes Ano - - + + No Ne - - + + The copied selection cannot be pasted in the current drawing. Zkopírovaný výběr nelze vložit do nynější kresby. - - + + The selection cannot be updated. It is not editable. + + + + + + + The selection cannot be deleted. It is not editable. + + + + + + The selection cannot be pasted. It is not editable. + + + + + Paste Vložit @@ -1223,7 +1241,7 @@ Chcete pokračovat? Nastavit ukládací box: (X%1,Y%2,W%3,H%4)->(X%5,Y%6,W%7,H%8) - + Move Center Posunout středovou polohu @@ -1243,134 +1261,154 @@ Chcete pokračovat? Zrušit - + Group Seskupit - + Ungroup Zrušit seskupení - + to Front na přední stranu - + to Forward do popředí - + to Back na zadní stranu - + to Backward do pozadí - + Move Group Přesunout skupinu - + + The selection cannot be grouped. It is not editable. + + + + + The selection cannot be entered. It is not editable. + + + + + The selection cannot be ungrouped. It is not editable. + + + + + The selection cannot be moved. It is not editable. + + + + Modify Fx Gadget Změnit udělátko efektu - + The current column is locked. Nynější sloupec je uzamknut. - + The current column is hidden. Nynější sloupec je skryt. - + It is not possible to edit the audio column. Není možné upravit sloupec zvuku. - + Note columns can only be edited in the xsheet or timeline. Sloupce s poznámkami mohou být upravovány jen v XSheet nebo časové ose. - + The current tool cannot be used on a Level column. Nynější nástroj nelze použít na sloupec úroveň. - + The current tool cannot be used on a Mesh column. Nynější nástroj nelze použít na sloupec síť. - + The current tool cannot be used in Level Strip mode. Nynější nástroj nelze použít ve sloupci pruh úrovně. - + The current tool cannot be used to edit a motion path. Nynější nástroj nelze použít na upravení cesty pohybu. - - + + The current level is not editable. Nynější úroveň není upravitelná. - + The current tool cannot be used on a Vector Level. Nynější nástroj nelze použít na vektorovou úroveň. - + The current tool cannot be used on a Toonz Level. Nynější nástroj nelze použít na úroveň Toonz. - + The current tool cannot be used on a Raster Level. Nynější nástroj nelze použít na rastrovou úroveň. - + The current tool cannot be used on a Mesh Level. Nynější nástroj nelze použít na úroveň síť. - + The current tool cannot be used on a mesh-deformed level Nynější nástroj nelze použít na úroveň zdeformovaná (přetvořená) síť. - + The current frame is locked: any editing is forbidden. Nynější snímek je uzamknut: jakékoli úpravy jsou zakázány. - + %1 Level : %2 Frame : %3 %1 Úroveň: %2 Snímek: %3 - - + + Modify Stroke Tool Změnit nástroj na tah - + Modify Spline Změnit křivku (spline) @@ -1421,7 +1459,7 @@ Chcete pokračovat? RGBPickerToolOptionsBox - + Pick Screen Zvolit obrazovku @@ -1429,12 +1467,12 @@ Chcete pokračovat? RasterSelectionTool - + Modify Savebox Změnit ukládací box - + No Antialiasing Žádné vyhlazování @@ -1508,7 +1546,7 @@ Chcete pokračovat? RotateToolOptionsBox - + Reset Rotation @@ -1516,37 +1554,37 @@ Chcete pokračovat? RulerToolOptionsBox - + X: ruler tool option X: - + Y: ruler tool option Y: - + W: ruler tool option Š: - + H: ruler tool option V: - + A: ruler tool option A: - + L: ruler tool option D: @@ -1555,22 +1593,22 @@ Chcete pokračovat? SelectionTool - + Type: Typ: - + Rectangular Obdélníkový - + Freehand Kreslení od ruky - + Polyline Lomená čára @@ -1578,48 +1616,48 @@ Chcete pokračovat? SelectionToolOptionsBox - + H: V: - + V: S: - + Link Stanovit poměr stran - - + + Rotation Otočení - + E/W: X: - + N/S: Y: - + Scale Měřítko - + Position Poloha - + Thickness Tloušťka @@ -1627,22 +1665,22 @@ Chcete pokračovat? ShiftTraceToolOptionBox - + Reset Previous Nastavit znovu předchozí - + Reset Following Nastavit znovu následující - + Previous Drawing Předchozí kresba - + Following Drawing Následující kresba @@ -1736,7 +1774,7 @@ Chcete pokračovat? StylePickerToolOptionsBox - + With this option being activated, the picked style will be moved to the end of the first page of the palette. Se zapnutím této volby bude zvolený styl @@ -1746,59 +1784,59 @@ přesunut na konec první strany palety. ToonzRasterBrushTool - - + + Size Velikost - + Hardness: Tvrdost: - + Smooth: Vyhlazení: - + Draw Order: Pořadí kresby: - + Over All Nad vše - + Under All Pod vše - + Palette Order Pořadí palety - + Preset: Přednastavení: - - + + <custom> <vlastní> - + Pencil Tužka - + Pressure Tlak @@ -1829,22 +1867,22 @@ přesunut na konec první strany palety. TypeTool - + Font: Písmo: - + Style: Styl: - + Vertical Orientation Svislé natočení - + Size: Velikost: @@ -1852,102 +1890,102 @@ přesunut na konec první strany palety. VectorSelectionTool - + Mode: Režim: - + Standard Standardní - + Selected Frames Vybrané snímky - + Whole Level Celá úroveň - + Same Style Stejný styl - + Same Style on Selected Frames Stejný styl na vybrané snímky - + Same Style on Whole Level Stejný styl na celou úroveň - + Boundary Strokes Hraniční tahy - + Boundaries on Selected Frames Hraniční čáry na vybrané snímky - + Boundaries on Whole Level Hraniční čáry na celou úroveň - + Preserve Thickness Zachovat tloušťku - + Cap Čepice - + Butt cap - + Round cap - + Projecting cap - + Join Spojit - + Miter join - + Round join - + Bevel join - + Miter: Zkosení @@ -2008,7 +2046,7 @@ přesunut na konec první strany palety. ZoomToolOptionsBox - + Reset Zoom diff --git a/toonz/sources/translations/czech/toonz.ts b/toonz/sources/translations/czech/toonz.ts index bdc69b9..005a43b 100644 --- a/toonz/sources/translations/czech/toonz.ts +++ b/toonz/sources/translations/czech/toonz.ts @@ -1224,7 +1224,7 @@ Co chcete dělat? Scene: - Záběr: + Záběr: :: Frame: @@ -1236,14 +1236,18 @@ Co chcete dělat? Level: - Úroveň: + Úroveň: (Flipped) (převráceno) - :: Project: + [SCENE]: + + + + [LEVEL]: @@ -1586,6 +1590,10 @@ contain the dpi information, then the current camera dpi will be used. Dpi: DPI: + + Level %1 converting to same file format; skipped. + + DVGui::ProgressDialog @@ -2430,6 +2438,10 @@ Hold F3 Key on the Viewer to Show This Frame Only no icon Žádné ikony + + Auto Inbetween + + FlipBoOk @@ -2644,7 +2656,7 @@ Chcete jej přepsat? ImportMagpieFilePopup Import Magpie File - Zavést soubor MAGPIE + Zavést soubor MAGPIE Load @@ -2654,6 +2666,10 @@ Chcete jej přepsat? %1 does not exist. %1 neexistuje. + + Import Toonz Lip Sync File + + InbetweenDialog @@ -3054,7 +3070,7 @@ Chcete ji vytvořit? Scan level - Úroveň digitalizovaného obrázku + Úroveň digitalizovaného obrázku Raster level @@ -3080,6 +3096,18 @@ Chcete ji vytvořit? Toonz Raster level Rastrová úroveň Toonz + + [Various] + + + + SubXsheet Level + + + + Another Level Type + + LineTestCapturePane @@ -3426,7 +3454,7 @@ Please use the frame numbers for reference. Arrangement in Xsheet - Seřazení v Xsheet + Seřazení v Xsheet (FILE DOES NOT EXIST) @@ -3460,6 +3488,30 @@ Please use the frame numbers for reference. :: :: + + Level Settings & Arrangement in Xsheet + + + + Premultiply + + + + White As Transparent + Bílá jako průhledná + + + DPI: + DPI: + + + Antialias Softness: + Jemnost vyhlazování: + + + Subsampling: + Podvzorkování: + LoadScenePopup @@ -3575,7 +3627,7 @@ Please use the frame numbers for reference. MagpieFileImportPopup Import Magpie File - Zavést soubor MAGPIE + Zavést soubor MAGPIE Frame Range @@ -3583,7 +3635,7 @@ Please use the frame numbers for reference. To: - Ke snímku: + Ke snímku: From: @@ -3613,6 +3665,14 @@ Please use the frame numbers for reference. The file path is missing. Cesta k souboru je neznámá. + + Import Toonz Lip Sync File + + + + To: + + MainWindow @@ -3698,7 +3758,7 @@ Please use the frame numbers for reference. &Import Magpie File... - &Zavést soubor MAGPIE... + &Zavést soubor MAGPIE... &New Project... @@ -4022,7 +4082,7 @@ Please use the frame numbers for reference. &Edit FX... - &Upravit efekt... + &Upravit efekt... Insert Frame @@ -5568,6 +5628,152 @@ Please use the frame numbers for reference. Brush Tool - Lock Alpha + + http://opentoonz.readthedocs.io + + + + &Import Toonz Lip Sync File... + + + + Export Exchange Digital Time Sheet (XDTS) + + + + &Clear Cache Folder + + + + Show/Hide Xsheet Camera Column + + + + &Create Blank Drawing + + + + &Shift Keys Down + + + + &Shift Keys Up + + + + Next Key + + + + Prev Key + + + + &FX Editor + + + + &Stop Motion Controls + + + + &Online Manual... + + + + Select Next Frame Guide Stroke + + + + Select Previous Frame Guide Stroke + + + + Select Prev && Next Frame Guide Strokes + + + + Reset Guide Stroke Selections + + + + Tween Selected Guide Strokes + + + + Tween Guide Strokes to Selected + + + + Select Guide Strokes && Tween Mode + + + + Capture Stop Motion Frame + + + + Raise Stop Motion Opacity + + + + Lower Stop Motion Opacity + + + + Toggle Stop Motion Live View + + + + Toggle Stop Motion Zoom + + + + Lower Stop Motion Level Subsampling + + + + Raise Stop Motion Level Subsampling + + + + Go to Stop Motion Insert Frame + + + + Clear Cache Folder + + + + There are no unused items in the cache folder. + + + + Deleting the following items: + + + + + <DIR> + + + + ... and %1 more items + + + + + +Are you sure? + +N.B. Make sure you are not running another process of OpenToonz, +or you may delete necessary files for it. + + + + Can't delete %1 : + + MatchlinesDialog @@ -6784,7 +6990,7 @@ Nastavit cestu k výstupní složce také na podsložku. Backup Animation Levels when Saving - Při ukládání vytvořit zálohu úrovní animace + Při ukládání vytvořit zálohu úrovní animace Cell-dragging Behaviour: @@ -7024,7 +7230,7 @@ Nastavit cestu k výstupní složce také na podsložku. Autocreation: - Automatické vytvoření: + Automatické vytvoření: Transparency Check @@ -7152,7 +7358,7 @@ Nastavit cestu k výstupní složce také na podsložku. X - X + X Viewer Shrink @@ -7260,11 +7466,11 @@ Nastavit cestu k výstupní složce také na podsložku. Disabled - Zakázáno + Zakázáno Enabled - Povoleno + Povoleno Use Xsheet as Animation Sheet @@ -7315,10 +7521,6 @@ Nastavit cestu k výstupní složce také na podsložku. Plocha/OpenToonz* - Stuff Folder* - - - Custom* Vlastní* @@ -7603,10 +7805,6 @@ if both are possible on coding file path. - Enable auto-stretch frame - - - Show Cursor Size Outlines Ukázat obrysy velikosti ukazovátka @@ -7697,7 +7895,7 @@ Also the initial output destination for new scenes will be set to $scenefolder a Tablet Settings - Nastavení tabletu + Nastavení tabletu Enable Windows Ink Support* (EXPERIMENTAL) @@ -7736,6 +7934,66 @@ in non alpha-enabled image format. Current Column Color: Barva nynějšího sloupce: + + Backup Scene and Animation Levels when Saving + + + + # of backups to keep: + + + + Enable Autocreation + + + + Numbering System: + + + + Enable Auto-stretch Frame + + + + Enable Creation in Hold Cells + + + + Enable Autorenumber + + + + Toolbar Display Behaviour: + + + + Show Camera Column + + + + Level Editor Box Color + + + + Incremental + + + + Enable Tools For Level Only + + + + Show Tools For Level Only + + + + Touch/Tablet Settings + + + + Enable Touch Gesture Controls + + PreferencesPopup:: FormatProperties @@ -9736,17 +9994,12 @@ Povolit kopii? Zdvojit snímek v XSheet - Please enable "Sync Level Strip Drawing Number Changes with the XSheet" preference option -to use the duplicate command in the xsheet / timeline. - - - Please select only one layer to duplicate a frame. - Vyberte, prosím, jen jednu úroveň pro zdvojení snímku. + Vyberte, prosím, jen jednu úroveň pro zdvojení snímku. Please select only one frame to duplicate. - Vyberte, prosím, jen jeden snímek ke zdvojení. + Vyberte, prosím, jen jeden snímek ke zdvojení. Timeline @@ -10002,59 +10255,153 @@ Chcete jej přepsat? %1 does not exist. %1 neexistuje. - - - ReframePopup - Reframe with Empty Inbetweens + The file %1 already exists. +Do you want to overwrite it? - OK - OK + The file %1 has been exported successfully. + - Cancel - Zrušit + Open containing folder + - steps - kroky + Please enable "Show Keyframes on Cell Area" to show or hide the camera column. + - with - s + The chosen folder path does not exist. +Do you want to create it? + - empty inbetweens - + Create + Vytvořit - ( - ( + Edit Level Settings : %1 + - blank cells will be inserted.) - prázdné buňky budou vloženy.) + Shift Key Frames Down + - - - RenameAsToonzPopup - Delete Original Files - Smazat původní soubor + Shift Key Frames Up + - Level Name: - Název úrovně: + Create Blank Drawing + - Rename - Přejmenovat + Duplicate Drawing + - Cancel - Zrušit + Unable to create a blank drawing on the camera column + + + + The current column is locked + + + + Cannot create a blank drawing on the current column + + + + The current level is not editable + + + + Unable to create a blank drawing on the current column + + + + Unable to replace the current drawing with a blank drawing + + + + There are no drawings in the camera column to duplicate + + + + Cannot duplicate a drawing in the current column + + + + Unable to duplicate a drawing on the current column + + + + Unable to replace the current or next drawing with a duplicate drawing + + + + Stop Motion Controller + + + + Camera Column Switch : + + + + + ReframePopup + + Reframe with Empty Inbetweens + + + + OK + OK + + + Cancel + Zrušit + + + steps + kroky + + + with + s + + + empty inbetweens + + + + ( + ( + + + blank cells will be inserted.) + prázdné buňky budou vloženy.) + + + + RenameAsToonzPopup + + Delete Original Files + Smazat původní soubor + + + Level Name: + Název úrovně: + + + Rename + Přejmenovat + + + Cancel + Zrušit Renaming File @@ -10205,7 +10552,11 @@ Výsledek výstupu se může lišit od toho, který byl očekáván. Co chcete d Click and drag to move guide - Klepnout a táhnout pro posunutí pomocné čáry + Klepnout a táhnout pro posunutí pomocné čáry + + + Left click and drag to move guide. Right click to delete guide + @@ -11349,6 +11700,26 @@ Nejprve, prosím, změny odešlete, nebo je vraťte zpět. Reset View + + Auto Inbetween + + + + Linear Interpolation + Lineární interpolace + + + Ease In Interpolation + + + + Ease Out Interpolation + + + + Ease In/Out Interpolation + + SceneViewerPanel @@ -11366,7 +11737,7 @@ Nejprve, prosím, změny odešlete, nebo je vraťte zpět. Scene: - Záběr: + Záběr: :: Frame: @@ -11378,7 +11749,7 @@ Nejprve, prosím, změny odešlete, nebo je vraťte zpět. Level: - Úroveň: + Úroveň: Freeze @@ -11413,7 +11784,11 @@ Nejprve, prosím, změny odešlete, nebo je vraťte zpět. (převráceno) - :: Project: + [SCENE]: + + + + [LEVEL]: @@ -11755,7 +12130,7 @@ Chcete jej nahradit? Playback Controls - Ovládání přehrávání + Ovládání přehrávání RGBA Channels @@ -11771,7 +12146,19 @@ Chcete jej nahradit? Playback - Přehrávání + Přehrávání + + + Play + Přehrát + + + Render + Zpracování + + + Help + Nápověda @@ -11909,6 +12296,58 @@ Přiřadit k '%3'? Failed to create menubar Nepodařilo se vytvořit pruh s nabídkou + + Project Management + + + + Import + Zavést + + + Export + Vyvést + + + Script + + + + Group + + + + Arrange + + + + New + Nový + + + Adjust + + + + Optimize + + + + Convert + Převést + + + Drawing Substitution + + + + Play + Přehrát + + + Workspace + + StartupPopup @@ -12022,7 +12461,7 @@ Přiřadit k '%3'? The chosen file path is not valid. - Vybraná souborová cesta je neplatná. + Vybraná souborová cesta je neplatná. The frame rate must be 1 or more. @@ -12079,7 +12518,411 @@ Možná byl soubor s přednastavením poškozen - The selected scene project '%1' is not in the Current Project list and may not open automatically. + Failed to create the folder. + + + + + StopMotion + + No + frame id + Ne + + + No level name specified: please choose a valid level name + Pro soubor nestanoven žádný název úrovně: Zvolte, prosím, platný název pro úroveň + + + The level name specified is already used: please choose a different level name. + Název úrovně se již používá: Zvolte, prosím, jiný název. + + + The save in path specified does not match with the existing level. + Zadaná cesta pro Uložit v neodpovídá existující úrovni. + + + The captured image size does not match with the existing level. + Velikost zachyceného obrázku neodpovídá existující úrovni. + + + File %1 already exists. +Do you want to overwrite it? + Soubor %1 již existuje. +Chcete jej přepsat? + + + Failed to load %1. + Nepodařilo se nahrát %1. + + + Folder %1 doesn't exist. +Do you want to create it? + + + + Unable to create + Nelze vytvořit + + + UNDEFINED WARNING + NEURČENÉ VAROVÁNÍ + + + The level is not registered in the scene, but exists in the file system. + Úroveň není zaregistrována v záběru, ale existuje v souborovém systému. + + + +WARNING : Image size mismatch. The saved image size is %1 x %2. + VAROVÁNÍ: Nesoulad ve velikosti obrázku. Velikost uloženého obrázku je %1 x %2. + + + WARNING + + + + +Frame %1 exists. + +Snímek %1 existuje. + + + +Frames %1 exist. + +Snímky%1 existují. + + + OVERWRITE 1 of + PŘEPSÁNÍ 1 + + + ADD to + PŘIDAT do + + + %1 frame + %1 snímek + + + %1 frames + %1 snímky + + + The level will be newly created. + Úroveň bude nově vytvořena. + + + NEW + NOVÝ + + + The level is already registered in the scene. + Úroveň je již zaregistrována v záběru. + + + +NOTE : The level is not saved. + +POZNÁMKA: Úroveň není uložena. + + + +WARNING : Failed to get image size of the existing level %1. + +VAROVÁNÍ: Nepodařilo se získat velikost obrázku stávající úrovně %1. + + + +WARNING : Image size mismatch. The existing level size is %1 x %2. + VAROVÁNÍ: Nesoulad ve velikosti obrázku. Velikost stávající úrovně je %1 x %2. + + + WARNING : Level name conflicts. There already is a level %1 in the scene with the path + %2. + VAROVÁNÍ: Střety v názvu úrovně. V záběru již je úroveň %1 s cestou + %2. + + + +WARNING : Image size mismatch. The size of level with the same name is is %1 x %2. + +VAROVÁNÍ: Nesoulad ve velikosti obrázku. Velikost úrovně se stejným názvem je %1 x %2. + + + WARNING : Level path conflicts. There already is a level with the path %1 + in the scene with the name %2. + VAROVÁNÍ: Střety v cestě úrovně. V záběru již je úroveň %1 s cestou + %2. + + + +WARNING : Image size mismatch. The size of level with the same path is %1 x %2. + +VAROVÁNÍ: Nesoulad ve velikosti obrázku. Velikost úrovně se stejnou cestou je %1 x %2. + + + WARNING + VAROVÁNÍ + + + No camera selected. + + + + + StopMotionController + + Controls + + + + Settings + Nastavení + + + Options + Volby + + + Resolution: + + + + Refresh + Obnovit + + + File + Soubor + + + Webcam Settings... + + + + Capture + Zachytávání + + + Next Level + Další úroveň + + + Next New + + + + Previous Level + Předchozí úroveň + + + Next Frame + Další snímek + + + Last Frame + Poslední snímek + + + Previous Frame + Předchozí snímek + + + Next XSheet Frame + + + + Previous XSheet Frame + + + + Current Frame + Nynější snímek + + + Set to the Current Playhead Location + + + + Start Live View + + + + Zoom + + + + Pick Zoom + + + + < + + + + > + + + + << + + + + >> + + + + <<< + + + + >>> + + + + Camera: + Kamera: + + + Name: + Název: + + + Frame: + Snímek: + + + File Type: + Typ souboru: + + + Save In: + Uložit v: + + + XSheet Frame: + + + + Camera Model + + + + Camera Mode + + + + Temperature: + + + + Shutter Speed: + + + + Iso: + + + + Aperture: + + + + Exposure: + + + + Image Quality: + + + + Picture Style: + + + + White Balance: + + + + Webcam Options + + + + DSLR Options + + + + Place the frame in the XSheet + + + + Use Direct Show Webcam Drivers + + + + Black Screen for Capture + + + + Use Reduced Resolution Images + + + + Use MJPG with Webcam + + + + Place on XSheet + + + + Use Numpad Shortcuts When Active + + + + Show Live View on All Frames + + + + Capture Review Time: + + + + Level Subsampling: + + + + Opacity: + Neprůhlednost: + + + No camera detected. + + + + No camera detected + + + + - Select camera - + - Vybrat kameru - + + + Mode: + + + + Auto + Automaticky + + + Disabled + Zakázáno + + + Stop Live View @@ -12496,6 +13339,17 @@ Klepněte na tlačítko pro vytvoření nového pod-Xsheet + Toolbar + + Collapse toolbar + + + + Expand toolbar + + + + TopBar Lock Rooms Tab @@ -12721,6 +13575,33 @@ Please refer to the user guide for details. + XDTSImportPopup + + Importing XDTS file %1 + + + + Load + Nahrát + + + Cancel + Zrušit + + + Please specify the level locations. Suggested paths are input in the fields with blue border. + + + + Level Name + + + + Level Path + + + + XsheetGUI::CellArea Click to select keyframe, drag to move it @@ -12925,6 +13806,14 @@ Please refer to the user guide for details. &Paste Insert Above &Vložit/Přidat nad + + Hide Camera Column + + + + Show Camera Column + + XsheetGUI::ColumnTransparencyPopup @@ -13122,10 +14011,6 @@ Hold F3 Key on the Viewer to Show This Frame Only sloupce - :: Project: - - - Frame diff --git a/toonz/sources/translations/czech/toonzlib.ts b/toonz/sources/translations/czech/toonzlib.ts index 655d87c..6275b78 100644 --- a/toonz/sources/translations/czech/toonzlib.ts +++ b/toonz/sources/translations/czech/toonzlib.ts @@ -4,17 +4,17 @@ Preferences - + Retas Level Format Formát úrovně RETAS - + Adobe Photoshop Adobe Photoshop - + PNG PNG @@ -224,88 +224,88 @@ Pravděpodobně kodek nemůže pracovat řádně. Vložit efekt: - + Create Linked Fx : %1 Vytvořit propojený efekt: %1 - + Replace Fx : Nahradit efekt: %1 - + Unlink Fx : %1 - - %2 Zrušit propojení efektu: %1 - - %2 - + Make Macro Fx : %1 Vytvořit makro efekt: %1 - + Explode Macro Fx : %1 Rozbalit makro efekt: %1 - + Create Output Fx Vytvořit výstupní efekt - + Connect to Xsheet : Spojit s Xsheet: - + Disconnect from Xsheet : Odpojit od Xsheet: - + Delete Link Smazat spojení - + Delete Fx Node : %1 Smazat uzel efektu: %1 - + Paste Fx : Vložit efekt: - + Disconnect Fx Odpojit od efekt - + Connect Fx : %1 - %2 Spojit efekt: %1 - %2 - + Rename Fx : %1 > %2 Přejmenovat efekt: %1 - %2 - + Group Fx Seskupit efekt - + Ungroup Fx Zrušit seskupení efektu - + Rename Group : %1 > %2 Přejmenovat skupinu: %1 > %2 @@ -488,17 +488,23 @@ Pravděpodobně kodek nemůže pracovat řádně. - + Can't save Nelze uložit - + + Failed to save the following resources: + + + + + Xsheet Xsheet - + Timeline Časová osa diff --git a/toonz/sources/translations/czech/toonzqt.ts b/toonz/sources/translations/czech/toonzqt.ts index fcc217f..1ed8f8a 100644 --- a/toonz/sources/translations/czech/toonzqt.ts +++ b/toonz/sources/translations/czech/toonzqt.ts @@ -278,32 +278,32 @@ Možná byl soubor s přednastavením poškozen DVGui::CleanupColorField - + Brightness: Jas: - + Contrast: Kontrast: - + Color Thres Prahová hodnota barvy - + White Thres Prahová hodnota světlosti - + H Range Oblast barevného odstínu - + Line Width Tloušťka čáry @@ -311,22 +311,22 @@ Možná byl soubor s přednastavením poškozen DVGui::ColorField - + R: Č: - + G: Z: - + B: M: - + A: A: @@ -409,7 +409,7 @@ Možná byl soubor s přednastavením poškozen DVGui::ToneCurveField - + Channel: Kanál: @@ -479,228 +479,258 @@ Možná byl soubor s přednastavením poškozen FlipConsole - - - - + + + + FPS FPS - + Save Uložit - + Snapshot Snímek obrazovky - + Define Sub-camera Určit podkameru - + Define Loading Box Určit nahrávací box - + Use Loading Box Použít nahrávací box - + Background Colors Barvy pozadí - + Framerate Počet snímků - + Playback Controls Ovládání přehrávání - + Color Channels Barevné kanály - + Set Key Nastavit klíčový snímek - + Histogram Histogram - + Display Areas as Filled Zobrazit plochy jako vyplněné - + + Viewer Controls + + + + &Save Images &Uložit obrázky - + &Snapshot &Snímek obrazovky - + &Compare to Snapshot &Porovnat se snímkem obrazovky - + &Define Sub-camera &Určit podkameru - + &Define Loading Box &Určit nahrávací box - + &Use Loading Box &Použít nahrávací box - + &White Background &Bílé pozadí - + &Black Background Č&erné pozadí - + &Checkered Background Ša&chovnicové pozadí - + &First Frame &První snímek - + &Previous Frame &Předchozí snímek - + Pause Pozastavit - + Play Přehrát - + Loop Smyčka - + &Next frame &Další snímek - + &Last Frame &Poslední snímek - - + + Red Channel Červený kanál - + Red Channel in Grayscale Červený kanál v odstínech šedi - - + + Green Channel Zelený kanál - + Green Channel in Grayscale Zelený kanál v odstínech šedi - - + + Blue Channel Modrý kanál - + Blue Channel in Grayscale Modrý kanál v odstínech šedi - + Alpha Channel Alfa kanál - + &Soundtrack &Zvukový doprovod - + &Histogram &Histogram - + &Locator - + &Display Areas as Filled &Zobrazit plochy jako vyplněné - + + &Zoom In + + + + + &Zoom Out + + + + + &Flip Horizontally + + + + + &Flip Vertically + + + + + &Reset View + + + + FPS FPS - + Set the current frame Nastavit nynější snímek - + Drag to play the animation Táhnout pro přehrání animace - + Set the playback frame rate Nastavit snímkování přehrávání @@ -708,12 +738,12 @@ Možná byl soubor s přednastavením poškozen FontParamField - + Style: Styl: - + Size: Velikost: @@ -1013,7 +1043,7 @@ Možná byl soubor s přednastavením poškozen FunctionSelection - + There is a circular reference in the definition of the interpolation. Ve vymezení interpolace je kruhový odkaz. @@ -1021,7 +1051,7 @@ Možná byl soubor s přednastavením poškozen FunctionSheet - + Function Editor Editor funkce @@ -1029,102 +1059,103 @@ Možná byl soubor s přednastavením poškozen FunctionSheetCellViewer - + Delete Key Smazat klíčový snímek - + Set Key Nastavit klíčový snímek - + Linear Interpolation Lineární interpolace - + Speed In / Speed Out Interpolation - + Ease In / Ease Out Interpolation - + Ease In / Ease Out (%) Interpolation - + Exponential Interpolation Exponenciální interpolace - + Expression Interpolation Výrazová interpolace - + File Interpolation Souborová interpolace - + + Similar Shape Interpolation + Interpolace skrze podobné tvary + + + Constant Interpolation Stálá interpolace - Step 1 - Krok 1 + Krok 1 - Step 2 - Krok 2 + Krok 2 - Step 3 - Krok 3 + Krok 3 - Step 4 - Krok 4 + Krok 4 - + Activate Cycle Zapnout koloběh - + Deactivate Cycle Vypnout koloběh - + Show Inbetween Values - + Hide Inbetween Values - + Change Interpolation - + Change Step @@ -1184,16 +1215,21 @@ Možná byl soubor s přednastavením poškozen - + Show Animated Only Ukázat jen kreslené - + Show All Ukázat vše + + + Hide Selected + + FxColumnPainter @@ -1411,37 +1447,37 @@ Vyberte uzly efektů a příbuzné odkazy, jež chcete vložit, před kopírová FxSettings - + &Camera Preview &Náhled kamery - + &Preview &Náhled - + &White Background &Bílé pozadí - + &Black Background Č&erné pozadí - + &Checkered Background Ša&chovnicové pozadí - + Fx Settings Nastavení efektu - + : : @@ -1521,19 +1557,19 @@ Vyberte uzly efektů a příbuzné odkazy, jež chcete vložit, před kopírová KeyframeNavigator - + Previous Key Předchozí klíčový snímek - - - + + + Set Key Nastavit klíčový snímek - + Next Key Další klíčový snímek @@ -1566,139 +1602,139 @@ Vyberte uzly efektů a příbuzné odkazy, jež chcete vložit, před kopírová PaletteViewer - - - + + + &Save Palette As &Uložit paletu jako - - - + + + &Save Palette &Uložit paletu - - + + Lock Palette Uzamknout paletu - + &Lock Palette &Uzamknout paletu - + Options Volby - + &Small Thumbnails View &Malé náhledy - + &Medium Thumbnails View &Střední náhledy - + &Large Thumbnails View &Velké náhledy - + &List View &Pohled se seznamem - + Style Name Název stylu - + StudioPalette Name Název studiové palety - + Both Names Oba názvy - + &New Page &Nová strana - - + + &New Style &Nový styl - - + + &Move Palette &Posunout paletu - + &Palette Gizmo Upravit &paletu - + New Page Nová strana - + Delete Page Smazat stranu - + Overwrite Přepsat - + Don't Overwrite Nepřepisovat - + Palette Paleta - + Level Palette: Paleta úrovně: - + Cleanup Palette Vyčistit paletu - + Studio Palette Studiová paleta - + (Color Model: (Barevný model: - + ) ) @@ -1752,7 +1788,7 @@ Vyberte uzly efektů a příbuzné odkazy, jež chcete vložit, před kopírová ParamViewer - + Swatch Viewer Pohled na vzor @@ -1760,7 +1796,7 @@ Vyberte uzly efektů a příbuzné odkazy, jež chcete vložit, před kopírová ParamsPageSet - + Fx Help Nápověda @@ -2037,12 +2073,12 @@ Jste si jistý? Není možné nahrát cestu pohybu. - + Stage Schematic Náčrtek jeviště - + FX Schematic Náčrtek efektu @@ -2162,12 +2198,12 @@ Jste si jistý? Paleta - + Overwrite Přepsat - + Don't Overwrite Nepřepisovat @@ -2407,6 +2443,11 @@ Jste si jistý? Název souboru nesmí být prázdný nebo obsahovat následující znaky: (nový řádek) \ / : * ? " | + + That is a reserved file name and cannot be used. + + + OpenToonz 1.3 OpenToonz 1.3 @@ -2494,63 +2535,91 @@ Jste si jistý? + RgbLinkButtons + + + Copy RGB : %1 > %2 + + + + + Swap %1 and %2 + + + + SchematicViewer - + &Fit to Window &Přizpůsobit oknu - + &Focus on Current &Zaměřit na nynější předmět - + &Reorder Nodes &Přeuspořádat uzly - + &Reset Size &Obnovit výchozí velikost - - - + + + &Minimize Nodes &Zmenšit uzly - - - + + + &Maximize Nodes &Zvětšit uzly - + + &Selection Mode + + + + + &Zoom Mode + + + + + &Hand Mode + + + + &New Pegbar &Nový pruh na kolíky - + &New Camera &Nová kamera - + &New Motion Path &Nová cesta pohybu - + &Swtich output port display mode &Přepnout režim zobrazení výstupní přípojky (port) - + &Toggle node icons &Přepnout ikony uzlů @@ -2647,6 +2716,19 @@ Jste si jistý? + StageSchematicNode + + + Toggle Autorotate Along Motion Path + + + + + Toggle Link Motion Path to Control Points + + + + StageSchematicScene diff --git a/toonz/sources/translations/french/image.ts b/toonz/sources/translations/french/image.ts index b08615c..fa9a74c 100644 --- a/toonz/sources/translations/french/image.ts +++ b/toonz/sources/translations/french/image.ts @@ -4,12 +4,12 @@ AviWriterProperties - + Codec - + Uncompressed @@ -17,17 +17,17 @@ GifWriterProperties - + Scale - + Looping - + Generate Palette @@ -35,12 +35,12 @@ Mp4WriterProperties - + Quality - + Scale @@ -337,12 +337,12 @@ Please try raising the FFmpeg timeout in Preferences. WebmWriterProperties - + Quality - + Scale diff --git a/toonz/sources/translations/french/tnzcore.ts b/toonz/sources/translations/french/tnzcore.ts index 307b6fc..cd7b2d8 100644 --- a/toonz/sources/translations/french/tnzcore.ts +++ b/toonz/sources/translations/french/tnzcore.ts @@ -41,10 +41,6 @@ Skipping frame. - - Malformed frame name - - TCenterLineStrokeStyle diff --git a/toonz/sources/translations/french/tnztools.ts b/toonz/sources/translations/french/tnztools.ts index 8999628..ee25c5a 100644 --- a/toonz/sources/translations/french/tnztools.ts +++ b/toonz/sources/translations/french/tnztools.ts @@ -1154,6 +1154,34 @@ Voulez-vous continuer? to Backward + + The selection cannot be updated. It is not editable. + + + + The selection cannot be deleted. It is not editable. + + + + The selection cannot be pasted. It is not editable. + + + + The selection cannot be grouped. It is not editable. + + + + The selection cannot be entered. It is not editable. + + + + The selection cannot be ungrouped. It is not editable. + + + + The selection cannot be moved. It is not editable. + + RGBPickerTool diff --git a/toonz/sources/translations/french/toonz.ts b/toonz/sources/translations/french/toonz.ts index b44bec7..947de82 100644 --- a/toonz/sources/translations/french/toonz.ts +++ b/toonz/sources/translations/french/toonz.ts @@ -1217,7 +1217,7 @@ Que voulez-vous faire? Scene: - Plan: + Plan: :: Frame: @@ -1228,15 +1228,15 @@ Que voulez-vous faire? :: Niveau: - Level: + (Flipped) - (Flipped) + [SCENE]: - :: Project: + [LEVEL]: @@ -1575,6 +1575,10 @@ contain the dpi information, then the current camera dpi will be used. Dpi: + + Level %1 converting to same file format; skipped. + + DVGui::ProgressDialog @@ -2345,6 +2349,10 @@ Hold F3 Key on the Viewer to Show This Frame Only no icon + + Auto Inbetween + + FlipBook @@ -2511,7 +2519,7 @@ Do you want to overwrite it? ImportMagpieFilePopup Import Magpie File - Importer un Fichier Magpie + Importer un Fichier Magpie Load @@ -2521,6 +2529,10 @@ Do you want to overwrite it? %1 does not exist. %1 n' existe pas. + + Import Toonz Lip Sync File + + InbetweenDialog @@ -2916,10 +2928,6 @@ Voulez-vous le créer? DPI Personnalisé - Scan level - - - Raster level @@ -2943,6 +2951,18 @@ Voulez-vous le créer? Toonz Raster level + + [Various] + + + + SubXsheet Level + + + + Another Level Type + + LineTestCapturePane @@ -3288,10 +3308,6 @@ Please use the frame numbers for reference. - Arrangement in Xsheet - - - (FILE DOES NOT EXIST) @@ -3323,6 +3339,30 @@ Please use the frame numbers for reference. :: + + Level Settings & Arrangement in Xsheet + + + + Premultiply + Prémultiplier + + + White As Transparent + Blanc comme Transparent + + + DPI: + DPI: + + + Antialias Softness: + Douceur Antialias: + + + Subsampling: + Sous-échantillonnage: + LoadScenePopup @@ -3438,7 +3478,7 @@ Please use the frame numbers for reference. MagpieFileImportPopup Import Magpie File - Importation d'un Fichier Magpie + Importation d'un Fichier Magpie Frame Range @@ -3446,7 +3486,7 @@ Please use the frame numbers for reference. To: - À: + À: From: @@ -3476,6 +3516,14 @@ Please use the frame numbers for reference. The file path is missing. Le chemin du fichier manque. + + Import Toonz Lip Sync File + + + + To: + + MainWindow @@ -3561,7 +3609,7 @@ Please use the frame numbers for reference. &Import Magpie File... - &Importer un Fichier Magpie... + &Importer un Fichier Magpie... &New Project... @@ -3881,7 +3929,7 @@ Please use the frame numbers for reference. &Edit FX... - &Modifier l' Effet Special... + &Modifier l' Effet Special... Insert Frame @@ -5407,6 +5455,152 @@ Please use the frame numbers for reference. Brush Tool - Lock Alpha + + http://opentoonz.readthedocs.io + + + + &Import Toonz Lip Sync File... + + + + Export Exchange Digital Time Sheet (XDTS) + + + + &Clear Cache Folder + + + + Show/Hide Xsheet Camera Column + + + + &Create Blank Drawing + + + + &Shift Keys Down + + + + &Shift Keys Up + + + + Next Key + + + + Prev Key + + + + &FX Editor + + + + &Stop Motion Controls + + + + &Online Manual... + + + + Select Next Frame Guide Stroke + + + + Select Previous Frame Guide Stroke + + + + Select Prev && Next Frame Guide Strokes + + + + Reset Guide Stroke Selections + + + + Tween Selected Guide Strokes + + + + Tween Guide Strokes to Selected + + + + Select Guide Strokes && Tween Mode + + + + Capture Stop Motion Frame + + + + Raise Stop Motion Opacity + + + + Lower Stop Motion Opacity + + + + Toggle Stop Motion Live View + + + + Toggle Stop Motion Zoom + + + + Lower Stop Motion Level Subsampling + + + + Raise Stop Motion Level Subsampling + + + + Go to Stop Motion Insert Frame + + + + Clear Cache Folder + + + + There are no unused items in the cache folder. + + + + Deleting the following items: + + + + + <DIR> + + + + ... and %1 more items + + + + + +Are you sure? + +N.B. Make sure you are not running another process of OpenToonz, +or you may delete necessary files for it. + + + + Can't delete %1 : + + MatchlinesDialog @@ -6594,7 +6788,7 @@ Set the output folder path to the subfolder as well. Backup Animation Levels when Saving - Créer une Copie de Réserve des Niveaux d'Animation lors de l'Enregistrement + Créer une Copie de Réserve des Niveaux d'Animation lors de l'Enregistrement Cells Only @@ -6818,7 +7012,7 @@ Set the output folder path to the subfolder as well. Autocreation: - Autocreation: + Autocreation: Minimize Savebox after Editing @@ -6953,10 +7147,6 @@ Set the output folder path to the subfolder as well. - X - - - Viewer Shrink @@ -7049,14 +7239,6 @@ Set the output folder path to the subfolder as well. - Disabled - - - - Enabled - - - Use Xsheet as Animation Sheet @@ -7081,10 +7263,6 @@ Set the output folder path to the subfolder as well. - Stuff Folder* - - - Custom* @@ -7373,10 +7551,6 @@ if both are possible on coding file path. - Enable auto-stretch frame - - - Show Cursor Size Outlines @@ -7466,10 +7640,6 @@ Also the initial output destination for new scenes will be set to $scenefolder a - Tablet Settings - - - Enable Windows Ink Support* (EXPERIMENTAL) @@ -7506,6 +7676,66 @@ in non alpha-enabled image format. Current Column Color: + + Backup Scene and Animation Levels when Saving + + + + # of backups to keep: + + + + Enable Autocreation + + + + Numbering System: + + + + Enable Auto-stretch Frame + + + + Enable Creation in Hold Cells + + + + Enable Autorenumber + + + + Toolbar Display Behaviour: + + + + Show Camera Column + + + + Level Editor Box Color + + + + Incremental + + + + Enable Tools For Level Only + + + + Show Tools For Level Only + + + + Touch/Tablet Settings + + + + Enable Touch Gesture Controls + + PreferencesPopup::FormatProperties @@ -9403,19 +9633,6 @@ Allow duplicate? - Please enable "Sync Level Strip Drawing Number Changes with the XSheet" preference option -to use the duplicate command in the xsheet / timeline. - - - - Please select only one layer to duplicate a frame. - - - - Please select only one frame to duplicate. - - - Timeline @@ -9669,39 +9886,133 @@ Que voulez-vous faire? %1 does not exist. - - - ReframePopup - Reframe with Empty Inbetweens + The file %1 already exists. +Do you want to overwrite it? - OK - OK + The file %1 has been exported successfully. + - Cancel - Annuler + Open containing folder + - steps + Please enable "Show Keyframes on Cell Area" to show or hide the camera column. - with + The chosen folder path does not exist. +Do you want to create it? - empty inbetweens - + Create + Créer - ( + Edit Level Settings : %1 - blank cells will be inserted.) + Shift Key Frames Down + + + + Shift Key Frames Up + + + + Create Blank Drawing + + + + Duplicate Drawing + + + + Unable to create a blank drawing on the camera column + + + + The current column is locked + + + + Cannot create a blank drawing on the current column + + + + The current level is not editable + + + + Unable to create a blank drawing on the current column + + + + Unable to replace the current drawing with a blank drawing + + + + There are no drawings in the camera column to duplicate + + + + Cannot duplicate a drawing in the current column + + + + Unable to duplicate a drawing on the current column + + + + Unable to replace the current or next drawing with a duplicate drawing + + + + Stop Motion Controller + + + + Camera Column Switch : + + + + + ReframePopup + + Reframe with Empty Inbetweens + + + + OK + OK + + + Cancel + Annuler + + + steps + + + + with + + + + empty inbetweens + + + + ( + + + + blank cells will be inserted.) @@ -9861,7 +10172,11 @@ Les fichiers audio ne seront pas inclus dans le clip rendu. Click and drag to move guide - Cliquer et faites glisser pour déplacer le repère + Cliquer et faites glisser pour déplacer le repère + + + Left click and drag to move guide. Right click to delete guide + @@ -10993,6 +11308,26 @@ S'il vous plaît commettre ou annuler les modifications avant.Reset View Réinitialiser l'Affichage + + Auto Inbetween + + + + Linear Interpolation + + + + Ease In Interpolation + + + + Ease Out Interpolation + + + + Ease In/Out Interpolation + + SceneViewerPanel @@ -11026,7 +11361,7 @@ S'il vous plaît commettre ou annuler les modifications avant. Scene: - Plan: + Plan: :: Frame: @@ -11038,7 +11373,7 @@ S'il vous plaît commettre ou annuler les modifications avant. Level: - Niveau: + Niveau: :: Zoom : @@ -11057,7 +11392,11 @@ S'il vous plaît commettre ou annuler les modifications avant. - :: Project: + [SCENE]: + + + + [LEVEL]: @@ -11398,7 +11737,7 @@ S'il vous plaît commettre ou annuler les modifications avant. Playback Controls - Contrôles de Lecture + Contrôles de Lecture RGBA Channels @@ -11413,7 +11752,15 @@ S'il vous plaît commettre ou annuler les modifications avant. - Playback + Play + Exécuter + + + Render + + + + Help @@ -11552,6 +11899,58 @@ Attribuer à '3%'? Failed to create menubar + + Project Management + + + + Import + Importer + + + Export + Exporter + + + Script + + + + Group + + + + Arrange + + + + New + + + + Adjust + + + + Optimize + + + + Convert + Convertir + + + Drawing Substitution + + + + Play + Exécuter + + + Workspace + + StartupPopup @@ -11656,10 +12055,6 @@ Attribuer à '3%'? - The chosen file path is not valid. - - - The frame rate must be 1 or more. @@ -11713,107 +12108,503 @@ Possibly the preset file has been corrupted - The selected scene project '%1' is not in the Current Project list and may not open automatically. + Failed to create the folder. - SubSheetBar + StopMotion - Sub-scene controls: -Click the arrow button to create a new sub-xsheet - Contrôles de Sub-xsheet: -Cliquez sur le bouton fléché pour créer un nouveau sub-xsheet + No + frame id + Non - Disable Edit in Place - Désactiver la Modification en Place + No level name specified: please choose a valid level name + Aucun nom n'a pas été spécifié pour le niveau: s'il vous plaît spécifiez un nom de niveau valide. - Enable Edit in Place - Activer la Modifiication en Place + The level name specified is already used: please choose a different level name. + - Exit Sub-xsheet (1 Level Up) - Sortir du Sub-xsheet (1 Niveau en Haut) + The save in path specified does not match with the existing level. + - Exit Sub-xsheet (2 Levels Up) - Sortir du Sub-xsheet (2 Niveaux en Haut) + The captured image size does not match with the existing level. + - Exit Sub-xsheet (3 or More Levels Up) - Sortir du Sub-xsheet (3 ou plus Niveaux en Haut) + File %1 already exists. +Do you want to overwrite it? + - Enter Sub-xsheet - Entrer dans le Sub-xsheet + Failed to load %1. + - Current Scene - Plan Courant + Folder %1 doesn't exist. +Do you want to create it? + Le dossier %1 n'existe pas. +Voulez-vous le créer? - - - TApp - Error allocating memory: not enough memory. - Erreur d'allocation de mémoire: pas assez de mémoire. + Unable to create + Il est impossible de créer - It is not possible to save automatically an untitled scene. - Il n'est pas possible d'enregistrer automatiquement une une scène sans nom. + UNDEFINED WARNING + - - - TaskSheet - Name: - Nom: + The level is not registered in the scene, but exists in the file system. + - Status: - État: + +WARNING : Image size mismatch. The saved image size is %1 x %2. + - Command Line: - Ligne de Commande: + WARNING + - Server: - Serveur: + +Frame %1 exists. + - Submitted By: - Soumis Par: + +Frames %1 exist. + - Submitted On: - Soumis Sur: + OVERWRITE 1 of + - Submission Date: - Date de Soumission: + ADD to + - Start Date: - Date de Début: + %1 frame + - Completion Date: - Date d' Achèvement: + %1 frames + - Duration: - Durée: + The level will be newly created. + - Step Count: - Compte des Pas: + NEW + - Failed Steps: - Pas Échoués: + The level is already registered in the scene. + + + + +NOTE : The level is not saved. + + + + +WARNING : Failed to get image size of the existing level %1. + + + + +WARNING : Image size mismatch. The existing level size is %1 x %2. + + + + WARNING : Level name conflicts. There already is a level %1 in the scene with the path + %2. + + + + +WARNING : Image size mismatch. The size of level with the same name is is %1 x %2. + + + + WARNING : Level path conflicts. There already is a level with the path %1 + in the scene with the name %2. + + + + +WARNING : Image size mismatch. The size of level with the same path is %1 x %2. + + + + WARNING + + + + No camera selected. + + + + + StopMotionController + + Controls + + + + Settings + + + + Options + Options + + + Resolution: + + + + Refresh + Actualiser + + + File + Fichier + + + Webcam Settings... + + + + Capture + Capturer + + + Next Level + + + + Next New + + + + Previous Level + + + + Next Frame + Image Suivante + + + Last Frame + Dernière Image + + + Previous Frame + Image Précédente + + + Next XSheet Frame + + + + Previous XSheet Frame + + + + Current Frame + Image Courante + + + Set to the Current Playhead Location + + + + Start Live View + + + + Zoom + + + + Pick Zoom + + + + < + + + + > + + + + << + + + + >> + + + + <<< + + + + >>> + + + + Camera: + + + + Name: + Nom: + + + Frame: + + + + File Type: + + + + Save In: + + + + XSheet Frame: + + + + Camera Model + + + + Camera Mode + + + + Temperature: + + + + Shutter Speed: + + + + Iso: + + + + Aperture: + + + + Exposure: + + + + Image Quality: + + + + Picture Style: + + + + White Balance: + + + + Webcam Options + + + + DSLR Options + + + + Place the frame in the XSheet + + + + Use Direct Show Webcam Drivers + + + + Black Screen for Capture + + + + Use Reduced Resolution Images + + + + Use MJPG with Webcam + + + + Place on XSheet + + + + Use Numpad Shortcuts When Active + + + + Show Live View on All Frames + + + + Capture Review Time: + + + + Level Subsampling: + + + + Opacity: + + + + No camera detected. + + + + No camera detected + + + + - Select camera - + + + + Mode: + + + + Auto + Auto + + + Disabled + + + + Stop Live View + + + + + SubSheetBar + + Sub-scene controls: +Click the arrow button to create a new sub-xsheet + Contrôles de Sub-xsheet: +Cliquez sur le bouton fléché pour créer un nouveau sub-xsheet + + + Disable Edit in Place + Désactiver la Modification en Place + + + Enable Edit in Place + Activer la Modifiication en Place + + + Exit Sub-xsheet (1 Level Up) + Sortir du Sub-xsheet (1 Niveau en Haut) + + + Exit Sub-xsheet (2 Levels Up) + Sortir du Sub-xsheet (2 Niveaux en Haut) + + + Exit Sub-xsheet (3 or More Levels Up) + Sortir du Sub-xsheet (3 ou plus Niveaux en Haut) + + + Enter Sub-xsheet + Entrer dans le Sub-xsheet + + + Current Scene + Plan Courant + + + + TApp + + Error allocating memory: not enough memory. + Erreur d'allocation de mémoire: pas assez de mémoire. + + + It is not possible to save automatically an untitled scene. + Il n'est pas possible d'enregistrer automatiquement une une scène sans nom. + + + + TaskSheet + + Name: + Nom: + + + Status: + État: + + + Command Line: + Ligne de Commande: + + + Server: + Serveur: + + + Submitted By: + Soumis Par: + + + Submitted On: + Soumis Sur: + + + Submission Date: + Date de Soumission: + + + Start Date: + Date de Début: + + + Completion Date: + Date d' Achèvement: + + + Duration: + Durée: + + + Step Count: + Compte des Pas: + + + Failed Steps: + Pas Échoués: Successful Steps: @@ -12119,6 +12910,17 @@ Cliquez sur le bouton fléché pour créer un nouveau sub-xsheet + Toolbar + + Collapse toolbar + + + + Expand toolbar + + + + TopBar Lock Rooms Tab @@ -12350,6 +13152,33 @@ S'il vous plaît se référer à la guide de l'utilisateur pour plus d + XDTSImportPopup + + Importing XDTS file %1 + + + + Load + Charger + + + Cancel + Annuler + + + Please specify the level locations. Suggested paths are input in the fields with blue border. + + + + Level Name + + + + Level Path + + + + XsheetGUI::CellArea Click to select keyframe, drag to move it @@ -12554,6 +13383,14 @@ S'il vous plaît se référer à la guide de l'utilisateur pour plus d &Paste Insert Above + + Hide Camera Column + + + + Show Camera Column + + XsheetGUI::ColumnTransparencyPopup @@ -12747,10 +13584,6 @@ Hold F3 Key on the Viewer to Show This Frame Only - :: Project: - - - Frame diff --git a/toonz/sources/translations/french/toonzlib.ts b/toonz/sources/translations/french/toonzlib.ts index 54dd24f..e46ff02 100644 --- a/toonz/sources/translations/french/toonzlib.ts +++ b/toonz/sources/translations/french/toonzlib.ts @@ -606,6 +606,11 @@ Probablement le codec peut ne pas fonctionner correctement. Timeline + + Failed to save the following resources: + + + Rasterizer diff --git a/toonz/sources/translations/french/toonzqt.ts b/toonz/sources/translations/french/toonzqt.ts index 6a7b250..bb0997c 100644 --- a/toonz/sources/translations/french/toonzqt.ts +++ b/toonz/sources/translations/french/toonzqt.ts @@ -695,6 +695,30 @@ Possibly the preset file has been corrupted &Locator + + Viewer Controls + + + + &Zoom In + + + + &Zoom Out + + + + &Flip Horizontally + + + + &Flip Vertically + + + + &Reset View + + FontParamField @@ -1005,19 +1029,19 @@ Possibly the preset file has been corrupted Step 1 - Pas 1 + Pas 1 Step 2 - Pas 2 + Pas 2 Step 3 - Pas 3 + Pas 3 Step 4 - Pas 4 + Pas 4 Activate Cycle @@ -1043,6 +1067,10 @@ Possibly the preset file has been corrupted Change Step + + Similar Shape Interpolation + Interpolation par Forme Similaire + FunctionToolbar @@ -1100,6 +1128,10 @@ Possibly the preset file has been corrupted Table + + Hide Selected + + FxColumnPainter @@ -2180,6 +2212,10 @@ The second line should be "Mesh [Input bit depth] [Output bit depth]"< OK OK + + That is a reserved file name and cannot be used. + + QPushButton @@ -2196,6 +2232,17 @@ The second line should be "Mesh [Input bit depth] [Output bit depth]"< + RgbLinkButtons + + Copy RGB : %1 > %2 + + + + Swap %1 and %2 + + + + SchematicViewer &Fit to Window @@ -2245,6 +2292,18 @@ The second line should be "Mesh [Input bit depth] [Output bit depth]"< &Toggle node icons + + &Selection Mode + + + + &Zoom Mode + + + + &Hand Mode + + SchematicWindowEditor @@ -2326,6 +2385,17 @@ The second line should be "Mesh [Input bit depth] [Output bit depth]"< + StageSchematicNode + + Toggle Autorotate Along Motion Path + + + + Toggle Link Motion Path to Control Points + + + + StageSchematicScene &New Pegbar diff --git a/toonz/sources/translations/german/image.ts b/toonz/sources/translations/german/image.ts index b08615c..fa9a74c 100644 --- a/toonz/sources/translations/german/image.ts +++ b/toonz/sources/translations/german/image.ts @@ -4,12 +4,12 @@ AviWriterProperties - + Codec - + Uncompressed @@ -17,17 +17,17 @@ GifWriterProperties - + Scale - + Looping - + Generate Palette @@ -35,12 +35,12 @@ Mp4WriterProperties - + Quality - + Scale @@ -337,12 +337,12 @@ Please try raising the FFmpeg timeout in Preferences. WebmWriterProperties - + Quality - + Scale diff --git a/toonz/sources/translations/german/tnzcore.ts b/toonz/sources/translations/german/tnzcore.ts index 3191c70..6c9681b 100644 --- a/toonz/sources/translations/german/tnzcore.ts +++ b/toonz/sources/translations/german/tnzcore.ts @@ -41,10 +41,6 @@ Skipping frame. - - Malformed frame name - - TCenterLineStrokeStyle diff --git a/toonz/sources/translations/german/tnztools.ts b/toonz/sources/translations/german/tnztools.ts index 0ac451d..1c23a53 100644 --- a/toonz/sources/translations/german/tnztools.ts +++ b/toonz/sources/translations/german/tnztools.ts @@ -1157,6 +1157,34 @@ Möchten Sie fortfahren? to Backward + + The selection cannot be updated. It is not editable. + + + + The selection cannot be deleted. It is not editable. + + + + The selection cannot be pasted. It is not editable. + + + + The selection cannot be grouped. It is not editable. + + + + The selection cannot be entered. It is not editable. + + + + The selection cannot be ungrouped. It is not editable. + + + + The selection cannot be moved. It is not editable. + + RGBPickerTool diff --git a/toonz/sources/translations/german/toonz.ts b/toonz/sources/translations/german/toonz.ts index 3806b31..ed7d8c9 100644 --- a/toonz/sources/translations/german/toonz.ts +++ b/toonz/sources/translations/german/toonz.ts @@ -1221,7 +1221,7 @@ Was möchten Sie tun? Scene: - Szene: + Szene: :: Frame: @@ -1233,14 +1233,18 @@ Was möchten Sie tun? Level: - Ebene: + Ebene: (Flipped) - :: Project: + [SCENE]: + + + + [LEVEL]: @@ -1583,6 +1587,10 @@ contain the dpi information, then the current camera dpi will be used. Dpi: + + Level %1 converting to same file format; skipped. + + DVGui::ProgressDialog @@ -2427,6 +2435,10 @@ Hold F3 Key on the Viewer to Show This Frame Only no icon Keine Icons + + Auto Inbetween + + FlipBoOk @@ -2640,7 +2652,7 @@ Do you want to overwrite it? ImportMagpieFilePopup Import Magpie File - MAGPIE-Datei importieren + MAGPIE-Datei importieren Load @@ -2650,6 +2662,10 @@ Do you want to overwrite it? %1 does not exist. %1 existiert nicht. + + Import Toonz Lip Sync File + + InbetweenDialog @@ -3049,10 +3065,6 @@ Möchten Sie einen erstellen? Eigene DPI - Scan level - - - Raster level @@ -3076,6 +3088,18 @@ Möchten Sie einen erstellen? Toonz Raster level + + [Various] + + + + SubXsheet Level + + + + Another Level Type + + LineTestCapturePane @@ -3422,7 +3446,7 @@ Please use the frame numbers for reference. Arrangement in Xsheet - Anordnung im Xsheet + Anordnung im Xsheet (FILE DOES NOT EXIST) @@ -3456,6 +3480,30 @@ Please use the frame numbers for reference. :: + + Level Settings & Arrangement in Xsheet + + + + Premultiply + Premultiply [Schwarz-Matte] + + + White As Transparent + Weiß als transparent + + + DPI: + DPI: + + + Antialias Softness: + Kantenglättung-Weichheit: + + + Subsampling: + Subsampling: + LoadScenePopup @@ -3571,7 +3619,7 @@ Please use the frame numbers for reference. MagpieFileImportPopup Import Magpie File - MAGPIE-Datei laden + MAGPIE-Datei laden Frame Range @@ -3579,7 +3627,7 @@ Please use the frame numbers for reference. To: - Zu Frame: + Zu Frame: From: @@ -3609,6 +3657,14 @@ Please use the frame numbers for reference. The file path is missing. Der Datei-Pfad ist unbekannt. + + Import Toonz Lip Sync File + + + + To: + + MainWindow @@ -3694,7 +3750,7 @@ Please use the frame numbers for reference. &Import Magpie File... - MAGPIE-Datei importieren (&I)... + MAGPIE-Datei importieren (&I)... &New Project... @@ -4018,7 +4074,7 @@ Please use the frame numbers for reference. &Edit FX... - Effekt bearbeiten (&E)... + Effekt bearbeiten (&E)... Insert Frame @@ -5564,6 +5620,152 @@ Please use the frame numbers for reference. Brush Tool - Lock Alpha + + http://opentoonz.readthedocs.io + + + + &Import Toonz Lip Sync File... + + + + Export Exchange Digital Time Sheet (XDTS) + + + + &Clear Cache Folder + + + + Show/Hide Xsheet Camera Column + + + + &Create Blank Drawing + + + + &Shift Keys Down + + + + &Shift Keys Up + + + + Next Key + + + + Prev Key + + + + &FX Editor + + + + &Stop Motion Controls + + + + &Online Manual... + + + + Select Next Frame Guide Stroke + + + + Select Previous Frame Guide Stroke + + + + Select Prev && Next Frame Guide Strokes + + + + Reset Guide Stroke Selections + + + + Tween Selected Guide Strokes + + + + Tween Guide Strokes to Selected + + + + Select Guide Strokes && Tween Mode + + + + Capture Stop Motion Frame + + + + Raise Stop Motion Opacity + + + + Lower Stop Motion Opacity + + + + Toggle Stop Motion Live View + + + + Toggle Stop Motion Zoom + + + + Lower Stop Motion Level Subsampling + + + + Raise Stop Motion Level Subsampling + + + + Go to Stop Motion Insert Frame + + + + Clear Cache Folder + + + + There are no unused items in the cache folder. + + + + Deleting the following items: + + + + + <DIR> + + + + ... and %1 more items + + + + + +Are you sure? + +N.B. Make sure you are not running another process of OpenToonz, +or you may delete necessary files for it. + + + + Can't delete %1 : + + MatchlinesDialog @@ -6761,7 +6963,7 @@ Set the output folder path to the subfolder as well. Backup Animation Levels when Saving - Beim Speichern ein Backup der Ebenen erstellen + Beim Speichern ein Backup der Ebenen erstellen Cell-dragging Behaviour: @@ -7001,7 +7203,7 @@ Set the output folder path to the subfolder as well. Autocreation: - Automatisches Erstellen: + Automatisches Erstellen: Transparency Check @@ -7129,7 +7331,7 @@ Set the output folder path to the subfolder as well. X - X + X Viewer Shrink @@ -7237,11 +7439,11 @@ Set the output folder path to the subfolder as well. Disabled - Deaktiviert + Deaktiviert Enabled - Aktiviert + Aktiviert Use Xsheet as Animation Sheet @@ -7292,10 +7494,6 @@ Set the output folder path to the subfolder as well. - Stuff Folder* - - - Custom* @@ -7580,10 +7778,6 @@ if both are possible on coding file path. - Enable auto-stretch frame - - - Show Cursor Size Outlines @@ -7673,10 +7867,6 @@ Also the initial output destination for new scenes will be set to $scenefolder a - Tablet Settings - - - Enable Windows Ink Support* (EXPERIMENTAL) @@ -7713,6 +7903,66 @@ in non alpha-enabled image format. Current Column Color: + + Backup Scene and Animation Levels when Saving + + + + # of backups to keep: + + + + Enable Autocreation + + + + Numbering System: + + + + Enable Auto-stretch Frame + + + + Enable Creation in Hold Cells + + + + Enable Autorenumber + + + + Toolbar Display Behaviour: + + + + Show Camera Column + + + + Level Editor Box Color + + + + Incremental + + + + Enable Tools For Level Only + + + + Show Tools For Level Only + + + + Touch/Tablet Settings + + + + Enable Touch Gesture Controls + + PreferencesPopup:: FormatProperties @@ -9692,19 +9942,6 @@ Allow duplicate? - Please enable "Sync Level Strip Drawing Number Changes with the XSheet" preference option -to use the duplicate command in the xsheet / timeline. - - - - Please select only one layer to duplicate a frame. - - - - Please select only one frame to duplicate. - - - Timeline @@ -9958,58 +10195,152 @@ Do you want to overwrite it? %1 does not exist. %1 existiert nicht. - - - ReframePopup - Reframe with Empty Inbetweens + The file %1 already exists. +Do you want to overwrite it? - OK + The file %1 has been exported successfully. - Cancel - Abbrechen + Open containing folder + - steps + Please enable "Show Keyframes on Cell Area" to show or hide the camera column. - with + The chosen folder path does not exist. +Do you want to create it? - empty inbetweens + Create + Erstellen + + + Edit Level Settings : %1 - ( + Shift Key Frames Down - blank cells will be inserted.) + Shift Key Frames Up - - - RenameAsToonzPopup - Delete Original Files - Original-Datei löschen + Create Blank Drawing + - Level Name: - Name der Ebene: + Duplicate Drawing + - Rename - Umbenennen + Unable to create a blank drawing on the camera column + - Cancel + The current column is locked + + + + Cannot create a blank drawing on the current column + + + + The current level is not editable + + + + Unable to create a blank drawing on the current column + + + + Unable to replace the current drawing with a blank drawing + + + + There are no drawings in the camera column to duplicate + + + + Cannot duplicate a drawing in the current column + + + + Unable to duplicate a drawing on the current column + + + + Unable to replace the current or next drawing with a duplicate drawing + + + + Stop Motion Controller + + + + Camera Column Switch : + + + + + ReframePopup + + Reframe with Empty Inbetweens + + + + OK + + + + Cancel + Abbrechen + + + steps + + + + with + + + + empty inbetweens + + + + ( + + + + blank cells will be inserted.) + + + + + RenameAsToonzPopup + + Delete Original Files + Original-Datei löschen + + + Level Name: + Name der Ebene: + + + Rename + Umbenennen + + + Cancel Abbrechen @@ -10155,7 +10486,11 @@ Das Ergebnis des Outputs könnte anders sein als erwartet. Was möchten Sie tun? Click and drag to move guide - [Ziehen] Hilfslinie verschieben + [Ziehen] Hilfslinie verschieben + + + Left click and drag to move guide. Right click to delete guide + @@ -11299,6 +11634,26 @@ Bitte tragen Sie die Änderungen ein oder setzen sie zurück. Reset View + + Auto Inbetween + + + + Linear Interpolation + + + + Ease In Interpolation + + + + Ease Out Interpolation + + + + Ease In/Out Interpolation + + SceneViewerPanel @@ -11316,7 +11671,7 @@ Bitte tragen Sie die Änderungen ein oder setzen sie zurück. Scene: - Szene: + Szene: :: Frame: @@ -11328,7 +11683,7 @@ Bitte tragen Sie die Änderungen ein oder setzen sie zurück. Level: - Ebene: + Ebene: Freeze @@ -11363,7 +11718,11 @@ Bitte tragen Sie die Änderungen ein oder setzen sie zurück. - :: Project: + [SCENE]: + + + + [LEVEL]: @@ -11704,7 +12063,7 @@ Bitte tragen Sie die Änderungen ein oder setzen sie zurück. Playback Controls - Abspiel-Kontrollen + Abspiel-Kontrollen RGBA Channels @@ -11719,8 +12078,16 @@ Bitte tragen Sie die Änderungen ein oder setzen sie zurück. Anderes - Playback - + Play + Abspielen + + + Render + Render + + + Help + Hilfe @@ -11858,6 +12225,58 @@ Zu '%3' zuweisen? Failed to create menubar + + Project Management + + + + Import + + + + Export + Exportieren + + + Script + + + + Group + + + + Arrange + + + + New + + + + Adjust + + + + Optimize + + + + Convert + Umwandlung + + + Drawing Substitution + + + + Play + Abspielen + + + Workspace + + StartupPopup @@ -11962,10 +12381,6 @@ Zu '%3' zuweisen? - The chosen file path is not valid. - - - The frame rate must be 1 or more. @@ -12019,101 +12434,497 @@ Possibly the preset file has been corrupted - The selected scene project '%1' is not in the Current Project list and may not open automatically. + Failed to create the folder. - SubSheetBar + StopMotion - Sub-scene controls: -Click the arrow button to create a new sub-xsheet - [Click] Neue Sub-Szene erstellen + No + frame id + Nein - Disable Edit in Place - Lokales Bearbeiten deaktiviert + No level name specified: please choose a valid level name + Der Name der Ebene wurde nicht festgelegt: Bitte einen gültigen Namen wählen. - Enable Edit in Place - Lokales Bearbeiten aktiviert + The level name specified is already used: please choose a different level name. + - Exit Sub-xsheet (1 Level Up) - Untere Sub-Szene schließen (1 Ebene) + The save in path specified does not match with the existing level. + - Exit Sub-xsheet (2 Levels Up) - Untere Sub-Szene schließen (2 Ebenen) + The captured image size does not match with the existing level. + - Exit Sub-xsheet (3 or More Levels Up) - Untere Sub-Szene schließen (3 Ebenen) + File %1 already exists. +Do you want to overwrite it? + - Enter Sub-xsheet - Sub-Szene bearbeiten + Failed to load %1. + - Current Scene - Aktuelle Szene + Folder %1 doesn't exist. +Do you want to create it? + Ordner %1 existiert nicht. +Möchten Sie einen erstellen? - - - T - Nothing to replace: no cells or columns selected. - Es gibt nichts zum ersetzen: Es wurden weder Cells noch Spalten gewählt. + Unable to create + Es konnte nicht erstellt werden. - - - TApp - Error allocating memory: not enough memory. - Fehler beim zuweisen des Speichers: Nicht genügend Speicher vorhanden. + UNDEFINED WARNING + - It is not possible to save automatically an untitled scene. - Eine unbenannte Szene kann nicht gespeichert werden. + The level is not registered in the scene, but exists in the file system. + - - - TaskSheet - Name: - Name: + +WARNING : Image size mismatch. The saved image size is %1 x %2. + - Status: - Status: + WARNING + - Command Line: - Kommandozeile: + +Frame %1 exists. + - Server: - Server: + +Frames %1 exist. + - Submitted By: - Absender: + OVERWRITE 1 of + - Submitted On: - Sender: + ADD to + - Submission Date: - Sende-Datum: + %1 frame + - Start Date: - Start-Datum: + %1 frames + - Completion Date: - Tag der Fertigstellung: + The level will be newly created. + + + + NEW + + + + The level is already registered in the scene. + + + + +NOTE : The level is not saved. + + + + +WARNING : Failed to get image size of the existing level %1. + + + + +WARNING : Image size mismatch. The existing level size is %1 x %2. + + + + WARNING : Level name conflicts. There already is a level %1 in the scene with the path + %2. + + + + +WARNING : Image size mismatch. The size of level with the same name is is %1 x %2. + + + + WARNING : Level path conflicts. There already is a level with the path %1 + in the scene with the name %2. + + + + +WARNING : Image size mismatch. The size of level with the same path is %1 x %2. + + + + WARNING + + + + No camera selected. + + + + + StopMotionController + + Controls + + + + Settings + Einstellungen + + + Options + Optionen + + + Resolution: + + + + Refresh + Aktualisieren + + + File + Datei + + + Webcam Settings... + + + + Capture + Einfangen + + + Next Level + + + + Next New + + + + Previous Level + + + + Next Frame + Nächster Frame + + + Last Frame + Letzter Frame + + + Previous Frame + Vorheriger Frame + + + Next XSheet Frame + + + + Previous XSheet Frame + + + + Current Frame + Aktueller Frame + + + Set to the Current Playhead Location + + + + Start Live View + + + + Zoom + + + + Pick Zoom + + + + < + + + + > + + + + << + + + + >> + + + + <<< + + + + >>> + + + + Camera: + + + + Name: + + + + Frame: + + + + File Type: + + + + Save In: + Speichern in: + + + XSheet Frame: + + + + Camera Model + + + + Camera Mode + + + + Temperature: + + + + Shutter Speed: + + + + Iso: + + + + Aperture: + + + + Exposure: + + + + Image Quality: + + + + Picture Style: + + + + White Balance: + + + + Webcam Options + + + + DSLR Options + + + + Place the frame in the XSheet + + + + Use Direct Show Webcam Drivers + + + + Black Screen for Capture + + + + Use Reduced Resolution Images + + + + Use MJPG with Webcam + + + + Place on XSheet + + + + Use Numpad Shortcuts When Active + + + + Show Live View on All Frames + + + + Capture Review Time: + + + + Level Subsampling: + + + + Opacity: + + + + No camera detected. + + + + No camera detected + + + + - Select camera - + + + + Mode: + + + + Auto + Automatisch + + + Disabled + Deaktiviert + + + Stop Live View + + + + + SubSheetBar + + Sub-scene controls: +Click the arrow button to create a new sub-xsheet + [Click] Neue Sub-Szene erstellen + + + Disable Edit in Place + Lokales Bearbeiten deaktiviert + + + Enable Edit in Place + Lokales Bearbeiten aktiviert + + + Exit Sub-xsheet (1 Level Up) + Untere Sub-Szene schließen (1 Ebene) + + + Exit Sub-xsheet (2 Levels Up) + Untere Sub-Szene schließen (2 Ebenen) + + + Exit Sub-xsheet (3 or More Levels Up) + Untere Sub-Szene schließen (3 Ebenen) + + + Enter Sub-xsheet + Sub-Szene bearbeiten + + + Current Scene + Aktuelle Szene + + + + T + + Nothing to replace: no cells or columns selected. + Es gibt nichts zum ersetzen: Es wurden weder Cells noch Spalten gewählt. + + + + TApp + + Error allocating memory: not enough memory. + Fehler beim zuweisen des Speichers: Nicht genügend Speicher vorhanden. + + + It is not possible to save automatically an untitled scene. + Eine unbenannte Szene kann nicht gespeichert werden. + + + + TaskSheet + + Name: + Name: + + + Status: + Status: + + + Command Line: + Kommandozeile: + + + Server: + Server: + + + Submitted By: + Absender: + + + Submitted On: + Sender: + + + Submission Date: + Sende-Datum: + + + Start Date: + Start-Datum: + + + Completion Date: + Tag der Fertigstellung: Duration: @@ -12435,6 +13246,17 @@ Click the arrow button to create a new sub-xsheet + Toolbar + + Collapse toolbar + + + + Expand toolbar + + + + TopBar Lock Rooms Tab @@ -12666,6 +13488,33 @@ Genaueres können Sie aus der Nutzerhilfe entnehmen. + XDTSImportPopup + + Importing XDTS file %1 + + + + Load + + + + Cancel + Abbrechen + + + Please specify the level locations. Suggested paths are input in the fields with blue border. + + + + Level Name + + + + Level Path + + + + XsheetGUI::CellArea Click to select keyframe, drag to move it @@ -12870,6 +13719,14 @@ Genaueres können Sie aus der Nutzerhilfe entnehmen. &Paste Insert Above + + Hide Camera Column + + + + Show Camera Column + + XsheetGUI::ColumnTransparencyPopup @@ -13067,10 +13924,6 @@ Hold F3 Key on the Viewer to Show This Frame Only Spalte - :: Project: - - - Frame diff --git a/toonz/sources/translations/german/toonzlib.ts b/toonz/sources/translations/german/toonzlib.ts index 53f7ad8..1dc66a6 100644 --- a/toonz/sources/translations/german/toonzlib.ts +++ b/toonz/sources/translations/german/toonzlib.ts @@ -440,6 +440,11 @@ Wahrscheinlich funktioniert der Codec nicht korrekt. Timeline + + Failed to save the following resources: + + + TScriptBinding::CenterlineVectorizer diff --git a/toonz/sources/translations/german/toonzqt.ts b/toonz/sources/translations/german/toonzqt.ts index c92b163..85618a3 100644 --- a/toonz/sources/translations/german/toonzqt.ts +++ b/toonz/sources/translations/german/toonzqt.ts @@ -698,6 +698,30 @@ Possibly the preset file has been corrupted &Locator + + Viewer Controls + + + + &Zoom In + + + + &Zoom Out + + + + &Flip Horizontally + + + + &Flip Vertically + + + + &Reset View + + FontParamField @@ -1008,19 +1032,19 @@ Possibly the preset file has been corrupted Step 1 - Schritt 1 + Schritt 1 Step 2 - Schritt 2 + Schritt 2 Step 3 - Schritt 3 + Schritt 3 Step 4 - Schritt 4 + Schritt 4 Activate Cycle @@ -1046,6 +1070,10 @@ Possibly the preset file has been corrupted Change Step + + Similar Shape Interpolation + Interpolation durch ähnliche Figuren + FunctionToolbar @@ -1103,6 +1131,10 @@ Possibly the preset file has been corrupted Table + + Hide Selected + + FxColumnPainter @@ -2230,6 +2262,10 @@ The second line should be "Mesh [Input bit depth] [Output bit depth]"< OK + + That is a reserved file name and cannot be used. + + QPushButton @@ -2250,6 +2286,17 @@ The second line should be "Mesh [Input bit depth] [Output bit depth]"< + RgbLinkButtons + + Copy RGB : %1 > %2 + + + + Swap %1 and %2 + + + + SchematicViewer &Fit to Window @@ -2299,6 +2346,18 @@ The second line should be "Mesh [Input bit depth] [Output bit depth]"< &Toggle node icons + + &Selection Mode + + + + &Zoom Mode + + + + &Hand Mode + + SchematicWindowEditor @@ -2380,6 +2439,17 @@ The second line should be "Mesh [Input bit depth] [Output bit depth]"< + StageSchematicNode + + Toggle Autorotate Along Motion Path + + + + Toggle Link Motion Path to Control Points + + + + StageSchematicScene &New Pegbar diff --git a/toonz/sources/translations/italian/image.ts b/toonz/sources/translations/italian/image.ts index b08615c..fa9a74c 100644 --- a/toonz/sources/translations/italian/image.ts +++ b/toonz/sources/translations/italian/image.ts @@ -4,12 +4,12 @@ AviWriterProperties - + Codec - + Uncompressed @@ -17,17 +17,17 @@ GifWriterProperties - + Scale - + Looping - + Generate Palette @@ -35,12 +35,12 @@ Mp4WriterProperties - + Quality - + Scale @@ -337,12 +337,12 @@ Please try raising the FFmpeg timeout in Preferences. WebmWriterProperties - + Quality - + Scale diff --git a/toonz/sources/translations/italian/tnzcore.ts b/toonz/sources/translations/italian/tnzcore.ts index e41546a..021262b 100644 --- a/toonz/sources/translations/italian/tnzcore.ts +++ b/toonz/sources/translations/italian/tnzcore.ts @@ -41,10 +41,6 @@ Skipping frame. - - Malformed frame name - - TCenterLineStrokeStyle diff --git a/toonz/sources/translations/italian/tnztools.ts b/toonz/sources/translations/italian/tnztools.ts index 9be3feb..7c1b0a7 100644 --- a/toonz/sources/translations/italian/tnztools.ts +++ b/toonz/sources/translations/italian/tnztools.ts @@ -1152,6 +1152,34 @@ Procedere? to Backward + + The selection cannot be updated. It is not editable. + + + + The selection cannot be deleted. It is not editable. + + + + The selection cannot be pasted. It is not editable. + + + + The selection cannot be grouped. It is not editable. + + + + The selection cannot be entered. It is not editable. + + + + The selection cannot be ungrouped. It is not editable. + + + + The selection cannot be moved. It is not editable. + + RGBPickerTool diff --git a/toonz/sources/translations/italian/toonz.ts b/toonz/sources/translations/italian/toonz.ts index 531523c..a3b4d28 100644 --- a/toonz/sources/translations/italian/toonz.ts +++ b/toonz/sources/translations/italian/toonz.ts @@ -1216,7 +1216,7 @@ Cosa vuoi fare? Scene: - Scena: + Scena: :: Frame: @@ -1228,14 +1228,18 @@ Cosa vuoi fare? Level: - Livello: + Livello: (Flipped) - :: Project: + [SCENE]: + + + + [LEVEL]: @@ -1575,6 +1579,10 @@ contain the dpi information, then the current camera dpi will be used. Dpi: + + Level %1 converting to same file format; skipped. + + DVGui::ProgressDialog @@ -2347,6 +2355,10 @@ Hold F3 Key on the Viewer to Show This Frame Only no icon + + Auto Inbetween + + FlipBook @@ -2513,7 +2525,7 @@ Vuoi sovrascriverlo? ImportMagpieFilePopup Import Magpie File - Importa un File da MagPie + Importa un File da MagPie Load @@ -2523,6 +2535,10 @@ Vuoi sovrascriverlo? %1 does not exist. %1 non esiste. + + Import Toonz Lip Sync File + + InbetweenDialog @@ -2918,10 +2934,6 @@ Vuoi crearla? DPI Personalizzato - Scan level - - - Raster level @@ -2945,6 +2957,18 @@ Vuoi crearla? Toonz Raster level + + [Various] + + + + SubXsheet Level + + + + Another Level Type + + LineTestCapturePane @@ -3290,10 +3314,6 @@ Please use the frame numbers for reference. - Arrangement in Xsheet - - - (FILE DOES NOT EXIST) @@ -3325,6 +3345,30 @@ Please use the frame numbers for reference. :: + + Level Settings & Arrangement in Xsheet + + + + Premultiply + Premoltiplica + + + White As Transparent + Imposta il Bianco come Trasparente + + + DPI: + DPI: + + + Antialias Softness: + Morbidezza dell' Antialias: + + + Subsampling: + Sottocampionamento + LoadScenePopup @@ -3440,7 +3484,7 @@ Please use the frame numbers for reference. MagpieFileImportPopup Import Magpie File - Importa un File da MagPie + Importa un File da MagPie Frame Range @@ -3448,7 +3492,7 @@ Please use the frame numbers for reference. To: - A: + A: From: @@ -3478,6 +3522,14 @@ Please use the frame numbers for reference. The file path is missing. Il percorso non è stato definito. + + Import Toonz Lip Sync File + + + + To: + + MainWindow @@ -3563,7 +3615,7 @@ Please use the frame numbers for reference. &Import Magpie File... - &Importa un File da MagPie... + &Importa un File da MagPie... &New Project... @@ -3883,7 +3935,7 @@ Please use the frame numbers for reference. &Edit FX... - &Modifica l' Effetto... + &Modifica l' Effetto... Insert Frame @@ -5410,6 +5462,152 @@ Decrementa lo spessore minimo del pennello Brush Tool - Lock Alpha + + http://opentoonz.readthedocs.io + + + + &Import Toonz Lip Sync File... + + + + Export Exchange Digital Time Sheet (XDTS) + + + + &Clear Cache Folder + + + + Show/Hide Xsheet Camera Column + + + + &Create Blank Drawing + + + + &Shift Keys Down + + + + &Shift Keys Up + + + + Next Key + + + + Prev Key + + + + &FX Editor + + + + &Stop Motion Controls + + + + &Online Manual... + + + + Select Next Frame Guide Stroke + + + + Select Previous Frame Guide Stroke + + + + Select Prev && Next Frame Guide Strokes + + + + Reset Guide Stroke Selections + + + + Tween Selected Guide Strokes + + + + Tween Guide Strokes to Selected + + + + Select Guide Strokes && Tween Mode + + + + Capture Stop Motion Frame + + + + Raise Stop Motion Opacity + + + + Lower Stop Motion Opacity + + + + Toggle Stop Motion Live View + + + + Toggle Stop Motion Zoom + + + + Lower Stop Motion Level Subsampling + + + + Raise Stop Motion Level Subsampling + + + + Go to Stop Motion Insert Frame + + + + Clear Cache Folder + + + + There are no unused items in the cache folder. + + + + Deleting the following items: + + + + + <DIR> + + + + ... and %1 more items + + + + + +Are you sure? + +N.B. Make sure you are not running another process of OpenToonz, +or you may delete necessary files for it. + + + + Can't delete %1 : + + MatchlinesDialog @@ -6595,7 +6793,7 @@ Set the output folder path to the subfolder as well. Backup Animation Levels when Saving - Crea una Copia dei Livelli di Animazione durante il Salvataggio + Crea una Copia dei Livelli di Animazione durante il Salvataggio Cells Only @@ -6819,7 +7017,7 @@ Set the output folder path to the subfolder as well. Autocreation: - Autocreazione: + Autocreazione: Minimize Savebox after Editing @@ -6954,10 +7152,6 @@ Set the output folder path to the subfolder as well. - X - - - Viewer Shrink @@ -7050,14 +7244,6 @@ Set the output folder path to the subfolder as well. - Disabled - - - - Enabled - - - Use Xsheet as Animation Sheet @@ -7082,10 +7268,6 @@ Set the output folder path to the subfolder as well. - Stuff Folder* - - - Custom* @@ -7374,10 +7556,6 @@ if both are possible on coding file path. - Enable auto-stretch frame - - - Show Cursor Size Outlines @@ -7467,10 +7645,6 @@ Also the initial output destination for new scenes will be set to $scenefolder a - Tablet Settings - - - Enable Windows Ink Support* (EXPERIMENTAL) @@ -7507,6 +7681,66 @@ in non alpha-enabled image format. Current Column Color: + + Backup Scene and Animation Levels when Saving + + + + # of backups to keep: + + + + Enable Autocreation + + + + Numbering System: + + + + Enable Auto-stretch Frame + + + + Enable Creation in Hold Cells + + + + Enable Autorenumber + + + + Toolbar Display Behaviour: + + + + Show Camera Column + + + + Level Editor Box Color + + + + Incremental + + + + Enable Tools For Level Only + + + + Show Tools For Level Only + + + + Touch/Tablet Settings + + + + Enable Touch Gesture Controls + + PreferencesPopup::FormatProperties @@ -9404,19 +9638,6 @@ Allow duplicate? - Please enable "Sync Level Strip Drawing Number Changes with the XSheet" preference option -to use the duplicate command in the xsheet / timeline. - - - - Please select only one layer to duplicate a frame. - - - - Please select only one frame to duplicate. - - - Timeline @@ -9670,39 +9891,133 @@ Lo vuoi sovrascrivere? %1 does not exist. %1 non esiste. - - - ReframePopup - Reframe with Empty Inbetweens + The file %1 already exists. +Do you want to overwrite it? - OK - OK + The file %1 has been exported successfully. + - Cancel - Annullare + Open containing folder + - steps + Please enable "Show Keyframes on Cell Area" to show or hide the camera column. - with + The chosen folder path does not exist. +Do you want to create it? - empty inbetweens - + Create + Crea - ( + Edit Level Settings : %1 - blank cells will be inserted.) + Shift Key Frames Down + + + + Shift Key Frames Up + + + + Create Blank Drawing + + + + Duplicate Drawing + + + + Unable to create a blank drawing on the camera column + + + + The current column is locked + + + + Cannot create a blank drawing on the current column + + + + The current level is not editable + + + + Unable to create a blank drawing on the current column + + + + Unable to replace the current drawing with a blank drawing + + + + There are no drawings in the camera column to duplicate + + + + Cannot duplicate a drawing in the current column + + + + Unable to duplicate a drawing on the current column + + + + Unable to replace the current or next drawing with a duplicate drawing + + + + Stop Motion Controller + + + + Camera Column Switch : + + + + + ReframePopup + + Reframe with Empty Inbetweens + + + + OK + OK + + + Cancel + Annullare + + + steps + + + + with + + + + empty inbetweens + + + + ( + + + + blank cells will be inserted.) @@ -9862,7 +10177,11 @@ Il risultato del render può essere diverso dal previsto. Cosa vuoi fare? Click and drag to move guide - Clicca e trascina per spostare la guida + Clicca e trascina per spostare la guida + + + Left click and drag to move guide. Right click to delete guide + @@ -10994,6 +11313,26 @@ Per favore sottometti o ripristina i cambiamenti prima di proseguire.Reset View + + Auto Inbetween + + + + Linear Interpolation + + + + Ease In Interpolation + + + + Ease Out Interpolation + + + + Ease In/Out Interpolation + + SceneViewerPanel @@ -11027,7 +11366,7 @@ Per favore sottometti o ripristina i cambiamenti prima di proseguire. Scene: - Scena: + Scena: :: Frame: @@ -11039,7 +11378,7 @@ Per favore sottometti o ripristina i cambiamenti prima di proseguire. Level: - Livello: + Livello: :: Zoom : @@ -11058,7 +11397,11 @@ Per favore sottometti o ripristina i cambiamenti prima di proseguire. - :: Project: + [SCENE]: + + + + [LEVEL]: @@ -11399,7 +11742,7 @@ Per favore sottometti o ripristina i cambiamenti prima di proseguire. Playback Controls - Controllo della Riproduzione + Controllo della Riproduzione RGBA Channels @@ -11414,7 +11757,15 @@ Per favore sottometti o ripristina i cambiamenti prima di proseguire. - Playback + Play + Riproduci + + + Render + + + + Help @@ -11553,6 +11904,58 @@ Lo assegno a %3? Failed to create menubar + + Project Management + + + + Import + Importa + + + Export + Esporta + + + Script + + + + Group + + + + Arrange + + + + New + + + + Adjust + + + + Optimize + + + + Convert + Converti + + + Drawing Substitution + + + + Play + Riproduci + + + Workspace + + StartupPopup @@ -11657,10 +12060,6 @@ Lo assegno a %3? - The chosen file path is not valid. - - - The frame rate must be 1 or more. @@ -11714,107 +12113,504 @@ Possibly the preset file has been corrupted - The selected scene project '%1' is not in the Current Project list and may not open automatically. + Failed to create the folder. - SubSheetBar + StopMotion - Sub-scene controls: -Click the arrow button to create a new sub-xsheet - Controlli del Sub-xsheet: -Clicca la freccia per creare un nuovo sub-xsheet + No + frame id + No - Disable Edit in Place - Disabilita la Visualizzazione nel Contesto + No level name specified: please choose a valid level name + Il nome del livello non è stato specificato: scegliere un nome di livello valido. - Enable Edit in Place - Abilita la Visualizzazione nel Contesto + The level name specified is already used: please choose a different level name. + - Exit Sub-xsheet (1 Level Up) - Esci dal Sub-xsheet (Sali di 1 Livello) + The save in path specified does not match with the existing level. + - Exit Sub-xsheet (2 Levels Up) - Esci dal Sub-xsheet (Sali di 2 Livelli) + The captured image size does not match with the existing level. + - Exit Sub-xsheet (3 or More Levels Up) - Esci dal Sub-xsheet (Sali di 3 o più Livelli) + File %1 already exists. +Do you want to overwrite it? + Il file %1 esiste già. +Vuoi sovrascriverlo? - Enter Sub-xsheet - Entra nel Sub-xsheet + Failed to load %1. + - Current Scene - Scena Corrente + Folder %1 doesn't exist. +Do you want to create it? + La cartella %1 non esiste. +Vuoi crearla? - - - TApp - Error allocating memory: not enough memory. - Errore di allocazione memoria: memoria non sufficente. + Unable to create + Impossibile creare - It is not possible to save automatically an untitled scene. - Impossibile salvare automaticamente una scena senza nome. + UNDEFINED WARNING + - - - TaskSheet - Name: - Nome: + The level is not registered in the scene, but exists in the file system. + - Status: - Stato: + +WARNING : Image size mismatch. The saved image size is %1 x %2. + - Command Line: - Linea di Comando: + WARNING + - Server: - Server: + +Frame %1 exists. + - Submitted By: - Sottomesso da: + +Frames %1 exist. + - Submitted On: - Sottomesso Su: + OVERWRITE 1 of + - Submission Date: - Data di Sottomissione: + ADD to + - Start Date: - Data di Inizio: + %1 frame + - Completion Date: - Data di Completamento: + %1 frames + - Duration: - Durata: + The level will be newly created. + - Step Count: - Conto dei Passi: + NEW + - Failed Steps: - Passi Falliti: + The level is already registered in the scene. + + + + +NOTE : The level is not saved. + + + + +WARNING : Failed to get image size of the existing level %1. + + + + +WARNING : Image size mismatch. The existing level size is %1 x %2. + + + + WARNING : Level name conflicts. There already is a level %1 in the scene with the path + %2. + + + + +WARNING : Image size mismatch. The size of level with the same name is is %1 x %2. + + + + WARNING : Level path conflicts. There already is a level with the path %1 + in the scene with the name %2. + + + + +WARNING : Image size mismatch. The size of level with the same path is %1 x %2. + + + + WARNING + + + + No camera selected. + + + + + StopMotionController + + Controls + + + + Settings + + + + Options + + + + Resolution: + + + + Refresh + Aggiorna + + + File + File + + + Webcam Settings... + + + + Capture + Acquisizione + + + Next Level + + + + Next New + + + + Previous Level + + + + Next Frame + Prossimo Fotogramma + + + Last Frame + Ultimo Fotogramma + + + Previous Frame + Fotogramma Precedente + + + Next XSheet Frame + + + + Previous XSheet Frame + + + + Current Frame + Fotogramma Corrente + + + Set to the Current Playhead Location + + + + Start Live View + + + + Zoom + + + + Pick Zoom + + + + < + + + + > + + + + << + + + + >> + + + + <<< + + + + >>> + + + + Camera: + + + + Name: + Nome: + + + Frame: + + + + File Type: + + + + Save In: + + + + XSheet Frame: + + + + Camera Model + + + + Camera Mode + + + + Temperature: + + + + Shutter Speed: + + + + Iso: + + + + Aperture: + + + + Exposure: + + + + Image Quality: + + + + Picture Style: + + + + White Balance: + + + + Webcam Options + + + + DSLR Options + + + + Place the frame in the XSheet + + + + Use Direct Show Webcam Drivers + + + + Black Screen for Capture + + + + Use Reduced Resolution Images + + + + Use MJPG with Webcam + + + + Place on XSheet + + + + Use Numpad Shortcuts When Active + + + + Show Live View on All Frames + + + + Capture Review Time: + + + + Level Subsampling: + + + + Opacity: + + + + No camera detected. + + + + No camera detected + + + + - Select camera - + + + + Mode: + + + + Auto + Auto + + + Disabled + + + + Stop Live View + + + + + SubSheetBar + + Sub-scene controls: +Click the arrow button to create a new sub-xsheet + Controlli del Sub-xsheet: +Clicca la freccia per creare un nuovo sub-xsheet + + + Disable Edit in Place + Disabilita la Visualizzazione nel Contesto + + + Enable Edit in Place + Abilita la Visualizzazione nel Contesto + + + Exit Sub-xsheet (1 Level Up) + Esci dal Sub-xsheet (Sali di 1 Livello) + + + Exit Sub-xsheet (2 Levels Up) + Esci dal Sub-xsheet (Sali di 2 Livelli) + + + Exit Sub-xsheet (3 or More Levels Up) + Esci dal Sub-xsheet (Sali di 3 o più Livelli) + + + Enter Sub-xsheet + Entra nel Sub-xsheet + + + Current Scene + Scena Corrente + + + + TApp + + Error allocating memory: not enough memory. + Errore di allocazione memoria: memoria non sufficente. + + + It is not possible to save automatically an untitled scene. + Impossibile salvare automaticamente una scena senza nome. + + + + TaskSheet + + Name: + Nome: + + + Status: + Stato: + + + Command Line: + Linea di Comando: + + + Server: + Server: + + + Submitted By: + Sottomesso da: + + + Submitted On: + Sottomesso Su: + + + Submission Date: + Data di Sottomissione: + + + Start Date: + Data di Inizio: + + + Completion Date: + Data di Completamento: + + + Duration: + Durata: + + + Step Count: + Conto dei Passi: + + + Failed Steps: + Passi Falliti: Successful Steps: @@ -12120,6 +12916,17 @@ Clicca la freccia per creare un nuovo sub-xsheet + Toolbar + + Collapse toolbar + + + + Expand toolbar + + + + TopBar Lock Rooms Tab @@ -12351,6 +13158,33 @@ Per favore fai riferimento alla Guida utente per i dettagli. + XDTSImportPopup + + Importing XDTS file %1 + + + + Load + Carica + + + Cancel + Annullare + + + Please specify the level locations. Suggested paths are input in the fields with blue border. + + + + Level Name + + + + Level Path + + + + XsheetGUI::CellArea Click to select keyframe, drag to move it @@ -12555,6 +13389,14 @@ Per favore fai riferimento alla Guida utente per i dettagli. &Paste Insert Above + + Hide Camera Column + + + + Show Camera Column + + XsheetGUI::ColumnTransparencyPopup @@ -12748,10 +13590,6 @@ Hold F3 Key on the Viewer to Show This Frame Only - :: Project: - - - Frame diff --git a/toonz/sources/translations/italian/toonzlib.ts b/toonz/sources/translations/italian/toonzlib.ts index dac0100..46cd1cf 100644 --- a/toonz/sources/translations/italian/toonzlib.ts +++ b/toonz/sources/translations/italian/toonzlib.ts @@ -605,6 +605,11 @@ Timeline + + Failed to save the following resources: + + + Rasterizer diff --git a/toonz/sources/translations/italian/toonzqt.ts b/toonz/sources/translations/italian/toonzqt.ts index cfe3267..c8afe17 100644 --- a/toonz/sources/translations/italian/toonzqt.ts +++ b/toonz/sources/translations/italian/toonzqt.ts @@ -695,6 +695,30 @@ E' possibile che il file sia corrotto. &Locator + + Viewer Controls + + + + &Zoom In + + + + &Zoom Out + + + + &Flip Horizontally + + + + &Flip Vertically + + + + &Reset View + + FontParamField @@ -1005,19 +1029,19 @@ E' possibile che il file sia corrotto. Step 1 - Passo 1 + Passo 1 Step 2 - Passo 2 + Passo 2 Step 3 - Passo 3 + Passo 3 Step 4 - Passo 4 + Passo 4 Activate Cycle @@ -1043,6 +1067,10 @@ E' possibile che il file sia corrotto. Change Step + + Similar Shape Interpolation + Interpolazione tramite Forma Simile + FunctionToolbar @@ -1100,6 +1128,10 @@ E' possibile che il file sia corrotto. Table + + Hide Selected + + FxColumnPainter @@ -2186,6 +2218,10 @@ The second line should be "Mesh [Input bit depth] [Output bit depth]"< OK OK + + That is a reserved file name and cannot be used. + + QPushButton @@ -2202,6 +2238,17 @@ The second line should be "Mesh [Input bit depth] [Output bit depth]"< + RgbLinkButtons + + Copy RGB : %1 > %2 + + + + Swap %1 and %2 + + + + SchematicViewer &Fit to Window @@ -2251,6 +2298,18 @@ The second line should be "Mesh [Input bit depth] [Output bit depth]"< &Toggle node icons + + &Selection Mode + + + + &Zoom Mode + + + + &Hand Mode + + SchematicWindowEditor @@ -2332,6 +2391,17 @@ The second line should be "Mesh [Input bit depth] [Output bit depth]"< + StageSchematicNode + + Toggle Autorotate Along Motion Path + + + + Toggle Link Motion Path to Control Points + + + + StageSchematicScene &New Pegbar diff --git a/toonz/sources/translations/japanese/image.ts b/toonz/sources/translations/japanese/image.ts index 324b9a4..144ba4c 100644 --- a/toonz/sources/translations/japanese/image.ts +++ b/toonz/sources/translations/japanese/image.ts @@ -4,12 +4,12 @@ AviWriterProperties - + Codec コーデック - + Uncompressed 非圧縮 @@ -17,17 +17,17 @@ GifWriterProperties - + Scale スケール(%) - + Looping 繰り返し再生 - + Generate Palette パレットを生成 @@ -35,12 +35,12 @@ Mp4WriterProperties - + Quality 品質 - + Scale スケール(%) @@ -339,12 +339,12 @@ Please try raising the FFmpeg timeout in Preferences. WebmWriterProperties - + Quality 品質 - + Scale スケール(%) diff --git a/toonz/sources/translations/japanese/tnzcore.ts b/toonz/sources/translations/japanese/tnzcore.ts index 410af5f..6ad238f 100644 --- a/toonz/sources/translations/japanese/tnzcore.ts +++ b/toonz/sources/translations/japanese/tnzcore.ts @@ -43,7 +43,7 @@ Malformed frame name - フレーム番号が不正な形式です + フレーム番号が不正な形式です diff --git a/toonz/sources/translations/japanese/tnztools.ts b/toonz/sources/translations/japanese/tnztools.ts index 2262f87..d77ae4b 100644 --- a/toonz/sources/translations/japanese/tnztools.ts +++ b/toonz/sources/translations/japanese/tnztools.ts @@ -1173,6 +1173,34 @@ Do you want to proceed? to Backward 背面へ + + The selection cannot be updated. It is not editable. + + + + The selection cannot be deleted. It is not editable. + + + + The selection cannot be pasted. It is not editable. + + + + The selection cannot be grouped. It is not editable. + + + + The selection cannot be entered. It is not editable. + + + + The selection cannot be ungrouped. It is not editable. + + + + The selection cannot be moved. It is not editable. + + RGBPickerTool diff --git a/toonz/sources/translations/japanese/toonz.ts b/toonz/sources/translations/japanese/toonz.ts index e873c01..b49506f 100644 --- a/toonz/sources/translations/japanese/toonz.ts +++ b/toonz/sources/translations/japanese/toonz.ts @@ -1215,7 +1215,7 @@ What do you want to do? Scene: - シーン: + シーン: :: Frame: @@ -1227,7 +1227,7 @@ What do you want to do? Level: - レベル: + レベル: (Flipped) @@ -1235,7 +1235,15 @@ What do you want to do? :: Project: - :: プロジェクト: + :: プロジェクト: + + + [SCENE]: + + + + [LEVEL]: + @@ -1577,6 +1585,10 @@ contain the dpi information, then the current camera dpi will be used. Dpi: DPI: + + Level %1 converting to same file format; skipped. + + DVGui::ProgressDialog @@ -2349,6 +2361,10 @@ Hold F3 Key on the Viewer to Show This Frame Only no icon アイコンなし + + Auto Inbetween + + FlipBook @@ -2514,7 +2530,7 @@ Do you want to overwrite it? ImportMagpieFilePopup Import Magpie File - MAGPIEファイルを読み込み + MAGPIEファイルを読み込み Load @@ -2524,6 +2540,10 @@ Do you want to overwrite it? %1 does not exist. %1 は存在しません。 + + Import Toonz Lip Sync File + + InbetweenDialog @@ -2920,7 +2940,7 @@ Do you want to create it? Scan level - スキャンレベル + スキャンレベル Vector level @@ -2950,6 +2970,18 @@ Do you want to create it? Toonz Raster level Toonzラスターレベル + + [Various] + + + + SubXsheet Level + + + + Another Level Type + + LineTestCapturePane @@ -3298,7 +3330,7 @@ Please use the frame numbers for reference. Arrangement in Xsheet - タイムシート内の配置 + タイムシート内の配置 (FILE DOES NOT EXIST) @@ -3332,6 +3364,30 @@ Please use the frame numbers for reference. :: + + Level Settings & Arrangement in Xsheet + + + + Premultiply + + + + White As Transparent + 白を透明にする + + + DPI: + DPI: + + + Antialias Softness: + アンチエイリアスの柔らかさ: + + + Subsampling: + 離散サンプリング: + LoadScenePopup @@ -3447,7 +3503,7 @@ Please use the frame numbers for reference. MagpieFileImportPopup Import Magpie File - MAGPIEファイルの読み込み + MAGPIEファイルの読み込み Frame Range @@ -3455,7 +3511,7 @@ Please use the frame numbers for reference. To: - 終了フレーム: + 終了フレーム: From: @@ -3485,6 +3541,14 @@ Please use the frame numbers for reference. The file path is missing. ファイルパスが不明です。 + + Import Toonz Lip Sync File + + + + To: + + MainWindow @@ -3570,7 +3634,7 @@ Please use the frame numbers for reference. &Import Magpie File... - MAGPIEファイルを読み込み (&I)... + MAGPIEファイルを読み込み (&I)... &New Project... @@ -3894,7 +3958,7 @@ Please use the frame numbers for reference. &Edit FX... - エフェクトを編集 (&E)... + エフェクトを編集 (&E)... Insert Frame @@ -5428,6 +5492,152 @@ Please use the frame numbers for reference. Brush Tool - Lock Alpha ブラシツール(ラスターMyPaintブラシ) - 透明部分の保護 + + http://opentoonz.readthedocs.io + + + + &Import Toonz Lip Sync File... + + + + Export Exchange Digital Time Sheet (XDTS) + + + + &Clear Cache Folder + + + + Show/Hide Xsheet Camera Column + + + + &Create Blank Drawing + + + + &Shift Keys Down + + + + &Shift Keys Up + + + + Next Key + + + + Prev Key + + + + &FX Editor + + + + &Stop Motion Controls + + + + &Online Manual... + + + + Select Next Frame Guide Stroke + + + + Select Previous Frame Guide Stroke + + + + Select Prev && Next Frame Guide Strokes + + + + Reset Guide Stroke Selections + + + + Tween Selected Guide Strokes + + + + Tween Guide Strokes to Selected + + + + Select Guide Strokes && Tween Mode + + + + Capture Stop Motion Frame + + + + Raise Stop Motion Opacity + + + + Lower Stop Motion Opacity + + + + Toggle Stop Motion Live View + + + + Toggle Stop Motion Zoom + + + + Lower Stop Motion Level Subsampling + + + + Raise Stop Motion Level Subsampling + + + + Go to Stop Motion Insert Frame + + + + Clear Cache Folder + + + + There are no unused items in the cache folder. + + + + Deleting the following items: + + + + + <DIR> + + + + ... and %1 more items + + + + + +Are you sure? + +N.B. Make sure you are not running another process of OpenToonz, +or you may delete necessary files for it. + + + + Can't delete %1 : + + MatchlinesDialog @@ -6679,7 +6889,7 @@ Set the output folder path to the subfolder as well. Backup Animation Levels when Saving - 保存する時にレベルのバックアップをとる + 保存する時にレベルのバックアップをとる Cell-dragging Behaviour: @@ -6919,7 +7129,7 @@ Set the output folder path to the subfolder as well. Autocreation: - 自動作成: + 自動作成: Transparency Check @@ -7047,7 +7257,7 @@ Set the output folder path to the subfolder as well. X - X + X Viewer Shrink @@ -7155,11 +7365,11 @@ Set the output folder path to the subfolder as well. Disabled - 無効 + 無効 Enabled - 有効 + 有効 Use Xsheet as Animation Sheet @@ -7199,7 +7409,7 @@ Set the output folder path to the subfolder as well. Stuff Folder* - Stuffフォルダ + Stuffフォルダ Custom* @@ -7527,7 +7737,7 @@ if both are possible on coding file path. Enable auto-stretch frame - 空コマを埋める + 空コマを埋める Show Cursor Size Outlines @@ -7621,7 +7831,7 @@ Also the initial output destination for new scenes will be set to $scenefolder a Tablet Settings - タブレット + タブレット Enable Windows Ink Support* (EXPERIMENTAL) @@ -7661,6 +7871,66 @@ in non alpha-enabled image format. Current Column Color: 現在の列の文字色: + + Backup Scene and Animation Levels when Saving + + + + # of backups to keep: + + + + Enable Autocreation + + + + Numbering System: + + + + Enable Auto-stretch Frame + + + + Enable Creation in Hold Cells + + + + Enable Autorenumber + + + + Toolbar Display Behaviour: + + + + Show Camera Column + + + + Level Editor Box Color + + + + Incremental + + + + Enable Tools For Level Only + + + + Show Tools For Level Only + + + + Touch/Tablet Settings + + + + Enable Touch Gesture Controls + + PreferencesPopup::FormatProperties @@ -9607,17 +9877,17 @@ Allow duplicate? Please enable "Sync Level Strip Drawing Number Changes with the XSheet" preference option to use the duplicate command in the xsheet / timeline. - タイムシート/タイムライン上で動画を複製コマンドを使用するには、 + タイムシート/タイムライン上で動画を複製コマンドを使用するには、 環境設定 > タイムシート > 「レベルビューア上の動画番号の変更を、タイムシートに同期する」 オプションを有効にしてください。 Please select only one layer to duplicate a frame. - このコマンドは1つのコマだけ選択して使用して下さい。 + このコマンドは1つのコマだけ選択して使用して下さい。 Please select only one frame to duplicate. - このコマンドは1つのコマだけ選択して使用して下さい。 + このコマンドは1つのコマだけ選択して使用して下さい。 Timeline @@ -9874,63 +10144,157 @@ Do you want to overwrite it? %1 does not exist. %1 は存在しません。 - - - ReframePopup - OK - OK + The file %1 already exists. +Do you want to overwrite it? + - Cancel - キャンセル + The file %1 has been exported successfully. + - steps - コマ + Open containing folder + - with - + Please enable "Show Keyframes on Cell Area" to show or hide the camera column. + - ( - ( + The chosen folder path does not exist. +Do you want to create it? + - blank cells will be inserted.) - コマの空コマが挿入されます。) + Create + 作成 - Reframe with Empty Inbetweens - 空コマを入れてリフレーム + Edit Level Settings : %1 + - empty inbetweens - + Shift Key Frames Down + - - - RenameAsToonzPopup - Delete Original Files - 元のファイルを削除 + Shift Key Frames Up + - Level Name: - レベル名: + Create Blank Drawing + - Rename - リネーム + Duplicate Drawing + - Cancel - キャンセル + Unable to create a blank drawing on the camera column + - Renaming File - ファイルをリネーム中... + The current column is locked + + + + Cannot create a blank drawing on the current column + + + + The current level is not editable + + + + Unable to create a blank drawing on the current column + + + + Unable to replace the current drawing with a blank drawing + + + + There are no drawings in the camera column to duplicate + + + + Cannot duplicate a drawing in the current column + + + + Unable to duplicate a drawing on the current column + + + + Unable to replace the current or next drawing with a duplicate drawing + + + + Stop Motion Controller + + + + Camera Column Switch : + + + + + ReframePopup + + OK + OK + + + Cancel + キャンセル + + + steps + コマ + + + with + + + + ( + ( + + + blank cells will be inserted.) + コマの空コマが挿入されます。) + + + Reframe with Empty Inbetweens + 空コマを入れてリフレーム + + + empty inbetweens + + + + + RenameAsToonzPopup + + Delete Original Files + 元のファイルを削除 + + + Level Name: + レベル名: + + + Rename + リネーム + + + Cancel + キャンセル + + + Renaming File + ファイルをリネーム中... Creating an animation level of %1 frames @@ -10078,7 +10442,11 @@ The audio file will not be included in the rendered clip. Click and drag to move guide - [ドラッグ]ガイドを移動 + [ドラッグ]ガイドを移動 + + + Left click and drag to move guide. Right click to delete guide + @@ -11222,6 +11590,26 @@ Please commit or revert changes first. Reset View 表示をリセット + + Auto Inbetween + + + + Linear Interpolation + 線形 + + + Ease In Interpolation + + + + Ease Out Interpolation + + + + Ease In/Out Interpolation + + SceneViewerPanel @@ -11239,7 +11627,7 @@ Please commit or revert changes first. Scene: - シーン: + シーン: :: Frame: @@ -11251,7 +11639,7 @@ Please commit or revert changes first. Level: - レベル: + レベル: Freeze @@ -11287,7 +11675,15 @@ Please commit or revert changes first. :: Project: - :: プロジェクト: + :: プロジェクト: + + + [SCENE]: + + + + [LEVEL]: + @@ -11627,7 +12023,7 @@ Please commit or revert changes first. Playback Controls - 再生コントロール + 再生コントロール RGBA Channels @@ -11643,7 +12039,19 @@ Please commit or revert changes first. Playback - 再生 + 再生 + + + Play + 再生 + + + Render + レンダリング + + + Help + ヘルプ @@ -11781,6 +12189,58 @@ Assign to '%3'? Failed to create menubar メニューバーの作成に失敗しました + + Project Management + + + + Import + + + + Export + 書き出し + + + Script + + + + Group + + + + Arrange + + + + New + 新規フォルダ + + + Adjust + + + + Optimize + + + + Convert + 変換 + + + Drawing Substitution + + + + Play + 再生 + + + Workspace + + StartupPopup @@ -11894,7 +12354,7 @@ Assign to '%3'? The chosen file path is not valid. - 選択されたファイルパスは無効です。 + 選択されたファイルパスは無効です。 The width must be 1 or more. @@ -11960,104 +12420,514 @@ Possibly the preset file has been corrupted The selected scene project '%1' is not in the Current Project list and may not open automatically. - 選択したシーンのプロジェクト '%1' は現在のプロジェクトリストにはありません。自動的に開かない場合があります。 + 選択したシーンのプロジェクト '%1' は現在のプロジェクトリストにはありません。自動的に開かない場合があります。 + + + Failed to create the folder. + - SubSheetBar + StopMotion - Sub-scene controls: -Click the arrow button to create a new sub-xsheet - [クリック]新規サブシーンを作成 + No + frame id + - Disable Edit in Place - 適所で編集を無効 + No level name specified: please choose a valid level name + - Enable Edit in Place - 適所で編集を有効 + The level name specified is already used: please choose a different level name. + 指定されたレベル名はすでに使用中です:別の名前を指定してください - Exit Sub-xsheet (1 Level Up) - この下のサブシーンを閉じる + The save in path specified does not match with the existing level. + 指定された保存先パスが既存のレベルと異なります。 - Exit Sub-xsheet (2 Levels Up) - この下のサブシーンを閉じる + The captured image size does not match with the existing level. + 取り込まれた画像サイズが既存のレベルと異なります。 - Exit Sub-xsheet (3 or More Levels Up) - この下のサブシーンを閉じる + File %1 already exists. +Do you want to overwrite it? + - Enter Sub-xsheet - サブシーン編集モード + Failed to load %1. + ファイル %1 の読み込みに失敗しました - Current Scene - 現在のシーン + Folder %1 doesn't exist. +Do you want to create it? + フォルダー %1 は存在しません。 +作成しますか? - - - T - Nothing to replace: no cells or columns selected. - 置き換えることができません:選択されているコマまたは列がありません。 + Unable to create + - - - TApp - Error allocating memory: not enough memory. - メモリー割り当てエラー: メモリーが不足しています。 + UNDEFINED WARNING + ※ 未定義の警告 ※ - It is not possible to save automatically an untitled scene. - 名称未設定のシーンを自動保存できません。 + The level is not registered in the scene, but exists in the file system. + このレベルは現在のシーンに読み込まれていませんが、ファイルは存在します。 - It is not possible to automatically save an untitled scene. - 名称未設定のシーンを自動保存できません。 + +WARNING : Image size mismatch. The saved image size is %1 x %2. + +警告: 画像サイズの不一致。保存されている画像のサイズは %1 x %2 ピクセルです。 - - - TaskSheet - Name: - 名前: + WARNING + - Status: - 状況: + +Frame %1 exists. + +以下のコマが撮り込み済です: %1 - Command Line: - コマンドライン: + +Frames %1 exist. + +以下のコマが撮り込み済です: %1 - Server: - サーバー: + OVERWRITE 1 of + 上書き : - Submitted By: - 送信者: + ADD to + 追加 : - Submitted On: - 送信先: + %1 frame + %1 コマ撮り込み済 - Submission Date: - 送信日: + %1 frames + %1 コマ撮り込み済 - Start Date: - 開始日: + The level will be newly created. + レベルは新規作成されます。 - Completion Date: - 完了日: + NEW + 新規作成 + + + The level is already registered in the scene. + このレベルは既にシーンに読み込まれています。 + + + +NOTE : The level is not saved. + +注意: このレベルはまだファイルに保存されていません。 + + + +WARNING : Failed to get image size of the existing level %1. + +警告: 既存のレベル %1 の画像サイズの取得に失敗しました。 + + + +WARNING : Image size mismatch. The existing level size is %1 x %2. + +警告: 画像サイズの不一致。既存のレベルのサイズは %1 x %2 です。 + + + WARNING : Level name conflicts. There already is a level %1 in the scene with the path + %2. + 警告: レベル名の重複。このシーンには、既に %1 という名前のレベルが存在します。 +既存のレベルのファイルパスは %2 です。 + + + +WARNING : Image size mismatch. The size of level with the same name is is %1 x %2. + +警告: 画像サイズの不一致。既存の同名のレベルのサイズは %1 x %2 です。 + + + WARNING : Level path conflicts. There already is a level with the path %1 + in the scene with the name %2. + 警告: ファイルパスの重複。既にこのシーンには %1 から読み込まれている +別名のレベル %2 があります。 + + + +WARNING : Image size mismatch. The size of level with the same path is %1 x %2. + +警告: 画像サイズの不一致。 既存の同じファイルパスのレベルのサイズは %1 x %2 です。 + + + WARNING + 警告 + + + No camera selected. + + + + + StopMotionController + + Controls + + + + Settings + 設定 + + + Options + + + + Resolution: + + + + Refresh + + + + File + ファイル + + + Webcam Settings... + + + + Capture + + + + Next Level + 次のレベル + + + Next New + + + + Previous Level + 前のレベル + + + Next Frame + 次のフレーム + + + Last Frame + 最後のフレーム + + + Previous Frame + 前のフレーム + + + Next XSheet Frame + + + + Previous XSheet Frame + + + + Current Frame + 現在のフレーム + + + Set to the Current Playhead Location + + + + Start Live View + + + + Zoom + + + + Pick Zoom + + + + < + + + + > + + + + << + + + + >> + + + + <<< + + + + >>> + + + + Camera: + カメラ: + + + Name: + + + + Frame: + フレーム: + + + File Type: + ファイルタイプ: + + + Save In: + + + + XSheet Frame: + + + + Camera Model + + + + Camera Mode + + + + Temperature: + + + + Shutter Speed: + + + + Iso: + + + + Aperture: + + + + Exposure: + + + + Image Quality: + + + + Picture Style: + + + + White Balance: + + + + Webcam Options + + + + DSLR Options + + + + Place the frame in the XSheet + + + + Use Direct Show Webcam Drivers + + + + Black Screen for Capture + + + + Use Reduced Resolution Images + + + + Use MJPG with Webcam + + + + Place on XSheet + + + + Use Numpad Shortcuts When Active + + + + Show Live View on All Frames + + + + Capture Review Time: + + + + Level Subsampling: + + + + Opacity: + 不透明度: + + + No camera detected. + + + + No camera detected + + + + - Select camera - + - カメラを選択してください - + + + Mode: + + + + Auto + + + + Disabled + 無効 + + + Stop Live View + + + + + SubSheetBar + + Sub-scene controls: +Click the arrow button to create a new sub-xsheet + [クリック]新規サブシーンを作成 + + + Disable Edit in Place + 適所で編集を無効 + + + Enable Edit in Place + 適所で編集を有効 + + + Exit Sub-xsheet (1 Level Up) + この下のサブシーンを閉じる + + + Exit Sub-xsheet (2 Levels Up) + この下のサブシーンを閉じる + + + Exit Sub-xsheet (3 or More Levels Up) + この下のサブシーンを閉じる + + + Enter Sub-xsheet + サブシーン編集モード + + + Current Scene + 現在のシーン + + + + T + + Nothing to replace: no cells or columns selected. + 置き換えることができません:選択されているコマまたは列がありません。 + + + + TApp + + Error allocating memory: not enough memory. + メモリー割り当てエラー: メモリーが不足しています。 + + + It is not possible to save automatically an untitled scene. + 名称未設定のシーンを自動保存できません。 + + + It is not possible to automatically save an untitled scene. + 名称未設定のシーンを自動保存できません。 + + + + TaskSheet + + Name: + 名前: + + + Status: + 状況: + + + Command Line: + コマンドライン: + + + Server: + サーバー: + + + Submitted By: + 送信者: + + + Submitted On: + 送信先: + + + Submission Date: + 送信日: + + + Start Date: + 開始日: + + + Completion Date: + 完了日: Duration: @@ -12375,6 +13245,17 @@ Click the arrow button to create a new sub-xsheet + Toolbar + + Collapse toolbar + + + + Expand toolbar + + + + TopBar Lock Rooms Tab @@ -12606,6 +13487,33 @@ Please refer to the user guide for details. + XDTSImportPopup + + Importing XDTS file %1 + + + + Load + + + + Cancel + キャンセル + + + Please specify the level locations. Suggested paths are input in the fields with blue border. + + + + Level Name + + + + Level Path + + + + XsheetGUI::CellArea Click to select keyframe, drag to move it @@ -12810,6 +13718,14 @@ Please refer to the user guide for details. &Paste Insert Above 上に挿入して貼り付け (&P) + + Hide Camera Column + + + + Show Camera Column + + XsheetGUI::ColumnTransparencyPopup @@ -13062,7 +13978,7 @@ Hold F3 Key on the Viewer to Show This Frame Only :: Project: - :: プロジェクト: + :: プロジェクト: Frame diff --git a/toonz/sources/translations/japanese/toonzlib.ts b/toonz/sources/translations/japanese/toonzlib.ts index 1513d13..68e7d0f 100644 --- a/toonz/sources/translations/japanese/toonzlib.ts +++ b/toonz/sources/translations/japanese/toonzlib.ts @@ -436,6 +436,11 @@ Timeline タイムライン + + Failed to save the following resources: + + + TScriptBinding::CenterlineVectorizer diff --git a/toonz/sources/translations/japanese/toonzqt.ts b/toonz/sources/translations/japanese/toonzqt.ts index 6e253f2..064bfea 100644 --- a/toonz/sources/translations/japanese/toonzqt.ts +++ b/toonz/sources/translations/japanese/toonzqt.ts @@ -695,6 +695,30 @@ Possibly the preset file has been corrupted &Locator ロケーター (&L) + + Viewer Controls + + + + &Zoom In + + + + &Zoom Out + + + + &Flip Horizontally + + + + &Flip Vertically + + + + &Reset View + + FontParamField @@ -1005,19 +1029,19 @@ Possibly the preset file has been corrupted Step 1 - ステップ1 + ステップ1 Step 2 - ステップ2 + ステップ2 Step 3 - ステップ3 + ステップ3 Step 4 - ステップ4 + ステップ4 Activate Cycle @@ -1043,6 +1067,10 @@ Possibly the preset file has been corrupted Change Step ステップを変更 + + Similar Shape Interpolation + 相似形補間 + FunctionToolbar @@ -1100,6 +1128,10 @@ Possibly the preset file has been corrupted Table テーブル + + Hide Selected + + FxColumnPainter @@ -2220,6 +2252,10 @@ The second line should be "Mesh [Input bit depth] [Output bit depth]"< OK OK + + That is a reserved file name and cannot be used. + + QPushButton @@ -2236,6 +2272,17 @@ The second line should be "Mesh [Input bit depth] [Output bit depth]"< + RgbLinkButtons + + Copy RGB : %1 > %2 + + + + Swap %1 and %2 + + + + SchematicViewer &Fit to Window @@ -2285,6 +2332,18 @@ The second line should be "Mesh [Input bit depth] [Output bit depth]"< &Toggle node icons アイコン表示切り替え (&T) + + &Selection Mode + + + + &Zoom Mode + + + + &Hand Mode + + SchematicWindowEditor @@ -2366,6 +2425,17 @@ The second line should be "Mesh [Input bit depth] [Output bit depth]"< + StageSchematicNode + + Toggle Autorotate Along Motion Path + + + + Toggle Link Motion Path to Control Points + + + + StageSchematicScene &New Pegbar diff --git a/toonz/sources/translations/korean/tnzcore.ts b/toonz/sources/translations/korean/tnzcore.ts index 99d605d..21742bd 100644 --- a/toonz/sources/translations/korean/tnzcore.ts +++ b/toonz/sources/translations/korean/tnzcore.ts @@ -5,26 +5,26 @@ BmpWriterProperties Bits Per Pixel - 픽셀당 비트 수 + 픽셀당 비트 수 24 bits - 24비트 + 24비트 8 bits (Greyscale) - 8비트 + 8비트 JpgWriterProperties Quality - 품질 + 품질 Smoothing - 평활화 + 평활화 @@ -43,7 +43,7 @@ Unidentified Action - 식별되지 않은 작업 + 식별되지 않은 작업 @@ -83,26 +83,26 @@ Tiio::BmpWriterProperties Bits Per Pixel - 픽셀당 비트 수 + 픽셀당 비트 수 24 bits - 24비트 + 24비트 8 bits (Greyscale) - 8비트 + 8비트 Tiio::JpgWriterProperties Quality - 품질 + 품질 Smoothing - 평활화 + 평활화 diff --git a/toonz/sources/translations/korean/tnztools.ts b/toonz/sources/translations/korean/tnztools.ts index 6d4dcdd..06d82f9 100644 --- a/toonz/sources/translations/korean/tnztools.ts +++ b/toonz/sources/translations/korean/tnztools.ts @@ -191,15 +191,15 @@ BrushToolOptionsBox Preset Name - 사전설정 이름 + 사전설정 이름 OK - + Cancel - 취소 + 취소 @@ -224,7 +224,7 @@ DVGui::StyleIndexLineEdit current - 현재 + 현재 @@ -1091,15 +1091,43 @@ Do you want to proceed? %1 Level : %2 Frame : %3 - %1 레벨 : %2 프레임 : %3 + %1 레벨 : %2 프레임 : %3 Modify Stroke Tool - 선 수정도구 + 선 수정도구 Modify Spline - 스플라인 수정 + 스플라인 수정 + + + The selection cannot be updated. It is not editable. + + + + The selection cannot be deleted. It is not editable. + + + + The selection cannot be pasted. It is not editable. + + + + The selection cannot be grouped. It is not editable. + + + + The selection cannot be entered. It is not editable. + + + + The selection cannot be ungrouped. It is not editable. + + + + The selection cannot be moved. It is not editable. + @@ -1353,7 +1381,7 @@ Do you want to proceed? StyleIndexLineEdit current - 현재 + 현재 diff --git a/toonz/sources/translations/korean/toonz.ts b/toonz/sources/translations/korean/toonz.ts index 71728d8..3cda0ef 100644 --- a/toonz/sources/translations/korean/toonz.ts +++ b/toonz/sources/translations/korean/toonz.ts @@ -1210,7 +1210,7 @@ What do you want to do? Scene: - 장면: + 장면: :: Frame: @@ -1226,11 +1226,19 @@ What do you want to do? Level: - 레벨: + 레벨: :: Project: - :: 프로젝트: + :: 프로젝트: + + + [SCENE]: + + + + [LEVEL]: + @@ -1559,6 +1567,10 @@ DPI 정보를 포함하면 현재 카메라 DPI가 적용됩니다. %1 level(s) skipped %1 레벨 건너뛰기 + + Level %1 converting to same file format; skipped. + + DVGui::ProgressDialog @@ -2206,7 +2218,7 @@ DPI 정보를 포함하면 현재 카메라 DPI가 적용됩니다. FileViewerPopup Viewer - 뷰어 + 뷰어 @@ -2428,7 +2440,7 @@ Do you want to overwrite it? ImportMagpieFilePopup Import Magpie File - MAGPIE 파일 가져오기 + MAGPIE 파일 가져오기 Load @@ -2438,6 +2450,10 @@ Do you want to overwrite it? %1 does not exist. %1이 존재하지 않음. + + Import Toonz Lip Sync File + + InbetweenDialog @@ -2814,7 +2830,7 @@ Do you want to create it? Scan level - 스캔 레벨 + 스캔 레벨 Toonz Vector level @@ -2844,6 +2860,18 @@ Do you want to create it? The file %1 is not a sound level. 파일 %1는 사운드 레벨이 아님. + + [Various] + + + + SubXsheet Level + + + + Another Level Type + + LineTestCapturePane @@ -3167,7 +3195,7 @@ Please use the frame numbers for reference. Arrangement in Xsheet - X-시트 배치 + X-시트 배치 (FILE DOES NOT EXIST) @@ -3213,6 +3241,30 @@ Please use the frame numbers for reference. :: :: + + Level Settings & Arrangement in Xsheet + + + + Premultiply + 미리 곱하기 + + + White As Transparent + 투명한 흰색 + + + DPI: + DPI: + + + Antialias Softness: + 안티 알리아스 부드러움: + + + Subsampling: + 서브 샘플링: + LoadScenePopup @@ -3237,7 +3289,7 @@ Please use the frame numbers for reference. LoadScriptPopup Load script - 스크립트 가져오기 + 스크립트 가져오기 @@ -3331,7 +3383,7 @@ Please use the frame numbers for reference. MagpieFileImportPopup Import Magpie File - MAGPIE 파일 가져오기 + MAGPIE 파일 가져오기 Frame Range @@ -3339,7 +3391,7 @@ Please use the frame numbers for reference. To: - 로: + 로: From: @@ -3369,6 +3421,14 @@ Please use the frame numbers for reference. The file path is missing. 파일 경로가 없음. + + Import Toonz Lip Sync File + + + + To: + + MainWindow @@ -3518,7 +3578,7 @@ Please use the frame numbers for reference. &Import Magpie File... - MAGPIE 파일 가져오기(&I)... + MAGPIE 파일 가져오기(&I)... &New Project... @@ -3950,7 +4010,7 @@ Please use the frame numbers for reference. &Edit FX... - Fx 편집(&E)... + Fx 편집(&E)... Insert Frame @@ -5163,6 +5223,102 @@ N.B. Open Toonz 다른 프로세스를 실행하고 있지 않은지 확인하 Can't delete %1 : %1을 삭제 할 수 있음: + + &Import Toonz Lip Sync File... + + + + Export Exchange Digital Time Sheet (XDTS) + + + + &Create Blank Drawing + + + + &Shift Keys Down + + + + &Shift Keys Up + + + + Next Key + + + + Prev Key + + + + &FX Editor + + + + &Stop Motion Controls + + + + Select Next Frame Guide Stroke + + + + Select Previous Frame Guide Stroke + + + + Select Prev && Next Frame Guide Strokes + + + + Reset Guide Stroke Selections + + + + Tween Selected Guide Strokes + + + + Tween Guide Strokes to Selected + + + + Select Guide Strokes && Tween Mode + + + + Capture Stop Motion Frame + + + + Raise Stop Motion Opacity + + + + Lower Stop Motion Opacity + + + + Toggle Stop Motion Live View + + + + Toggle Stop Motion Zoom + + + + Lower Stop Motion Level Subsampling + + + + Raise Stop Motion Level Subsampling + + + + Go to Stop Motion Insert Frame + + MatchlinesDialog @@ -6350,7 +6506,7 @@ Is it OK to release these shortcuts? Stuff Folder* - 물건 폴더* + 물건 폴더* Custom* @@ -6386,7 +6542,7 @@ Is it OK to release these shortcuts? Enable auto-stretch frame - 자동 스트레치 프레임 사용 + 자동 스트레치 프레임 사용 Show Cursor Size Outlines @@ -6780,11 +6936,11 @@ if both are possible on coding file path. Disabled - 비활성화 + 비활성화 Enabled - 활성화 + 활성화 Use Xsheet as Animation Sheet @@ -6908,7 +7064,7 @@ if both are possible on coding file path. X - X + X Viewer Shrink @@ -7042,7 +7198,7 @@ in non alpha-enabled image format. Autocreation: - 자동 생성 + 자동 생성 Vector Snapping: @@ -7128,6 +7284,46 @@ in non alpha-enabled image format. # of backups to keep: # 보관할 백업 수: + + Enable Autocreation + + + + Numbering System: + + + + Enable Auto-stretch Frame + + + + Enable Creation in Hold Cells + + + + Enable Autorenumber + + + + Toolbar Display Behaviour: + + + + Level Editor Box Color + + + + Incremental + + + + Enable Tools For Level Only + + + + Show Tools For Level Only + + PreferencesPopup::FormatProperties @@ -8613,16 +8809,16 @@ The operation cannot be undone: are you sure? Please enable "Sync Level Strip Drawing Number Changes with the XSheet" preference option to use the duplicate command in the xsheet / timeline. - 사용가능 " X시트: 환경설정 옵션으로 레벨 스트립 그리기 번호 변경 + 사용가능 " X시트: 환경설정 옵션으로 레벨 스트립 그리기 번호 변경 X시트/ 타임에서 중복 명령을 사용하세요. Please select only one layer to duplicate a frame. - 프레임을 복제하려면 레이어를 하나만 선택하세요. + 프레임을 복제하려면 레이어를 하나만 선택하세요. Please select only one frame to duplicate. - 복제할 프레임을 하나만 선택하세요. + 복제할 프레임을 하나만 선택하세요. Cannot paste data @@ -9004,15 +9200,15 @@ Do you want to import them or load from their original location? Change project - 프로젝트 변경 + 프로젝트 변경 File not found - 파일을 찾을 수 없음 + 파일을 찾을 수 없음 Don't Save - 저장하지 마세요 + 저장하지 마세요 Clone Level @@ -9253,6 +9449,96 @@ Do you want to overwrite it? Camera Column Switch : 카메라 칼럼 스위치: + + The file %1 already exists. +Do you want to overwrite it? + + + + The file %1 has been exported successfully. + + + + Open containing folder + + + + Please enable "Show Keyframes on Cell Area" to show or hide the camera column. + + + + The chosen folder path does not exist. +Do you want to create it? + + + + Create + + + + Edit Level Settings : %1 + + + + Shift Key Frames Down + + + + Shift Key Frames Up + + + + Create Blank Drawing + + + + Duplicate Drawing + + + + Unable to create a blank drawing on the camera column + + + + The current column is locked + + + + Cannot create a blank drawing on the current column + + + + The current level is not editable + + + + Unable to create a blank drawing on the current column + + + + Unable to replace the current drawing with a blank drawing + + + + There are no drawings in the camera column to duplicate + + + + Cannot duplicate a drawing in the current column + + + + Unable to duplicate a drawing on the current column + + + + Unable to replace the current or next drawing with a duplicate drawing + + + + Stop Motion Controller + + ReframePopup @@ -10544,6 +10830,26 @@ Please commit or revert changes first. Reset View 보기 재설정 + + Auto Inbetween + 자동 중간 + + + Linear Interpolation + 선행 보간 + + + Ease In Interpolation + + + + Ease Out Interpolation + + + + Ease In/Out Interpolation + + SceneViewerPanel @@ -10585,7 +10891,7 @@ Please commit or revert changes first. Scene: - 장면: + 장면: :: Frame: @@ -10605,11 +10911,19 @@ Please commit or revert changes first. Level: - 레벨: + 레벨: :: Project: - :: 프로젝트: + :: 프로젝트: + + + [SCENE]: + + + + [LEVEL]: + @@ -10953,7 +11267,7 @@ Please commit or revert changes first. Playback Controls - 재생 제어 + 재생 제어 RGBA Channels @@ -10961,16 +11275,28 @@ Please commit or revert changes first. Playback - 재생 + 재생 - - - ShortcutViewer - %1 is already assigned to '%2' -Assign to '%3'? - %1는 %2에 지정되었음. -%3에 다시 지정 하겠습니까? + Play + 재생 + + + Render + 렌더 + + + Help + 도움말 + + + + ShortcutViewer + + %1 is already assigned to '%2' +Assign to '%3'? + %1는 %2에 지정되었음. +%3에 다시 지정 하겠습니까? Yes @@ -11272,7 +11598,7 @@ Assign to '%3'? The chosen file path is not valid. - 선택한 파일 경로가 유효하지 않음. + 선택한 파일 경로가 유효하지 않음. The width must be greater than zero. @@ -11322,73 +11648,474 @@ Possibly the preset file has been corrupted The selected scene project '%1' is not in the Current Project list and may not open automatically. - 선택한 장면 프로젝트 '%1' 현재 프로젝트 목록에 없으며 자동으로 열리지 않을 수 있음. + 선택한 장면 프로젝트 '%1' 현재 프로젝트 목록에 없으며 자동으로 열리지 않을 수 있음. + + + Failed to create the folder. + + + + + StopMotion + + No + frame id + 아니오 + + + No level name specified: please choose a valid level name + 레벨 이름지정 되지 않음: 유효한 레벨 이름을 선택하세요 + + + The level name specified is already used: please choose a different level name. + 지정된 레벨 이름은 이미 사용중. 다른 레벨 이름을 선택하세요. + + + The save in path specified does not match with the existing level. + 지정한 저장 경로가 기존 레벨과 일치하지 않음. + + + The captured image size does not match with the existing level. + 캡처된 이미지 크기가 기존 레벨과 일치하지 않음. + + + File %1 already exists. +Do you want to overwrite it? + %1 파일이 이미존재함. +덮어쓰시겠습니까? + + + Failed to load %1. + %1를 가져오지 못함. + + + Folder %1 doesn't exist. +Do you want to create it? + 폴더 %1 존재하지 않음. +생성하겠습니까? + + + Unable to create + 만들 수 없음 + + + UNDEFINED WARNING + 정의 되지 않은 경고 + + + The level is not registered in the scene, but exists in the file system. + 레벨은 장면에 등록되지 않지만 파일 시스템에 존재함. + + + +WARNING : Image size mismatch. The saved image size is %1 x %2. + 경고: 이미지 크기가 일치하지 않음. 저장된 이미지 크기는 %1 x %2임. + + + WARNING + + + + +Frame %1 exists. + %1 프레임이 존재함. + + + +Frames %1 exist. + %1 프레임이 존재함. + + + OVERWRITE 1 of + 1의 덮어쓰기 + + + ADD to + 추가 + + + %1 frame + 프레임 %1 + + + %1 frames + 프레임 %1 + + + The level will be newly created. + 레벨이 새로 생성됨. + + + NEW + 새로운 + + + The level is already registered in the scene. + 레벨은 이미 장면에 등록되어 있음. + + + +NOTE : The level is not saved. + 참고: 레벨이 저장되지 않음. + + + +WARNING : Failed to get image size of the existing level %1. + 경고: 기존 레벨 %1의 이미지 크기를 가져오지 못함. + + + +WARNING : Image size mismatch. The existing level size is %1 x %2. + 경고: 이미지 크기가 일치하지 안음. 기존 레벨 크기는 %1 x %2임. + + + WARNING : Level name conflicts. There already is a level %1 in the scene with the path + %2. + 경고: 레벨 이름이 충돌함. 경로가 있는 장면에 이미 레벨 %1가 있음 %2. + + + +WARNING : Image size mismatch. The size of level with the same name is is %1 x %2. + 경고: 이미지 크기가 일치하지 않음. 이름이 같은 레벨의 크기는 %1 x %2임. + + + WARNING : Level path conflicts. There already is a level with the path %1 + in the scene with the name %2. + 경고: 레벨 경로 충돌. 경로가 %1인 레벨이 이미 있음. 이름이 %2인 장면에서 + + + +WARNING : Image size mismatch. The size of level with the same path is %1 x %2. + 경고: 이미지 크기가 일치하지 않음. 경로가 같은 레벨의 크기는 %1 x %2임. + + + WARNING + 경고 + + + No camera selected. + + + + + StopMotionController + + Controls + + + + Settings + 설정 + + + Options + 옵션 + + + Resolution: + + + + Refresh + 새로고침 + + + File + 파일 + + + Webcam Settings... + + + + Capture + 캡처 + + + Next Level + 새로운 레벨 + + + Next New + + + + Previous Level + 이전 레벨 + + + Next Frame + 다음 프레임 + + + Last Frame + 마지막 프레임 + + + Previous Frame + 이전 프레임 + + + Next XSheet Frame + + + + Previous XSheet Frame + + + + Current Frame + 현재 프레임 + + + Set to the Current Playhead Location + + + + Start Live View + + + + Zoom + + + + Pick Zoom + + + + < + + + + > + + + + << + + + + >> + + + + <<< + + + + >>> + + + + Camera: + 카메라: + + + Name: + 이름: + + + Frame: + 프레임: + + + File Type: + 파일 유형: + + + Save In: + 저장: + + + XSheet Frame: + + + + Camera Model + + + + Camera Mode + + + + Temperature: + + + + Shutter Speed: + + + + Iso: + + + + Aperture: + + + + Exposure: + + + + Image Quality: + + + + Picture Style: + + + + White Balance: + + + + Webcam Options + + + + DSLR Options + + + + Place the frame in the XSheet + + + + Use Direct Show Webcam Drivers + + + + Black Screen for Capture + + + + Use Reduced Resolution Images + + + + Use MJPG with Webcam + + + + Place on XSheet + + + + Use Numpad Shortcuts When Active + + + + Show Live View on All Frames + + + + Capture Review Time: + + + + Level Subsampling: + + + + Opacity: + 불투명도: + + + No camera detected. + + + + No camera detected + + + + - Select camera - + - 카메라 선택 - + + + Mode: + + + + Auto + 자동 + + + Disabled + 비활성화 + + + Stop Live View + StudioPaletteTreeViewer This folder is not empty. Delete anyway? - 이 폴더는 비어 있지 않음. 삭제하겠습니까? + 이 폴더는 비어 있지 않음. 삭제하겠습니까? New Palette - 새로운 팔레트 + 새로운 팔레트 New Folder - 새폴더 + 새폴더 New Cleanup Palette - 새 정리 팔레트 + 새 정리 팔레트 Delete Folder - 폴더 삭제 + 폴더 삭제 Load into Current Cleaunp Palette - 현재 클리아운프 팔레트에 가져오기 + 현재 클리아운프 팔레트에 가져오기 Replace with Current Cleaunp Palette - 현재 클리어프 팔레트로 교체 + 현재 클리어프 팔레트로 교체 Load into Current Palette - 현재 팔레트로 가져오기 + 현재 팔레트로 가져오기 Merge to Current Palette - 현재 팔레트로 병합 + 현재 팔레트로 병합 Replace with Current Palette - 현재 팔레트로 교체 + 현재 팔레트로 교체 Delete Palette - 팔레트 삭제 + 팔레트 삭제 Search for Palettes - 팔레트 검색 + 팔레트 검색 StudioPaletteViewer &New Folder - 새 폴더(&N) + 새 폴더(&N) &New Palette - 새로운 팔레트(&N) + 새로운 팔레트(&N) &Delete - 삭제(&D) + 삭제(&D) @@ -11740,6 +12467,17 @@ Possibly the preset file has been corrupted + Toolbar + + Collapse toolbar + + + + Expand toolbar + + + + TopBar Lock Rooms Tab @@ -11969,6 +12707,33 @@ Please refer to the user guide for details. + XDTSImportPopup + + Importing XDTS file %1 + + + + Load + 가져오기 + + + Cancel + 취소 + + + Please specify the level locations. Suggested paths are input in the fields with blue border. + + + + Level Name + + + + Level Path + + + + XsheetGUI::CellArea Click to select keyframe, drag to move it @@ -12346,7 +13111,7 @@ Hold F3 Key on the Viewer to Show This Frame Only :: Project: - :: 프로젝트: + :: 프로젝트: Frame diff --git a/toonz/sources/translations/korean/toonzlib.ts b/toonz/sources/translations/korean/toonzlib.ts index 188f26c..7ea8dbd 100644 --- a/toonz/sources/translations/korean/toonzlib.ts +++ b/toonz/sources/translations/korean/toonzlib.ts @@ -5,170 +5,170 @@ CenterlineVectorizer Can't vectorize a %1 level - %1 레벨을 벡터화 할 수 없음 + %1 레벨을 벡터화 할 수 없음 Can't vectorize a level with no frames - 프레임 없이 레벨을 벡터링 할 수 없음 + 프레임 없이 레벨을 벡터링 할 수 없음 Can't vectorize a %1 image - %1 이미지를 벡터화 할 수 없음 + %1 이미지를 벡터화 할 수 없음 Bad argument (%1): should be an Image or a Level - 잘못된 인수(%1): 이미지 또는 레벨이어야함. + 잘못된 인수(%1): 이미지 또는 레벨이어야함. FilePath "%1" - "%1" + "%1" can't concatenate an absolute path : %1 - 절대 경로를 연결하세요: %1 + 절대 경로를 연결하세요: %1 %1 is not a directory - %1 디렉토리가 아님. + %1 디렉토리가 아님. can't read directory %1 - %1 디렉토리 읽기 + %1 디렉토리 읽기 Image File %1 doesn't exist - %1 파일이 존재하지 않음 + %1 파일이 존재하지 않음 Loaded first frame of %1 - %1 첫번째 프레임 가져오기 + %1 첫번째 프레임 가져오기 Unexpected error while reading image - 이미지를 읽는 동안 이야기치 않는 오류 발생 + 이미지를 읽는 동안 이야기치 않는 오류 발생 Unrecognized file type : - 인식 할 수 없는 파일 형식: + 인식 할 수 없는 파일 형식: Can't save a %1 image to this file type : %2 - %1 이미지를 이 파일 형식에 저장할 수 있음: %2 + %1 이미지를 이 파일 형식에 저장할 수 있음: %2 Unexpected error while writing image - 이미지를 쓰는 중 이야기치 않는 오류 + 이미지를 쓰는 중 이야기치 않는 오류 ImageBuilder Bad argument (%1): should be 'Raster' or ToonzRaster' - 잘못된 인수(%1): 래스터 또는 툰즈 레스터 여야함. + 잘못된 인수(%1): 래스터 또는 툰즈 레스터 여야함. ImageBuilder(%1 image) - 이미지 빌더 (%1 이미지) + 이미지 빌더 (%1 이미지) %1 : %2 - %1 : %2 + %1 : %2 Bad argument (%1): should be a Transformation - 잘못된 인수(%1): 변환이어야함 + 잘못된 인수(%1): 변환이어야함 Level %1 frames - %1 프레임 + %1 프레임 Bad argument (%1). It should be FilePath or string - 잘못된 인수(%1). 파일 경로 또는 문자열이어야함. + 잘못된 인수(%1). 파일 경로 또는 문자열이어야함. Exception loading level (%1) - 예외 적재 레벨(%1) + 예외 적재 레벨(%1) File %1 doesn't exist - %1 파일이 존재하지 않음 + %1 파일이 존재하지 않음 File %1 is unsupported - %1 파일이 지원되지 않음. + %1 파일이 지원되지 않음. Exception reading %1 - %1 읽기 예외 + %1 읽기 예외 Can't save an empty level - 빈 레벨을 저장할 수 없음 + 빈 레벨을 저장할 수 없음 Unrecognized file type : - 인식 할 수 없는 파일 형식: + 인식 할 수 없는 파일 형식: Can't save a %1 level to this file type : %2 - %1 레벨을 이 파일 형식에 저장하세요: %2 + %1 레벨을 이 파일 형식에 저장하세요: %2 Exception writing %1 - %1 쓰기 예외 + %1 쓰기 예외 frame index (%1) must be a number - 프레임 인덱스(%1)는 숫자여야함 + 프레임 인덱스(%1)는 숫자여야함 frame index (%1) is out of range (0-%2) - 프레임 인덱스 (%1) 이 범위를 벗어남 (0-%2) + 프레임 인덱스 (%1) 이 범위를 벗어남 (0-%2) second argument (%1) is not an image - 두 번? 인수(%1)는 이미지가 아님 + 두 번? 인수(%1)는 이미지가 아님 can not insert a %1 image into a level - %1 이미지를 레벨에 삽입할 수 없음 + %1 이미지를 레벨에 삽입할 수 없음 can not insert a %1 image to a %2 level - %1 이미지를 %2 레벨에 삽입할 수 없음 + %1 이미지를 %2 레벨에 삽입할 수 없음 OutlineVectorizer Can't vectorize a %1 level - %1 레벨을 벡터화 할 수 없음 + %1 레벨을 벡터화 할 수 없음 Can't vectorize a level with no frames - 프레임 없이 레벨을 벡터링 할 수 없음 + 프레임 없이 레벨을 벡터링 할 수 없음 Can't vectorize a %1 image - %1 이미지를 벡터화 할 수 없음 + %1 이미지를 벡터화 할 수 없음 Bad argument (%1): should be an Image or a Level - 잘못된 인수(%1): 이미지 또는 레벨이어야함. + 잘못된 인수(%1): 이미지 또는 레벨이어야함. Invalid color : - 잘못된 색상 : + 잘못된 색상 : @@ -596,401 +596,406 @@ Set Keyframe %1 at frame %2 - %2 프레임에서 키프레임 %1 설정 + %2 프레임에서 키프레임 %1 설정 Remove Keyframe %1 at frame %2 - 프레임 %2에서 키프레임 %1을 제거하세요. + 프레임 %2에서 키프레임 %1을 제거하세요. Move Center %1 Frame %2 - 센터 %1 프레임 %2 이동 + 센터 %1 프레임 %2 이동 + + + Failed to save the following resources: + + Rasterizer Expected a vector image: %1 - 벡터 레벨 이미지: %1 + 벡터 레벨 이미지: %1 Expected a vector level: %1 - 벡터 레벨 예상: %1 + 벡터 레벨 예상: %1 Argument must be a vector level or image : - 인수는 벡터 레벨 또는 이미지여야함 : + 인수는 벡터 레벨 또는 이미지여야함 : %1 has no palette - 팔레트가 없음 %1 + 팔레트가 없음 %1 Scene File %1 doesn't exist - %1 파일이 존재하지 않음 + %1 파일이 존재하지 않음 Exception reading %1 - %1 읽기 예외 + %1 읽기 예외 Exception writing %1 - %1 쓰기 예외 + %1 쓰기 예외 Bad level type (%1): must be Vector,Raster or ToonzRaster - 잘못된 레벨 유형(%1): 벡터, 래스터 또는 툰즈 래스터여야함. + 잘못된 레벨 유형(%1): 벡터, 래스터 또는 툰즈 래스터여야함. Can't add the level: name(%1) is already used - 레벨을 추가할 수 없음: 이름(%1)이 이미 사용됨 + 레벨을 추가할 수 없음: 이름(%1)이 이미 사용됨 Can't load this kind of file as a level : %1 - 이 종류의 파일을 레벨로 가져올 수 없음: %1 + 이 종류의 파일을 레벨로 가져올 수 없음: %1 Could not load level %1 - %1 레벨을 가져올 수 없음. + %1 레벨을 가져올 수 없음. Level is not included in the scene : %1 - 레벨은 장면에 포함되어 있지 않음: %1 + 레벨은 장면에 포함되어 있지 않음: %1 %1 : Expected a Level instance or a level name - %1: 예상되는 레벨 인스턴스 또는 레벨 이름 + %1: 예상되는 레벨 인스턴스 또는 레벨 이름 Level '%1' is not included in the scene - 레벨 %1 현장에 포함되지 않음. + 레벨 %1 현장에 포함되지 않음. TScriptBinding::CenterlineVectorizer Can't vectorize a %1 level - %1 레벨을 벡터화 할 수 없음 + %1 레벨을 벡터화 할 수 없음 Can't vectorize a level with no frames - 프레임 없이 레벨을 벡터링 할 수 없음 + 프레임 없이 레벨을 벡터링 할 수 없음 Can't vectorize a %1 image - %1 이미지를 벡터화 할 수 없음 + %1 이미지를 벡터화 할 수 없음 Bad argument (%1): should be an Image or a Level - 잘못된 인수(%1): 이미지 또는 레벨이어야함. + 잘못된 인수(%1): 이미지 또는 레벨이어야함. TScriptBinding::FilePath "%1" - "%1" + "%1" can't concatenate an absolute path : %1 - 절대 경로를 연결하세요: %1 + 절대 경로를 연결하세요: %1 %1 is not a directory - %1 디렉토리가 아님. + %1 디렉토리가 아님. can't read directory %1 - %1 디렉토리 읽기 + %1 디렉토리 읽기 TScriptBinding::Image File %1 doesn't exist - %1 파일이 존재하지 않음 + %1 파일이 존재하지 않음 Loaded first frame of %1 - %1 첫번째 프레임 가져오기 + %1 첫번째 프레임 가져오기 Unexpected error while reading image - 이미지를 읽는 동안 이야기치 않는 오류 발생 + 이미지를 읽는 동안 이야기치 않는 오류 발생 Unrecognized file type : - 인식 할 수 없는 파일 형식: + 인식 할 수 없는 파일 형식: Can't save a %1 image to this file type : %2 - %1 이미지를 이 파일 형식에 저장할 수 있음: %2 + %1 이미지를 이 파일 형식에 저장할 수 있음: %2 Unexpected error while writing image - 이미지를 쓰는 중 이야기치 않는 오류 + 이미지를 쓰는 중 이야기치 않는 오류 TScriptBinding::ImageBuilder Bad argument (%1): should be 'Raster' or ToonzRaster' - 잘못된 인수(%1): 래스터 또는 툰즈 레스터 여야함. + 잘못된 인수(%1): 래스터 또는 툰즈 레스터 여야함. ImageBuilder(%1 image) - 이미지 빌더 (%1 이미지) + 이미지 빌더 (%1 이미지) %1 : %2 - %1 : %2 + %1 : %2 Bad argument (%1): should be a Transformation - 잘못된 인수(%1): 변환이어야함 + 잘못된 인수(%1): 변환이어야함 TScriptBinding::Level %1 frames - %1 프레임 + %1 프레임 Bad argument (%1). It should be FilePath or string - 잘못된 인수(%1). 파일 경로 또는 문자열이어야함. + 잘못된 인수(%1). 파일 경로 또는 문자열이어야함. Exception loading level (%1) - 예외 적재 레벨(%1) + 예외 적재 레벨(%1) File %1 doesn't exist - %1 파일이 존재하지 않음 + %1 파일이 존재하지 않음 File %1 is unsupported - %1 파일이 지원되지 않음. + %1 파일이 지원되지 않음. Exception reading %1 - %1 읽기 예외 + %1 읽기 예외 Can't save an empty level - 빈 레벨을 저장할 수 없음 + 빈 레벨을 저장할 수 없음 Unrecognized file type : - 인식 할 수 없는 파일 형식: + 인식 할 수 없는 파일 형식: Can't save a %1 level to this file type : %2 - %1 레벨을 이 파일 형식에 저장하세요: %2 + %1 레벨을 이 파일 형식에 저장하세요: %2 Exception writing %1 - %1 쓰기 예외 + %1 쓰기 예외 frame index (%1) must be a number - 프레임 인덱스(%1)는 숫자여야함 + 프레임 인덱스(%1)는 숫자여야함 frame index (%1) is out of range (0-%2) - 프레임 인덱스 (%1) 이 범위를 벗어남 (0-%2) + 프레임 인덱스 (%1) 이 범위를 벗어남 (0-%2) second argument (%1) is not an image - 두 번? 인수(%1)는 이미지가 아님 + 두 번? 인수(%1)는 이미지가 아님 can not insert a %1 image into a level - %1 이미지를 레벨에 삽입할 수 없음 + %1 이미지를 레벨에 삽입할 수 없음 can not insert a %1 image to a %2 level - %1 이미지를 %2 레벨에 삽입할 수 없음 + %1 이미지를 %2 레벨에 삽입할 수 없음 TScriptBinding::OutlineVectorizer Can't vectorize a %1 level - %1 레벨을 벡터화 할 수 없음 + %1 레벨을 벡터화 할 수 없음 Can't vectorize a level with no frames - 프레임 없이 레벨을 벡터링 할 수 없음 + 프레임 없이 레벨을 벡터링 할 수 없음 Can't vectorize a %1 image - %1 이미지를 벡터화 할 수 없음 + %1 이미지를 벡터화 할 수 없음 Bad argument (%1): should be an Image or a Level - 잘못된 인수(%1): 이미지 또는 레벨이어야함. + 잘못된 인수(%1): 이미지 또는 레벨이어야함. Invalid color : - 잘못된 색상 : + 잘못된 색상 : TScriptBinding::Rasterizer Expected a vector image: %1 - 벡터 레벨 이미지: %1 + 벡터 레벨 이미지: %1 Expected a vector level: %1 - 벡터 레벨 예상: %1 + 벡터 레벨 예상: %1 Argument must be a vector level or image : - 인수는 벡터 레벨 또는 이미지여야함 : + 인수는 벡터 레벨 또는 이미지여야함 : %1 has no palette - 팔레트가 없음 %1 + 팔레트가 없음 %1 TScriptBinding::Scene File %1 doesn't exist - %1 파일이 존재하지 않음 + %1 파일이 존재하지 않음 Exception reading %1 - %1 읽기 예외 + %1 읽기 예외 Exception writing %1 - %1 쓰기 예외 + %1 쓰기 예외 Bad level type (%1): must be Vector,Raster or ToonzRaster - 잘못된 레벨 유형(%1): 벡터, 래스터 또는 툰즈 래스터여야함. + 잘못된 레벨 유형(%1): 벡터, 래스터 또는 툰즈 래스터여야함. Can't add the level: name(%1) is already used - 레벨을 추가할 수 없음: 이름(%1)이 이미 사용됨 + 레벨을 추가할 수 없음: 이름(%1)이 이미 사용됨 Can't load this kind of file as a level : %1 - 이 종류의 파일을 레벨로 가져올 수 없음: %1 + 이 종류의 파일을 레벨로 가져올 수 없음: %1 Could not load level %1 - %1 레벨을 가져올 수 없음. + %1 레벨을 가져올 수 없음. Level is not included in the scene : %1 - 레벨은 장면에 포함되어 있지 않음: %1 + 레벨은 장면에 포함되어 있지 않음: %1 %1 : Expected a Level instance or a level name - %1: 예상되는 레벨 인스턴스 또는 레벨 이름 + %1: 예상되는 레벨 인스턴스 또는 레벨 이름 Level '%1' is not included in the scene - 레벨 %1 현장에 포함되지 않음. + 레벨 %1 현장에 포함되지 않음. TScriptBinding::ToonzRasterConverter Can't convert a %1 level - %1 레벨을 변환할 수 있음. + %1 레벨을 변환할 수 있음. Can't convert a level with no frames - 프레임 없이 레벨을 변환 할수 있음. + 프레임 없이 레벨을 변환 할수 있음. Can't convert a %1 image - %1 이미지를 변환할 수 있음. + %1 이미지를 변환할 수 있음. Bad argument (%1): should be a raster Level or a raster Image - 잘못된 인수(%1): 래스터 레벨 또는 래스터 이미지여야함. + 잘못된 인수(%1): 래스터 레벨 또는 래스터 이미지여야함. TScriptBinding::Transform Identity - 정체 + 정체 Translation(%1,%2) - 번역(%1,%2) + 번역(%1,%2) Rotation(%1) - 회전(%1) + 회전(%1) Scale(%1%) - 비율(%1%) + 비율(%1%) Scale(%1%, %2%) - 비율(%1%, %2%) + 비율(%1%, %2%) Transform(%1, %2, %3; %4, %5, %6) - 변환(%1, %2, %3, %4, %5, %6) + 변환(%1, %2, %3, %4, %5, %6) ToonzRasterConverter Can't convert a %1 level - %1 레벨을 변환할 수 있음. + %1 레벨을 변환할 수 있음. Can't convert a level with no frames - 프레임 없이 레벨을 변환 할수 있음. + 프레임 없이 레벨을 변환 할수 있음. Can't convert a %1 image - %1 이미지를 변환할 수 있음. + %1 이미지를 변환할 수 있음. Bad argument (%1): should be a raster Level or a raster Image - 잘못된 인수(%1): 래스터 레벨 또는 래스터 이미지여야함. + 잘못된 인수(%1): 래스터 레벨 또는 래스터 이미지여야함. Transform Identity - 정체 + 정체 Translation(%1,%2) - 번역(%1,%2) + 번역(%1,%2) Rotation(%1) - 회전(%1) + 회전(%1) Scale(%1%) - 비율(%1%) + 비율(%1%) Scale(%1%, %2%) - 비율(%1%, %2%) + 비율(%1%, %2%) Transform(%1, %2, %3; %4, %5, %6) - 변환(%1, %2, %3, %4, %5, %6) + 변환(%1, %2, %3, %4, %5, %6) diff --git a/toonz/sources/translations/korean/toonzqt.ts b/toonz/sources/translations/korean/toonzqt.ts index 8ed3fde..e242f98 100644 --- a/toonz/sources/translations/korean/toonzqt.ts +++ b/toonz/sources/translations/korean/toonzqt.ts @@ -184,50 +184,50 @@ Possibly the preset file has been corrupted ColorChannelControl R - R + R G - G + G B - B + B A - A + A H - 수평 + 수평 S - S + S V - V + V ColorField R: - R: + R: G: - G: + G: B: - B: + B: A: - A: + A: @@ -305,88 +305,88 @@ Possibly the preset file has been corrupted DVGui::ColorField R: - R: + R: G: - G: + G: B: - B: + B: A: - A: + A: DVGui::DvTextEdit Bold - 볼드 + 볼드 Italic - 이탤릭체 + 이탤릭체 Underline - 밑줄 + 밑줄 Align Left - 왼쪽 정렬 + 왼쪽 정렬 Align Center - 중심 정렬 + 중심 정렬 Align Right - 오른쪽 정렬 + 오른쪽 정렬 DVGui::FileField ... - ... + ... DVGui::LineEdit A file name cannot contains any of the following chracters: /\:*?"<>|. - 파일 이름에는 다음 문자 중 어느 것도 포함될 수 없음: /\:*?"<>|. + 파일 이름에는 다음 문자 중 어느 것도 포함될 수 없음: /\:*?"<>|. DVGui::ProgressDialog OpenToonz - 오픈툰즈 + 오픈툰즈 DVGui::RadioButtonDialog OpenToonz - 오픈툰즈 + 오픈툰즈 DVGui::StyleIndexLineEdit current - 현재 + 현재 DVGui::ToneCurveField Channel: - 채널: + 채널: @@ -408,27 +408,27 @@ Possibly the preset file has been corrupted DvTextEdit Bold - 볼드 + 볼드 Italic - 이탤릭체 + 이탤릭체 Underline - 밑줄 + 밑줄 Align Left - 왼쪽 정렬 + 왼쪽 정렬 Align Center - 중심 정렬 + 중심 정렬 Align Right - 오른쪽 정렬 + 오른쪽 정렬 @@ -457,7 +457,7 @@ Possibly the preset file has been corrupted FileField ... - ... + ... @@ -653,6 +653,30 @@ Possibly the preset file has been corrupted Set the playback frame rate 재생 프레임 속도설정 + + Viewer Controls + + + + &Zoom In + + + + &Zoom Out + + + + &Flip Horizontally + + + + &Flip Vertically + + + + &Reset View + + FontParamField @@ -882,7 +906,7 @@ Possibly the preset file has been corrupted Expr - type="unfinished"> + type="unfinished"> Const @@ -1050,6 +1074,10 @@ Possibly the preset file has been corrupted Show All 모두 표시 + + Hide Selected + + FxColumnPainter @@ -1338,7 +1366,7 @@ Select FX nodes and related links before copying or cutting the selection you wa LineEdit A file name cannot contains any of the following chracters: /\:*?"<>|. - 파일 이름에는 다음 문자 중 어느 것도 포함될 수 없음: /\:*?"<>|. + 파일 이름에는 다음 문자 중 어느 것도 포함될 수 없음: /\:*?"<>|. @@ -1367,19 +1395,19 @@ Select FX nodes and related links before copying or cutting the selection you wa PageViewer - No Styles - - - 스타일 없음 - + - 스타일 없음 - Name Editor - 이름 편집기 + 이름 편집기 New Style - 새로운 스타일 + 새로운 스타일 New Page - 새로운 페이지 + 새로운 페이지 @@ -1493,19 +1521,19 @@ Select FX nodes and related links before copying or cutting the selection you wa PaletteViewerGUI::PageViewer - No Styles - - - 스타일 없음 - + - 스타일 없음 - Name Editor - 이름 편집기 + 이름 편집기 New Style - 새로운 스타일 + 새로운 스타일 New Page - 새로운 페이지 + 새로운 페이지 @@ -1574,7 +1602,7 @@ Select FX nodes and related links before copying or cutting the selection you wa ProgressDialog OpenToonz - 오픈툰즈 + 오픈툰즈 @@ -2108,11 +2136,15 @@ The second line should be "Mesh [Input bit depth] [Output bit depth]"< Modify Fx Param : %1 Key : %2 Frame %3 - Fx 매개변수 수정: %1 키 : %2 프레임 %3 + Fx 매개변수 수정: %1 키 : %2 프레임 %3 Set - 설정 + 설정 + + + That is a reserved file name and cannot be used. + @@ -2126,7 +2158,7 @@ The second line should be "Mesh [Input bit depth] [Output bit depth]"< RadioButtonDialog OpenToonz - 오픈툰즈 + 오픈툰즈 @@ -2210,7 +2242,7 @@ The second line should be "Mesh [Input bit depth] [Output bit depth]"< SettingsPage Reset to default - 기본값으로 재설정 + 기본값으로 재설정 @@ -2521,31 +2553,31 @@ Are you sure ? StyleEditorGUI::ColorChannelControl R - R + R G - G + G B - B + B A - A + A H - 수평 + 수평 S - S + S V - V + V @@ -2556,14 +2588,14 @@ Are you sure ? Reset to default - 기본값으로 재설정 + 기본값으로 재설정 StyleIndexLineEdit current - 현재 + 현재 @@ -2646,7 +2678,7 @@ Are you sure ? ToneCurveField Channel: - 채널: + 채널: diff --git a/toonz/sources/translations/russian/image.ts b/toonz/sources/translations/russian/image.ts index efc8b7a..acc8248 100644 --- a/toonz/sources/translations/russian/image.ts +++ b/toonz/sources/translations/russian/image.ts @@ -4,12 +4,12 @@ AviWriterProperties - + Codec Кодек - + Uncompressed Без сжатия @@ -17,17 +17,17 @@ GifWriterProperties - + Scale Масштаб - + Looping Зациклить - + Generate Palette Создать палитру @@ -35,12 +35,12 @@ Mp4WriterProperties - + Quality Качество - + Scale Масштаб @@ -340,12 +340,12 @@ Please try raising the FFmpeg timeout in Preferences. WebmWriterProperties - + Quality Качество - + Scale Масштаб diff --git a/toonz/sources/translations/russian/tnzcore.ts b/toonz/sources/translations/russian/tnzcore.ts index c9ce570..007a79f 100644 --- a/toonz/sources/translations/russian/tnzcore.ts +++ b/toonz/sources/translations/russian/tnzcore.ts @@ -35,7 +35,7 @@ QObject - + colors цвета @@ -45,9 +45,8 @@ Пропуск кадра. - Malformed frame name - Неправильное имя файла + Неправильное имя файла diff --git a/toonz/sources/translations/russian/tnztools.ts b/toonz/sources/translations/russian/tnztools.ts index bfc4278..96c7568 100644 --- a/toonz/sources/translations/russian/tnztools.ts +++ b/toonz/sources/translations/russian/tnztools.ts @@ -112,7 +112,7 @@ BrushTool - + Size Размер @@ -121,12 +121,12 @@ Жесткость: - + Accuracy: Точность: - + Smooth: Плавность: @@ -151,18 +151,18 @@ Порядок палитры - + Preset: Предустановка: - - + + <custom> <пользовательская> - + Break Разрыв @@ -171,105 +171,105 @@ Карандаш - + Pressure Нажим - + Cap Конец - + Join Изгиб - + Miter: Скос: - + Range: Диапазон: - + Snap Привязка - + Off Выкл - + Linear Линейный - + In <<-< Замедл. в начале - + Out <-<< Замедл. в конце - + In&Out <<-<< В начале &в конце - + Low Низкий - + Med Средний - + High Высокий - + Butt cap Обрубок - + Round cap Закругленный - + Projecting cap Плоский колпачок - + Miter join Острый изгиб - + Round join Закругленный изгиб - + Bevel join Скошенный изгиб @@ -277,17 +277,17 @@ BrushToolOptionsBox - + Preset Name Имя предустановки - + OK OK - + Cancel Отмена @@ -316,7 +316,7 @@ DVGui::StyleIndexLineEdit - + current текущий @@ -324,161 +324,161 @@ EditTool - + Scale Constraint: Ограничение масштаба: - - + + None Нет - + A/R A/R - + Mass Масса - + Auto Select Column Автовыбор столбца - + Column Столбец - + Pegbar Pegbar - + Global Key Глобальный ключ - + Lock Center E/W Блокировать центр E/W - + Lock Center N/S Блокировать центр N/S - + Lock Position E/W Блокировать положение E/W - + Lock Position N/S Блокировать положение N/S - + Lock Rotation Блокировать вращение - + Lock Shear H Болкировать сдвиг H - + Lock Shear V Болкировать сдвиг V - + Lock Scale H Болкировать масштаб H - + Lock Scale V Болкировать масштаб V - + Lock Global Scale Болкировать глобальный масштаб - + E/W and N/S Positions E/W и N/S положение - + Z Position Z положение - + SO порядок размещения Порядок - - + + Rotation Вращение - + Global Scale Глобальный масштаб - + Horizontal and Vertical Scale Горизонтальное и вертикальное масштабирование - - + + Shear Скос - + Center Position Центральное положение - + Active Axis Активная ось - + Position Положение - + Scale Масштаб - + Center Центр - + All Все @@ -486,86 +486,86 @@ EraserTool - - + + Size: Размер: - - + + Selective Избирательно - - + + Invert Инвертировать - - + + Frame Range Диапазон кадров - - + + Type: Тип: - - + + Normal Обычный - - + + Rectangular Прямоугольный - - + + Freehand От руки - - + + Polyline Полилиния - + Hardness: Жесткость: - + Mode: Режим: - + Lines Линии - + Areas Области - + Lines & Areas Линии и области - + Pencil Mode Режим карандаша @@ -656,12 +656,12 @@ FingerTool - + Size: Размер: - + Invert Инвертировать @@ -669,44 +669,44 @@ FullColorBrushTool - - + + Size Размер - + Pressure Нажим - - + + Opacity Непрозрачность - + Hardness: Жесткость: - + Preset: Предустановка: - + Eraser Ластик - + Lock Alpha Заблокировать альфа канал - + <custom> <пользовательская> @@ -714,52 +714,52 @@ FullColorEraserTool - + Size: Размер: - + Opacity: Непрозрачность: - + Hardness: Жесткость: - + Type: Тип: - + Normal Обычный - + Rectangular Прямоугольный - + Freehand От руки - + Polyline Полилиния - + Invert Обратить - + Frame Range Диапазон кадров @@ -775,7 +775,7 @@ HandToolOptionsBox - + Reset Position @@ -791,7 +791,7 @@ MagnetTool - + Size: Размер: @@ -799,32 +799,32 @@ PaintBrushTool - + Size: Размер: - + Mode: Режим: - + Lines Линии - + Areas Области - + Lines & Areas Линии и области - + Selective Избирательно @@ -832,17 +832,17 @@ PinchTool - + Size: Размер: - + Corner: Угол: - + Manual Вручную @@ -1056,152 +1056,152 @@ Do you want to proceed? PrimitiveParam - + Shape: Фигура: - + Rectangle Прямоугольник - + Circle Круг - + Ellipse Эллипс - + Line Линия - + Polyline Полилиния - + Arc Дуга - + Polygon Многоугольник - + Size: Размер: - + Thickness: Толщина: - + Opacity: Непрозрачность: - + Hardness: Жесткость: - + Polygon Sides: Сторон многоугольника: - + Auto Group Автогруппировать - + Auto Fill Автозаливка - + Selective Избирательно - + Pencil Mode Режим карандаша - + Cap Конец - + Butt cap Обрубок - + Round cap Закругленный - + Projecting cap Плоский колпачок - + Join Изгиб - + Miter join Острый изгиб - + Round join Закругленный изгиб - + Bevel join Скошенный изгиб - + Miter: Скос: - + Snap Привязка - + Low Низкий - + Med Средний - + High Высокий @@ -1222,14 +1222,32 @@ Do you want to proceed? QObject - - + + The copied selection cannot be pasted in the current drawing. Скопированное выделение невозможно вставить в текущий рисунок. - - + + The selection cannot be updated. It is not editable. + + + + + + + The selection cannot be deleted. It is not editable. + + + + + + The selection cannot be pasted. It is not editable. + + + + + Paste Вставить @@ -1251,7 +1269,7 @@ Do you want to proceed? Задать окно сохранения : (X%1,Y%2,W%3,H%4)->(X%5,Y%6,W%7,H%8) - + Move Center Переместить центр @@ -1271,69 +1289,89 @@ Do you want to proceed? Отмена - + Group Сгруппировать - + Ungroup Разгруппировать - + to Front вперед - + to Forward на передний план - + to Back назад - + to Backward на задний план - + Move Group Переместить группу - - + + The selection cannot be grouped. It is not editable. + + + + + The selection cannot be entered. It is not editable. + + + + + The selection cannot be ungrouped. It is not editable. + + + + + The selection cannot be moved. It is not editable. + + + + + Yes Да - - + + No Нет - + Modify Fx Gadget Изменить Fx-гаджет - + The current column is locked. Текущий столбец на замке. - + The current column is hidden. Текущий столбец скрыт. - + It is not possible to edit the audio column. Невозможно редактировать столбец аудио. @@ -1342,79 +1380,79 @@ Do you want to proceed? Редактировать столбец Magpie невозможно. - + Note columns can only be edited in the xsheet or timeline. Столбцы заметок можно редактировать только в Xsheet или на временной шкале. - + The current tool cannot be used on a Level column. Текущий инструмент нельзя использовать в столбце уровня. - + The current tool cannot be used on a Mesh column. Текущий инструмент нельзя использовать в столбце полисетки. - + The current tool cannot be used in Level Strip mode. Текущий инструмент нельзя использовать в режиме "Полоса уровней". - + The current tool cannot be used to edit a motion path. Текущий инструмент не может использоваться для редактирования траектории. - - + + The current level is not editable. Текущий уровень не редактируется. - + The current tool cannot be used on a Vector Level. Текущий инструмент нельзя использовать в векторном уровне. - + The current tool cannot be used on a Toonz Level. Текущий инструмент нельзя использовать в Toonz уровне. - + The current tool cannot be used on a Raster Level. Текущий инструмент нельзя использовать в растровом уровне. - + The current tool cannot be used on a Mesh Level. Текущий инструмент нельзя использовать в уровне полисетки. - + The current tool cannot be used on a mesh-deformed level Текущий инструмент нельзя использовать в уровне деформации полисетки - + The current frame is locked: any editing is forbidden. Текущий кадр заблокирован: любое редактирование запрещено. - + %1 Level : %2 Frame : %3 %1 Уровень : %2 Кадр : %3 - - + + Modify Stroke Tool Изменить метод обводки - + Modify Spline Изменить сплайн @@ -1465,7 +1503,7 @@ Do you want to proceed? RGBPickerToolOptionsBox - + Pick Screen Экранный выбор @@ -1473,12 +1511,12 @@ Do you want to proceed? RasterSelectionTool - + Modify Savebox Изменить Savebox - + No Antialiasing Без сглаживания @@ -1552,7 +1590,7 @@ Do you want to proceed? RotateToolOptionsBox - + Reset Rotation @@ -1560,37 +1598,37 @@ Do you want to proceed? RulerToolOptionsBox - + X: ruler tool option X: - + Y: ruler tool option Y: - + W: ruler tool option Ш: - + H: ruler tool option В: - + A: ruler tool option У: - + L: ruler tool option Д: @@ -1599,22 +1637,22 @@ Do you want to proceed? SelectionTool - + Type: Тип: - + Rectangular Прямоугольный - + Freehand От руки - + Polyline Полилиния @@ -1622,48 +1660,48 @@ Do you want to proceed? SelectionToolOptionsBox - + H: H: - + V: V: - + Link Связать - - + + Rotation Вращение - + E/W: E/W: - + N/S: N/S: - + Scale Масштаб - + Position Положение - + Thickness Толщина @@ -1671,22 +1709,22 @@ Do you want to proceed? ShiftTraceToolOptionBox - + Reset Previous Сбросить изменения - + Reset Following Сбросить изменения - + Previous Drawing Предыдущий рисунок - + Following Drawing Следующий рисунок @@ -1780,7 +1818,7 @@ Do you want to proceed? StylePickerToolOptionsBox - + With this option being activated, the picked style will be moved to the end of the first page of the palette. При активации этого параметра, выбранный стиль будет перемещен в конец первой страницы палитры. @@ -1789,59 +1827,59 @@ moved to the end of the first page of the palette. ToonzRasterBrushTool - - + + Size Размер - + Hardness: Жесткость: - + Smooth: Плавность: - + Draw Order: Порядок рисовки: - + Over All Над всеми - + Under All Под всеми - + Palette Order Порядок палитры - + Preset: Предустановка: - - + + <custom> <пользовательская> - + Pencil Карандаш - + Pressure Нажим @@ -1872,22 +1910,22 @@ moved to the end of the first page of the palette. TypeTool - + Font: Шрифт: - + Style: Начертание: - + Vertical Orientation Вертикальная ориентация - + Size: Размер: @@ -1895,102 +1933,102 @@ moved to the end of the first page of the palette. VectorSelectionTool - + Mode: Режим: - + Standard Обычный - + Selected Frames Выбраные кадры - + Whole Level Уровень целиком - + Same Style Того же стиля - + Same Style on Selected Frames Того же стиля на выбранных кадрах - + Same Style on Whole Level Того же стиля во всем уровне - + Boundary Strokes Отделяющие линии - + Boundaries on Selected Frames Отделяющие линии на выбранных кадрах - + Boundaries on Whole Level Отделяющие линии на всём уровне - + Preserve Thickness Сохранять толщину - + Cap Конец - + Butt cap Обрубок - + Round cap Закругленный - + Projecting cap Плоский колпачок - + Join Изгиб - + Miter join Острый изгиб - + Round join Закругленный изгиб - + Bevel join Скошенный изгиб - + Miter: Скос: @@ -2051,7 +2089,7 @@ moved to the end of the first page of the palette. ZoomToolOptionsBox - + Reset Zoom diff --git a/toonz/sources/translations/russian/toonz.ts b/toonz/sources/translations/russian/toonz.ts index 8a12738..1c32d4c 100644 --- a/toonz/sources/translations/russian/toonz.ts +++ b/toonz/sources/translations/russian/toonz.ts @@ -582,12 +582,12 @@ Do you want to save your changes? BrowserPopup - + Choose Выбрать - + Path %1 doesn't exists. Пути %1 не существует. @@ -1392,32 +1392,32 @@ What do you want to do? Цветовая модель - + Use Current Frame Использовать текущий кадр - + Remove Color Model Удалить цветовую модель - + Update Colors by Using Picked Positions Обновить цвета с помощью выбранных позиций - + Reset View Вид по умолчанию - + Fit to Window По размеру окна - + It is not possible to retrieve the color model set for the current level. Не удается получить цветовую модель текущего уровня. @@ -1425,101 +1425,104 @@ What do you want to do? ComboViewerPanel - + GUI Show / Hide Показать / скрыть GUI - + Toolbar Панель инструментов - + Tool Options Bar Панель настройки инструментов - + Console Консоль - + Safe Area (Right Click to Select) Безопасная зона (Щелкните правой кнопкой мыши, чтобы выбрать) - + Field Guide Направляющая сетка - + Camera Stand View Стандартный вид с камеры - + 3D View 3D-просмотр - + Camera View Вид с камеры - + Freeze Заморозить - + Preview Предпросмотр - + Sub-camera Preview Предпросмотр суб-камеры - + Untitled Безымянный - - Scene: - Сцена: + + [SCENE]: + - - :: Project: + + [LEVEL]: - + Scene: + Сцена: + + + :: Frame: :: Кадр: - - - + + + (Flipped) (Перевёрнутый) - + :: Level: :: Уровень: - Level: - Уровень: + Уровень: @@ -1533,7 +1536,7 @@ What do you want to do? CommandBarListTree - + ----Separator---- ----Разделитель---- @@ -1541,42 +1544,42 @@ What do you want to do? CommandBarPopup - + XSheet Toolbar Панель инструментов Xsheet - + Customize XSheet Toolbar Настроить панель инструментов Xsheet - + Command Bar Панель команд - + Customize Command Bar Настройка панели команд - + OK OK - + Cancel Отмена - + Toolbar Items Элементы панели инструментов - + Duplicated commands will be ignored. Only the last one will appear in the menu bar. Дублированные команды будут игнорироваться. Только последняя появится в строке меню. @@ -1592,7 +1595,7 @@ What do you want to do? CommandListTree - + ----Separator---- ----Разделитель---- @@ -1613,185 +1616,190 @@ What do you want to do? ConvertPopup - + + Level %1 converting to same file format; skipped. + + + + Level %1 already exists; skipped. Уровень %1 уже существует; пропуск. - + Converting %1 Конвертация %1 - + Converting level %1 of %2: %3 Конвертация уровня %1 из %2: %3 - + Level %1 has no frame; skipped. Уровень %1 не имеет кадров; пропуск. - + Unpainted tlv Неокрашенный tlv - + Unpainted tlv from non AA source Неокрашенный tlv из источника без AA - + Painted tlv from two images Окрашенный tlv из двух изображений - + Painted tlv from non AA source Окрашенный tlv из источника без АА - - + + Same as Painted То же что и окрашенный - + Create new palette Создать новую палитру - + Options Опции - + Convert Конвертировать - - - + + + Cancel Отмена - + Bg Color: Цвет заднего плана: - + Skip Existing Files Пропустить существующие файлы - + Remove dot before frame number Удалите точку перед номером кадра - + Convert... Конвертировать... - + File to convert: Файл для конвертации: - + Start: Старт: - + End: Конец: - + Save in: Сохранить в: - + File Name: Имя файла: - + File Format: Формат файла: - + Stroke Mode: Режим обводки: - + Centerline Ось - + Outline Контур - + Unpainted File Folder: Папка неокрашенного файла: - + Unpainted File Suffix: Суффикс неокрашенного файла: - + Apply Autoclose Применить Autoclose - + Save Backup to "nopaint" Folder Сохранить резервную копию в папку «nopaint» - + Append Default Palette Добавить палитру по умолчанию - + Remove Unused Styles from Input Palette Удаление неиспользуемых стилей из палитры ввода - + Keep Original Antialiasing Сохранять оригинальное сглаживание - + Add Antialiasing with Intensity: Добавить сглаживание с интенсивностью: - + Remove Antialiasing using Threshold: Удалить сглаживание с использованием порога: - + When activated, styles of the default palette ($TOONZSTUDIOPALETTE\cleanup_default.tpl) will be appended to the palette after conversion in @@ -1803,22 +1811,22 @@ before color designing. сохранить попытки по созданию стилей перед рисованием цветом. - + Image DPI DPI изображения - + Current Camera DPI Текущее разрешение камеры в DPI - + Custom DPI Пользовательское значение DPI - + Specify the policy for setting DPI of converted tlv. If you select the "Image DPI" option and the source image does not contain the dpi information, then the current camera dpi will be used. @@ -1829,103 +1837,103 @@ contain the dpi information, then the current camera dpi will be used. - + Mode: Режим: - + Antialias: Сглаживание: - + Palette: Палитра: - + Tolerance: Допуск: - + Dpi: DPI: - + Convert 1 Level Конвертировать 1 уровень - + Convert %1 Levels Конвертировать%1 уровней - - + + Level Уровень - + already exists; skipped уже существует; пропущено - + Generating level Генерирование уровня - + converted to tlv. конвертировано в tlv. - + Level %1 converted to TLV Format Уровень %1 конвертирован в формат TLV - + Warning: Level %1 NOT converted to TLV Format Внимание: Уровень %1 НЕ конвертирован в формат TLV - + Converted %1 out of %2 Levels to TLV Format Конвертировано %1 из%2 Уровни в формат TLV - + Warning: Can't read palette '%1' Внимание: не удается прочитать палитру "%1" - + No output filename specified: please choose a valid level name. Не указано имя выходного файла: выберите допустимое имя уровня. - + No unpainted suffix specified: cannot convert. Нет неокрашенного суффикса: нельзя конвертировать. - + Convert completed with %1 error(s) and %2 level(s) skipped Конвертирование выполнено с ошибкой %1 и %2 уровни пропущены - + Convert completed with %1 error(s) Конвертирование выполнено с ошибкой %1 - + %1 level(s) skipped Уровень %1 пропущен @@ -1933,7 +1941,7 @@ contain the dpi information, then the current camera dpi will be used. DVGui::ProgressDialog - + Loading "%1"... Загрузка "%1"... @@ -2049,79 +2057,79 @@ contain the dpi information, then the current camera dpi will be used. DvDirTreeView - + There was an error copying %1 to %2 Произошла ошибка при копировании %1 в %2 - + Edit Редактировать - + Get Получить - + Put... Поместить... - + Delete Удалить - + Refresh Обновить - + Cleanup Очистка - + Purge Чистка - + Delete folder Удалить папку - + Yes Да - + No Нет - + It is not possible to delete the folder. Невозможно удалить папку. - + The local path does not exist: Не существует локального пути: - + Refreshing... Обновление... - - - + + + Refresh operation failed: Сбой операции обновления: @@ -2131,57 +2139,57 @@ contain the dpi information, then the current camera dpi will be used. DvItemViewerButtonBar - + Back Назад - + Forward Вперед - + Up One Level Открыть родительскую папку - + Up Вверх - + New Folder Новая папка - + New Новый - + Icons View Просмотр в виде значков - + Icon Значок - + List View Просмотр в виде списка - + List Список - + Export File List Экспорт списка файлов @@ -2189,12 +2197,12 @@ contain the dpi information, then the current camera dpi will be used. DvItemViewerPanel - + Save File List Сохранить список файлов - + File List (*.csv) Список файлов (* .csv) @@ -2256,82 +2264,82 @@ contain the dpi information, then the current camera dpi will be used. ExportLevelPopup::ExportOptions - + Background Color: Цвет фона: - + No Antialias Без сглаживания - + Vectors Export Box Параметры экспорта векторов - + Width: Ширина: - + Height: Высота: - + H Resolution: Горизонт. разрешение: - + V Resolution: Вертик. разрешение: - + Scale: Масштаб: - + Vectors Thickness Толщина векторов - + Mode: Режим: - + Scale Thickness Масштаб толщины - + Add Thickness Добавить толщину - + Constant Thickness Постоянная толщина - + Start: Старт: - + End: Конец: - + DPI: DPI: @@ -2455,201 +2463,202 @@ contain the dpi information, then the current camera dpi will be used. Папка: - + Open folder failed Не удалось открыть папку - + The input folder path was invalid. Недопустимый путь к папке ввода. - + Can't change file extension Не удалось расширение файла - + Can't set a drawing number Не удалось установить номер рисунка - + Can't rename. File already exists: Не удалось переименовать. Файл уже существует: - + Couldn't rename Не удалось переименовать - + Preview Screensaver Просмотр Screensaver - + Install Screensaver Установка Screensaver - + Load As Sub-xsheet Загрузить как Sub-xsheet - + Load Загрузить - + Rename Переименовать - + Convert to Painted TLV Конвертировать в окрашенный TLV - + Convert to Unpainted TLV Конвертировать в неокрашенный TLV - + Version Control Управление версиями - - + + Edit Редактировать - - + + Edit Frame Range... Изменить диапазон кадров... - - - + + + Put... Поместить... - - + + Revert Вернуть - - - - + + + + Get Получить - + Delete Удалить - + Get Revision... Пересмотреть... - + + Unlock Разблокировать - - - + + + Edit Info Изменить инфо - + Revision History... Пересмотреть историю... - + Unlock Frame Range Разблокировать диапазон кадров - + Save Scene Сохранить сцену - + Scene name: Название сцены: - + There was an error copying %1 to %2 Произошла ошибка при копировании %1 в %2 - + Convert To Unpainted Tlv Конвертировать в неокрашенный TLV - - + + Warning: level %1 already exists; overwrite? Внимание: уровень %1 уже существует; перезаписать? - - + + Yes Да - - + + No Нет - + Done: All Levels converted to TLV Format Выполнено: все уровни конвертированы в формат TLV - + Convert To Painted Tlv Конвертировать в окрашенный TLV - + Done: 2 Levels converted to TLV Format Выполнено: 2 уровня, конвертированы в формат TLV - + New Folder Новая папка - + It is not possible to create the %1 folder. Не удалось создать папку %1. @@ -2657,34 +2666,34 @@ contain the dpi information, then the current camera dpi will be used. FileBrowserPopup - - + + File name: Имя файла: - + OK OK - + Cancel Отмена - + Apply Применить - + Folder name: Имя папки: - - + + Invalid file Недопустимый файл @@ -2731,20 +2740,20 @@ contain the dpi information, then the current camera dpi will be used. Filmstrip - - - - + + + + - No Current Level - - Нет текущего уровня - - + Level Strip Level Strip - + Level: Уровень: @@ -2796,12 +2805,17 @@ Hold F3 Key on the Viewer to Show This Frame Only FilmstripFrames - + no icon нет значка - + + Auto Inbetween + + + + Linear Линейный @@ -2809,56 +2823,56 @@ Hold F3 Key on the Viewer to Show This Frame Only FlipBook - - + + Flipbook Flipbook - + The file name cannot be empty or contain any of the following characters:(new line) \ / : * ? " | Имя файла не может быть пустым или содержать любой из следующих символов: (новая строка) \ /: *? "| - + It is not possible to save because the selected file format is not supported. Это невозможно сохранить, потому что выбранный формат файла не поддерживается. - + File %1 already exists. Do you want to overwrite it? Файл «%1» уже существует. Хотите перезаписать его? - + It is not possible to save Flipbook content. Невозможно сохранить содержимое Flipbook. - + Saved %1 frames out of %2 in %3 Сохранено %1 кадр из %2 в %3 - + There are no rendered images to save. Нет отрендеренных изображений для сохранения. - - + + It is not possible to take or compare snapshots for Toonz vector levels. Невозможно получить или сравнить snapshots для векторных уровней Toonz. - + Rendered Frames :: From %1 To %2 :: Step %3 Рендер кадров :: От %1 до %2 :: Шаг %3 - + :: Shrink :: Сокращать @@ -2866,12 +2880,12 @@ Do you want to overwrite it? FlipbookPanel - + Safe Area (Right Click to Select) Безопасная зона (Щелкните правой кнопкой мыши, чтобы выбрать) - + Minimize Уменьшить @@ -2994,17 +3008,21 @@ Do you want to overwrite it? ImportMagpieFilePopup - Import Magpie File - Импортировать файл Magpie + Импортировать файл Magpie + + + + Import Toonz Lip Sync File + - + Load Загрузить - + %1 does not exist. %1 не существует. @@ -3012,39 +3030,39 @@ Do you want to overwrite it? InbetweenDialog - - + + Inbetween промежуточные кадры Автофазовка - + Linear Линейная - + Ease In Замедл. в начале - + Ease Out Замедл. в конце - + Ease In / Ease Out Замедл. в начале/в конце - + Interpolation: Интерполяция: - + Cancel Отмена @@ -3327,35 +3345,35 @@ Do you want to overwrite it? Имя уровня не определено: выберите допустимое имя уровня - + Invalid frame range Недопустимый диапазон кадров - + Invalid increment value Недопустимое значение прироста - + Invalid step value Недопустимое значение шага - - + + The level name specified is already used: please choose a different level name Указанное имя уровня уже используется: выберите другое имя уровня - + Folder %1 doesn't exist. Do you want to create it? Папки %1 не существует. Вы хотите создать ее? - + Unable to create Не удалось создать @@ -3363,158 +3381,176 @@ Do you want to create it? LevelSettingsPopup - - + + DPI: DPI: - - + + Premultiply Умножение - - + + White As Transparent Белый как прозрачный - - + + Add Antialiasing Добавить сглаживание - - + + Antialias Softness: Мягкость сглаживания: - - + + Subsampling: Субсемплинг: - + Level Settings Настройки уровня - + Scan Path: Путь сканирования: - + Forced Squared Pixel Принудительно квадратные пиксели - + Width: Ширина: - + Height: Высота: - + Use Camera DPI Использовать DPI камеры - + Camera DPI: Камера DPI: - + Image DPI: DPI изображения: - + Resolution: Разрешение: - + Image DPI DPI изображения - + Custom DPI Пользовательское значение DPI - + Name && Path Имя и путь - + Name: Имя: - + Path: Путь: - + Resolution Разрешение - + DPI && Resolution DPI и разрешение - Scan level - Уровень сканирования + Уровень сканирования - + Toonz Vector level Векторный уровень Toonz - + Toonz Raster level Растровый уровень Toonz - + + + + + + [Various] + + + + Raster level Растровый уровень - + Mesh level Уровень полисетки - + Palette level Уровень палитры - + + SubXsheet Level + + + + Sound Column Столбец со звуковой дорожкой - + + Another Level Type + + + + The file %1 is not a sound level. Файл %1 не является уровнем звука. @@ -3812,17 +3848,17 @@ Please use the frame numbers for reference. LoadColorModelPopup - + Load Color Model Загрузить цветовую модель - + Frames : Кадры: - + Load Загрузить @@ -3849,42 +3885,42 @@ Please use the frame numbers for reference. LoadImagesPopup - + Load Images Загрузить изображения - + Append Добавить - + From: От: - + To: До: - + Step: Шаг: - + Shrink: Сокращение: - + Load Загрузить - + Load / Append Images Загрузка / Добавление изображений @@ -3892,85 +3928,114 @@ Please use the frame numbers for reference. LoadLevelPopup - + Load Level Загрузить уровень - + Load Загрузить - + TLV Caching Behavior Кэширование данных изображения TLV - + Load Subsequence Level Загрузить субсеквенционный уровень - Arrangement in Xsheet - Расположение в Xsheet + Расположение в Xsheet - + (FILE DOES NOT EXIST) (ФАЙЛ НЕ СУЩЕСТВУЕТ) - + On Demand По требованию - + All Icons Все иконки - + All Icons & Images Все иконки и изображения - - + + From: От: - - + + To: До: - + + DPI: + DPI: + + + + Antialias Softness: + Мягкость сглаживания: + + + + Subsampling: + Субсемплинг: + + + Step: Шаг: - + Inc: ? Прирост: - + Level Name: Имя уровня: - + + Level Settings & Arrangement in Xsheet + + + + + Premultiply + + + + + White As Transparent + Белый как прозрачный + + + Frames: Кадры: - + :: :: @@ -3978,22 +4043,22 @@ Please use the frame numbers for reference. LoadScenePopup - + Load Scene Загрузить сцену - + Load Загрузить - + is not a scene file. не является файлом сцены. - + does not exist. не существует. @@ -4016,22 +4081,22 @@ Please use the frame numbers for reference. LoadSubScenePopup - + Load Sub-Xsheet Загрузить Sub-Xsheet - + Load Загрузить - + is not a scene file. не является файлом сцены. - + does not exist. не существует. @@ -4103,10 +4168,8 @@ Please use the frame numbers for reference. MagpieFileImportPopup - - Import Magpie File - Импортировать файл Magpie + Импортировать файл Magpie @@ -4114,9 +4177,19 @@ Please use the frame numbers for reference. Диапазон кадров - To: - До: + До: + + + + + Import Toonz Lip Sync File + + + + + To: + @@ -4134,23 +4207,23 @@ Please use the frame numbers for reference. Уровень: - + Phoneme Фонема - + Import Импорт - + Cancel Отмена - + The file path is missing. Отсутствует путь к файлу. @@ -4158,357 +4231,361 @@ Please use the frame numbers for reference. MainWindow - + Untitled Безымянный - + Cleanup Очистка - + PltEdit Палитра - + InknPaint InknPaint - + Xsheet Xsheet - + About OpenToonz О программе - + Close Закрыть - + + http://opentoonz.readthedocs.io + + + + Cannot delete Не удается удалить - + &New Scene &Новая сцена - + &Load Scene... &Загрузить сцену... - + &Save Scene &Сохранить сцену - + &Save Scene As... &Сохранить сцену как... - + &Save All &Сохранить все - + &Revert Scene &Откатить сцену - + &Load Folder... &Загрузить папку ... - + &Load As Sub-xsheet... &Загрузить как Sub-xsheet... - + &Open Recent Scene File &Открыть предыдущую сцену - + &Open Recent Level File &Открыть предыдущий уровень - + &Clear Recent Scene File List &Очистить список предыдущих сцен - + &Clear Recent level File List &Очистить список предыдущих уровней - + &New Level... &Новый уровень... - + &New Vector Level &Новый векторный уровень - + New Vector Level Новый векторный уровень - + &New Toonz Raster Level &Новый растровый уровень Toonz - + New Toonz Raster Level Новый растровый уровень Toonz - + &New Raster Level &Новый растровый уровень - + New Raster Level Новый растровый уровень - + &Load Level... &Загрузить уровень... - + &Save Level &Сохранить уровень - + &Save All Levels &Сохранить все уровни - + &Save Level As... &Сохранить уровень как... - + &Export Level... &Экспортировать уровень... - + &Convert File... &Конвертировать файл... - + &Save Palette As... &Сохранить палитру как... - + &Save Palette &Сохранить палитру - + &Load Color Model... &Загрузить цветовую модель... - &Import Magpie File... - &Импортировать файл Magpie... + &Импортировать файл Magpie... - + &New Project... &Новый проект... - + &Project Settings... &Настройки проекта... - + &Save Default Settings &Сохранить настройки по умолчанию - + &Output Settings... &Настройки вывода ... - + &Preview Settings... &Настройки предпросмотра... - + &Render &Рендер - + &Fast Render to MP4 &Рендер в MP4 - + &Preview &Предпросмотр - + &Export Soundtrack &Экспортировать звуковую дорожку - + &Save Previewed Frames &Сохранить кадры предпросмотра - + &Regenerate Preview &Регенерировать предпросмотр - + &Regenerate Frame Preview &Регенерировать предпросмотр кадра - + &Clone Preview &Клонировать предпросмотр - + &Freeze//Unfreeze Preview &Заморозить//разморозить предпросмотр - + Freeze Preview Заморозить предпросмотр - + Unfreeze Preview Разморозить предпросмотр - + &Save As Preset &Сохранить как предустановку - + &Preferences... &Настройки программы... - + &Configure Shortcuts... &Настройка горячих клавиш... - + &Print Xsheet &Экспортировать Xsheet в HTML - + Run Script... Запустить скрипт... - + Open Script Console... Открыть командную строку ... - + &Print Current Frame... &Распечатать текущий кадр... - + &Quit &Выйти - + Reload qss Обновить qss - + &Load Recent Image Files &Загрузить предыдущие файлы изображений - + &Clear Recent Flipbook Image List &Очистить список предыдущих изображений Flipbook - + Preview Fx Предпросмотр Fx - + &Select All &Выбрать все - + &Invert Selection &Обратить выделенное - + &Undo &Отменить - + &Redo &Повторить - + &Cut &Вырезать - + &Copy &Копировать @@ -4517,72 +4594,72 @@ Please use the frame numbers for reference. &Вставить - + &Merge &Слить - + &Paste Into &Поместить в - + &Paste Color && Name &Вставить цвет и имя - + Paste Color Вставить цвет - + Paste Name Вставить имя - + Get Color from Studio Palette Взять цвет из Studio Palette - + Toggle Link to Studio Palette Переключить линк на Studio Palette - + Remove Reference to Studio Palette Удалить референс на Studio Palette - + &Delete &Удалить - + &Insert &Вставить - + &Group &Сгруппировать - + &Ungroup &Разгруппировать - + &Bring to Front &На передний план - + &Bring Forward &На порядок выше @@ -4591,117 +4668,117 @@ Please use the frame numbers for reference. &На порядок ниже - + &Send Backward &На задний план - + &Enter Group &Войти в группу - + &Exit Group &Выйти из группы - + &Remove Vector Overflow &Удалить векторные излишки - + &Touch Gesture Control &Управление сенсорными жестами - + &Define Scanner... &Определить сканер... - + &Scan Settings... &Настройки сканера... - + &Scan &Сканирование - + &Autocenter... &Автоцентр... - + &Set Cropbox &Установить область обрезки - + &Reset Cropbox &Сбросить область обрезки - + &Cleanup Settings... &Настройки очистки... - + &Preview Cleanup &Просмотр очистки - + &Camera Test &Тестирование камеры - + &Opacity Check &Opacity Check - + &Cleanup &Очистка - + &Camera Capture... &Захват камеры... - + &Add Frames... &Добавить кадры... - + &Renumber... &Пересчитать... - + &Replace Level... &Заменить уровень ... - + &Revert to Cleaned Up &Возврат к очистке - + Separate Colors... Разделить цвета... - + Animate Tool Инструмент анимирования @@ -4710,847 +4787,991 @@ Please use the frame numbers for reference. &Возврат к последней сохраненной версии - + &Paste Insert &Вставить вставку - + &Paste Insert Above/After &Вставить копию спереди/сзади - + &Insert Above/After &Вставить пробел cпереди/сзади - + &Send to Back - + &Expose in Xsheet &Экспонировать в Xsheet - + &Display in Level Strip &Отобразить в Level Strip - + &Level Settings... &Настройки уровня... - + Adjust Levels... Коррекция цветовых уровней... - + Adjust Thickness... Отрегулировать толщину... - + &Antialias... &Сглаживание... - + &Binarize... &Бинаризация... - + &Brightness and Contrast... &Яркость и контрастность... - + &Color Fade... &Спад цвета... - + &Capture &Захват - + &Canvas Size... &Размер холста... - + &Info... &Инфо... - + &View... &Вид... - + &Remove All Unused Levels &Удалить все неиспользуемые в сцене уровни - + &Replace Parent Directory... &Заменить родительский каталог ... - + &Scene Settings... &Настройки сцены... - - + + &Camera Settings... &Настройки камеры... - + &Open Sub-xsheet &Открыть Sub-xsheet - + &Close Sub-xsheet &Закрыть Sub-xsheet - + Explode Sub-xsheet Разбить Sub-xsheet - + Collapse Коллапс - + Toggle Edit in Place Переключить Редактировать на месте - + &Save Sub-xsheet As... &Сохранить Sub-xsheet как... - + Resequence Пересчитать секвенцию - + Clone Sub-xsheet Клонировать Sub-xsheet - + &Apply Match Lines... &Применить разделительные линии... - + &Merge Tlv Levels... &Объединить уровни Tlv ... - + &Delete Match Lines &Удалить разделительные линии - + &Delete Lines... &Удалить линии... - + &Merge Levels &Объединить уровни - + &New FX... &Новый FX... - + &New Output &Новый вывод - &Edit FX... - &Редактировать FX... + &Редактировать FX... - + + &Import Toonz Lip Sync File... + + + + + Export Exchange Digital Time Sheet (XDTS) + + + + + &Clear Cache Folder + + + + Insert Frame Вставить кадр - + Remove Frame Удалить кадр - + Insert Multiple Keys Вставить несколько ключей - + Remove Multiple Keys Удаление нескольких ключей - + Remove Empty Columns Удалить пустые столбцы - + + Show/Hide Xsheet Camera Column + + + + &Reverse &Обратить - + &Swing &Добавить в обратном порядке - + &Random &Случайно - + &Autoexpose &Автоэкспонирование - + &Repeat... &Повторение... - + &Reset Step &Сбросить шаг - + &Increase Step &Увеличить шаг - + &Decrease Step &Уменьшить шаг - + &Step 2 &Шаг 2 - + &Step 3 &Шаг 3 - + &Step 4 &Шаг 4 - + &Each 2 &Каждые 2 - + &Each 3 &Каждые 3 - + &Each 4 &Каждые 4 - + &Roll Up думаю, так будет понятнее, чем "все кадры кроме первого наверх" &Первый вниз - + &Roll Down &Последний наверх - + &Time Stretch... &Растяжение времени... - + + &Create Blank Drawing + + + + &Duplicate Drawing &Дублировать рисунок - + &Autorenumber &Автопересчет - + &Clone &Клонировать - + Drawing Substitution Forward Заправка чертежа вперед - + Drawing Substitution Backward Заправка чертежа назад - + Similar Drawing Substitution Forward Заправка аналогичных чертежей вперед - + Similar Drawing Substitution Backward Заправка аналогичных чертежей назад - + 1's по 1 - + 2's по 2 - + 3's по 3 - + 4's по 4 - + &Fill In Empty Cells &Заполнить пустые ячейки - + &Set Key &Установить ключ - + + &Shift Keys Down + + + + + &Shift Keys Up + + + + &Camera Box &Граница камеры - + &Table &Таблица - + &Field Guide &Направляющая сетка - + &Raster Bounding Box &Растровая граница - + &Field Guide in Capture Window &Направляющая сетка в окне захвата - + &Safe Area &Безопасная зона - + &Camera BG Color &Цвет фона камеры - + &Guide &Ориентир - + &Ruler &Линейка - + &Transparency Check &Проверка прозрачности - + &Ink Check &Проверка штриха - + &Ink#1 Check &Проверка штриха#1 - + &Paint Check &Проверка цвета - + Inks &Only Только &линии - + &Fill Check &Проверка заполнения - + &Black BG Check &На чёрном фоне - + &Gap Check &Проверка замкнутости - + Shift and Trace Сдвинуть и калькировать (Shift and Trace) - + Edit Shift Редактировать сдвиг - + No Shift Без сдвига - + Reset Shift Сбросить сдвиг - + &Visualize Vector As Raster &Отображать вектор как растр - + &Histogram &Гистограмма - + Link Flipbooks Link Flipbooks - + Play Воспроизведение - + Loop По кругу - + Pause Пауза - + First Frame Первый кадр - + Last Frame Последний кадр - + Previous Frame Предыдущий кадр - + Next Frame Следующий кадр - + Next Drawing Следующий рисунок - + Prev Drawing Предыдущий рисунок - + Next Step Следующий шаг - + Prev Step Предыдущий шаг - + + Next Key + + + + + Prev Key + + + + Red Channel Красный канал - + Green Channel Зеленый канал - + Blue Channel Голубой канал - - + + &FX Editor + + + + + &Stop Motion Controls + + + + + &Online Manual... + + + + + Reset Zoom - - + + Reset Rotation - - + + Reset Position - - + + Flip Viewer Horizontally Отзеркалить горизонтально + + Capture Stop Motion Frame + + + + + Raise Stop Motion Opacity + + + + + Lower Stop Motion Opacity + + + + + Toggle Stop Motion Live View + + + + + Toggle Stop Motion Zoom + + + + + Lower Stop Motion Level Subsampling + + + + + Raise Stop Motion Level Subsampling + + + + + Go to Stop Motion Insert Frame + + + + + + + + Clear Cache Folder + + + + + There are no unused items in the cache folder. + + + + + Deleting the following items: + + + + + + <DIR> + + + + + ... and %1 more items + + + + + + +Are you sure? + +N.B. Make sure you are not running another process of OpenToonz, +or you may delete necessary files for it. + + + + + + Can't delete %1 : + + + Matte Channel Матовый канал - + Red Channel Greyscale Красный канал в оттенках серого - + Green Channel Greyscale Зеленый канал в оттенках серого - + Blue Channel Greyscale Голубой канал в оттенках серого - + Compare to Snapshot Сравнить с Snapshot - + Toggle Autofill on Current Palette Color Переключить автозаливку на текущий цвет палитры - + &Lock Room Panes &Заблокировать Room Panes - + &Export &Экспортировать - + &File Browser &Браузер файлов - + &Flipbook &Flipbook - + &Function Editor &Редактор функций - + &Level Strip &Level Strip - + &Palette &Палитра - + &Palette Gizmo &Палитра Gizmo - + &Delete Unused Styles &Удалить неиспользуемые стили - + &Tasks &Задания - + &Batch Servers &Пакетные серверы - + &Message Center &Центр сообщений - + &Color Model &Цветовая модель - + &Studio Palette &Палитра Studio - + &Schematic &Схема - + &Cleanup Settings &Настройки очистки - + &Scene Cast &Состав сцены - + &Style Editor &Редактор стилей - + &Toolbar &Панель инструментов - + &Tool Option Bar &Панель настройки инструментов - + &Viewer &Просмотрщик - + &LineTest Capture &LineTest захват - + &LineTest Viewer &LineTest просмотрщик - + &Xsheet &Xsheet - + &Timeline &Таймлайн - + &ComboViewer &ComboViewer - + &History &История - + Record Audio Запись аудио - + &Reset to Default Rooms &Сбросить вкладки по умолчанию - + Toggle Maximize Panel Переключить максимизацию панелей - + Toggle Main Window's Full Screen Mode Переключить главное окно в полноэкранный режим - + &About OpenToonz... &О программе... - + &Startup Popup... &Стартовое окно... - + &Blend colors &Смешивание цветов - + Onion Skin Toggle Переключение видимости кальки - + Zero Thick Lines Линии нулевой толщины - + Toggle Cursor Size Outline Переключить размер контура курсора - + Duplicate Дублировать - + Show Folder Contents Показать содержимое папки - + Convert... Конвертировать... - + Collect Assets Сбор активов - + Import Scene Импортировать сцену - + Export Scene... Экспортировать сцену... - + Convert to Vectors... Конвертировать в вектор... - + Tracking... Трекинг... - + Remove Level Удалить уровень - + Add As Render Task Добавить как задачу рендеринга - + Add As Cleanup Task Добавить как задачу очистки @@ -5559,32 +5780,32 @@ Please use the frame numbers for reference. Выделить все ключи в этом ряду - + Select All Keys in this Column Выделить все ключи в этом столбце - + Select All Keys Выделить все ключи - + Select All Following Keys Выделить все следующие ключи - + Select All Previous Keys Выделить все предыдущие ключи - + Select Previous Keys in this Column Выделить предыдущие ключи в этом столбце - + Select Following Keys in this Column Выделить все следующие ключи в этом столбце @@ -5597,247 +5818,247 @@ Please use the frame numbers for reference. Выделить все следующие ключи в этом ряду - + &Reload &Перезагрузить - + &Toggle Edit In Place &Редактировать на месте - + New Note Level Новый уровень заметок - + &Apply Lip Sync Data to Column &Применить данные липсинга к столбцу - + Toggle XSheet Toolbar Показать/скрыть панель Xsheet - + Reframe with Empty Inbetweens... Перекадрировать с пустыми промежутками... - + Auto Input Cell Number... Автоматический ввод номера ячейки... - + &Paste Numbers &Вставлять номер видео - + Alpha Channel Альфа-канал - + &Command Bar &Панель команд - + Toggle Current Time Indicator Скрыть/показать индикатор кадра - + Vectors to Toonz Raster Конвертировать вектор в Toonz растр - + Replace Vectors with Simplified Vectors Заменить вектора упрощенными векторами - + Select All Keys in this Frame Выделить все ключи в этом кадре - + Select Previous Keys in this Frame Выделить все предыдущие ключи перед кадром - + Select Following Keys in this Frame Выделить все последующие ключи после кадра - + Invert Key Selection Инвертировать выбор ключей - + Set Acceleration Установка ускорения - + Set Deceleration Установка замедления - + Set Constant Speed Установить постоянную скорость - + Reset Interpolation Сбросить интерполяцию - + Linear Interpolation Линейная интерполяция - + Speed In / Speed Out Interpolation Интерполяция ускорения в начале/в конце - + Ease In / Ease Out Interpolation Интерполяция замедления в начале/в конце - + Ease In / Ease Out (%) Interpolation Интерполяция замедления в начале/в конце (%) - + Exponential Interpolation Экспоненциальная интерполяция - + Expression Interpolation Интерполяция выражений - + File Interpolation Интерполяция из файла - + Constant Interpolation Постоянная интерполяция - + Fold Column Свернуть столбцы - + Show This Only Показать только это - + Show Selected Показать выбранные - + Show All Показать все - + Hide Selected Скрыть выбранные - + Hide All Скрыть все - + Toggle Show/Hide Переключить: Показать/Спрятать - + ON This Only ВКЛ только это - + ON Selected ВКЛ выбранные - + ON All ВКЛ все - + OFF All ВЫКЛ все - + OFF Selected ВЫКЛ выбранные - + Swap ON/OFF Переключить ВКЛ/ВЫКЛ - + Lock This Only Заблокировать это только - + Lock Selected Заблокировать выбранные - + Lock All Заблокировать все - + Unlock Selected Разблокировать выбранные - + Unlock All Разблокировать все - + Swap Lock/Unlock Переключатель Блокировать/Разблокировать - + Hide Upper Columns Скрыть верхние столбцы @@ -5846,160 +6067,160 @@ Please use the frame numbers for reference. Инструмент редактирования - + Selection Tool Инструмент выделения - + Brush Tool Кисть - + Geometric Tool Геометрический инструмент - + Type Tool Инструмент шрифта - + Fill Tool Заливка - + Paint Brush Tool Инструмент покраски - + Eraser Tool Ластик - + Tape Tool Скотч - + Style Picker Tool Пипетка - + RGB Picker Tool Инструмент RGB пипетка - + Control Point Editor Tool Редактор контрольных точек - + Pinch Tool Щипок - + Pump Tool Насос - + Magnet Tool Магнит - + Bender Tool Клещи - + Iron Tool Утюг - + Cutter Tool Нож - + Skeleton Tool Скелет - + Tracker Tool Трекер - + Hook Tool Крюк - + Zoom Tool Лупа - + Rotate Tool Поворот - + Hand Tool Рука - + Plastic Tool Plastic Tool - + Ruler Tool Рулетка - + Finger Tool Палец - + Zoom In Приблизить - + Zoom Out Отдалить - - + + Reset View Вид по умолчанию - - + + Fit to Window По размеру окна - - + + Actual Pixel Size Фактический пиксельный размер @@ -6008,363 +6229,398 @@ Please use the frame numbers for reference. Повернуть просмотр горизонтально - - + + Flip Viewer Vertically Повернуть просмотр вертикально - + Show//Hide Full Screen Показать // Скрыть полный экран - + Full Screen Mode Полноэкранный режим - + Exit Full Screen Mode Выход из полноэкранного режима - + + Select Next Frame Guide Stroke + + + + + Select Previous Frame Guide Stroke + + + + + Select Prev && Next Frame Guide Strokes + + + + + Reset Guide Stroke Selections + + + + + Tween Selected Guide Strokes + + + + + Tween Guide Strokes to Selected + + + + + Select Guide Strokes && Tween Mode + + + + Refresh Folder Tree Обновить дерево папок - + Refresh Обновить - + Global Key Глобальный ключ - + Brush size - Increase max Размер кисти - Увеличить макс - + Brush size - Decrease max Размер кисти - Уменьшение макс - + Brush size - Increase min Размер кисти - Увеличить мин - + Brush size - Decrease min Размер кисти - Уменьшение мин - + Brush hardness - Increase Жесткость кисти - увеличение - + Brush hardness - Decrease Жесткость кисти - уменьшение - + SnapSensitivity Чувствительность - + Auto Group Автогруппа - + Break sharp angles Разрыв острых углов - + Frame range Диапазон кадров - + Inverse kinematics Инверсная кинематика - + Invert Инвертировать - + Manual Вручную - + Onion skin Калька - + Orientation Ориентация - + Pencil Mode Режим карандаша - + Preserve Thickness Сохранять толщину - + Pressure Sensitivity Чувствительность к давлению - + Segment Ink Сегмент Ink - + Selective Избирательно - + Brush Tool - Draw Order Кисть - порядок рисования - + Smooth Гладкий - + Snap Привязка - + Auto Select Drawing Автоматический выбор рисунка - + Auto Fill Автозаливка - + Join Vectors Объединить векторы - + Show Only Active Skeleton Показать только активный скелет - + Brush Tool - Eraser (Raster option) - + Brush Tool - Lock Alpha - + Brush Preset Предустановка кисти - + Geometric Shape Геометрическая форма - + Geometric Edge Геометрический край - + Mode Режим - + Mode - Areas Режим - Области - + Mode - Lines Режим - Линии - + Mode - Lines & Areas Режим - Линии и Области - + Type Тип - + Type - Normal Тип - обычный - + Type - Rectangular Тип - Прямоугольный - + Type - Freehand Тип - От руки - + Type - Polyline Тип - Полилиния - + TypeTool Font Шрифт - + TypeTool Size Размер шрифта - + TypeTool Style Стиль шрифта - + Active Axis Активная ось - + Active Axis - Position Активная ось - расположение - + Active Axis - Rotation Активная ось - вращение - + Active Axis - Scale Активная ось - масштаб - + Active Axis - Shear Активная ось - сдвиг - + Active Axis - Center Активная ось - центр - + Active Axis - All Активные оси - все - + Build Skeleton Mode Режим создания скелета - + Animate Mode Режим анимации - + Inverse Kinematics Mode Режим инверсной кинематики - + None Pick Mode Объектов выделения - нет - + Column Pick Mode Режим выбора столбца - + Pegbar Pick Mode Режим выбора Pegbar - + Pick Screen Кликнуть по экрану - + Create Mesh Создать полисетку - + Fill Tool - Autopaint Lines Заливка - авторисовка линий - + Fill Tool - Areas Заливка - Области - + Fill Tool - Lines Заливка - Линиии - + Style Picker Tool - Areas Инструмент выбора стиля - Области - + Style Picker Tool - Lines Инструмент выбора стиля - Линии - + Toggle FX/Stage schematic Переключение Схемы Fx @@ -6453,32 +6709,32 @@ Gaps MenuBarPopup - + Customize Menu Bar of Room "%1" Настроить панель вкладок «%1» - + OK OK - + Cancel Отмена - + %1 Menu Bar %1 Панель меню - + Menu Items Пункты меню - + N.B. If you put unique title to submenu, it may not be translated to another language. N.B. Duplicated commands will be ignored. Only the last one will appear in the menu bar. Примечание: Если вы поместите уникальный заголовок в подменю, он не может быть переведен на другой язык. @@ -6751,88 +7007,88 @@ What do you want to do? Сделать стереоскопию - + Standard Простое - + Improved Улучшенный - + High Высокий - + Triangle filter Треугольный фильтр - + Mitchell-Netravali filter Фильтр Митчелла-Нетравали - + Cubic convolution, a = .5 Кубическая свертка, a = .5 - + Cubic convolution, a = .75 Кубическая свертка, a = .75 - + Cubic convolution, a = 1 Кубическая свертка, a = 1 - + Hann window, rad = 2 ? Hann window, rad = 2 - + Hann window, rad = 3 Hann window, rad = 3 - + Hamming window, rad = 2 Hamming window, rad = 2 - + Hamming window, rad = 3 Hamming window, rad = 3 - + Lanczos window, rad = 2 Lanczos window, rad = 2 - + Lanczos window, rad = 3 Lanczos window, rad = 3 - + Gaussian convolution Гауссова свертка - + Closest Pixel (Nearest Neighbor) Ближайший пиксель (ближайший соседний) - + Bilinear Билинейный @@ -7028,34 +7284,34 @@ The parameters to be saved are: Сдвиг камеры: - + Add preset Добавить предустановку - + Enter the name for the output settings preset. Введите имя для заданных параметров вывода. - + Add output settings preset Добавить предустановку настроек вывода - + <custom> <пользовательский> - + Remove preset Удалить пресет - - - + + + Warning Предупреждение @@ -7063,7 +7319,7 @@ The parameters to be saved are: OverwriteDialog - + Level "%1" already exists. What do you want to do? @@ -7771,200 +8027,192 @@ Set the output folder path to the subfolder as well. PreferencesPopup - + New Level Format Формат нового уровня - + Assign the new level format name: Назначьте имя формата нового уровня: - + New Format Новый формат - + Numpad keys are assigned to the following commands. Is it OK to release these shortcuts? Клавиши Numpad назначаются следующим командам. Хотите их изменить? - + OK OK - + Cancel Отмена - + Preferences Настройки программы - + General Общие - + Use Default Viewer for Movie Formats Использовать средство просмотра по умолчанию для форматов видео - + Minimize Raster Memory Fragmentation * Минимизировать фрагментацию памяти в растре* - + Save Automatically Сохранять автоматически - + Automatically Save the Scene File Сохранять файл сцены - + Automatically Save Non-Scene Files Сохранять файлы без сцены - + Show Startup Window when OpenToonz Starts Показывать стартовое окно при запуске OpenToonz - + Replace Toonz Level after SaveLevelAs command Заменять уровень Toonz после команды "Сохранить уровень как" - Backup Animation Levels when Saving - Делать резервные копии уровней при сохранении + Делать резервные копии уровней при сохранении - + Show Info in Rendered Frames Показывать информацию в отрендереных кадрах - + Watch File System and Update File Browser Automatically Автоматически просматривать файловую систему и обновлять браузер файлов - + My Documents/OpenToonz* Мои Документы/OpenToonz* - + Desktop/OpenToonz* Рабочий стол/OpenToonz* - Stuff Folder* - Папка Stuff* + Папка Stuff* - + Custom* 3 файла с звёздочкой * выше решил не переводить другое* - + Custom Project Path(s): Пользовательский путь(и) проекта: - + Advanced: Multiple paths can be separated by ** (No Spaces) Дополнительно: несколько путей могут быть разделены ** (без пробелов) - - - - - - + * Changes will take effect the next time you run Toonz * Изменения вступят в силу после перезапуска OpenToonz - + Interface Интерфейс - + All imported images will use the same DPI Все импортированные изображения будут использовать один и тот же DPI - + Move Current Frame by Clicking on Xsheet / Numerical Columns Cell Area Переместить текущий кадр, нажав на ячейку Xsheet / числовую область ячейки столбца - + Show Raster Images Darken Blended Отображать растровые изображения в режиме наложения Darken - + Color Calibration using 3D Look-up Table * Коррекция цвета с помощью 3D-таблицы поиска * - + Antialiased Region Boundaries Границы области с сглаживанием - + Down Arrow at End of Level Strip Creates a New Frame Стрелка вниз в конце Level Strip создает новый кадр - Enable auto-stretch frame - Заполнение пустых кадров + Заполнение пустых кадров - + Show Cursor Size Outlines Показать форму кисти - + Expand Function Editor Header to Match Xsheet Toolbar Height* Развернуть заголовок редактора функций, чтобы соответствовать высоте панели инструментов XSheet * - + Open Flipbook after Rendering Открыть Flipbook после рендеринга - + Enable Actual Pixel View on Scene Editing Mode Включить реальный пиксельный просмотр в режиме редактирования сцены - + Display Level Name on Each Marker Отображать имя уровня на каждом маркере @@ -7974,17 +8222,17 @@ Is it OK to release these shortcuts? Показать растровые изображения Darken Blended in Camstand View - + Show "ABC" Appendix to the Frame Number in Xsheet Cell Показывать «ABC» суффикс к номеру кадра в ячейке Xsheet - + Visualization Визуализация - + Show Lines with Thickness 0 Показать линии с нулевой толщиной @@ -7993,308 +8241,323 @@ Is it OK to release these shortcuts? Сглаженные границы областей - + Loading Загрузка - + Expose Loaded Levels in Xsheet Экспонировать загруженные уровни в Xsheet - + Create Sub-folder when Importing Sub-xsheet Создавать подпапки при импорте Sub-xsheet - + Use Camera DPI for All Imported Images Применять разрешение камеры ко всем импортированным изображениям - + Automatically Remove Scene Number from Loaded Level Name Автоматически удалять номер сцены из имени загруженного уровня - + Edit Правка - + Import/Export Импорт/Экспорт - + Drawing Рисунок - + DPI: DPI: - + New Levels Default to the Current Camera Size Новые уровни по умолчанию текущего разрешения камеры - + Keep Original Cleaned Up Drawings As Backup Сохранять оригинальные очищенные рисунки в качестве резервной копии - + Multi Layer Style Picker : Switch Levels by Picking Многослойная пипетка: Переключение уровней путем выбора - + Use the TLV Savebox to Limit Filling Operations Используйте команду «Сохранить в TLV» для ограничения заливки - + Minimize Savebox after Editing Минимизировать Savebox после правки - + Saving Сохранение - + Use Numpad and Tab keys for Switching Styles Использовать клавиши Numpad и Tab для переключения стилей - + Keep fill when using "Replace Vectors" command Сохранять заливку при использовании команды "Заменить векторы " - + Use higher DPI for calculations - Slower but more accurate Режим высокого разрешения - медленнее, но точнее - + Tools Инструменты - + Small Маленький - + Large Большой - + Crosshair прицел - + + Default По умолчанию - + Left-Handed Левша - + Simple Простой - + Xsheet Xsheet - + Xsheet Autopan during Playback Автозапуск Xsheet во время воспроизведения - + Ignore Alpha Channel on Levels in Column 1 Игнорировать альфа-канал на уровнях в столбце 1 - + Show Keyframes on Cell Area Показывать ключи в областях ячеек - + Use Arrow Key to Shift Cell Selection Использовать клавиши-стрелки для добавления ячеек к выбору - + Enable to Input Cells without Double Clicking Редактировать ввод ячеек одним кликом - + Enable OpenToonz Commands' Shortcut Keys While Renaming Cell Разрешить хоткеи команд OpenToonz при переименовании ячеек - + Show Toolbar in the XSheet Показывать панель инструментов в Xsheet - + Show Column Numbers in Column Headers Отображать номера столбцов в их заголовках - + Sync Level Strip Drawing Number Changes with the Xsheet Синхронно менять номер наброска в Level Strip с Xsheet - + + Incremental + + + + + Enable Tools For Level Only + + + + + Show Tools For Level Only + + + + Classic Классический - + Classic-revised Классический-пересмотренный - + Compact Компактный - + Show Current Time Indicator (Timeline Mode only) Показывать индикатор текущего времени (только на таймлайне) - + Animation Анимация - + Preview Предпросмотр - + Rewind after Playback Возврат к началу по окончанию воспроизведения - + Display in a New Flipbook Window Отображение в новом окне Flipbook - + Fit to Flipbook По размеру Flipbook - + Onion Skin Калька - + Onion Skin ON Включить кальку - + Show Onion Skin During Playback Показывать кальку во время воспроизведения - + Use Onion Skin Colors for Reference Drawings of Shift and Trace Использовать цвета кальки для референсных рисунков Shift and Trace - + Display Lines Only Отображать только линии - + Check for the Latest Version of OpenToonz on Launch Проверять наличие последней версии OpenToonz при запуске - Tablet Settings - Настройки планшета + Настройки планшета - + Enable Windows Ink Support* (EXPERIMENTAL) Включить Windows Ink Support* (ЭКСПЕРИМЕНТАЛЬНО) - + Choosing this option will set initial location of all file browsers to $scenefolder. Also the initial output destination for new scenes will be set to $scenefolder as well. Выберите этот параметр, чтобы задать начальный путь для всех обозревателей файлов для $scenefolder. Кроме того, папка назначения визуализации на момент создания новой сцены также имеет значение $scenefolder. - + Graph Editor Opens in Popup Редактор графиков открывается во всплывающем окне - + Spreadsheet Opens in Popup Электронная таблица откроется во всплывающем окне - + Toggle Between Graph Editor and Spreadsheet Переключение между редактором графиков и электронной таблицей - + Constant Постоянная - + Exponential Экспоненциальная - + Expression Выражение - + File Из файла - + Function Editor*: Редактор функций*: @@ -8303,240 +8566,241 @@ Also the initial output destination for new scenes will be set to $scenefolder a Начертание *: - + 3DLUT File for [%1] *: 3DLUT файл для [%1]*: - + OpenToonz can use FFmpeg for additional file formats. OpenToonz может использовать FFmpeg для дополнительных форматов файлов. - + FFmpeg is not bundled with OpenToonz. FFmpeg не поставляется с OpenToonz. - + Cursor Options Настройки курсора - + Basic Cursor Type: Базовый тип курсора: - + Cursor Style: Стиль курсора: - + Column Header Layout*: Макет заголовка столбца*: - + Transparency Check Проверка прозрачности - + Version Control Управление версиями - + Enable Version Control* Включить систему управления версиями* - + Automatically Refresh Folder Contents Автоматически обновлять содержимое папки - + Project Folder Aliases (+drawings, +scenes, etc.) Псевдонимы папок проекта (+drawings, +scenes, и т.д.) - + Scene Folder Alias ($scenefolder) Псевдоним папки сцены ($scenefolder) - + Use Project Folder Aliases Only Использовать только псевдонимы папок проекта - + This option defines which alias to be used if both are possible on coding file path. Этот параметр используется для замены пути к файлу псевдонимом. Задайте предпочитаемый псевдоним. - + Always ask before loading or importing Всегда спрашивать перед загрузкой или импортом - + Always import the file to the current project Всегда импортировать файл в текущий проект - + Always load the file from the current location Всегда загружать файл из текущего местоположения - + Strokes Штрихи - + Guides Руководства - + All Все - + Open the dropdown to display all options Раскрывающийся список для отображения всех параметров - + Cycle through the available options Циклический выбор параметров - + Cells Only Только ячейки - + Cells and Column Data Ячейки и данные столбцов - + Theme: Тема: - + Font *: Шрифт: - + Style *: Начертание *: - + Default File Import Behavior: Импорт файлов по умолчанию: - + Default TLV Caching Behavior: Кэшировать TLV изображения: - + Column Icon: Значок столбца: - + cm см - + mm мм - + inch дюйм - + field поле - + + + + + pixel пиксель - + Mouse Cursor да, всё верно курсора - + Viewer Center центра - - - + + On Demand По требованию - + All Icons Все иконки - + All Icons & Images Все иконки и изображения - - - + At Once Сразу - + Life is too short for Comic Sans это пасхалка, похоже Жизнь слишком коротка для Comic Sans - + Good luck. You're on your own from here. и это, видимо, тоже Удачи. Вы сами отсюда. - + Colors Цвета @@ -8549,92 +8813,95 @@ if both are possible on coding file path. Интеграция похожих цветов в один стиль - + Toonz Vector Level Векторный уровень Toonz - + Toonz Raster Level Растровый уровень Toonz - + Raster Level Растровый уровень - Disabled - Отключено + Отключено - Enabled - Включено + Включено - + Use Xsheet as Animation Sheet Использовать Xsheet как лист анимации - + Linear Линейный - + Speed In / Speed Out Ускор. в начале/в конце - + Ease In / Ease Out Замедл. в начале/в конце - + Ease In / Ease Out % Замедл. в начале/в конце % - + Arrow Markers Стрелки-маркеры направления - + Animated Guide Анимированные стрелки - + + Touch/Tablet Settings + + + + Category Категория - + Interval(Minutes): Интервал (в минутах): - + Undo Memory Size (MB) Емкость памяти отмен (МБ) - + Render Task Chunk Size: Размер блока рендерных задач: - + Additional Project Locations Дополнительные местоположения корневой папки проектов - + Path Alias Priority: Приоритет псевдонимов, используемых для путей к файлам: @@ -8643,86 +8910,85 @@ if both are possible on coding file path. Стиль: - + Pixels Only: Только пиксели: - + Unit: Единицы: - + Camera Unit: Единицы камеры: - + Rooms*: Закладки Rooms*: - + Icon Size * Размер иконки * - X - X + X - + Viewer Shrink ? Viewer Shrink - + Step Шаг - + Matte color is used for background when overwriting raster levels with transparent pixels in non alpha-enabled image format. Матовый цвет используется для фона при перезаписи растровых уровней прозрачными пикселями в формате изображения без альфа. - + Matte color: Матовый цвет: - + Viewer BG Color Цвет фона просмотра - + Preview BG Color Цвет фона предпросмотра - + ChessBoard Color 1 Цвет клетки 1 - + Chessboard Color 2 Цвет клетки 2 - + Viewer Zoom Center дальше будет понятно из контекста Зуммировать относительно - + Language *: Язык *: @@ -8735,7 +9001,7 @@ in non alpha-enabled image format. Иконка столбца - + Level Settings by File Format: Настройки уровня по формату файла: @@ -8760,170 +9026,224 @@ in non alpha-enabled image format. СОХРАНИТЕ ВАШУ РАБОТУ перед экспортом в формате MP4, WEBM или GIF. - + Please provide the path where FFmpeg is located on your computer. Укажите путь, где FFmpeg находится на вашем компьютере. - + FFmpeg Path: Путь к FFmpeg: - + Number of seconds to wait for FFmpeg to complete processing the output: Количество секунд ожидания FFmpeg для завершения обработки выходных данных: - + Note: FFmpeg begins working once all images have been processed. Примечание: FFmpeg начинает работать после обработки всех изображений. - + FFmpeg Timeout: FFmpeg перерыв: - + Please indicate where you would like exports from Fast Render(MP4) to go. Укажите, где вы хотите экспортировать Fast Render (MP4) для перехода. - + Fast Render Path: Путь быстрого рендера: - + Scan File Format: Формат файла сканирования: - + Default Level Type: Тип уровня по умолчанию: - + Width: Ширина: - + Height: Высота: - Autocreation: - Автосоздание: + Автосоздание: - + Vector Snapping: Векторная привязка: - + Replace Vectors with Simplified Vectors Command Заменить векторы упрощенными векторами - + Dropdown Shortcuts: Хоткеи выпадающего списка: - - Next/Previous Step Frames: - Шаг следующего/предыдущего кадра: + + Backup Scene and Animation Levels when Saving + - - Cell-dragging Behaviour: - Поведение при перетаскивании ячейки: + + # of backups to keep: + - + + Enable Autocreation + + + + + Numbering System: + + + + + Enable Auto-stretch Frame + + + + + Enable Creation in Hold Cells + + + + + Enable Autorenumber + + + + + Toolbar Display Behaviour: + + + + + Next/Previous Step Frames: + Шаг следующего/предыдущего кадра: + + + + Cell-dragging Behaviour: + Поведение при перетаскивании ячейки: + + + + Show Camera Column + + + + Current Column Color: Текущий цвет столбца: - + Default Interpolation: Интерполяция по умолчанию: - + Animation Step: Шаг анимации: - + Blank Frames: Пустые кадры: - + Blank Frames Color: Цвет пустых кадров: - + Paper Thickness: Толщина бумаги: - + Previous Frames Correction: Коррекция предыдущих кадров: - + Following Frames Correction: Коррекция последующих кадров: - + Vector Guided Style: Вид векторного гида: - + + Level Editor Box Color + + + + Ink Color on White Bg: Цвет штриха на белом фоне: - + Ink Color on Black Bg: Цвет штриха на черном фоне: - + Paint Color: Цвет краски: + + + Enable Touch Gesture Controls + + PreferencesPopup::FormatProperties - + Level Settings by File Format Настройки уровня по формату файла - + Name: Имя: - + Regular Expression: Регулярное выражение: - + Priority Приоритет @@ -9004,39 +9324,39 @@ Do you want to overwrite it? ProjectCreatePopup - + New Project Новый проект - + OK OK - + Cancel Отмена - + Project Name cannot be empty or contain any of the following characters: \ / : * ? " < > | Имя проекта не может быть пустым или содержать любой из следующих символов: \ /: *? "<> | - + Bad project name: '%1' looks like an absolute file path Плохое имя проекта: «%1» выглядит как абсолютный путь к файлу - + Project '%1' already exists Проект «%1» уже существует - + It is not possible to create the %1 project. Не удалось создать проект %1. @@ -9072,7 +9392,7 @@ Do you want to overwrite it? ProjectSettingsPopup - + Project Settings Настройки проекта @@ -9183,17 +9503,17 @@ Do you want to overwrite it? QApplication - + New Scene Новая сцена - + Load Scene Загрузить сцену - + Quit Выйти @@ -9201,26 +9521,28 @@ Do you want to overwrite it? QObject + - - - - - - + + + + + + Yes Да + - - - - - - - + + + + + + + No Нет @@ -9237,19 +9559,22 @@ Do you want to overwrite it? Автоматический ввод номера ячейки : %1 + + + - - - - - - + + + + + + - - + + Overwrite Перезаписать @@ -9265,6 +9590,9 @@ Do you want to overwrite it? Применить + + + @@ -9275,39 +9603,40 @@ Do you want to overwrite it? - - - + + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - + + - + Cancel @@ -9437,7 +9766,7 @@ Save the scene first. - + The resolution of the output camera does not fit with the options chosen for the output file format. Разрешение выходной камеры не соответствует параметрам, выбранным для формата выходного файла. @@ -9541,13 +9870,13 @@ Save the scene first. Не выбрано ни одного уровня! - + Move Keyframe Переместить ключевой кадр - + Cleanup Settings Настройки очистки @@ -9565,8 +9894,8 @@ Save the scene first. - - + + Don't Overwrite Не перезаписывать @@ -9601,8 +9930,8 @@ Do you want to save your changes? - - + + Save Сохранить @@ -9641,7 +9970,7 @@ Are you sure ? - + Delete Удалить @@ -9687,115 +10016,115 @@ Are you sure ? Активировать кальку - + Saving previewed frames.... Сохранение кадров предпросмотра .... - + %1 has an invalid extension format. %1 имеет недопустимый формат расширения. - - + + None Ничего - + Edited Отредактированный - + Normal Нормальный - + To Update Обновить - + Modified Модифицированный - + Locked Заблокированный - + Unversioned Без версии - + Missing Отсутствует - + Partially Edited Частично отредактирован - + Partially Locked Частично заблокирован - + Partially Modified Частично модифицирован - + Name Имя - + Path Путь - - + + Date Created Дата создания - - + + Date Modified Дата изменения - - + + Size Размер - - + + Frames Кадры - - + + Version Control Контроль версий - - + + Type Тип @@ -9810,47 +10139,52 @@ Are you sure ? Хранить оригинальную палитру - + Insert Frame at Frame %1 Вставить рамку в кадр %1 - + Remove Frame at Frame %1 Удалить рамку в кадре %1 - + Insert Multiple Keys at Frame %1 Вставка нескольких ключей в кадр %1 - + Remove Multiple Keys at Frame %1 Удаление нескольких ключей в кадре %1 - - + + Change current drawing %1 Изменить текущий рисунок %1 - + New Note Level Новый уровень заметок - + Set Keyframe : %1 Установить ключевой кадр: %1 - + The %1 file has been generated Файл %1 был сгенерирован + + Please enable "Show Keyframes on Cell Area" to show or hide the camera column. + + + Close SubXsheet Закрыть SubXsheet @@ -9949,14 +10283,14 @@ Are you sure ? Команда «Отменить к последнему сохраненному» не поддерживается для текущего выбора. - + File %1 doesn't belong to the current project. Do you want to import it or load it from its original location? Файл %1 не относится к текущему проекту. Вы хотите импортировать его или загрузить его из исходного местоположения? - + Import Импорт @@ -9964,70 +10298,70 @@ Do you want to import it or load it from its original location? - + Load Загрузить - + Load Level %1 Загрузить уровень %1 - + Load and Replace Level %1 Загрузить и заменить уровень %1 - + The camera settings of the scene you are loading as sub-xsheet are different from those of your current scene. What you want to do? Настройки камеры для сцены, которую вы загружаете в качестве sub-xsheet, отличаются от настроек вашей текущей сцены. Что вы хотите делать? - + Keep the sub-xsheet original camera settings. Сохраните исходные настройки камеры sub-xsheet. - + Apply the current scene camera settings to the sub-xsheet. Примените текущие настройки камеры сцены к sub-xsheet. - + Expose Level %1 Экспонировать уровень %1 - + Converting %1 images to tlv format... Конвертирование %1 изображений в формат tlv... - + %1: the current scene has been modified. What would you like to do? %1 текущая сцена была изменена. Что вы хотите сделать? - + Save All Сохранить все - + Save Scene Only Сохранить только сцену - + Discard Changes Отменить изменения - + The following file(s) have been modified. @@ -10036,46 +10370,63 @@ What would you like to do? - + What would you like to do? Что вы хотите сделать? - + Save Changes Сохранить изменения - + Anyway В любом случае - - - + + The file %1 already exists. +Do you want to overwrite it? + + + + + The file %1 has been exported successfully. + + + + + + + OK OK - + + Open containing folder + + + + %1 has an invalid file extension. %1 имеет недопустимое расширение файла. - + Always do this action. Всегда выполнять это действие. - + %1 is an invalid path. %1 - недопустимый путь. - + The scene %1 already exists. Do you want to overwrite it? Сцена %1 уже существует. @@ -10088,43 +10439,43 @@ Do you want to overwrite it? - - - + + + Couldn't save %1 Не удалось сохранить %1 - + The level %1 already exists. Do you want to overwrite it? Уровень %1 уже существует. Вы хотите переписать его? - + Overwrite Palette Переписать палитру - + Don't Overwrite Palette Не перезаписывать палитру - + The soundtrack %1 already exists. Do you want to overwrite it? Саундтрек %1 уже существует. Вы хотите переписать его? - + File %1 doesn't look like a TOONZ Scene Файл %1 не похож на сцену TOONZ - + A prior save of Scene '%1' was critically interupted. A partial save file was generated and changes may be manually salvaged from '%2'. @@ -10136,34 +10487,34 @@ Do you wish to continue loading the last good save or stop and try to salvage th Хотите продолжить загрузку последнего сохраненного файла или приостановить загрузку, чтобы попытаться восстановить его из временного файла сохранения? - + Continue Продолжить - + It is not possible to load the scene %1 because it does not belong to any project. Невозможно загрузить сцену %1, потому что она не принадлежит ни одному проекту. - + The Scene '%1' belongs to project '%2'. What do you want to do? Сцена «%1» относится к проекту «%2». Что вы хотите сделать? - + Import Scene Импорт сцены - + Change Project Сменить проект - + There were problems loading the scene %1. @@ -10172,31 +10523,31 @@ What do you want to do? Некоторые файлы могут отсутствовать. - + There were problems loading the scene %1. Some levels have not been loaded because their version is not supported Возникли проблемы с загрузкой сцены %1. Некоторые уровни не загружены, потому что их версия не поддерживается - + This scene is incompatible with pixels only mode of the current OpenToonz version. What would you like to do? Эта сцена несовместима с режимом "только пиксели" текущей версии OpenToonz. Чтовы хотите делать? - + Turn off pixels only mode Отключить режим "только пиксели" - + Keep pixels only mode on and resize the scene Оставить режим "только пиксели" и изменить размер сцены - + File '%1' will reload level '%2' as a duplicate column in the xsheet. Allow duplicate? @@ -10205,34 +10556,34 @@ Allow duplicate? Разрешить дубликаты? - + Allow Позволить - + Allow All Dups Разрешить все дупликаты - + No to All Dups Не разрешать дублирование - - + + It is not possible to load the level %1 Невозможно загрузить уровень %1 - + + %1 more level(s) - + The following level(s) use path with $scenefolder alias. @@ -10241,7 +10592,7 @@ Allow duplicate? - + They will not be opened properly when you load the scene next time. What do you want to do? @@ -10250,279 +10601,279 @@ What do you want to do? Что Вы хотите делать? - + Copy the levels to correspondent paths Копировать уровни в соответствующие пути - + Decode all $scenefolder aliases Декодировать все псевдонимы $scenefolder - + Save the scene only Сохранить только сцену - + Overwrite for All Перезаписать для всех - + Don't Overwrite for All Не перезаписывать для всех - - + + Failed to overwrite %1 Не удалось перезаписать %1 - - + + No Current Level Нет текущего уровня - - + + No Current Scene Нет текущей сцены - + Save the scene first Сначала сохранить сцену - + Save level Failed Ошибка сохранения уровня - + Are you sure you want to save the Default Settings? Вы действительно хотите сохранить настройки по умолчанию? - + It is not possible to load the %1 level. Невозможно загрузить уровень %1. - + The scene %1 doesn't exist. Сцены %1 не существует. - + Revert: the current scene has been modified. Are you sure you want to revert to previous version? Revert: текущая сцена была изменена. Вы действительно хотите вернуться к предыдущей версии? - + Revert Возвратиться - - + + The copied selection cannot be pasted in the current drawing. Скопированный выбор не может быть вставлен в текущий рисунок. - - - + + + Paste : Level %1 : Frame Вставить: Уровень %1: Кадр - + Delete Frames : Level %1 : Frame Удалить кадры: Уровень %1 : Кадр - + Cut Frames : Level %1 : Frame Вырезать кадры : Уровень %1 : Кадр - + Add Frames : Level %1 : Frame Добавить кадры: Уровень %1: Кадр - + Renumber : Level %1 Пересчитать : Уровень %1 - + Insert : Level %1 Вставить: Уровень %1 - + Reverse : Level %1 Обратить: Уровень %1 - + Swing : Level %1 Свинг : Уровень %1 - + Step %1 : Level %2 Шаг %1 : Уровень %2 - + Each %1 : Level %2 Каждый %1 : Уровень %2 - + Duplicate : Level %1 Дублировать : Уровень %1 - + Move Level to Scene : Level %1 Переместить уровень в сцену : Уровень %1 - + Inbetween : Level %1, Промежуточные кадры : Уровень %1 - + It is not possible to paste the columns: there is a circular reference. Вставить столбцы невозможно: имеется круговой референс. - + Paste Column : Всавить столбец : - + Delete Column : Удалить столбец : - + Insert Column : Вставить столбец : - + Resequence : Col%1 Пересчитать секвенцию : Кол%1 - + Clone Sub-xsheet : Col%1 Клонировать Sub-xsheet : Кол%1 - + Clear Cells : Col%1 Очистить ячейки: Кол%1 - + Reverse Обратить - + Swing Добавить в обратном порядке - + Autoexpose Автоэкспонирование - + Invalid selection: each selected column must contain one single level with increasing frame numbering. Недопустимый выбор: каждый выбранный столбец должен содержать один единственный уровень с увеличением нумерации кадров. - + Random Случайно - + Step %1 Шаг %1 - + Each %1 Каждые %1 - + Reframe to %1's Рекадрировать на %1 - + Reframe to %1's with %2 blanks Перекадрировать в %1 с помощью %2 заготовок - + Roll Up Первый вниз - + Roll Down Последний наверх - + Clone Level : %1 > %2 Клонировать уровень : %1 > %2 - + Clone Levels : Клонировать уровни : - + Clone Level CloneLevelUndo::LevelNamePopup Клонировать уровень - + Level Name: CloneLevelUndo::LevelNamePopup Имя уровня: - + Ok Ок - + FlipBook Flipbook @@ -10632,47 +10983,58 @@ undefined error. <пользовательский> + + The chosen folder path does not exist. +Do you want to create it? + + + + Create + + + + The file name already exists. Do you want to overwrite it? Имя файла уже существует. Вы хотите переписать его? - + Deleting "%1". Are you sure? Удаление «%1». Вы уверены? - + The selected scene could not be found. Не удалось найти выбранную сцену. - + Script Console Консоль скриптов - + Hide Zero Thickness Lines Скрыть линии нулевой толщины - + Show Zero Thickness Lines Показать линии нулевой толщины - + Hide cursor size outline Скрыть форму кисти - + Show cursor size outline Показать форму кисти @@ -10724,17 +11086,19 @@ Are you sure? Запустить скрипт - + Create project Создать проект - + + Image DPI Изображение DPI - + + Custom DPI Пользовательский DPI @@ -10765,20 +11129,20 @@ Are you sure? - + Create Level %1 at Column %2 Создать уровень %1 в столбце %2 - + A filename cannot be empty or contain any of the following characters: \ / : * ? " < > | Имя файла не может быть пустым или содержать любой из следующих символов: \ /: *? "<> | - - + + File %1 already exists. Do you want to overwrite it? @@ -10786,35 +11150,35 @@ Do you want to overwrite it? Хотите перезаписать его? - + Do you want to expose the renamed level ? Вы хотите экспонировать переименованный уровень? - + Expose Экспонировать - + Don't expose Не экспонировать - + Nothing to replace: no cells or columns selected. Нечего заменить: не выбраны ни ячейки, ни столбцы. - + The palette %1 already exists. Do you want to overwrite it? Палитра %1 уже существует. Вы хотите переписать её? - - + + Cannot load Color Model in current palette. Невозможно загрузить цветовую модель в текущей палитре. @@ -10837,34 +11201,44 @@ What do you want to do? Добавить цветовую палитру модели в палитру назначения. - + Choose Folder Выберите папку - - - + + + File Browser Браузер файлов - + Duplicate Дублировать - + Paste Key Frames Вставить ключевые кадры - + Delete Key Frames Удалить ключевые кадры + + Shift Key Frames Down + + + + + Shift Key Frames Up + + + Copy File Копировать файл @@ -10990,215 +11364,274 @@ The operation cannot be undone: are you sure? %1 импортированных сцен - + It is not possible to delete the selection. Удалить выделение невозможно. - + Paste Cells Вставить ячейки - + Delete Cells Удалить ячейки - + Cut Cells Вырезать ячейки - + Insert Cells Поместить ячейки - + It is not possible to paste vectors in the current cell. Невозможно вставить векторы в текущую ячейку. - + Paste (Strokes) Вставить (штрихи) - + It is not possible to paste image on the current cell. Невозможно вставить изображение в текущую ячейку. - - + + Paste Вставить - + Paste (Raster) Вставить (Растр) - + Overwrite Paste Cells Заменить вставленные ячейки - + Paste Numbers Вставлять номер видео - - + + Rename Cell at Column %1 Frame %2 Переименовать ячейку в столбце %1 Кадр %2 - + + Create Blank Drawing + + + + + Duplicate Drawing + + + + Fill In Empty Cells Заполнить пустые ячейки - + Duplicate Frame in XSheet Дублировать кадр в Xsheet - - - + + + No data to paste. Нет данных для вставки. - - - + + + It is not possible to paste the cells: there is a circular reference. Невозможно вставить ячейки: имеется круговой референс. - - + + It is not possible to paste data: there is nothing to paste. Невозможно вставить данные: нечего вставлять. - + + Unable to create a blank drawing on the camera column + + + + + + The current column is locked + + + + + Cannot create a blank drawing on the current column + + + + + + The current level is not editable + + + + + Unable to create a blank drawing on the current column + + + + + Unable to replace the current drawing with a blank drawing + + + + + There are no drawings in the camera column to duplicate + + + + + Cannot duplicate a drawing in the current column + + + + + Unable to duplicate a drawing on the current column + + + + + Unable to replace the current or next drawing with a duplicate drawing + + + Please enable "Sync Level Strip Drawing Number Changes with the XSheet" preference option to use the duplicate command in the xsheet / timeline. - Пожалуйста, включите параметр "Синхронно менять номер наброска в Level Strip с Xsheet" + Пожалуйста, включите параметр "Синхронно менять номер наброска в Level Strip с Xsheet" чтобы использовать команду дублирования кадров в Xsheet/таймлайне. - Please select only one layer to duplicate a frame. - Выберите только один уровень для создания дубликата кадра. + Выберите только один уровень для создания дубликата кадра. - Please select only one frame to duplicate. - Выберите только один кадр для дублирования. + Выберите только один кадр для дублирования. - - + + Cannot paste data Nothing to paste Не удается вставить данные Нечего вставлять - + It is not possible to paste the cells: Some column is locked or column type is not match. Вставить в ячейку невозможно. Столбец заблокирован или его формат не поддерживается. - - + + This command only works on vector cells. Эта команда работает только с векторными ячейками. - + Please select only one column for this command. Пожалуйста, выберите только один столбец для этой команды. - + All selected cells must belong to the same level. Все выбранные ячейки должны принадлежать к одному и тому же уровню. - + Simplify Vectors : Level %1 Упрощение векторов : уровень %1 - + It is not possible to save images in camera stand view. Невозможно сохранить изображения в режиме просмотра камеры. - + The preview images are not ready yet. Изображения предварительного просмотра еще не готовы. - + Xsheet Xsheet - + Timeline Таймлайн - + Modify Play Range : %1 - %2 Изменить диапазон воспроизведения : %1 - %2 - + Modify Play Range : %1 - %2 > %3 - %4 Изменить диапазон воспроизведения : %1 - %2 > %3 - %4 - + Use Level Extender Использовать удлинитель уровня - + Modify Sound Level Изменить уровень звука - + Move keyframe handle : %1 Handle of the keyframe %2 Переместить ушко ключевого кадра : %1 Ушко ключевого кадра %2 - + Move Columns Переместить столбцы - + Change Pegbar Изменить Pegbar - + Change Text at Column %1 Frame %2 Изменить текст в столбце %1 кадре %2 - + Toggle cycle of %1 Переключить цикл %1 @@ -11208,116 +11641,122 @@ to use the duplicate command in the xsheet / timeline. Переместить уровень - - + + Schematic Схема - + Stage Schematic Схема сцены - + Fx Schematic Fx Схема - + Palette Палитра - - + + Studio Palette Палитра Studio - - + + Style Editor Редактор стилей - - + + Viewer Просмотрщик - + Command Bar Панель команд - + Tool Options Настройки инструмента - + Tasks Задания - + Batch Servers Пакетные серверы - + Scene Cast Состав сцены - - + + Export Экспортировать - - + + Function Editor Редактор функций - - + + Message Center Центр сообщений - + LineTest Viewer LineTest просмотрщик - + LineTest Capture LineTest захват - - + + Combo Viewer ComboViewer - - + + History История - - + + + Stop Motion Controller + + + + + Fx Settings Настройки Fx @@ -11368,79 +11807,79 @@ to use the duplicate command in the xsheet / timeline. Уровень, который вы используете, не имеет допустимой палитры. - + It is not possible to merge tlv columns because no column was selected. Невозможно объединить столбцы tlv, потому что не выбран столбец. - + It is not possible to merge tlv columns because at least two columns have to be selected. Невозможно объединить столбцы tlv, потому что нужно выбрать как минимум два столбца. - - + + Merging Tlv Levels... Слияние уровней Tlv ... - - + + It is not possible to delete lines because no column, cell or level strip frame was selected. Невозможно удалить строки, потому что не выбран ни один столбец, ячейка или кадр Level Strip. - + The selected column is empty. Выбранный столбец пуст. - + Selected cells must be in the same column. Выбранные ячейки должны находиться в одном столбце. - + Match lines can be deleted from Toonz raster levels only Разделительные линии могут быть удалены только из растровых уровней Toonz - + Level: Уровень: - + Skipping frame. Пропуск кадра. - + Don't Duplicate Не дублировать - + The specified name is already assigned to the %1 file. Указанное имя уже присвоено файлу %1. - + Warning: level %1 already exists; overwrite? Предупреждение: уровень %1 уже существует; перезаписать? - + It is not possible to rename the %1 file. Невозможно переименовать файл %1. - + It is not possible to copy the %1 file. Невозможно скопировать файл %1. - + Color Model Цветовая модель @@ -11531,14 +11970,14 @@ to use the duplicate command in the xsheet / timeline. Неверный файл - - + + [Drag&Drop] to copy separator to menu bar [[Drag&Drop] для копирования разделителя в строку меню - - + + [Drag&Drop] to copy command to menu bar [Drag&Drop] для копирования команды в строку меню @@ -11584,54 +12023,54 @@ to use the duplicate command in the xsheet / timeline. В указанном диапазоне кадров нет рисунка. - + Cannot open menubar settings template file. Re-installing Toonz will solve this problem. Не удается открыть файл шаблонов настроек меню. Повторная установка Toonz решит эту проблему. - + No more Undo operations available. Больше нет операций Undo. - + No more Redo operations available. Больше нет операций Redo. - + The rooms will be reset the next time you run Toonz. Вкладки будут восстановлены при следующем запуске OpenToonz. - + Visit Web Site Посетить сайт - + An update is available for this software. Visit the Web site for more information. Доступно обновление программного обеспечения. Подробную информацию можно найти на веб-сайте. - + Check for the latest version on launch. Проверять наличие обновлений при запуске. - + https://opentoonz.github.io/e/ https://opentoonz.github.io/e/ - + Installing %1 again could fix the problem. Установка %1 снова может устранить проблему. - + The qualifier %1 is not a valid key name. Skipping. Квалификатор%1 не является допустимым именем ключа. Пропуск. @@ -11744,6 +12183,16 @@ Do you want to import them or load from their original location? Already saving! + + + Edit Level Settings : %1 + + + + + Camera Column Switch : + + ReframePopup @@ -11791,38 +12240,38 @@ Do you want to import them or load from their original location? RenameAsToonzPopup - + The file name cannot be empty or contain any of the following characters:(new line) \ / : * ? " | Имя файла не может быть пустым или содержать любой из следующих символов: (новая строка) \ /: *? "| - - + + Rename Переименовать - + Renaming File Переименование файла - + Creating an animation level of %1 frames Создание анимационного уровня из %1 кадров - + Delete Original Files Удалить исходные файлы - + Level Name: Имя уровня: - + Cancel Отмена @@ -11903,12 +12352,12 @@ The audio file will not be included in the rendered clip. ReplaceLevelPopup - + Replace Level Заменить уровень - + Replace Заменить @@ -11917,7 +12366,7 @@ The audio file will not be included in the rendered clip. Нечего заменить: ячейки не выбраны. - + File not found Файл не найден @@ -11927,12 +12376,12 @@ The audio file will not be included in the rendered clip. ReplaceParentDirectoryPopup - + Replace Parent Directory Заменить родительский каталог - + Replace Заменить @@ -11973,20 +12422,24 @@ The audio file will not be included in the rendered clip. Ruler - + Click to create an horizontal guide Нажмите, чтобы создать горизонтальную направляющую - + Click to create a vertical guide Нажмите, чтобы создать вертикальную направляющую - + + Left click and drag to move guide. Right click to delete guide + + + Click and drag to move guide - Нажмите и перетащите, чтобы переместить направляющую + Нажмите и перетащите, чтобы переместить направляющую @@ -12086,20 +12539,20 @@ The audio file will not be included in the rendered clip. Ввод %1 предметов... - - + + No items to put. Нечего помещать. - - + + %1 items to put. %1 элементрв для помещения. - - + + %1 Selected / %2 Total %1 Выбрано / %2 Всего @@ -12107,75 +12560,75 @@ The audio file will not be included in the rendered clip. SVNCommitFrameRangeDialog - + Version Control: Put Управление версиями: Поместить - + Note: the file will be updated too. Примечание: файл также будет обновлен. - + Comment: Комментарий: - + Put Поместить - + Cancel Отмена - + Put done successfully. Помещено успешно. - + Locking file... Заблокировать файл ... - + Getting frame range edit information... Получение информации о измененных кадрах... - - + + No frame range edited. Нет отредактированного диапазона кадров. - + Updating frame range edit information... Обновление информации о редактировании диапазона кадров ... - - + + Putting changes... Внесение изменений... - + Adding hook file to repository... Добавление файла hook в репозиторий ... - + Setting the needs-lock property to hook file... ?? Настройка свойства блокировки потребностей для захвата файла... - + Updating file... Обновление файла... @@ -12199,7 +12652,7 @@ The audio file will not be included in the rendered clip. - + Delete %1 items. Удаление %1 элементов. @@ -12234,18 +12687,18 @@ The audio file will not be included in the rendered clip. Отмена - - + + Deleting %1 items... Удаление %1 элементов... - + Delete Удалить - + You are deleting items also on repository. Are you sure ? Вы удаляете элементы также в репозитории. Вы уверены? @@ -12253,28 +12706,28 @@ The audio file will not be included in the rendered clip. SVNFrameRangeLockInfoDialog - + Version Control: Edit Info Управление версиями: Редактировать инфо - + Getting repository status... Получение статуса репозитория... - + Close Закрыть - - + + No frame range edited. Нет отредактированного диапазона кадров. - + %1 on %2 is editing frames from %3 to %4. Изменение кадров с %1 по %2 на %3 по %4. @@ -12337,24 +12790,24 @@ The audio file will not be included in the rendered clip. Нет элементов для разблокировки. - - + + %1 items to edit. %1 элементов для редактирования. - - + + %1 items to unlock. %1 предметов для разблокировки. - + Editing %1 items... Изменение %1 объектов... - + Unlocking %1 items... Разблокировка %1 предметов... @@ -12408,7 +12861,7 @@ The audio file will not be included in the rendered clip. Изменение кадров с %1 по %2 на %3 по %4. - + Getting frame range edit information... Получение информации о измененных кадрах... @@ -12416,32 +12869,32 @@ The audio file will not be included in the rendered clip. SVNLockInfoDialog - + Version Control: Edit Info Управление версиями: Редактировать инфо - + <b>Edited By:</b> <b> Отредактировано:</b> - + <b>Host:</b> <b>Host:</b> - + <b>Comment:</b> <b>Комментарий:</b> - + <b>Date:</b> <b>Дата:</b> - + Close Закрыть @@ -12449,52 +12902,52 @@ The audio file will not be included in the rendered clip. SVNLockMultiFrameRangeDialog - + Version Control: Edit Frame Range Управление версиями: Редактирование диапазона кадров - + Getting repository status... Получение статуса репозитория... - + From: От: - + To: До: - + Comment: Комментарий: - + Edit Редактировать - + Cancel Отмена - + No frame range edited. Нет отредактированного диапазона кадров. - + %1 is editing frames from %2 to %3 %1- редактирование кадров с %2 до %3 - + Editing %1 items... Изменение %1 объектов... @@ -12502,27 +12955,27 @@ The audio file will not be included in the rendered clip. SVNMultiFrameRangeLockInfoDialog - + Version Control: Edit Info Управление версиями: Редактировать инфо - + Getting repository status... Получение статуса репозитория... - + Close Закрыть - + No frame range edited. Нет отредактированного диапазона кадров. - + %1 is editing frames from %2 to %3 %1- редактирование кадров с %2 до %3 @@ -12598,23 +13051,23 @@ The audio file will not be included in the rendered clip. Отмена - + No items to revert. Нет элементов для возврата. - - + + %1 items to revert. %1 предметов для возврата. - + Reverting %1 items... Возврат %1 пунктов... - + Revert done successfully. Возврат прошел успешно. @@ -12622,44 +13075,44 @@ The audio file will not be included in the rendered clip. SVNRevertFrameRangeDialog - + Version Control: Revert Frame Range changes Управление версиями: возврат изменений диапазона кадров - + 1 item to revert. 1 объект для возврата. - + Revert Вернуть - + Cancel Отмена - + Reverting 1 item... Вернуть 1 объект ... - + It is not possible to revert the file. Не удалось восстановить файл. - - - + + + Revert done successfully. Возврат прошел успешно. - + Reverting %1 items... Возврат %1 пунктов... @@ -12667,87 +13120,87 @@ The audio file will not be included in the rendered clip. SVNTimeline - + Version Control: Timeline Контроль версий: Таймлайн - + Getting file history... Получение истории файлов... - + Get Scene Contents Получить содержимое сцены - + Get Last Revision Получить последнюю ревизию - + Get Selected Revision Получить выбранный вариант - + Close Закрыть - - + + Date Дата - - - + + + Author Автор - + + - Comment Комментарий - + Revision Ревизия - + Getting the status for %1... Получение статуса для %1... - + Getting repository status... Получение статуса репозитория... - + Getting %1 to revision %2... Получение %1 до ревизии %2... - + Getting %1 items to revision %2... Получение %1 элементов для ревизии %2... - + Getting %1... Получение %1... - + Getting %1 items... Получение %1 предметов... @@ -12755,63 +13208,63 @@ The audio file will not be included in the rendered clip. SVNUnlockFrameRangeDialog - + Version Control: Unlock Frame Range Управление версиями: разблокировка диапазона кадров - + Note: the file will be updated too. Are you sure ? Примечание: файл также будет обновлен. Вы уверены? - + Unlock Разблокировать - + Cancel Отмена - + Unlock done successfully. Разблокировка выполнена успешно. - + Locking file... Заблокировать файл ... - + Getting frame range edit information... Получение информации о измененных кадрах... - - + + No frame range edited. Нет отредактированного диапазона кадров. - + Updating frame range edit information... Обновление информации о редактировании диапазона кадров ... - + Putting changes... Внесение изменений... - + Updating file... Обновление файла... - + Close Закрыть @@ -12819,37 +13272,37 @@ The audio file will not be included in the rendered clip. SVNUnlockMultiFrameRangeDialog - + Version Control: Unlock Frame Range Управление версиями: разблокировка диапазона кадров - + Getting repository status... Получение статуса репозитория... - + Unlock Разблокировать - + Cancel Отмена - + Unlocking %1 items... Разблокировка %1 предметов... - + No items to unlock. Нет элементов для разблокировки. - + %1 items to unlock. %1 предметов для разблокировки. @@ -12892,18 +13345,18 @@ The audio file will not be included in the rendered clip. Нет объектов для редактирования. - - + + %1 items to edit. %1 элементов для редактирования. - + Updating %1 items... Обновление %1 элементов ... - + Editing %1 items... Изменение %1 объектов... @@ -12943,8 +13396,8 @@ The audio file will not be included in the rendered clip. - - + + %1 items to update. %1 элементов для обновления. @@ -12971,12 +13424,12 @@ Please commit or revert changes first. Нет элементов для обновления. - + Updating items... Обновление элементов... - + Updating to their items... Обновление их предметов... @@ -13003,12 +13456,12 @@ Please commit or revert changes first. SaveImagesPopup - + Save Flipbook Images Сохранить изображения Flipbook - + Save Сохранить @@ -13016,12 +13469,12 @@ Please commit or revert changes first. SaveLevelAsPopup - + Save Level Сохранить уровень - + Save Сохранить @@ -13029,12 +13482,12 @@ Please commit or revert changes first. SavePaletteAsPopup - + Save Palette Сохранить палитру - + Save Сохранить @@ -13096,12 +13549,12 @@ Please commit or revert changes first. SaveSceneAsPopup - + Save Scene Сохранить сцену - + Save Сохранить @@ -13120,12 +13573,12 @@ Please commit or revert changes first. SaveSubSceneAsPopup - + Sub-xsheet Sub-xsheet - + Save Сохранить @@ -13252,77 +13705,102 @@ Please commit or revert changes first. Суб-камера. Сброс по умолчанию - + Swap Compared Images Поменять сравниваемые изображения - + Flip View - + Reset View Вид по умолчанию - + Vector Guided Drawing Векторный гид - + Off Выкл - + Closest Drawing Ближайший рисунок - + Farthest Drawing Дальний рисунок - + All Drawings Все рисунки - + + Auto Inbetween + + + + + Linear Interpolation + Линейная интерполяция + + + + Ease In Interpolation + + + + + Ease Out Interpolation + + + + + Ease In/Out Interpolation + + + + Save Previewed Frames Сохранить кадры предпросмотра - + Regenerate Preview Регенерировать предпросмотр - + Regenerate Frame Preview Регенерировать предпросмотр кадра - + Show %1 Показать %1 - + Hide %1 Скрыть %1 - + Table Таблица - + Select %1 Выбрать %1 @@ -13339,22 +13817,22 @@ Please commit or revert changes first. Выбрать - + Show / Hide Показать / скрыть - + Select Camera Выбрать камеру - + Select Pegbar Выбрать Pegbar - + Select Column Выбрать столбец @@ -13362,86 +13840,89 @@ Please commit or revert changes first. SceneViewerPanel - + Safe Area (Right Click to Select) Безопасная зона (Щелкните правой кнопкой мыши, чтобы выбрать) - + Field Guide Направляющая сетка - + Camera Stand View Стандартный вид с камеры - + 3D View 3D-просмотр - + Camera View Вид с камеры - + Freeze Заморозить - + Preview Предпросмотр - + Sub-camera Preview Предпросмотр суб-камеры - + Untitled Безымянный - - Scene: - Сцена: + + [SCENE]: + - - :: Project: + + [LEVEL]: - + Scene: + Сцена: + + + :: Frame: :: Кадр: - - + + :: Zoom : :: Зум : - - + + (Flipped) (Перевёрнутый) - + :: Level: :: Уровень: - Level: - Уровень: + Уровень: @@ -13653,138 +14134,138 @@ Please commit or revert changes first. ShortcutPopup - + Configure Shortcuts Настроить хоткеи - + Remove Удалить - - + + Export Current Shortcuts Экспорт текущих хоткеев - + Delete Удалить - + Delete Current Preset Удалить текущую предустановку - + Save As Сохранить как - + Save Current Shortcuts as New Preset Сохранить текущие хоткеи в новой предустановке - + Load Загрузить - + Use selected preset as shortcuts Использовать выбранные пердустановки как хоткеи - + Shortcut Presets Предустановки хоткеев - + Clear All Shortcuts Удалить все хоткеи - + Couldn't find any matching command. Не удалось найти подходящую команду. - + Search: Поиск: - + Preset: Предустановка: - + This will erase ALL shortcuts. Continue? Это приведет к удалению всех хоткеев. Продолжить? - + This will overwrite all current shortcuts. Continue? Это перезапишет все текущие ярлыки. Продолжить? - + A file named Файл с именем - + already exists. Do you want to replace it? уже существует. Хотите заменить его? - + OpenToonz - Setting Shortcuts OpenToonz - Настройка хоткеев - + Saving Shortcuts Сохранить хоткеи - + Included presets cannot be deleted. Включенные предустановки не могут быть удалены. - + Are you sure you want to delete the preset: Вы действительно хотите удалить предустановку: - + ? ? - + Setting Shortcuts Настройки сочетаний клавиш - + Load from file... Загрузить из файла... - + Enter Preset Name Введите имя предустановки - + Preset Name: Имя предустановки: @@ -13800,7 +14281,7 @@ Please commit or revert changes first. - + Fill Заливка @@ -13850,63 +14331,81 @@ Please commit or revert changes first. - View - Вид + Play + Воспроизведение + Render + Рендер + + + + + + View + Вид + + + + + Windows Окна - - + + + + Help + Справка + + + + Right-click Menu Commands Меню команд правого клика - - - + + + Tools Инструменты - - + + Tool Modifiers Модификаторы инструментов - - + + Visualization Визуализация - - + + Misc Прочее - Playback Controls - Управление воспроизведением + Управление воспроизведением - - + + RGBA Channels Каналы RGBA - - Playback - Воспроизведение + Воспроизведение @@ -13953,7 +14452,7 @@ Assign to '%3'? - + Scan Сканирование @@ -13972,7 +14471,7 @@ Assign to '%3'? - + Edit Правка @@ -13982,7 +14481,7 @@ Assign to '%3'? - + Windows Окна @@ -14009,7 +14508,7 @@ Assign to '%3'? - + View Вид @@ -14020,7 +14519,7 @@ Assign to '%3'? - + Help Справка @@ -14045,6 +14544,7 @@ Assign to '%3'? + Render Рендер @@ -14055,7 +14555,7 @@ Assign to '%3'? - + Xsheet Xsheet @@ -14065,273 +14565,857 @@ Assign to '%3'? Subxsheet - - Levels - Уровни + + Levels + Уровни + + + + + Cells + Ячейки + + + + + Reframe + Перестроить + + + + + Step + Шаг + + + + + Each + Каждый + + + + File + Файл + + + + Project Management + + + + + Import + Импорт + + + + Export + + + + + Script + + + + + Group + + + + + Arrange + + + + + Scan && Cleanup + Сканирование и очистка + + + + Level + Уровень + + + + New + Новый + + + + Adjust + + + + + Optimize + + + + + Convert + Конвертировать + + + + Drawing Substitution + + + + + Play + Воспроизведение + + + + Workspace + + + + + Cannot open menubar settings file %1 + Не удается открыть файл настроек меню %1 + + + + Failed to create menubar + Не удалось создать меню + + + + StartupPopup + + + OpenToonz Startup + Стартовое окно + + + Choose Project + Выбрать проект + + + + Create a New Scene + Создать новую сцену + + + Open Scene + Открыть сцену + + + + Current Project + + + + + Recent Scenes [Project] + + + + + Scene Name: + Имя сцены: + + + + Width: + Ширина: + + + + Height: + Высота: + + + + DPI: + DPI: + + + + X + X + + + + Resolution: + Разрешение: + + + + Frame Rate: + Частота кадров: + + + + Add + Добавить + + + + Remove + Удалить + + + + Show this at startup + Показывать это окно при запуске + + + + Automatically Save Every + Автоматически сохранять каждые + + + + Create Scene + Создать сцену + + + + New Project... + Новый проект... + + + + Open Another Scene... + Открыть другую сцену... + + + + pixel + пиксель + + + + cm + см + + + + mm + мм + + + + inch + дюйм + + + + field + поле + + + + Save In: + Сохранить в: + + + + Camera Size: + Размер камеры: + + + + Units: + Единицы: + + + + Minutes + Минут(ы) + + + + No Recent Scenes + Нет недавних сцен + + + + The name cannot be empty. + Имя не может быть пустым. + + + The chosen file path is not valid. + Выбранный путь к файлу недействителен. + + + + The width must be greater than zero. + Ширина должна быть больше нуля. + + + + The height must be greater than zero. + Высота должна быть больше нуля. + + + + The frame rate must be 1 or more. + Частота кадров должна быть 1 или более. + + + + Failed to create the folder. + + + + + Preset name + Имя предустановки + + + + Enter the name for %1 + Введите имя для %1 + + + + Error : Preset Name is Invalid + Ошибка: недопустимое имя предустановки + + + + The preset name must not use ','(comma). + Имя файла предустановки не должно содержать "," (запятую). + + + + Bad camera preset + савсэм плахой предустановк, слюшай + Плохая предустановка камеры + + + + '%1' doesn't seem to be a well formed camera preset. +Possibly the preset file has been corrupted + «%1», похоже, не является предустановленной камерой. +Возможно, файл предварительной настройки поврежден + + + + StopMotion + + + No + frame id + Нет + + + + No level name specified: please choose a valid level name + Имя уровня не определено: выберите допустимое имя уровня + + + + The level name specified is already used: please choose a different level name. + Указанное имя уровня уже используется: выберите другое имя уровня. + + + + The save in path specified does not match with the existing level. + Указанный путь сохранения не соответствует существующему уровню. + + + + + The captured image size does not match with the existing level. + Размер захваченного изображения не соответствует существующему уровню. + + + + + File %1 already exists. +Do you want to overwrite it? + Файл «%1» уже существует. +Хотите перезаписать его? + + + + Failed to load %1. + Не удалось загрузить %1. + + + + Folder %1 doesn't exist. +Do you want to create it? + Папки %1 не существует. +Вы хотите создать ее? + + + + + + Unable to create + Не удалось создать + + + + + + + + UNDEFINED WARNING + НЕОПРЕДЕЛЕННОЕ ПРЕДУПРЕЖДЕНИЕ + + + + The level is not registered in the scene, but exists in the file system. + Уровень не загружен в текущую сцену, но файл существует. + + + + +WARNING : Image size mismatch. The saved image size is %1 x %2. + +Предупреждение: несоответствие размера изображения. Размер сохраненного изображения%1 x %2. + + + + + + WARNING + + + + + + +Frame %1 exists. + +Кадр %1 существует. + + + + + +Frames %1 exist. + +Кадры %1 существуют. + + + + + OVERWRITE 1 of + ПЕРЕЗАПИСАТЬ 1 из + + + + + ADD to + ДОБАВИТЬ + + + + + %1 frame + %1 кадр + + + + + %1 frames + %1 кадров + + + + The level will be newly created. + Уровень будет вновь создан. + + + + NEW + НОВЫЙ + + + + The level is already registered in the scene. + Этот уровень уже загружев в сцену. + + + + +NOTE : The level is not saved. + +ПРИМЕЧАНИЕ : уровень не сохранен. + + + + +WARNING : Failed to get image size of the existing level %1. + +ВНИМАНИЕ : получить размер изображения уровня %1 не удалось. + + + + +WARNING : Image size mismatch. The existing level size is %1 x %2. + +ВНИМАНИЕ: несоответствие размера изображения. Существующий размер уровня %1 x %2. + + + + WARNING : Level name conflicts. There already is a level %1 in the scene with the path + %2. + ВНИМАНИЕ: конфликт имен уровней. В сцене уже есть уровень %1. Существующий путь к файлу уровня %2. + + + + +WARNING : Image size mismatch. The size of level with the same name is is %1 x %2. + +ВНИМАНИЕ: несоответствие размера изображения. Размер уровня с тем же именем — %1 x %2. + + + + WARNING : Level path conflicts. There already is a level with the path %1 + in the scene with the name %2. + ВНИМАНИЕ : повторяющийся путь к файлу. В сцене уже есть уровень из %1 под именем %2. + + + + +WARNING : Image size mismatch. The size of level with the same path is %1 x %2. + +ВНИМАНИЕ: несоответствие размера изображения. Размер уровня с тем же путем %1 x %2. + + + + WARNING + Предупреждение + + + + No camera selected. + + + + + StopMotionController + + + Controls + + + + + Settings + Настройки + + + + + Options + Опции + + + + Resolution: + + + + + Refresh + Обновить + + + + File + + + + + Webcam Settings... + + + + + Capture + Захват + + + + Next Level + Следующий уровень + + + + Next New + + + + + Previous Level + Предыдущий уровень - - - Cells - Ячейки + + Next Frame + Следующий кадр - - Reframe - Перестроить + + Last Frame + Последний кадр - - Step - Шаг + + Previous Frame + Предыдущий кадр - - Each - Каждый + + Next XSheet Frame + - - File - Файл + + Previous XSheet Frame + - - Scan && Cleanup - Сканирование и очистка + + Current Frame + Текущий кадр - - Level - Уровень + + Set to the Current Playhead Location + - - Cannot open menubar settings file %1 - Не удается открыть файл настроек меню %1 + + + Start Live View + - - Failed to create menubar - Не удалось создать меню + + Zoom + - - - StartupPopup - - OpenToonz Startup - Стартовое окно + + Pick Zoom + - Choose Project - Выбрать проект + + < + - - Create a New Scene - Создать новую сцену + + > + - Open Scene - Открыть сцену + + << + - - Current Project + + >> - - Recent Scenes [Project] + + <<< - - Scene Name: - Имя сцены: + + >>> + - - Width: - Ширина: + + Camera: + Камера: - - Height: - Высота: + + Name: + Имя: - - DPI: - DPI: + + Frame: + Кадр: - - X - X + + File Type: + Тип файла: - - Resolution: - Разрешение: + + Save In: + Сохранить в: - - Frame Rate: - Частота кадров: + + XSheet Frame: + - - Add - Добавить + + Camera Model + - - Remove - Удалить + + Camera Mode + - - Show this at startup - Показывать это окно при запуске + + Temperature: + - - Automatically Save Every - Автоматически сохранять каждые + + Shutter Speed: + - - Create Scene - Создать сцену + + Iso: + - - New Project... - Новый проект... + + Aperture: + - - Open Another Scene... - Открыть другую сцену... + + Exposure: + - - - pixel - пиксель + + Image Quality: + - - - cm - см + + Picture Style: + - - - mm - мм + + White Balance: + - - - inch - дюйм + + Webcam Options + - - - field - поле + + DSLR Options + - - Save In: - Сохранить в: + + Place the frame in the XSheet + - - Camera Size: - Размер камеры: + + Use Direct Show Webcam Drivers + - - Units: - Единицы: + + Black Screen for Capture + - - Minutes - Минут(ы) + + Use Reduced Resolution Images + - - No Recent Scenes - Нет недавних сцен + + Use MJPG with Webcam + - - The name cannot be empty. - Имя не может быть пустым. + + Place on XSheet + - - The chosen file path is not valid. - Выбранный путь к файлу недействителен. + + Use Numpad Shortcuts When Active + - - The width must be greater than zero. - Ширина должна быть больше нуля. + + Show Live View on All Frames + - - The height must be greater than zero. - Высота должна быть больше нуля. + + Capture Review Time: + - - The frame rate must be 1 or more. - Частота кадров должна быть 1 или более. + + Level Subsampling: + - - Preset name - Имя предустановки + + Opacity: + Непрозрачность: - - Enter the name for %1 - Введите имя для %1 + + No camera detected. + - - Error : Preset Name is Invalid - Ошибка: недопустимое имя предустановки + + No camera detected + - - The preset name must not use ','(comma). - Имя файла предустановки не должно содержать "," (запятую). + + - Select camera - + - Выбрать камеру - - - Bad camera preset - савсэм плахой предустановк, слюшай - Плохая предустановка камеры + + Mode: + - - '%1' doesn't seem to be a well formed camera preset. -Possibly the preset file has been corrupted - «%1», похоже, не является предустановленной камерой. -Возможно, файл предварительной настройки поврежден + + + + Auto + Авто + + + + + + + Disabled + Отключено - - The selected scene project '%1' is not in the Current Project list and may not open automatically. + + Stop Live View @@ -14769,15 +15853,28 @@ Possibly the preset file has been corrupted Предыдущая версия - + Older Version Старая версия + Toolbar + + + Collapse toolbar + + + + + Expand toolbar + + + + TopBar - + Lock Rooms Tab Заблокировать вкладки @@ -14828,206 +15925,206 @@ Possibly the preset file has been corrupted VectorizerPopup - + Convert-to-Vector Settings Настройки конвертации в вектор - + Centerline Сплошная линия - + Outline Контурная обводка - - - + + + Mode Режим - - + + Threshold Предел - - - - + + + + Accuracy Точность - - - - + + + + Despeckling Удаление соринок - - + + Max Thickness Максимальная толщина - - + + Thickness Calibration Калибровка толщины - + Start: Начало: - + End: Конец: - - + + Preserve Painted Areas Сохранять окрашенные области - + Add Border Добавить кайму - + Full color non-AA images Полноцветные изображения без сглаживания - + Enhanced ink recognition Улучшенное распознавание контура - + Corners Углы - - + + Adherence Смачивание - - + + Angle Угол - - + + Curve Radius Радиус кривой - + Raster Levels Уровни растра - - + + Max Colors Макс. цвета - - + + Transparent Color Прозрачный цвет - + TLV Levels Уровни TLV - - + + Tone Threshold Порог тона - + Toggle Swatch Preview Переключить просмотр образцов - + Toggle Centerlines Check Переключить проверку сплошной линии - + Save Settings Сохранить настройки - + Load Settings Загрузить изменения - + Reset Settings Сбросить настройки - + Convert Конвертировать - + The current selection is invalid. Текущий выбор недействителен. - + Cannot convert to vector the current selection. Невозможно преобразовать текущий выделенный фрагмент в вектор. - + Conversion in progress: Выполняется конвертация: - - + + File could not be opened for read Файл не может быть открыт для чтения - + File could not be opened for write Файл не может быть открыт для записи - + Save Vectorizer Parameters Сохранить параметры векторизации - + Load Vectorizer Parameters Загрузить параметры векторизации @@ -15035,22 +16132,22 @@ Possibly the preset file has been corrupted VersionControl - + The version control configuration file is empty or wrongly defined. Please refer to the user guide for details. Файл конфигурации управления версиями пуст или неправильно определен. Подробнее см. В руководстве пользователя. - + The version control client application specified on the configuration file cannot be found. Please refer to the user guide for details. Клиентское приложение управления версиями, указанное в файле конфигурации, не может быть найдено. Подробнее см. В руководстве пользователя. - - + + The version control client application is not installed on your computer. Subversion 1.5 or later is required. Please refer to the user guide for details. @@ -15059,7 +16156,7 @@ Please refer to the user guide for details. Подробнее см. В руководстве пользователя. - + The version control client application installed on your computer needs to be updated, otherwise some features may not be available. Subversion 1.5 or later is required. Please refer to the user guide for details. @@ -15077,79 +16174,112 @@ Please refer to the user guide for details. + XDTSImportPopup + + + Importing XDTS file %1 + + + + + Load + Загрузить + + + + Cancel + Отмена + + + + Please specify the level locations. Suggested paths are input in the fields with blue border. + + + + + Level Name + + + + + Level Path + + + + XsheetGUI::CellArea - + Click to select keyframe, drag to move it Кликнуть для выделения кадра, потянуть для перемещения - + Click and drag to set the acceleration range Нажмите и перетащите, чтобы установить диапазон ускорения - + Click and drag to set the deceleration range Нажмите и перетащите, чтобы установить диапазон замедления - + Set the cycle of previous keyframes Установите цикл предыдущих ключевых кадров - + Click and drag to move the selection Кликнуть и потянуть для перемещения выделенного - + Click and drag to play Кликнуть и потянуть для воспроизведения - + Click and drag to repeat selected cells Нажмите и перетащите, чтобы повторить выбранные ячейки - + Reframe Перестроить - + Step Шаг - + Each Каждый - + Edit Cell Numbers Ввести номер кадра - + Replace Level Заменить уровень - + Replace with Заменить - + Paste Special Специальная вставка - + Edit Image Редактирование изображений @@ -15158,12 +16288,12 @@ Please refer to the user guide for details. Заменить - + Open Memo Открыть заметку - + Delete Memo Удалить заметку @@ -15171,135 +16301,145 @@ Please refer to the user guide for details. XsheetGUI::ColumnArea - + &Subsampling 1 &Субсемплинг 1 - + &Subsampling 2 &Субсемплинг 2 - + &Subsampling 3 &Субсемплинг 3 - + &Subsampling 4 &Субсемплинг 4 - + Click to select camera Нажмите, чтобы выбрать камеру - - + + Click to select column, drag to move it Нажмите, чтобы выбрать столбец, перетащите, чтобы переместить его - + Click to select column Щелкните для выбора столбца - + Click to select column, drag to move it, double-click to edit Нажмите, чтобы выбрать столбец, перетащите, чтобы переместить его, двойной клик чтобы редактировать - + Click to select column, double-click to edit Щелкните для выбора столбца, двойной клик для редактирования - + Lock Toggle Блокировка переключения - + Additional column settings Дополнительные настройки столбцов - + Preview Visibility Toggle Переключение видимости - + Camera Stand Visibility Toggle Переключатель видимости камеры - + + Hide Camera Column + + + + + Show Camera Column + + + + &Insert Before &Вставить пробел сзади - + &Insert After &Вставить пробел cпереди - + &Paste Insert Before &Вставить копию сзади - + &Paste Insert After &Вставить копию спереди - + &Insert Below &Вставить пробел сзади - + &Insert Above &Вставить пробел cпереди - + &Paste Insert Below &Вставить копию сзади - + &Paste Insert Above &Вставить копию спереди - - + + Click to play the soundtrack back Нажмите, чтобы воспроизвести зв. дорожку - - + + Set the volume of the soundtrack Установите громкость зв. дорожки - + Alt + Click to Toggle Thumbnail Alt + Click для переключения иконок - + Reframe Перестроить - + Subsampling Субсемплинг @@ -15340,12 +16480,12 @@ Please refer to the user guide for details. Фильтр не влияет на уровни вектора - + Filter: Фильтр: - + Opacity: Непрозрачность: @@ -15414,22 +16554,22 @@ Please refer to the user guide for details. XsheetGUI::RowArea - + Playback Start Marker Маркер начала воспроизведения - + Playback End Marker Маркер окончания воспроизведения - + Pinned Center : Col%1%2 Фиксированный центр : Кол%1%2 - + Double Click to Toggle Onion Skin Двойной клик для переключения Onion Skin @@ -15438,68 +16578,68 @@ Please refer to the user guide for details. Текущий кадр - + Click to Reset Shift & Trace Markers to Neighbor Frames Hold F2 Key on the Viewer to Show This Frame Only Нажмите, чтобы сбросить маркеры Shift & Trace для соседних кадров Удерживайте клавишу F2 чтобы видеть только этот кадр - + Click to Hide This Frame from Shift & Trace Hold F1 Key on the Viewer to Show This Frame Only Нажмите, чтобы скрыть этот кадр из Shift & Trace Удерживайте клавишу F1 чтобы видеть только этот кадр - + Click to Hide This Frame from Shift & Trace Hold F3 Key on the Viewer to Show This Frame Only Нажмите, чтобы скрыть этот кадр из Shift & Trace Удерживайте клавишу F3 чтобы видеть только этот кадр - + Click to Move Shift & Trace Marker Нажмите, чтобы переместить маркер Shift & Trace - + Current Frame Текущий кадр - + Fixed Onion Skin Toggle Переключение фиксированной кальки - + Relative Onion Skin Toggle Переключение относительной кальки - + Set Start Marker Установить стартовый маркер - + Set Stop Marker Установить конечный маркер - + Set Auto Markers Установить авто-маркеры - + Remove Markers Удалить маркеры - + Preview This Просмотреть это @@ -15507,7 +16647,7 @@ Hold F3 Key on the Viewer to Show This Frame Only XsheetGUI::SoundColumnPopup - + Volume: Громкость: @@ -15523,62 +16663,57 @@ Hold F3 Key on the Viewer to Show This Frame Only XsheetViewer - + Untitled Безымянный - + Scene: Сцена: - - :: Project: - - - - + Frames Кадры - + Frame - + (Sub) (Под) - + Level: Уровень: - + Selected: Выбранный: - + frame : кадр : - + frames * кадры * - + column столбец - + columns столбцы diff --git a/toonz/sources/translations/russian/toonzlib.ts b/toonz/sources/translations/russian/toonzlib.ts index 559d446..03ca8c4 100644 --- a/toonz/sources/translations/russian/toonzlib.ts +++ b/toonz/sources/translations/russian/toonzlib.ts @@ -4,17 +4,17 @@ Preferences - + Retas Level Format Формат уровней Retas - + Adobe Photoshop Adobe Photoshop - + PNG PNG @@ -224,88 +224,88 @@ Вставить Fx : - + Create Linked Fx : %1 Создать связанный Fx : %1 - + Replace Fx : Заменить Fx : - + Unlink Fx : %1 - - %2 Разъединить Fx : %1 - - %2 - + Make Macro Fx : %1 Сделать Makro Fx : %1 - + Explode Macro Fx : %1 Разбить Macro Fx : %1 - + Create Output Fx Создать выход Fx - + Connect to Xsheet : Подключить к Xsheet : - + Disconnect from Xsheet : Отключить от Xsheet : - + Delete Link Удалить связь - + Delete Fx Node : %1 Удалить Fx-узел : %1 - + Paste Fx : Вставить Fx : - + Disconnect Fx Отключить Fx - + Connect Fx : %1 - %2 Подключить Fx : %1 - %2 - + Rename Fx : %1 > %2 Переименовать Fx : %1 - %2 - + Group Fx Сгруппировать Fx - + Ungroup Fx Разгруппировать Fx - + Rename Group : %1 > %2 Переименовать группу : %1 > %2 @@ -447,11 +447,17 @@ %1 не является допустимым цветом (допустимые названия цветов: "красный","прозрачный,"#FF8800" и др.) - + Can't save Не удается сохранить + + Failed to save the following resources: + + + + Set Keyframe %1 at frame %2 Установить ключевой кадр %1 в кадре %2 @@ -538,12 +544,12 @@ Порог яркости - + Xsheet - + Timeline Таймлайн diff --git a/toonz/sources/translations/russian/toonzqt.ts b/toonz/sources/translations/russian/toonzqt.ts index e402893..ee34238 100644 --- a/toonz/sources/translations/russian/toonzqt.ts +++ b/toonz/sources/translations/russian/toonzqt.ts @@ -282,32 +282,32 @@ Possibly the preset file has been corrupted DVGui::CleanupColorField - + Brightness: Яркость: - + Contrast: Контраст: - + Color Thres Цветовой порог - + White Thres Порог белого - + H Range H Range - + Line Width Ширина линии @@ -315,22 +315,22 @@ Possibly the preset file has been corrupted DVGui::ColorField - + R: R: - + G: G: - + B: B: - + A: A: @@ -416,7 +416,7 @@ Possibly the preset file has been corrupted DVGui::ToneCurveField - + Channel: Канал: @@ -486,228 +486,258 @@ Possibly the preset file has been corrupted FlipConsole - - - - + + + + FPS FPS - + Save Сохранить - + Snapshot Snapshot - + Define Sub-camera Определить подкамеру - + Define Loading Box Определить Loading Box - + Use Loading Box Использовать Loading Box - + Background Colors Фоновые цвета - + Framerate Частота кадров - + Playback Controls Управление воспроизведением - + Color Channels Цветовые каналы - + Set Key Установить ключ - + Histogram Гистограмма - + Display Areas as Filled Отобразить область заполненной - + + Viewer Controls + + + + &Save Images &Сохранить изображения - + &Snapshot &Snapshot - + &Compare to Snapshot &Сравнить с Snapshot - + &Define Sub-camera &Определить подкамеру - + &Define Loading Box &Определить Loading Box - + &Use Loading Box &Использовать Loading Box - + &White Background &Белый фон - + &Black Background &Черный фон - + &Checkered Background &Клетчатый фон - + &First Frame &Первый кадр - + &Previous Frame &Предыдущий кадр - + Pause Pause - + Play Play - + Loop Loop - + &Next frame &Следующий кадр - + &Last Frame &Последний кадр - - + + Red Channel Красный канал - + Red Channel in Grayscale Красный канал в оттенках серого - - + + Green Channel Зеленый канал - + Green Channel in Grayscale Зеленый канал в оттенках серого - - + + Blue Channel Синий канал - + Blue Channel in Grayscale Синий канал в оттенках серого - + Alpha Channel Альфа-канал - + &Soundtrack &Звуковая дорожка - + &Histogram &Гистограмма - + &Locator &Локатор - + &Display Areas as Filled &Отобразить область заливкой - + + &Zoom In + + + + + &Zoom Out + + + + + &Flip Horizontally + + + + + &Flip Vertically + + + + + &Reset View + + + + FPS FPS - + Set the current frame Установите текущий кадр - + Drag to play the animation Перетащите, чтобы воспроизвести анимацию - + Set the playback frame rate Установите частоту кадров воспроизведения @@ -715,12 +745,12 @@ Possibly the preset file has been corrupted FontParamField - + Style: Начертания: - + Size: Кегль: @@ -1020,7 +1050,7 @@ Possibly the preset file has been corrupted FunctionSelection - + There is a circular reference in the definition of the interpolation. В определении интерполяции имеется круговой референс. @@ -1028,7 +1058,7 @@ Possibly the preset file has been corrupted FunctionSheet - + Function Editor Редактор функций @@ -1036,102 +1066,103 @@ Possibly the preset file has been corrupted FunctionSheetCellViewer - + Delete Key Удалить ключ - + Set Key Установить ключ - + Linear Interpolation Линейная интерполяция - + Speed In / Speed Out Interpolation Интерполяция ускорения в начале/в конце - + Ease In / Ease Out Interpolation Интерполяция замедления в нач./в конце - + Ease In / Ease Out (%) Interpolation Замедление в начале/в конце (%) Интерполяция - + Exponential Interpolation Экспоненциальная интерполяция - + Expression Interpolation Интерполяция выражений - + File Interpolation Интерполяция из файла - + + Similar Shape Interpolation + Интерполяция аналогичной формы + + + Constant Interpolation Равномерная интерполяция - Step 1 - Шаг 1 + Шаг 1 - Step 2 - Шаг 2 + Шаг 2 - Step 3 - Шаг 3 + Шаг 3 - Step 4 - Шаг 4 + Шаг 4 - + Activate Cycle Активировать цикл - + Deactivate Cycle Деактивировать цикл - + Show Inbetween Values - + Hide Inbetween Values - + Change Interpolation - + Change Step @@ -1195,16 +1226,21 @@ Possibly the preset file has been corrupted - + Show Animated Only Показать только анимированные - + Show All Показать все + + + Hide Selected + + FxColumnPainter @@ -1426,37 +1462,37 @@ Select FX nodes and related links before copying or cutting the selection you wa FxSettings - + &Camera Preview &Предпросмотр камеры - + &Preview &Предпросмотр - + &White Background &Белый фон - + &Black Background &Черный фон - + &Checkered Background &Клетчатый фон - + Fx Settings Настройки эффектов - + : : @@ -1536,19 +1572,19 @@ Select FX nodes and related links before copying or cutting the selection you wa KeyframeNavigator - + Previous Key Предыдущий ключ - - - + + + Set Key Установить ключ - + Next Key Следующий ключ @@ -1581,139 +1617,139 @@ Select FX nodes and related links before copying or cutting the selection you wa PaletteViewer - - - + + + &Save Palette As &Сохранить палитру как - - - + + + &Save Palette &Сохранить палитру - - + + Lock Palette Блокировать палитру - + &Lock Palette &Блокировать палитру - + Options Опции - + &Small Thumbnails View &Маленькие иконки - + &Medium Thumbnails View &Средние иконки - + &Large Thumbnails View &Большие иконки - + &List View &Посмотреть список - + Style Name Имя стиля - + StudioPalette Name StudioPalette Имя - + Both Names Оба имени - + &New Page &Новая страница - - + + &New Style &Новый стиль - - + + &Move Palette &Переместить палитру - + &Palette Gizmo &Палитра Gizmo - + New Page Новая страница - + Delete Page Удалить страницу - + Overwrite Перезаписать - + Don't Overwrite Не перезаписывать - + Palette Палитра - + Level Palette: Палитра уровней: - + Cleanup Palette Палитра очистки - + Studio Palette Studio Палитра - + (Color Model: (Цветовая модель: - + ) ) @@ -1767,7 +1803,7 @@ Select FX nodes and related links before copying or cutting the selection you wa ParamViewer - + Swatch Viewer Просмотрщик образцов @@ -1775,7 +1811,7 @@ Select FX nodes and related links before copying or cutting the selection you wa ParamsPageSet - + Fx Help FX Помощь @@ -1986,12 +2022,12 @@ Are you sure? Невозможно загрузить траекторию движения. - + Stage Schematic Stage Schematic - + FX Schematic FX Schematic @@ -2111,12 +2147,12 @@ Are you sure? Палитра - + Overwrite Перезаписать - + Don't Overwrite Не перезаписывать @@ -2356,6 +2392,11 @@ Are you sure? Имя файла не может быть пустым или содержать любой из следующих символов: (новая строка) \ /: *? "| + + That is a reserved file name and cannot be used. + + + OpenToonz 1.1 OpenToonz 1.1 @@ -2521,63 +2562,91 @@ The second line should be "Mesh [Input bit depth] [Output bit depth]"< + RgbLinkButtons + + + Copy RGB : %1 > %2 + + + + + Swap %1 and %2 + + + + SchematicViewer - + &Fit to Window &По размеру окна - + &Focus on Current &Фокус на текущем - + &Reorder Nodes &Изменение порядка узлов - + &Reset Size &Сбросить размер - - - + + + &Minimize Nodes &Минимизировать узлы - - - + + + &Maximize Nodes &Максимизировать узлы - + + &Selection Mode + + + + + &Zoom Mode + + + + + &Hand Mode + + + + &New Pegbar &Новый Pegbar - + &New Camera &Новая камера - + &New Motion Path &Новая траектория движения - + &Swtich output port display mode &Переключение отображения выходного порта - + &Toggle node icons &Переключить иконки узлов @@ -2674,6 +2743,19 @@ The second line should be "Mesh [Input bit depth] [Output bit depth]"< + StageSchematicNode + + + Toggle Autorotate Along Motion Path + + + + + Toggle Link Motion Path to Control Points + + + + StageSchematicScene diff --git a/toonz/sources/translations/spanish/image.ts b/toonz/sources/translations/spanish/image.ts index 2a1cd57..1fc3e89 100644 --- a/toonz/sources/translations/spanish/image.ts +++ b/toonz/sources/translations/spanish/image.ts @@ -4,12 +4,12 @@ AviWriterProperties - + Codec Compresor - + Uncompressed Sin compresión @@ -17,17 +17,17 @@ GifWriterProperties - + Scale Escala - + Looping Ciclo - + Generate Palette Generar paleta @@ -35,12 +35,12 @@ Mp4WriterProperties - + Quality Calidad - + Scale Escala @@ -340,12 +340,12 @@ intentar aumentar el tiempo de espera en las Preferencias. WebmWriterProperties - + Quality Calidad - + Scale Escala diff --git a/toonz/sources/translations/spanish/tnzcore.ts b/toonz/sources/translations/spanish/tnzcore.ts index 5c82b64..7563b81 100644 --- a/toonz/sources/translations/spanish/tnzcore.ts +++ b/toonz/sources/translations/spanish/tnzcore.ts @@ -43,7 +43,7 @@ Malformed frame name - Nombre de fotograma malformado + Nombre de fotograma malformado diff --git a/toonz/sources/translations/spanish/tnztools.ts b/toonz/sources/translations/spanish/tnztools.ts index 365e1ef..be9d3a9 100644 --- a/toonz/sources/translations/spanish/tnztools.ts +++ b/toonz/sources/translations/spanish/tnztools.ts @@ -1173,6 +1173,34 @@ Do you want to proceed? to Backward hacia atrás + + The selection cannot be updated. It is not editable. + + + + The selection cannot be deleted. It is not editable. + + + + The selection cannot be pasted. It is not editable. + + + + The selection cannot be grouped. It is not editable. + + + + The selection cannot be entered. It is not editable. + + + + The selection cannot be ungrouped. It is not editable. + + + + The selection cannot be moved. It is not editable. + + RGBPickerTool diff --git a/toonz/sources/translations/spanish/toonz.ts b/toonz/sources/translations/spanish/toonz.ts index 490c373..59fc37c 100644 --- a/toonz/sources/translations/spanish/toonz.ts +++ b/toonz/sources/translations/spanish/toonz.ts @@ -1218,7 +1218,7 @@ What do you want to do? Scene: - Escena: + Escena: :: Frame: @@ -1230,14 +1230,18 @@ What do you want to do? Level: - Nivel: + Nivel: (Flipped) (Invertido) - :: Project: + [SCENE]: + + + + [LEVEL]: @@ -1583,6 +1587,10 @@ contuviera información de PPP, entonces se usarán los de la cámara actual. Dpi: PPP: + + Level %1 converting to same file format; skipped. + + DVGui::ProgressDialog @@ -2356,6 +2364,10 @@ Mantener presionada la tecla F3 para ver sólo este fotograma en el visorno icon sin ícono + + Auto Inbetween + + FlipBook @@ -2521,7 +2533,7 @@ Do you want to overwrite it? ImportMagpieFilePopup Import Magpie File - Importar archivo de Magpie + Importar archivo de Magpie Load @@ -2531,6 +2543,10 @@ Do you want to overwrite it? %1 does not exist. %1 no existe. + + Import Toonz Lip Sync File + + InbetweenDialog @@ -2927,7 +2943,7 @@ Do you want to create it? Scan level - Nivel de escaneo + Nivel de escaneo Toonz Vector level @@ -2953,6 +2969,18 @@ Do you want to create it? Sound Column Columna de sonido + + [Various] + + + + SubXsheet Level + + + + Another Level Type + + LineTestCapturePane @@ -3301,7 +3329,7 @@ Usar los números de fotograma como referencia. Arrangement in Xsheet - Acomodar en la planilla + Acomodar en la planilla (FILE DOES NOT EXIST) @@ -3335,6 +3363,30 @@ Usar los números de fotograma como referencia. :: al + + Level Settings & Arrangement in Xsheet + + + + Premultiply + Premultiplicar + + + White As Transparent + Blanco como transparente + + + DPI: + PPP: + + + Antialias Softness: + Suavizado: + + + Subsampling: + Sub-muestreo: + LoadScenePopup @@ -3450,7 +3502,7 @@ Usar los números de fotograma como referencia. MagpieFileImportPopup Import Magpie File - Importar archivo de Magpie + Importar archivo de Magpie Frame Range @@ -3458,7 +3510,7 @@ Usar los números de fotograma como referencia. To: - Hasta: + Hasta: From: @@ -3488,6 +3540,14 @@ Usar los números de fotograma como referencia. The file path is missing. Falta la ruta al archivo. + + Import Toonz Lip Sync File + + + + To: + + MainWindow @@ -3573,7 +3633,7 @@ Usar los números de fotograma como referencia. &Import Magpie File... - &Importar archivo de Magpie... + &Importar archivo de Magpie... &New Project... @@ -3893,7 +3953,7 @@ Usar los números de fotograma como referencia. &Edit FX... - &Editar efecto... + &Editar efecto... Insert Frame @@ -5431,6 +5491,152 @@ Usar los números de fotograma como referencia. Brush Tool - Lock Alpha + + http://opentoonz.readthedocs.io + + + + &Import Toonz Lip Sync File... + + + + Export Exchange Digital Time Sheet (XDTS) + + + + &Clear Cache Folder + + + + Show/Hide Xsheet Camera Column + + + + &Create Blank Drawing + + + + &Shift Keys Down + + + + &Shift Keys Up + + + + Next Key + + + + Prev Key + + + + &FX Editor + + + + &Stop Motion Controls + + + + &Online Manual... + + + + Select Next Frame Guide Stroke + + + + Select Previous Frame Guide Stroke + + + + Select Prev && Next Frame Guide Strokes + + + + Reset Guide Stroke Selections + + + + Tween Selected Guide Strokes + + + + Tween Guide Strokes to Selected + + + + Select Guide Strokes && Tween Mode + + + + Capture Stop Motion Frame + + + + Raise Stop Motion Opacity + + + + Lower Stop Motion Opacity + + + + Toggle Stop Motion Live View + + + + Toggle Stop Motion Zoom + + + + Lower Stop Motion Level Subsampling + + + + Raise Stop Motion Level Subsampling + + + + Go to Stop Motion Insert Frame + + + + Clear Cache Folder + + + + There are no unused items in the cache folder. + + + + Deleting the following items: + + + + + <DIR> + + + + ... and %1 more items + + + + + +Are you sure? + +N.B. Make sure you are not running another process of OpenToonz, +or you may delete necessary files for it. + + + + Can't delete %1 : + + MatchlinesDialog @@ -6680,7 +6886,7 @@ También establecer la ruta de salida a esa carpeta. Backup Animation Levels when Saving - Respaldar niveles de animación al guardarlos + Respaldar niveles de animación al guardarlos Cells Only @@ -6904,7 +7110,7 @@ También establecer la ruta de salida a esa carpeta. Autocreation: - Creación automática: + Creación automática: Minimize Savebox after Editing @@ -7044,7 +7250,7 @@ También establecer la ruta de salida a esa carpeta. X - x + x Viewer Shrink @@ -7156,11 +7362,11 @@ También establecer la ruta de salida a esa carpeta. Disabled - Deshabilitada + Deshabilitada Enabled - Habilitada + Habilitada Use Xsheet as Animation Sheet @@ -7192,7 +7398,7 @@ También establecer la ruta de salida a esa carpeta. Stuff Folder* - Carpeta de contenido* + Carpeta de contenido* Custom* @@ -7536,7 +7742,7 @@ la relatividad al resolver la ruta de un archvo. Enable auto-stretch frame - Extensión automática de acetatos + Extensión automática de acetatos Show Cursor Size Outlines @@ -7630,7 +7836,7 @@ También, se establecerá el destino inicial de salida para las nuevas escenas e Tablet Settings - Opciones de tableta + Opciones de tableta Enable Windows Ink Support* (EXPERIMENTAL) @@ -7670,6 +7876,66 @@ contengan píxeles transparentes en formatos de imagen sin soporte para canal al Current Column Color: Color de columna actual: + + Backup Scene and Animation Levels when Saving + + + + # of backups to keep: + + + + Enable Autocreation + + + + Numbering System: + + + + Enable Auto-stretch Frame + + + + Enable Creation in Hold Cells + + + + Enable Autorenumber + + + + Toolbar Display Behaviour: + + + + Show Camera Column + + + + Level Editor Box Color + + + + Incremental + + + + Enable Tools For Level Only + + + + Show Tools For Level Only + + + + Touch/Tablet Settings + + + + Enable Touch Gesture Controls + + PreferencesPopup::FormatProperties @@ -9613,16 +9879,16 @@ Allow duplicate? Please enable "Sync Level Strip Drawing Number Changes with the XSheet" preference option to use the duplicate command in the xsheet / timeline. - Por favor habilitar la opción "Sincronizar cambios de número en cinta de nivel con la planilla" + Por favor habilitar la opción "Sincronizar cambios de número en cinta de nivel con la planilla" en las Preferencias, para poder usar esta opción en la planilla o línea de tiempo. Please select only one layer to duplicate a frame. - Por favor seleccionar únicamente una columna/capa para duplicar un fotograma. + Por favor seleccionar únicamente una columna/capa para duplicar un fotograma. Please select only one frame to duplicate. - Por favor seleccionar únicamente un fotograma para duplicar. + Por favor seleccionar únicamente un fotograma para duplicar. Timeline @@ -9878,70 +10144,164 @@ Do you want to overwrite it? %1 does not exist. %1 no existe. - - - ReframePopup - OK - Aceptar + The file %1 already exists. +Do you want to overwrite it? + - Cancel - Cancelar + The file %1 has been exported successfully. + - steps - fotogramas + Open containing folder + - with - con + Please enable "Show Keyframes on Cell Area" to show or hide the camera column. + - ( - ( + The chosen folder path does not exist. +Do you want to create it? + - blank cells will be inserted.) - acetatos en blanco serán insertados). + Create + Crear - Reframe with Empty Inbetweens - Reexponer con intermedios vacíos + Edit Level Settings : %1 + - empty inbetweens - intermedios vacíos + Shift Key Frames Down + - - - RenameAsToonzPopup - Rename - Renombrar + Shift Key Frames Up + - Renaming File - Renombrando archivo + Create Blank Drawing + - Creating an animation level of %1 frames - Creando un nivel de animación de %1 fotogramas + Duplicate Drawing + - Delete Original Files - Borrar archivos originales + Unable to create a blank drawing on the camera column + - Level Name: - Nombre del nivel: + The current column is locked + - Cancel - Cancelar + Cannot create a blank drawing on the current column + - The file name cannot be empty or contain any of the following characters:(new line) \ / : * ? " | + The current level is not editable + + + + Unable to create a blank drawing on the current column + + + + Unable to replace the current drawing with a blank drawing + + + + There are no drawings in the camera column to duplicate + + + + Cannot duplicate a drawing in the current column + + + + Unable to duplicate a drawing on the current column + + + + Unable to replace the current or next drawing with a duplicate drawing + + + + Stop Motion Controller + + + + Camera Column Switch : + + + + + ReframePopup + + OK + Aceptar + + + Cancel + Cancelar + + + steps + fotogramas + + + with + con + + + ( + ( + + + blank cells will be inserted.) + acetatos en blanco serán insertados). + + + Reframe with Empty Inbetweens + Reexponer con intermedios vacíos + + + empty inbetweens + intermedios vacíos + + + + RenameAsToonzPopup + + Rename + Renombrar + + + Renaming File + Renombrando archivo + + + Creating an animation level of %1 frames + Creando un nivel de animación de %1 fotogramas + + + Delete Original Files + Borrar archivos originales + + + Level Name: + Nombre del nivel: + + + Cancel + Cancelar + + + The file name cannot be empty or contain any of the following characters:(new line) \ / : * ? " | El nombre del archivo no puede estar vacío ni contener ninguno de los siguientes caracteres:(nueva línea) \ / : * ? " | @@ -10080,7 +10440,11 @@ El archivo de sonido no será incluido en el clip procesado. Click and drag to move guide - Clic y arrastrar para mover una guía + Clic y arrastrar para mover una guía + + + Left click and drag to move guide. Right click to delete guide + @@ -11224,6 +11588,26 @@ Por favor enviar o revertir los cambios antes. Reset View Restablecer vista + + Auto Inbetween + + + + Linear Interpolation + Interpolación lineal + + + Ease In Interpolation + + + + Ease Out Interpolation + + + + Ease In/Out Interpolation + + SceneViewerPanel @@ -11257,7 +11641,7 @@ Por favor enviar o revertir los cambios antes. Scene: - Escena: + Escena: :: Frame: @@ -11269,7 +11653,7 @@ Por favor enviar o revertir los cambios antes. Level: - Nivel: + Nivel: :: Zoom : @@ -11288,7 +11672,11 @@ Por favor enviar o revertir los cambios antes. (Invertido) - :: Project: + [SCENE]: + + + + [LEVEL]: @@ -11629,7 +12017,7 @@ Por favor enviar o revertir los cambios antes. Playback Controls - Controles de reproducción + Controles de reproducción RGBA Channels @@ -11645,7 +12033,19 @@ Por favor enviar o revertir los cambios antes. Playback - Reproducir + Reproducir + + + Play + Reproducir + + + Render + + + + Help + Ayuda @@ -11783,6 +12183,58 @@ Assign to '%3'? Failed to create menubar Falla al crear la barra de menúes + + Project Management + + + + Import + Importar + + + Export + Exportar + + + Script + + + + Group + + + + Arrange + + + + New + Nueva + + + Adjust + + + + Optimize + + + + Convert + Convertir + + + Drawing Substitution + + + + Play + Reproducir + + + Workspace + + StartupPopup @@ -11896,7 +12348,7 @@ Assign to '%3'? The chosen file path is not valid. - La ruta escogida para el archivo no es válida. + La ruta escogida para el archivo no es válida. The width must be 1 or more. @@ -11961,115 +12413,522 @@ Es posible que el archivo del ajuste esté corrupto - The selected scene project '%1' is not in the Current Project list and may not open automatically. + Failed to create the folder. - SubSheetBar + StopMotion - Sub-scene controls: -Click the arrow button to create a new sub-xsheet - Controles de sub-escena: -Clic en el botón con la flecha para crear una nueva sub-planilla + No + frame id + No - Disable Edit in Place - Deshabilitar editar en contexto + No level name specified: please choose a valid level name + No se ha especificado un nombre de nivel: por favor escoger un nombre válido - Enable Edit in Place - Habilitar editar en contexto + The level name specified is already used: please choose a different level name. + El nombre de nivel especificado ya está en uso: por favor escoger un nombre diferente - Exit Sub-xsheet (1 Level Up) - Salir de sub-planilla (arriba 1 nivel) + The save in path specified does not match with the existing level. + La ruta especificada para guardar no coincide con la del nivel existente. - Exit Sub-xsheet (2 Levels Up) - Salir de sub-planilla (arriba 2 niveles) + The captured image size does not match with the existing level. + El tamaño de la imagen capturada no coincide con el del nivel existente. - Exit Sub-xsheet (3 or More Levels Up) - Salir de sub-planilla (arriba 3 niveles o más) + File %1 already exists. +Do you want to overwrite it? + El archivo %1 ya existe. +¿Sobrescribirlo? - Enter Sub-xsheet - Entrar a sub-planilla + Failed to load %1. + Falla al cargar %1. - Current Scene - Escena actual + Folder %1 doesn't exist. +Do you want to create it? + La carpeta %1 no existe. +¿Crearla? - - - T - Nothing to replace: no cells or columns selected. - Nada que reemplazar: no se han seleccionado acetatos o columnas. + Unable to create + - - - TApp - Error allocating memory: not enough memory. - Error al asignar memoria: no hay suficiente memoria. + UNDEFINED WARNING + ADVERTENCIA NO DEFINIDA - It is not possible to save automatically an untitled scene. - No es posible guardar de forma automática una escena sin título. + The level is not registered in the scene, but exists in the file system. + El nivel no se encuentra registrado en la escena, pero existe en el sistema de archivos. - It is not possible to automatically save an untitled scene. - No es posible guardar de forma automática una escena sin título. + +WARNING : Image size mismatch. The saved image size is %1 x %2. + +ADVERTENCIA : Tamaño de imagen no coincidente. El tamaño de la imagen guardada es de %1 x %2. - - - TaskSheet - Name: - Nombre: + WARNING + - Status: - Estado: + +Frame %1 exists. + +El fotograma %1 ya existe. - Command Line: - Línea de comandos: + +Frames %1 exist. + +Los fotogramas %1 ya existen. - Server: - Servidor: + OVERWRITE 1 of + SOBRESCRIBIR 1 de - Submitted By: - Enviado por: + ADD to + AGREGAR a - Submitted On: - Enviado en: + %1 frame + %1 fotograma - Submission Date: - Enviado el: + %1 frames + %1 fotogramas - Start Date: - Fecha de inicio: + The level will be newly created. + El nivel se creará desde el inicio. - Completion Date: - Fecha de finalización: + NEW + NUEVO - Duration: - Duración: + The level is already registered in the scene. + El nivel ya se encuentra registrado en la escena. - Step Count: - Cantidad de pasos: - + +NOTE : The level is not saved. + +NOTA : El nivel no está guardado. + + + +WARNING : Failed to get image size of the existing level %1. + +ADVERTENCIA : No se pudo obtener el tamaño de imagen del nivel %1 ya existente. + + + +WARNING : Image size mismatch. The existing level size is %1 x %2. + +ADVERTENCIA : Tamaño de imagen no coincidente. El tamaño del nivel ya existente es %1 x %2. + + + WARNING : Level name conflicts. There already is a level %1 in the scene with the path + %2. + ADVERTENCIA : Conflicto en el nombre del nivel. Ya existe un nivel %1 en la escena con la ruta + %2. + + + +WARNING : Image size mismatch. The size of level with the same name is is %1 x %2. + +ADVERTENCIA : Tamaño de imagen no coincidente. El tamaño del nivel con ese nombre es %1 x %2. + + + WARNING : Level path conflicts. There already is a level with the path %1 + in the scene with the name %2. + ADVERTENCIA : Conflicto en la ruta del nivel. Ya existe un nivel con la ruta %1 + en la escena llamada %2. + + + +WARNING : Image size mismatch. The size of level with the same path is %1 x %2. + +ADVERTENCIA : Tamaño de imagen no coincidente. El tamaño del nivel con esa ruta es %1 x %2. + + + WARNING + ADVERTENCIA + + + No camera selected. + + + + + StopMotionController + + Controls + + + + Settings + Opciones + + + Options + Opciones + + + Resolution: + + + + Refresh + Actualizar + + + File + Archivo + + + Webcam Settings... + + + + Capture + + + + Next Level + Siguiente nivel + + + Next New + + + + Previous Level + Nivel anterior + + + Next Frame + Fotograma siguiente + + + Last Frame + Fotograma final + + + Previous Frame + Fotograma anterior + + + Next XSheet Frame + + + + Previous XSheet Frame + + + + Current Frame + Fotograma actual + + + Set to the Current Playhead Location + + + + Start Live View + + + + Zoom + + + + Pick Zoom + + + + < + + + + > + + + + << + + + + >> + + + + <<< + + + + >>> + + + + Camera: + Cámara: + + + Name: + Nombre: + + + Frame: + Fotograma: + + + File Type: + Tipo de archivo: + + + Save In: + Guardar en: + + + XSheet Frame: + + + + Camera Model + + + + Camera Mode + + + + Temperature: + + + + Shutter Speed: + + + + Iso: + + + + Aperture: + + + + Exposure: + + + + Image Quality: + + + + Picture Style: + + + + White Balance: + + + + Webcam Options + + + + DSLR Options + + + + Place the frame in the XSheet + + + + Use Direct Show Webcam Drivers + + + + Black Screen for Capture + + + + Use Reduced Resolution Images + + + + Use MJPG with Webcam + + + + Place on XSheet + + + + Use Numpad Shortcuts When Active + + + + Show Live View on All Frames + + + + Capture Review Time: + + + + Level Subsampling: + + + + Opacity: + Opacidad: + + + No camera detected. + + + + No camera detected + + + + - Select camera - + - Seleccionar cámara - + + + Mode: + + + + Auto + Auto + + + Disabled + Deshabilitada + + + Stop Live View + + + + + SubSheetBar + + Sub-scene controls: +Click the arrow button to create a new sub-xsheet + Controles de sub-escena: +Clic en el botón con la flecha para crear una nueva sub-planilla + + + Disable Edit in Place + Deshabilitar editar en contexto + + + Enable Edit in Place + Habilitar editar en contexto + + + Exit Sub-xsheet (1 Level Up) + Salir de sub-planilla (arriba 1 nivel) + + + Exit Sub-xsheet (2 Levels Up) + Salir de sub-planilla (arriba 2 niveles) + + + Exit Sub-xsheet (3 or More Levels Up) + Salir de sub-planilla (arriba 3 niveles o más) + + + Enter Sub-xsheet + Entrar a sub-planilla + + + Current Scene + Escena actual + + + + T + + Nothing to replace: no cells or columns selected. + Nada que reemplazar: no se han seleccionado acetatos o columnas. + + + + TApp + + Error allocating memory: not enough memory. + Error al asignar memoria: no hay suficiente memoria. + + + It is not possible to save automatically an untitled scene. + No es posible guardar de forma automática una escena sin título. + + + It is not possible to automatically save an untitled scene. + No es posible guardar de forma automática una escena sin título. + + + + TaskSheet + + Name: + Nombre: + + + Status: + Estado: + + + Command Line: + Línea de comandos: + + + Server: + Servidor: + + + Submitted By: + Enviado por: + + + Submitted On: + Enviado en: + + + Submission Date: + Enviado el: + + + Start Date: + Fecha de inicio: + + + Completion Date: + Fecha de finalización: + + + Duration: + Duración: + + + Step Count: + Cantidad de pasos: + Failed Steps: Pasos fallidos: @@ -12378,6 +13237,17 @@ Clic en el botón con la flecha para crear una nueva sub-planilla + Toolbar + + Collapse toolbar + + + + Expand toolbar + + + + TopBar Lock Rooms Tab @@ -12609,6 +13479,33 @@ Por favor ver la guía de usuario para obtener más detalles. + XDTSImportPopup + + Importing XDTS file %1 + + + + Load + Cargar + + + Cancel + + + + Please specify the level locations. Suggested paths are input in the fields with blue border. + + + + Level Name + + + + Level Path + + + + XsheetGUI::CellArea Click to select keyframe, drag to move it @@ -12813,6 +13710,14 @@ Por favor ver la guía de usuario para obtener más detalles. &Paste Insert Above &Pegar (insertar encima) + + Hide Camera Column + + + + Show Camera Column + + XsheetGUI::ColumnTransparencyPopup @@ -13064,10 +13969,6 @@ Mantener presionada la tecla F3 para ver sólo este fotograma en el visorAmpliar/reducir el tiempo - :: Project: - - - Frame diff --git a/toonz/sources/translations/spanish/toonzlib.ts b/toonz/sources/translations/spanish/toonzlib.ts index 84f7f31..d675810 100644 --- a/toonz/sources/translations/spanish/toonzlib.ts +++ b/toonz/sources/translations/spanish/toonzlib.ts @@ -436,6 +436,11 @@ Timeline Línea de T. + + Failed to save the following resources: + + + TScriptBinding::CenterlineVectorizer diff --git a/toonz/sources/translations/spanish/toonzqt.ts b/toonz/sources/translations/spanish/toonzqt.ts index 3fbf2a3..4887d0a 100644 --- a/toonz/sources/translations/spanish/toonzqt.ts +++ b/toonz/sources/translations/spanish/toonzqt.ts @@ -695,6 +695,30 @@ Es posible que el archivo de dicho ajuste se encuentre corrupto. &Locator &Localizador + + Viewer Controls + + + + &Zoom In + + + + &Zoom Out + + + + &Flip Horizontally + + + + &Flip Vertically + + + + &Reset View + + FontParamField @@ -1005,19 +1029,19 @@ Es posible que el archivo de dicho ajuste se encuentre corrupto. Step 1 - Exposición x1 + Exposición x1 Step 2 - Exposición x2 + Exposición x2 Step 3 - Exposición x3 + Exposición x3 Step 4 - Exposición x4 + Exposición x4 Activate Cycle @@ -1043,6 +1067,10 @@ Es posible que el archivo de dicho ajuste se encuentre corrupto. Change Step + + Similar Shape Interpolation + Interpolación mediante forma similar + FunctionToolbar @@ -1100,6 +1128,10 @@ Es posible que el archivo de dicho ajuste se encuentre corrupto. Table Mesa + + Hide Selected + + FxColumnPainter @@ -2229,6 +2261,10 @@ La segunda línea debería tener la forma "Mesh [profundidad de bits de ent OK Aceptar + + That is a reserved file name and cannot be used. + + QPushButton @@ -2245,6 +2281,17 @@ La segunda línea debería tener la forma "Mesh [profundidad de bits de ent + RgbLinkButtons + + Copy RGB : %1 > %2 + + + + Swap %1 and %2 + + + + SchematicViewer &Fit to Window @@ -2294,6 +2341,18 @@ La segunda línea debería tener la forma "Mesh [profundidad de bits de ent &Toggle node icons Íconos de &nodos + + &Selection Mode + + + + &Zoom Mode + + + + &Hand Mode + + SchematicWindowEditor @@ -2375,6 +2434,17 @@ La segunda línea debería tener la forma "Mesh [profundidad de bits de ent + StageSchematicNode + + Toggle Autorotate Along Motion Path + + + + Toggle Link Motion Path to Control Points + + + + StageSchematicScene &New Pegbar