From 06bcc2ea0a3e2938bac7deeb7cdf5e2fb2c5072e Mon Sep 17 00:00:00 2001 From: shun_iwasawa Date: Mon, 11 Jul 2016 18:55:17 +0900 Subject: [PATCH 01/56] organize palette 1 --- toonz/sources/include/tools/cursors.h | 2 + toonz/sources/tnztools/CMakeLists.txt | 3 +- .../Resources/picker_style_organize.png | Bin 0 -> 16125 bytes .../Resources/picker_style_white_organize.png | Bin 0 -> 16831 bytes toonz/sources/tnztools/cursormanager.cpp | 2 + toonz/sources/tnztools/stylepickertool.cpp | 461 ++++++++++-------- toonz/sources/tnztools/stylepickertool.h | 53 ++ toonz/sources/tnztools/tnztools.qrc | 2 + toonz/sources/tnztools/tooloptions.cpp | 9 + toonz/sources/toonz/colormodelviewer.cpp | 19 +- toonz/sources/toonz/colormodelviewer.h | 1 + toonz/sources/toonzlib/convert2tlv.cpp | 26 +- 12 files changed, 376 insertions(+), 202 deletions(-) create mode 100644 toonz/sources/tnztools/Resources/picker_style_organize.png create mode 100644 toonz/sources/tnztools/Resources/picker_style_white_organize.png create mode 100644 toonz/sources/tnztools/stylepickertool.h diff --git a/toonz/sources/include/tools/cursors.h b/toonz/sources/include/tools/cursors.h index a912ffaf..16eec827 100644 --- a/toonz/sources/include/tools/cursors.h +++ b/toonz/sources/include/tools/cursors.h @@ -66,6 +66,8 @@ enum { PickerCursorWhite, PickerCursorWhiteLine, PickerCursorWhiteArea, + PickerCursorOrganize, + PickerCursorWhiteOrganize, PickerRGB, PickerRGBWhite, diff --git a/toonz/sources/tnztools/CMakeLists.txt b/toonz/sources/tnztools/CMakeLists.txt index ae100a99..8e036db4 100644 --- a/toonz/sources/tnztools/CMakeLists.txt +++ b/toonz/sources/tnztools/CMakeLists.txt @@ -10,7 +10,8 @@ set(MOC_HEADERS ../include/tools/tooloptions.h ../include/tools/screenpicker.h rgbpickertool.h - rulertool.h) + rulertool.h + stylepickertool.h) set(HEADERS ${MOC_HEADERS} autofill.h diff --git a/toonz/sources/tnztools/Resources/picker_style_organize.png b/toonz/sources/tnztools/Resources/picker_style_organize.png new file mode 100644 index 0000000000000000000000000000000000000000..c502b37c6b60efe812ce2cbbc8552a70b28b98b9 GIT binary patch literal 16125 zcmeI3e^gWF8OL85YypAM)*e@j^AhI|+QQ8bl91a33Ir837(=LNrSs)7Ft_vHysM)ly*=&pwANz}PUk`G+>p*@?@b_iLGZRc z{cGpF=j7zc`+mRA``*v{zEAEyccZ0vep14;1OPx%(E^hdeiPy+P6j}X`uBS+@JGC7 z!Ezq}375rBO#W+G&%wTYuAsnTsp19RSH*jXqJjd#|vaI>Yr>&C5TLww|X}b{yXc zTKbO-rpF8{iK~AD$@pN0V|%CUt9_n7 zss=9I7Spuuprvq_IN+s{%DD@u4ws5Tu!%-3K->~ycCSZW>QXsB*JQ=JWm{u zC^K7#0^Z9KnoMm5qtNOIojy~k(dn{u4-zVcQbQ`#q*{@oQd3z9DoaHSU-Fy;7#X~d z3d(AlH#{8tWt3M5f`=kWzu%wfS7-9xN>ZuU>q&)*RH-tcBEwhX7U)2R+cz_uWF(J? z^)X(~BXGQ%5cAS@zFIKK<>Ek*Yxurgp2$FM-!MB!kqpotQkkhB$1^#Yh{sdyb%v(q zU`W=&d1gFfZBKF`R0kJv{I8R?#IV7Mk`^Z4eG`MO-=4($^P*FXfrNJkAj;`G^S zJS=HteSEc-VGGy5TbViD-3werba6&y5_=|`I~(98u!%ikTWBkUSI7YGl`8PEw7`39 zJnzg2@3LsgfE7dBRm9w7oZG?sedz{rtR=eM(QK@V7T6r<)MhAj8H#M1QctP0luG}A zLQg3aNRqH}Ob#>e;3{gy$&sa})LJwLq8yt8o*xG-(BCQxszvfR7^;Hzx@aMXbJ3M7 z>2X&Y$Y>*?jO;3^fOqm zs(z+Q&*T^vniO#%Sws7mDsuY-+Rd;qqVC;OJg>p_M1|hc&1uBgTtvE-!U~}zbW++F9+)c*H?OBbER_`83vga^XbqGG@}{=v$YFh%xTenPkY1-$ zsuT)Rsesq87405tU4CmT+CA19b(Xq0L9892iH>PTTw*;B7n>6J=)vY_H5#?XK#px5 z>#%SE)>&ra;Q955yHX8D3VFtMjB8vzkrC+_Hinl9c}NJYWVjVRg21OAGV=H{dXXas z;Rg<)ck}}%M$_RzP#Tgk#wCde6<}N_4apeel0<|GFfNpaWQ=i1B0>ci7fM4i#<(OA zp#qExr6Cz(T#|@T0mg;Wkc=@dNkpgs<3edj#u%3*B2<8Jp)@38j7t&`D!{l<8j>-_ zC5Z?XU|c8-$r$63M1%@3E|i93jB!aKLIoHXN<%WnxFivw0*ni#AsJ&_l88_N#)Z<5 zj4>`rM5qAcLTO0G7?&g>RDf}zG$dn;OA-+(z_?Hvk}<|5i3k;7Tqq667~_&egbFY& zl!j!CaY-UV1sE4fLo&W4u7v0dg{&LCMd*jG3!WHS#K2b#31)%S3_z_3fckX+T!-&@ z*5?7>dK7@mivTF-0pQ*@W}O6u0LXx4u?>EMl$4aTv^1qsnGb-~YW4Yin>KA~Z*TAH z>^yYn(CO2s2L=X$00i-c3H;v?I6m|?+}j{ouojn$x;aqT)%O8>OL}9GDbE%-5!<~h z1}GAHhzsSx7q`8;W4*5L41B>l7_>Jw-&nQEKKS2l4I3M_ZjFJ-fQaE%w0|wE zJoU}my=JS613M=Ychc{u*=SPKUgF*9&!} z8hh~te_#98MbDkun|Sfe;bW;&uHR8!8$W}Y4(ODoqrG{qGrzUzzjg{S93TGS|NJqfIMRZ?(Umy{mrl z?sL6MI?Qo_)aKs*%qp1L^v##b3%F>iIQi>u%WWKiE=OzwP9l*-y(3{^qsS z32_a(f?qzQ>hh$%SOR!glFTMD7tlG>3%f{b8mL#nMZfM7%0fik60Iy%5u>AQEiA9<6! z!&Ez+I`7UTchCF0-{;x)^S&3Lt05%}0Z1J0`}T_q4+f^M z?|)$D)Mu}~ZR*Cex7={+6ALR=^xR(g5 zzI>heVu?^tH*H$Qv)_92!0O9KhKA3~ySZo1Er-8e;PY-t+_2!%;9Y#}rp3>f^4kwS z{I%UjcY;l4-o99xH*(L^uEWKLj{g0tduOc)40N7$=9e^ey;XbZx)<&(od@3Dv7z|U z)`5jHw_Shw+SfYjKL!_i*PmJQblwH==@~t*57d8;ed*^9whUhQtGJadUbg)t2yCi* z<@0?_U*7T1$(zpZ{^{AdZ!Ujz?dg{vx_SP)bu*<8zKCvQ`}Cm$A71m9`>aE=4xIPi zv0L7@FaMu=V?VZxoS%~S=(^WqJw^Qw-|ig#*|9xCMFV~D-)>vl;C-NNXYhxCi{Fg? zVA_LHOkJ|S1b{m~QW~4}X8+xSq(;g_Sq;LnL?njT1K^pLh>6m2sGEYYRf&4dBYXSJ zCPns|o9uqhAFG0GO3kV`Y*w?lRu)blRMEm@FJ`XE`ftJe<5WSz=)rMqpIekdB{F7fY}AjC@SWjC<0=Xioh8iN)#rjYK9)t?AV(5rR>q zW74LTT4QGnvh`3?+v5_fUWtY>XQI*TN+>%yVfQu(%{U-`Qx;C+e^qDIE;wWH?tN?-nc$ z!Q%c3=N33FCrGL%7Q?T~N~m*!7Y4x}n`d8HVaRFltcH~GbAyBIbt z5F-(BuH}A9X_+ELa)aima-t^JuTUG+bTKNyT33<$9ByYiQBJUNiSCIjsG5r5oIb`_WRy&{218c6U1A(=7ep(}7G&IZ zC^53r>2leFcDo~JO{bV3%(zrFiiY+;XU^V0J0w{z8{mqut!YPCN!GoX7}ub&tG(v* zw$2pFOdT{d$?718l2I|sC1cY;*~5-$&E8f-ouV-%dVMJ|7N3(hTD_ek@;X=iVFimHYqML zAIwW}VL-?x#YN_Wc_}Uo2-&2#$b2v_#f1SOn-mwB59Xz~Fd$@;;v)0Gyc8D(glrOV z6=q-Qg;De#ZwGo|_wY0QXVA;OCaI?055OuP0A1?ZgMw)Fd@$qJ!qUOe{xw@S9$WlOSh=h4T>klAt>5#H zSLU|XSod6Vel!)V+>u|@7W`0(*A_f>V!O3!>Epla=>)BZb`9_P*EK(}Y!i~$iD!#vNczERasqa=a zxcdsuJ@==^viINGaO@i|HZ9t@rT_ZoH=gQyY3RzUO?g-H!TnDxS$(getCurrentLevelStyleIndex(); + pick(pos, e); +} + +void StylePickerTool::leftButtonDrag(const TPointD &pos, const TMouseEvent &e) { + pick(pos, e); +} - m_prop.bind(m_passivePick); - m_passivePick.setId("PassivePick"); - } +void StylePickerTool::pick(const TPointD &pos, const TMouseEvent &e) { + // Area = 0, Line = 1, All = 2 + int modeValue = m_colorType.getIndex(); - ToolType getToolType() const override { return TTool::LevelReadTool; } + //------------------------------------ + // MultiLayerStylePicker + /*--- + PickしたStyleId = 0、かつ + Preference で MultiLayerStylePickerが有効、かつ + Scene編集モード、かつ + 下のカラムから拾った色がTransparentでない場合、 + → カレントLevelを移動する。 + ---*/ + if (Preferences::instance()->isMultiLayerStylePickerEnabled() && + getApplication()->getCurrentFrame()->isEditingScene()) { + int superPickedColumnId = getViewer()->posToColumnIndex( + e.m_pos, getPixelSize() * getPixelSize(), false); - void draw() override {} + if (superPickedColumnId >= 0 /*-- 何かColumnに当たった場合 --*/ + && + getApplication()->getCurrentColumn()->getColumnIndex() != + superPickedColumnId) /*-- かつ、Current Columnでない場合 --*/ + { + /*-- そのColumnからPickを試みる --*/ + int currentFrame = getApplication()->getCurrentFrame()->getFrame(); + TXshCell pickedCell = + getApplication()->getCurrentXsheet()->getXsheet()->getCell( + currentFrame, superPickedColumnId); + TImageP pickedImage = pickedCell.getImage(false).getPointer(); + TToonzImageP picked_ti = pickedImage; + TVectorImageP picked_vi = pickedImage; + TXshSimpleLevel *picked_level = pickedCell.getSimpleLevel(); + if ((picked_ti || picked_vi) && picked_level) { + TPointD tmpMousePosition = + getColumnMatrix(superPickedColumnId).inv() * + getViewer()->winToWorld(e.m_pos); - void leftButtonDown(const TPointD &pos, const TMouseEvent &e) override { - m_oldStyleId = m_currentStyleId = - getApplication()->getCurrentLevelStyleIndex(); - pick(pos, e); - } - void leftButtonDrag(const TPointD &pos, const TMouseEvent &e) override { - pick(pos, e); - } + TPointD tmpDpiScale = + getCurrentDpiScale(picked_level, getCurrentFid()); - void pick(const TPointD &pos, const TMouseEvent &e) { - // Area = 0, Line = 1, All = 2 - int modeValue = m_colorType.getIndex(); + tmpMousePosition.x /= tmpDpiScale.x; + tmpMousePosition.y /= tmpDpiScale.y; - //------------------------------------ - // MultiLayerStylePicker - /*--- - PickしたStyleId = 0、かつ - Preference で MultiLayerStylePickerが有効、かつ - Scene編集モード、かつ - 下のカラムから拾った色がTransparentでない場合、 - → カレントLevelを移動する。 - ---*/ - if (Preferences::instance()->isMultiLayerStylePickerEnabled() && - getApplication()->getCurrentFrame()->isEditingScene()) { - int superPickedColumnId = getViewer()->posToColumnIndex( - e.m_pos, getPixelSize() * getPixelSize(), false); - - if (superPickedColumnId >= 0 /*-- 何かColumnに当たった場合 --*/ - && - getApplication()->getCurrentColumn()->getColumnIndex() != - superPickedColumnId) /*-- かつ、Current Columnでない場合 --*/ - { - /*-- そのColumnからPickを試みる --*/ - int currentFrame = getApplication()->getCurrentFrame()->getFrame(); - TXshCell pickedCell = - getApplication()->getCurrentXsheet()->getXsheet()->getCell( - currentFrame, superPickedColumnId); - TImageP pickedImage = pickedCell.getImage(false).getPointer(); - TToonzImageP picked_ti = pickedImage; - TVectorImageP picked_vi = pickedImage; - TXshSimpleLevel *picked_level = pickedCell.getSimpleLevel(); - if ((picked_ti || picked_vi) && picked_level) { - TPointD tmpMousePosition = - getColumnMatrix(superPickedColumnId).inv() * - getViewer()->winToWorld(e.m_pos); - - TPointD tmpDpiScale = - getCurrentDpiScale(picked_level, getCurrentFid()); - - tmpMousePosition.x /= tmpDpiScale.x; - tmpMousePosition.y /= tmpDpiScale.y; - - StylePicker superPicker(pickedImage); - int picked_subsampling = - picked_level->getImageSubsampling(pickedCell.getFrameId()); - int superPicked_StyleId = superPicker.pickStyleId( - TScale(1.0 / picked_subsampling) * tmpMousePosition + - TPointD(-0.5, -0.5), - getPixelSize() * getPixelSize(), modeValue); - /*-- 何かStyleが拾えて、Transparentでない場合 --*/ - if (superPicked_StyleId > 0) { - /*-- Levelの移動 --*/ - getApplication()->getCurrentLevel()->setLevel(picked_level); - /*-- Columnの移動 --*/ - getApplication()->getCurrentColumn()->setColumnIndex( - superPickedColumnId); - /*-- 選択の解除 --*/ - if (getApplication()->getCurrentSelection()->getSelection()) - getApplication() - ->getCurrentSelection() - ->getSelection() - ->selectNone(); - /*-- StyleIdの移動 --*/ - getApplication()->setCurrentLevelStyleIndex(superPicked_StyleId); - return; - } + StylePicker superPicker(pickedImage); + int picked_subsampling = + picked_level->getImageSubsampling(pickedCell.getFrameId()); + int superPicked_StyleId = superPicker.pickStyleId( + TScale(1.0 / picked_subsampling) * tmpMousePosition + + TPointD(-0.5, -0.5), + getPixelSize() * getPixelSize(), modeValue); + /*-- 何かStyleが拾えて、Transparentでない場合 --*/ + if (superPicked_StyleId > 0) { + /*-- Levelの移動 --*/ + getApplication()->getCurrentLevel()->setLevel(picked_level); + /*-- Columnの移動 --*/ + getApplication()->getCurrentColumn()->setColumnIndex( + superPickedColumnId); + /*-- 選択の解除 --*/ + if (getApplication()->getCurrentSelection()->getSelection()) + getApplication() + ->getCurrentSelection() + ->getSelection() + ->selectNone(); + /*-- StyleIdの移動 --*/ + getApplication()->setCurrentLevelStyleIndex(superPicked_StyleId); + return; } } } - /*-- MultiLayerStylePicker ここまで --*/ - //------------------------------------ - TImageP image = getImage(false); - TToonzImageP ti = image; - TVectorImageP vi = image; - TXshSimpleLevel *level = - getApplication()->getCurrentLevel()->getSimpleLevel(); - if ((!ti && !vi) || !level) return; - - /*-- 画面外をpickしても拾えないようにする --*/ - if (!m_viewer->getGeometry().contains(pos)) return; - - int subsampling = level->getImageSubsampling(getCurrentFid()); - StylePicker picker(image); - int styleId = picker.pickStyleId( - TScale(1.0 / subsampling) * pos + TPointD(-0.5, -0.5), - getPixelSize() * getPixelSize(), modeValue); - - if (styleId < 0) return; - - if (modeValue == 1) // LINES - { - /*-- pickLineモードのとき、取得Styleが0の場合はカレントStyleを変えない。 - * --*/ - if (styleId == 0) return; - /*-- - * pickLineモードのとき、PurePaintの部分をクリックしてもカレントStyleを変えない - * --*/ - if (ti && - picker.pickTone(TScale(1.0 / subsampling) * pos + - TPointD(-0.5, -0.5)) == 255) - return; - } - - /*--- Styleを選択している場合は選択を解除する ---*/ - TSelection *selection = - TTool::getApplication()->getCurrentSelection()->getSelection(); - if (selection) { - TStyleSelection *styleSelection = - dynamic_cast(selection); - if (styleSelection) styleSelection->selectNone(); - } - - getApplication()->setCurrentLevelStyleIndex(styleId); } + /*-- MultiLayerStylePicker ここまで --*/ + //------------------------------------ + TImageP image = getImage(false); + TToonzImageP ti = image; + TVectorImageP vi = image; + TXshSimpleLevel *level = + getApplication()->getCurrentLevel()->getSimpleLevel(); + if ((!ti && !vi) || !level) return; - void mouseMove(const TPointD &pos, const TMouseEvent &e) override { - if (!m_passivePick.getValue()) return; - /*--- PassiveにStyleを拾う機能 ---*/ - PaletteController *controller = - TTool::getApplication()->getPaletteController(); + /*-- 画面外をpickしても拾えないようにする --*/ + if (!m_viewer->getGeometry().contains(pos)) return; - TImageP image = getImage(false); - TToonzImageP ti = image; - TVectorImageP vi = image; - TXshSimpleLevel *level = - getApplication()->getCurrentLevel()->getSimpleLevel(); - if ((!ti && !vi) || !level || !m_viewer->getGeometry().contains(pos)) { - controller->notifyStylePassivePicked(-1, -1, -1); + int subsampling = level->getImageSubsampling(getCurrentFid()); + StylePicker picker(image); + int styleId = picker.pickStyleId( + TScale(1.0 / subsampling) * pos + TPointD(-0.5, -0.5), + getPixelSize() * getPixelSize(), modeValue); + + if (styleId < 0) return; + + if (modeValue == 1) // LINES + { + /*-- pickLineモードのとき、取得Styleが0の場合はカレントStyleを変えない。 + * --*/ + if (styleId == 0) return; + /*-- + * pickLineモードのとき、PurePaintの部分をクリックしてもカレントStyleを変えない + * --*/ + if (ti && + picker.pickTone(TScale(1.0 / subsampling) * pos + + TPointD(-0.5, -0.5)) == 255) return; - } - - int subsampling = level->getImageSubsampling(getCurrentFid()); - StylePicker picker(image); - TPointD pickPos(TScale(1.0 / subsampling) * pos + TPointD(-0.5, -0.5)); - int inkStyleId = - picker.pickStyleId(pickPos, getPixelSize() * getPixelSize(), 1); - int paintStyleId = - picker.pickStyleId(pickPos, getPixelSize() * getPixelSize(), 0); - int tone = picker.pickTone(pickPos); - controller->notifyStylePassivePicked(inkStyleId, paintStyleId, tone); } - void onActivate() override {} - - int getCursorId() const override { - bool isBlackBG = ToonzCheck::instance()->getChecks() & ToonzCheck::eBlackBg; - - if (m_colorType.getValue() == LINES) - return (isBlackBG) ? ToolCursor::PickerCursorWhiteLine - : ToolCursor::PickerCursorLine; - else if (m_colorType.getValue() == AREAS) - return (isBlackBG) ? ToolCursor::PickerCursorWhiteArea - : ToolCursor::PickerCursorArea; - else // line&areas - return (isBlackBG) ? ToolCursor::PickerCursorWhite - : ToolCursor::PickerCursor; + /*--- Styleを選択している場合は選択を解除する ---*/ + TSelection *selection = + TTool::getApplication()->getCurrentSelection()->getSelection(); + if (selection) { + TStyleSelection *styleSelection = + dynamic_cast(selection); + if (styleSelection) styleSelection->selectNone(); } -} stylePickerTool; + getApplication()->setCurrentLevelStyleIndex(styleId); } + +void StylePickerTool::mouseMove(const TPointD &pos, const TMouseEvent &e) { + if (!m_passivePick.getValue()) return; + /*--- PassiveにStyleを拾う機能 ---*/ + PaletteController *controller = + TTool::getApplication()->getPaletteController(); + + TImageP image = getImage(false); + TToonzImageP ti = image; + TVectorImageP vi = image; + TXshSimpleLevel *level = + getApplication()->getCurrentLevel()->getSimpleLevel(); + if ((!ti && !vi) || !level || !m_viewer->getGeometry().contains(pos)) { + controller->notifyStylePassivePicked(-1, -1, -1); + return; + } + + int subsampling = level->getImageSubsampling(getCurrentFid()); + StylePicker picker(image); + TPointD pickPos(TScale(1.0 / subsampling) * pos + TPointD(-0.5, -0.5)); + int inkStyleId = + picker.pickStyleId(pickPos, getPixelSize() * getPixelSize(), 1); + int paintStyleId = + picker.pickStyleId(pickPos, getPixelSize() * getPixelSize(), 0); + int tone = picker.pickTone(pickPos); + controller->notifyStylePassivePicked(inkStyleId, paintStyleId, tone); +} + +int StylePickerTool::getCursorId() const { + bool isBlackBG = ToonzCheck::instance()->getChecks() & ToonzCheck::eBlackBg; + + /* in case the "organize palette" option is active */ + if (m_organizePalette.getValue()) + return (isBlackBG) ? ToolCursor::PickerCursorWhiteOrganize + : ToolCursor::PickerCursorOrganize; + + if (m_colorType.getValue() == LINES) + return (isBlackBG) ? ToolCursor::PickerCursorWhiteLine + : ToolCursor::PickerCursorLine; + else if (m_colorType.getValue() == AREAS) + return (isBlackBG) ? ToolCursor::PickerCursorWhiteArea + : ToolCursor::PickerCursorArea; + else // line&areas + return (isBlackBG) ? ToolCursor::PickerCursorWhite + : ToolCursor::PickerCursor; +} + +bool StylePickerTool::onPropertyChanged(std::string propertyName) { + if (propertyName == m_organizePalette.getName()){ + + if (m_organizePalette.getValue()) { + if (!startOrganizePalette()){ + m_organizePalette.setValue(false); + getApplication()->getCurrentTool()->notifyToolChanged(); + return false; + } + } else { + std::cout << "End Organize Palette" << std::endl; + m_paletteToBeOrganized = NULL; + } + } + return true; +} + +bool StylePickerTool::startOrganizePalette() { + /* Check if the organizing operation is available */ + TXshLevel* level = getApplication()->getCurrentLevel()->getLevel(); + if (!level) { + DVGui::error(tr("No current level.")); + return false; + } + if ( level->getType() != PLI_XSHLEVEL && level->getType() != TZP_XSHLEVEL + && level->getType() != PLT_XSHLEVEL ) { + DVGui::error(tr("Current level has no available palette.")); + return false; + } + /* palette should have more than one page to organize */ + TPalette* pal = NULL; + if (level->getType() == PLT_XSHLEVEL) + pal = level->getPaletteLevel()->getPalette(); + else + pal = level->getSimpleLevel()->getPalette(); + if (!pal || pal->getPageCount() < 2){ + DVGui::error(tr("Palette must have more than one palette to be organized.")); + return false; + } + + m_paletteToBeOrganized = pal; + + std::cout << "Start Organize Palette" << std::endl; + + return true; +} + +/* + If the working palette is changed, then deactivate the "organize palette" toggle. +*/ +void StylePickerTool::onImageChanged() { + std::cout << "StylePickerTool::onImageChanged" << std::endl; + if (!m_organizePalette.getValue() || !m_paletteToBeOrganized)return; + + TXshLevel* level = getApplication()->getCurrentLevel()->getLevel(); + if (!level) { + m_organizePalette.setValue(false); + getApplication()->getCurrentTool()->notifyToolChanged(); + return; + } + TPalette* pal = NULL; + if (level->getType() == PLT_XSHLEVEL) + pal = level->getPaletteLevel()->getPalette(); + else if (level->getSimpleLevel()) { + pal = level->getSimpleLevel()->getPalette(); + } + if (!pal || pal != m_paletteToBeOrganized) { + m_organizePalette.setValue(false); + getApplication()->getCurrentTool()->notifyToolChanged(); + return; + } +} + + +StylePickerTool stylePickerTool; + diff --git a/toonz/sources/tnztools/stylepickertool.h b/toonz/sources/tnztools/stylepickertool.h new file mode 100644 index 00000000..333ac0e1 --- /dev/null +++ b/toonz/sources/tnztools/stylepickertool.h @@ -0,0 +1,53 @@ +#pragma once + +#ifndef STYLEPICKERTOOL_H +#define STYLEPICKERTOOL_H + +#include "tools/tool.h" +#include "tproperty.h" +#include + +class StylePickerTool final : public TTool, public QObject { + int m_oldStyleId, m_currentStyleId; + + TEnumProperty m_colorType; + TPropertyGroup m_prop; + TBoolProperty m_passivePick; + + TBoolProperty m_organizePalette; + TPalette* m_paletteToBeOrganized; + + bool startOrganizePalette(); +public: + TPropertyGroup *getProperties(int targetType) override { return &m_prop; } + + StylePickerTool(); + + ToolType getToolType() const override { return TTool::LevelReadTool; } + + void draw() override {} + + void leftButtonDown(const TPointD &pos, const TMouseEvent &e) override; + + void leftButtonDrag(const TPointD &pos, const TMouseEvent &e) override; + + void pick(const TPointD &pos, const TMouseEvent &e); + + void mouseMove(const TPointD &pos, const TMouseEvent &e) override; + + int getCursorId() const override; + + bool onPropertyChanged(std::string propertyName); + + bool isOrganizePaletteActive() { return m_organizePalette.getValue(); } + + /* + This function is called when either frame/column/level/scene is switched or + either scene/level/object is changed (see tapp.cpp). + If the working palette is changed, then deactivate the "organize palette" toggle. + */ + void onImageChanged() override; +}; + + +#endif \ No newline at end of file diff --git a/toonz/sources/tnztools/tnztools.qrc b/toonz/sources/tnztools/tnztools.qrc index 98087dc9..1b5b91bb 100644 --- a/toonz/sources/tnztools/tnztools.qrc +++ b/toonz/sources/tnztools/tnztools.qrc @@ -50,6 +50,8 @@ Resources/picker_style_white_line.png Resources/picker_style_white_area.png Resources/picker_style_white.png + Resources/picker_style_organize.png + Resources/picker_style_white_organize.png Resources/picker_rgb.png Resources/picker_rgb_white.png Resources/fill_f.png diff --git a/toonz/sources/tnztools/tooloptions.cpp b/toonz/sources/tnztools/tooloptions.cpp index ea777d38..ceb05173 100644 --- a/toonz/sources/tnztools/tooloptions.cpp +++ b/toonz/sources/tnztools/tooloptions.cpp @@ -2173,6 +2173,15 @@ StylePickerToolOptionsBox::StylePickerToolOptionsBox( m_layout->addWidget(m_currentStyleLabel, 0); m_layout->addStretch(1); + // retrieve the "organize palette" checkbox from the layout and insert + // into rightmost of the tool option bar + ToolOptionCheckbox* organizePaletteCB = + dynamic_cast(m_controls.value("Organize Palette")); + m_layout->removeWidget(organizePaletteCB); + m_layout->addWidget(new ToolOptionsBarSeparator(this), 0); + m_layout->addWidget(organizePaletteCB); + organizePaletteCB->setToolTip(tr("With this option being activated, the picked style will be\nmoved to the end of the first page of the palette.")); + if (m_realTimePickMode) { connect(m_realTimePickMode, SIGNAL(toggled(bool)), m_currentStyleLabel, SLOT(setVisible(bool))); diff --git a/toonz/sources/toonz/colormodelviewer.cpp b/toonz/sources/toonz/colormodelviewer.cpp index 2e063b5b..69e207fd 100644 --- a/toonz/sources/toonz/colormodelviewer.cpp +++ b/toonz/sources/toonz/colormodelviewer.cpp @@ -14,6 +14,7 @@ #include "tools/toolcommandids.h" #include "tools/tool.h" #include "tools/toolhandle.h" +#include "../tnztools/stylepickertool.h" // TnzQt includes #include "toonzqt/menubarcommand.h" @@ -306,6 +307,12 @@ void ColorModelViewer::pick(const QPoint &p) { if (styleSelection) styleSelection->selectNone(); } + /* + if the Style Picker too is current and "organize palette" is activated, + then move the picked style to the first page of the palette. + */ + //TODO: write organize palette operation here (maybe implement in PaletteCmd) + ph->setStyleIndex(styleIndex); } @@ -356,8 +363,16 @@ void ColorModelViewer::showEvent(QShowEvent *e) { //----------------------------------------------------------------------------- /*- ツールのTypeに合わせてPickのタイプも変え、カーソルも切り替える -*/ void ColorModelViewer::changePickType() { - TPropertyGroup *propGroup = - TApp::instance()->getCurrentTool()->getTool()->getProperties(0); + TTool *tool = TApp::instance()->getCurrentTool()->getTool(); + if (tool->getName() == T_StylePicker) { + StylePickerTool* stylePickerTool = dynamic_cast(tool); + if (stylePickerTool->isOrganizePaletteActive()) { + setToolCursor(m_imageViewer, ToolCursor::PickerCursorOrganize); + return; + } + } + + TPropertyGroup *propGroup = tool->getProperties(0); /*- Propertyの無いツールの場合 -*/ if (!propGroup) { m_mode = 2; diff --git a/toonz/sources/toonz/colormodelviewer.h b/toonz/sources/toonz/colormodelviewer.h index e0680805..3a4a00fb 100644 --- a/toonz/sources/toonz/colormodelviewer.h +++ b/toonz/sources/toonz/colormodelviewer.h @@ -48,6 +48,7 @@ protected: * UseCurrentFrameのLevelに移動してきたときに、改めてCurrentFrameを格納しなおす * -*/ void reloadCurrentFrame(); + protected slots: void showCurrentImage(); diff --git a/toonz/sources/toonzlib/convert2tlv.cpp b/toonz/sources/toonzlib/convert2tlv.cpp index 8e9c5292..6663848c 100644 --- a/toonz/sources/toonzlib/convert2tlv.cpp +++ b/toonz/sources/toonzlib/convert2tlv.cpp @@ -566,6 +566,17 @@ TPalette *Convert2Tlv::buildPalette() { page->addStyle(stylesToBeAddedToPage.at(s)); } + /* + If the palette path is empty, an initial palette with four colors are set in the palette here. + ( see Convert2Tlv::init() ) So here I make the latter three styles in the initial palette to set + "AutoPaint" options. + */ + if (m_palettePath.isEmpty()) { + assert(m_palette->getStyleCount() >= 5); + for (int id = 2; id <= 4; id++) + m_palette->getStyle(id)->setFlags(1); + } + if (!m_appendDefaultPalette) return m_palette; /*-- Adding styles in the default palette to the result palette, starts here @@ -810,11 +821,16 @@ bool Convert2Tlv::init(std::string &errorMessage) { m_it = m_level1->begin(); - /*- 既定のパレットを作る。黒、赤、青、緑の順 -*/ - m_colorMap[TPixel::Black] = ++m_lastIndex; - m_colorMap[TPixel::Red] = ++m_lastIndex; - m_colorMap[TPixel::Blue] = ++m_lastIndex; - m_colorMap[TPixel::Green] = ++m_lastIndex; + /*- + If the palette is empty, make an initial palette with black, red, blue and green styles. + For the latter three styles the "autopaint" option should be set. + -*/ + if (m_lastIndex == 0) { + m_colorMap[TPixel::Black] = ++m_lastIndex; + m_colorMap[TPixel::Red] = ++m_lastIndex; + m_colorMap[TPixel::Blue] = ++m_lastIndex; + m_colorMap[TPixel::Green] = ++m_lastIndex; + } return true; } From 0b1ad71d3b6fdcf59da08572d9faeb537ea88038 Mon Sep 17 00:00:00 2001 From: Jeremy Bullock Date: Mon, 11 Jul 2016 22:36:05 -0600 Subject: [PATCH 02/56] updated style link and right click menu --- .../include/toonzqt/paletteviewergui.h | 3 - .../include/toonzqt/selectioncommandids.h | 2 + toonz/sources/toonz/mainwindow.cpp | 4 + toonz/sources/toonzqt/paletteviewergui.cpp | 77 ++++++------------- toonz/sources/toonzqt/styleselection.cpp | 14 +++- 5 files changed, 42 insertions(+), 58 deletions(-) diff --git a/toonz/sources/include/toonzqt/paletteviewergui.h b/toonz/sources/include/toonzqt/paletteviewergui.h index 390722c2..bc1d074c 100644 --- a/toonz/sources/include/toonzqt/paletteviewergui.h +++ b/toonz/sources/include/toonzqt/paletteviewergui.h @@ -200,9 +200,6 @@ protected: void zoomOutChip(); protected slots: - - void toggleLink(); - void eraseToggleLink(); void removeLink(); private: diff --git a/toonz/sources/include/toonzqt/selectioncommandids.h b/toonz/sources/include/toonzqt/selectioncommandids.h index 0dd6b738..99ebe5e5 100644 --- a/toonz/sources/include/toonzqt/selectioncommandids.h +++ b/toonz/sources/include/toonzqt/selectioncommandids.h @@ -12,6 +12,8 @@ #define MI_PasteColors "MI_PasteColors" #define MI_PasteNames "MI_PasteNames" #define MI_GetColorFromStudioPalette "MI_GetColorFromStudioPalette" +#define MI_ToggleLinkToStudioPalette "MI_ToggleLinkToStudioPalette" +#define MI_RemoveReferenceToStudioPalette "MI_RemoveReferenceToStudioPalette" #define MI_Clear "MI_Clear" #define MI_SelectAll "MI_SelectAll" #define MI_InvertSelection "MI_InvertSelection" diff --git a/toonz/sources/toonz/mainwindow.cpp b/toonz/sources/toonz/mainwindow.cpp index c1a379f0..f16ad5cd 100644 --- a/toonz/sources/toonz/mainwindow.cpp +++ b/toonz/sources/toonz/mainwindow.cpp @@ -1608,6 +1608,10 @@ void MainWindow::defineActions() { createRightClickMenuAction(MI_PasteNames, tr("Paste Name"), ""); createRightClickMenuAction(MI_GetColorFromStudioPalette, tr("Get Color from Studio Palette"), ""); + createRightClickMenuAction(MI_ToggleLinkToStudioPalette, + tr("Toggle Link to Studio Palette"), "\\"); + createRightClickMenuAction(MI_RemoveReferenceToStudioPalette, + tr("Remove Connection to Studio Palette"), ""); createMenuEditAction(MI_Clear, tr("&Delete"), "Delete"); createMenuEditAction(MI_Insert, tr("&Insert"), "Ins"); createMenuEditAction(MI_Group, tr("&Group"), "Ctrl+G"); diff --git a/toonz/sources/toonzqt/paletteviewergui.cpp b/toonz/sources/toonzqt/paletteviewergui.cpp index a20bb852..c53f3fd1 100644 --- a/toonz/sources/toonzqt/paletteviewergui.cpp +++ b/toonz/sources/toonzqt/paletteviewergui.cpp @@ -1023,28 +1023,29 @@ void PageViewer::contextMenuEvent(QContextMenuEvent *event) { bool isLocked = m_page ? m_page->getPalette()->isLocked() : false; // remove links from studio palette - if (m_viewType == LEVEL_PALETTE && m_styleSelection && - !m_styleSelection->isEmpty() && !isLocked) { - menu.addSeparator(); - QAction *removeLinkAct = menu.addAction(tr("Remove Links")); - connect(removeLinkAct, SIGNAL(triggered()), this, SLOT(removeLink())); - } + //if (m_viewType == LEVEL_PALETTE && m_styleSelection && + // !m_styleSelection->isEmpty() && !isLocked) { + // menu.addSeparator(); + // QAction *removeLinkAct = menu.addAction(tr("Remove Links")); + // connect(removeLinkAct, SIGNAL(triggered()), this, SLOT(removeLink())); + //} if (((indexPage == 0 && index > 0) || (indexPage > 0 && index >= 0)) && index < getChipCount() && !isLocked) { - // iwsw commented out temporarly - /* - wstring globalName = m_page->getStyle(index)->getGlobalName(); - if (m_viewType != STUDIO_PALETTE && - globalName != L"" && + + std::wstring globalName = m_page->getStyle(index)->getGlobalName(); + if (m_viewType != STUDIO_PALETTE && globalName != L"" && (globalName[0] == L'-' || globalName[0] == L'+')) { - createMenuAction(menu, "MI_ToggleLinkToStudioPalette", tr("Toggle - Link to Studio Palette"), "toggleLink()"); - createMenuAction(menu, "MI_RemoveReferenceToStudioPalette", - tr("Remove Reference to Studio Palette"), "eraseToggleLink()"); + menu.addSeparator(); + QAction *toggleStyleLink = cmd->getAction("MI_ToggleLinkToStudioPalette"); + menu.addAction(toggleStyleLink); + QAction *removeStyleLink = cmd->getAction("MI_RemoveReferenceToStudioPalette"); + menu.addAction(removeStyleLink); + QAction *getBackOriginalAct = cmd->getAction("MI_GetColorFromStudioPalette"); + menu.addAction(getBackOriginalAct); } - */ + if (pasteValueAct) pasteValueAct->setEnabled(true); if (pasteColorsAct) pasteColorsAct->setEnabled(true); @@ -1062,29 +1063,18 @@ void PageViewer::contextMenuEvent(QContextMenuEvent *event) { clearAct->setEnabled(false); } - // get color from the original studio palette - if (m_viewType == LEVEL_PALETTE && m_styleSelection && - !m_styleSelection->isEmpty() && !isLocked) { - menu.addSeparator(); - QAction *getBackOriginalAct = - cmd->getAction("MI_GetColorFromStudioPalette"); - menu.addAction(getBackOriginalAct); - } - - // iwsw commented out temporarly - /* - if (m_viewType != STUDIO_PALETTE) - { - menu.addSeparator(); - menu.addAction(cmd->getAction(MI_EraseUnusedStyles)); - } - */ if (m_page) { + menu.addSeparator(); QAction *newStyle = menu.addAction(tr("New Style")); connect(newStyle, SIGNAL(triggered()), SLOT(addNewColor())); QAction *newPage = menu.addAction(tr("New Page")); connect(newPage, SIGNAL(triggered()), SLOT(addNewPage())); } + + if (m_viewType != STUDIO_PALETTE) { + menu.addAction(cmd->getAction(MI_EraseUnusedStyles)); + } + menu.exec(event->globalPos()); } @@ -1371,25 +1361,6 @@ void PageViewer::onStyleRenamed() { PaletteCmd::renamePaletteStyle(getPaletteHandle(), newName); } -//----------------------------------------------------------------------------- -/*! Recall \b TStyleSelection::toggleLink() to current page style selection. -*/ -void PageViewer::toggleLink() { - if (!m_page || !m_styleSelection || m_styleSelection->isEmpty()) return; - m_styleSelection->toggleLink(); - update(); - emit changeWindowTitleSignal(); -} - -//----------------------------------------------------------------------------- -/*! Recall \b TStyleSelection::eraseToggleLink() to current page style - * selection. -*/ -void PageViewer::eraseToggleLink() { - if (!m_page || !m_styleSelection || m_styleSelection->isEmpty()) return; - m_styleSelection->eraseToggleLink(); -} - //============================================================================= /*! \class PaletteViewerGUI::PaletteTabBar \brief The PaletteTabBar class provides a bar with tab to show @@ -1653,6 +1624,8 @@ void PageViewer::updateCommandLocks() { cmd->getAction("MI_BlendColors")->setEnabled(!isLocked); cmd->getAction("MI_PasteNames")->setEnabled(!isLocked); cmd->getAction("MI_GetColorFromStudioPalette")->setEnabled(!isLocked); + cmd->getAction("MI_ToggleLinkToStudioPalette")->setEnabled(!isLocked); + cmd->getAction("MI_RemoveReferenceToStudioPalette")->setEnabled(!isLocked); } //----------------------------------------------------------------------------- diff --git a/toonz/sources/toonzqt/styleselection.cpp b/toonz/sources/toonzqt/styleselection.cpp index 81e823b9..e3d586a4 100644 --- a/toonz/sources/toonzqt/styleselection.cpp +++ b/toonz/sources/toonzqt/styleselection.cpp @@ -505,9 +505,15 @@ void TStyleSelection::enableCommands() { enableCommand(this, MI_PasteNames, &TStyleSelection::pasteStylesName); // available only for level palette - if (m_paletteHandle->getPalette()->getGlobalName() == L"") - enableCommand(this, MI_GetColorFromStudioPalette, - &TStyleSelection::getBackOriginalStyle); + if (m_paletteHandle->getPalette()->getGlobalName() == L"") { + enableCommand(this, MI_GetColorFromStudioPalette, + &TStyleSelection::getBackOriginalStyle); + enableCommand(this, MI_ToggleLinkToStudioPalette, + &TStyleSelection::toggleLink); + enableCommand(this, MI_RemoveReferenceToStudioPalette, + &TStyleSelection::eraseToggleLink); + + } } enableCommand(this, MI_Clear, &TStyleSelection::deleteStyles); enableCommand(this, MI_EraseUnusedStyles, &TStyleSelection::eraseUnsedStyle); @@ -1408,6 +1414,7 @@ public: void TStyleSelection::toggleLink() { TPalette *palette = getPalette(); if (!palette || m_pageIndex < 0) return; + if (isEmpty() || palette->isLocked()) return; int n = m_styleIndicesInPage.size(); if (n <= 0) return; @@ -1460,6 +1467,7 @@ void TStyleSelection::toggleLink() { void TStyleSelection::eraseToggleLink() { TPalette *palette = getPalette(); if (!palette || m_pageIndex < 0) return; + if (isEmpty() || palette->isLocked()) return; int n = m_styleIndicesInPage.size(); if (n <= 0) return; From cd848c35e6ad8222100219e9548ca7a5eba90b06 Mon Sep 17 00:00:00 2001 From: Jeremy Bullock Date: Fri, 15 Jul 2016 21:42:28 -0600 Subject: [PATCH 03/56] Changed connection to reference --- toonz/sources/toonz/mainwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/toonz/sources/toonz/mainwindow.cpp b/toonz/sources/toonz/mainwindow.cpp index f16ad5cd..64cffb68 100644 --- a/toonz/sources/toonz/mainwindow.cpp +++ b/toonz/sources/toonz/mainwindow.cpp @@ -1611,7 +1611,7 @@ void MainWindow::defineActions() { createRightClickMenuAction(MI_ToggleLinkToStudioPalette, tr("Toggle Link to Studio Palette"), "\\"); createRightClickMenuAction(MI_RemoveReferenceToStudioPalette, - tr("Remove Connection to Studio Palette"), ""); + tr("Remove Reference to Studio Palette"), ""); createMenuEditAction(MI_Clear, tr("&Delete"), "Delete"); createMenuEditAction(MI_Insert, tr("&Insert"), "Ins"); createMenuEditAction(MI_Group, tr("&Group"), "Ctrl+G"); From 48c6711cad1f3ee9dbcb102397086cc3eb4ae623 Mon Sep 17 00:00:00 2001 From: shun_iwasawa Date: Fri, 29 Jul 2016 17:23:11 +0900 Subject: [PATCH 04/56] organize palette 2 --- toonz/sources/include/toonz/palettecmd.h | 3 +++ toonz/sources/toonz/colormodelviewer.cpp | 10 ++++++++-- toonz/sources/toonzlib/palettecmd.cpp | 23 +++++++++++++++++++++++ 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/toonz/sources/include/toonz/palettecmd.h b/toonz/sources/include/toonz/palettecmd.h index bca5440c..cc37f9d2 100644 --- a/toonz/sources/include/toonz/palettecmd.h +++ b/toonz/sources/include/toonz/palettecmd.h @@ -88,6 +88,9 @@ DVAPI void renamePalettePage(TPaletteHandle *paletteHandle, int pageIndex, DVAPI void renamePaletteStyle(TPaletteHandle *paletteHandle, const std::wstring &newName); +/* called in ColorModelViewer::pick() - move selected style to the first page */ +DVAPI void organizePaletteStyle(TPaletteHandle *paletteHandle, int styleId); + } // namespace #endif diff --git a/toonz/sources/toonz/colormodelviewer.cpp b/toonz/sources/toonz/colormodelviewer.cpp index 69e207fd..474a3e03 100644 --- a/toonz/sources/toonz/colormodelviewer.cpp +++ b/toonz/sources/toonz/colormodelviewer.cpp @@ -308,10 +308,16 @@ void ColorModelViewer::pick(const QPoint &p) { } /* - if the Style Picker too is current and "organize palette" is activated, + if the Style Picker tool is current and "organize palette" is activated, then move the picked style to the first page of the palette. */ - //TODO: write organize palette operation here (maybe implement in PaletteCmd) + TTool *tool = TApp::instance()->getCurrentTool()->getTool(); + if (tool->getName() == "T_StylePicker"){ + StylePickerTool* spTool = dynamic_cast(tool); + if (spTool && spTool->isOrganizePaletteActive()){ + PaletteCmd::organizePaletteStyle(ph, styleIndex); + } + } ph->setStyleIndex(styleIndex); } diff --git a/toonz/sources/toonzlib/palettecmd.cpp b/toonz/sources/toonzlib/palettecmd.cpp index 30a03904..5c375bd9 100644 --- a/toonz/sources/toonzlib/palettecmd.cpp +++ b/toonz/sources/toonzlib/palettecmd.cpp @@ -1168,3 +1168,26 @@ void PaletteCmd::renamePaletteStyle(TPaletteHandle *paletteHandle, paletteHandle->notifyColorStyleChanged(false); TUndoManager::manager()->add(undo); } + +//============================================================================= +// organizePaletteStyle +// called in ColorModelViewer::pick() - move selected style to the first page +//----------------------------------------------------------------------------- +void PaletteCmd::organizePaletteStyle(TPaletteHandle *paletteHandle, int styleId){ + if (!paletteHandle) return; + TPalette *palette = paletteHandle->getPalette(); + if (!palette) return; + // if the style is already in the first page, then do nothing + TPalette::Page* page = palette->getStylePage(styleId); + if (!page || page->getIndex() == 0) return; + + int indexInPage = page->search(styleId); + + /* + just call arrangeStyles as tentative implementation. + TODO: store the picked position into the style name somehow + */ + arrangeStyles(paletteHandle, 0, palette->getPage(0)->getStyleCount(), + page->getIndex(), { indexInPage }); + +} From e897af4ff25b7308a30a13224cfd488f430582c6 Mon Sep 17 00:00:00 2001 From: shun_iwasawa Date: Thu, 18 Aug 2016 20:25:44 +0900 Subject: [PATCH 05/56] organize palette 3 --- .../sources/common/tvrender/tcolorstyles.cpp | 8 ++- toonz/sources/common/tvrender/tpalette.cpp | 31 ++++++++- toonz/sources/include/tcolorstyles.h | 6 ++ toonz/sources/include/toonz/palettecmd.h | 3 +- toonz/sources/tnztools/cursormanager.cpp | 3 +- toonz/sources/tnztools/stylepickertool.cpp | 66 +++++++++---------- toonz/sources/tnztools/stylepickertool.h | 15 +++-- toonz/sources/tnztools/tooloptions.cpp | 10 +-- toonz/sources/toonz/colormodelviewer.cpp | 15 +++-- toonz/sources/toonzlib/convert2tlv.cpp | 20 +++--- toonz/sources/toonzlib/palettecmd.cpp | 65 +++++++++++++++--- 11 files changed, 166 insertions(+), 76 deletions(-) diff --git a/toonz/sources/common/tvrender/tcolorstyles.cpp b/toonz/sources/common/tvrender/tcolorstyles.cpp index 3b18ce5e..a67f8f15 100644 --- a/toonz/sources/common/tvrender/tcolorstyles.cpp +++ b/toonz/sources/common/tvrender/tcolorstyles.cpp @@ -50,7 +50,8 @@ TColorStyle::TColorStyle() , m_enabled(true) , m_icon(0) , m_validIcon(false) - , m_isEditedFromOriginal(false) {} + , m_isEditedFromOriginal(false) + , m_pickedPosition() {} //------------------------------------------------------------------- @@ -66,7 +67,8 @@ TColorStyle::TColorStyle(const TColorStyle &other) , m_flags(other.m_flags) , m_enabled(other.m_enabled) , m_validIcon(false) - , m_isEditedFromOriginal(other.m_isEditedFromOriginal) {} + , m_isEditedFromOriginal(other.m_isEditedFromOriginal) + , m_pickedPosition(other.m_pickedPosition) {} //------------------------------------------------------------------- @@ -79,6 +81,7 @@ TColorStyle &TColorStyle::operator=(const TColorStyle &other) { m_enabled = other.m_enabled; m_validIcon = false; m_isEditedFromOriginal = other.m_isEditedFromOriginal; + m_pickedPosition = other.m_pickedPosition; return *this; } @@ -100,6 +103,7 @@ bool TColorStyle::operator==(const TColorStyle &cs) const { if (m_originalName != cs.getOriginalName()) return false; if (m_globalName != cs.getGlobalName()) return false; if (m_isEditedFromOriginal != cs.getIsEditedFlag()) return false; + if (m_pickedPosition != cs.getPickedPosition()) return false; for (int p = 0; p < colorParamCount; ++p) if (getColorParamValue(p) != cs.getColorParamValue(p)) return false; diff --git a/toonz/sources/common/tvrender/tpalette.cpp b/toonz/sources/common/tvrender/tpalette.cpp index e3019080..3f7f9c05 100644 --- a/toonz/sources/common/tvrender/tpalette.cpp +++ b/toonz/sources/common/tvrender/tpalette.cpp @@ -15,6 +15,7 @@ #include "tpalette.h" #include +#include PERSIST_IDENTIFIER(TPalette, "palette") @@ -30,6 +31,21 @@ namespace { const int maxStyleIndex = 32765; +const std::string pointToString(const TPoint &point) { + return std::to_string(point.x) + "," + std::to_string(point.y); +} + +// splitting string with ',' +const TPoint stringToPoint(const std::string &string) { + std::string buffer; + std::stringstream ss(string); + std::getline(ss, buffer, ','); // getting the first part of string + int x = std::stoi(buffer); + std::getline(ss, buffer); // getting the second part of string + int y = std::stoi(buffer); + return TPoint(x, y); +} + } // namespace //=================================================================== @@ -563,10 +579,17 @@ void TPalette::saveData(TOStream &os) { os.openChild("styles"); { for (int i = 0; i < getStyleCount(); ++i) { - os.openChild("style"); + TColorStyleP style = m_styles[i].second; + if (style->getPickedPosition() == TPoint()) + os.openChild("style"); + else { + std::map attr; + attr["pickedpos"] = pointToString(style->getPickedPosition()); + os.openChild("style", attr); + } { StyleWriter w(os, i); - m_styles[i].second->save(w); + style->save(w); } os.closeChild(); } @@ -680,6 +703,10 @@ void TPalette::loadData(TIStream &is) { StyleReader r(is, version); TColorStyle *cs = TColorStyle::load(r); + std::string pickedPosStr; + if (is.getTagParam("pickedpos", pickedPosStr)) + cs->setPickedPosition(stringToPoint(pickedPosStr)); + addStyle(cs); } diff --git a/toonz/sources/include/tcolorstyles.h b/toonz/sources/include/tcolorstyles.h index 1b999e7e..2aecdad5 100644 --- a/toonz/sources/include/tcolorstyles.h +++ b/toonz/sources/include/tcolorstyles.h @@ -118,6 +118,9 @@ private: // This flag will be set when the //! style is edited from the original one. + TPoint m_pickedPosition; // picked position from color model by using style + // picker tool with "organize palette" option. + protected: TRaster32P m_icon; //!< Icon shown on TPalette viewers. bool m_validIcon; //!< Icon's validity status. @@ -212,6 +215,9 @@ The \a global name contains information about palette id. m_flags = flags; } //!< Returns color attributes. + void setPickedPosition(const TPoint &pos) { m_pickedPosition = pos; } + TPoint getPickedPosition() const { return m_pickedPosition; } + // Color-related functions /*! \detail diff --git a/toonz/sources/include/toonz/palettecmd.h b/toonz/sources/include/toonz/palettecmd.h index cc37f9d2..da63518e 100644 --- a/toonz/sources/include/toonz/palettecmd.h +++ b/toonz/sources/include/toonz/palettecmd.h @@ -89,7 +89,8 @@ DVAPI void renamePaletteStyle(TPaletteHandle *paletteHandle, const std::wstring &newName); /* called in ColorModelViewer::pick() - move selected style to the first page */ -DVAPI void organizePaletteStyle(TPaletteHandle *paletteHandle, int styleId); +DVAPI void organizePaletteStyle(TPaletteHandle *paletteHandle, int styleId, + const TPoint &point); } // namespace diff --git a/toonz/sources/tnztools/cursormanager.cpp b/toonz/sources/tnztools/cursormanager.cpp index 849ce805..323ba474 100644 --- a/toonz/sources/tnztools/cursormanager.cpp +++ b/toonz/sources/tnztools/cursormanager.cpp @@ -74,7 +74,8 @@ const struct { {ToolCursor::PickerCursorWhiteArea, "picker_style_white_area", 7, 22}, {ToolCursor::PickerCursorWhite, "picker_style_white", 7, 22}, {ToolCursor::PickerCursorOrganize, "picker_style_organize", 7, 22}, - {ToolCursor::PickerCursorWhiteOrganize, "picker_style_white_organize", 7, 22}, + {ToolCursor::PickerCursorWhiteOrganize, "picker_style_white_organize", 7, + 22}, {ToolCursor::PickerRGB, "picker_rgb", 7, 22}, {ToolCursor::PickerRGBWhite, "picker_rgb_white", 7, 22}, {ToolCursor::FillCursorF, "fill_f", 6, 23}, diff --git a/toonz/sources/tnztools/stylepickertool.cpp b/toonz/sources/tnztools/stylepickertool.cpp index 459cfec8..4c21641d 100644 --- a/toonz/sources/tnztools/stylepickertool.cpp +++ b/toonz/sources/tnztools/stylepickertool.cpp @@ -1,16 +1,16 @@ #include "stylepickertool.h" -//TnzTools includes +// TnzTools includes #include "tools/tool.h" #include "tools/cursors.h" #include "tools/stylepicker.h" #include "tools/toolhandle.h" -//TnzQt includes +// TnzQt includes #include "toonzqt/tselectionhandle.h" #include "toonzqt/styleselection.h" -//TnzLib includes +// TnzLib includes #include "toonz/txshsimplelevel.h" #include "toonz/txshlevelhandle.h" #include "toonz/tpalettehandle.h" @@ -43,7 +43,7 @@ StylePickerTool::StylePickerTool() : TTool("T_StylePicker") , m_currentStyleId(0) , m_colorType("Mode:") - , m_passivePick("Passive Pick", false) + , m_passivePick("Passive Pick", false) , m_organizePalette("Organize Palette", false) , m_paletteToBeOrganized(NULL) { m_prop.bind(m_colorType); @@ -60,13 +60,12 @@ StylePickerTool::StylePickerTool() m_organizePalette.setId("OrganizePalette"); } - void StylePickerTool::leftButtonDown(const TPointD &pos, const TMouseEvent &e) { m_oldStyleId = m_currentStyleId = getApplication()->getCurrentLevelStyleIndex(); pick(pos, e); } - + void StylePickerTool::leftButtonDrag(const TPointD &pos, const TMouseEvent &e) { pick(pos, e); } @@ -104,12 +103,10 @@ void StylePickerTool::pick(const TPointD &pos, const TMouseEvent &e) { TVectorImageP picked_vi = pickedImage; TXshSimpleLevel *picked_level = pickedCell.getSimpleLevel(); if ((picked_ti || picked_vi) && picked_level) { - TPointD tmpMousePosition = - getColumnMatrix(superPickedColumnId).inv() * - getViewer()->winToWorld(e.m_pos); + TPointD tmpMousePosition = getColumnMatrix(superPickedColumnId).inv() * + getViewer()->winToWorld(e.m_pos); - TPointD tmpDpiScale = - getCurrentDpiScale(picked_level, getCurrentFid()); + TPointD tmpDpiScale = getCurrentDpiScale(picked_level, getCurrentFid()); tmpMousePosition.x /= tmpDpiScale.x; tmpMousePosition.y /= tmpDpiScale.y; @@ -155,9 +152,9 @@ void StylePickerTool::pick(const TPointD &pos, const TMouseEvent &e) { int subsampling = level->getImageSubsampling(getCurrentFid()); StylePicker picker(image); - int styleId = picker.pickStyleId( - TScale(1.0 / subsampling) * pos + TPointD(-0.5, -0.5), - getPixelSize() * getPixelSize(), modeValue); + int styleId = + picker.pickStyleId(TScale(1.0 / subsampling) * pos + TPointD(-0.5, -0.5), + getPixelSize() * getPixelSize(), modeValue); if (styleId < 0) return; @@ -216,28 +213,27 @@ void StylePickerTool::mouseMove(const TPointD &pos, const TMouseEvent &e) { int StylePickerTool::getCursorId() const { bool isBlackBG = ToonzCheck::instance()->getChecks() & ToonzCheck::eBlackBg; - + /* in case the "organize palette" option is active */ if (m_organizePalette.getValue()) return (isBlackBG) ? ToolCursor::PickerCursorWhiteOrganize - : ToolCursor::PickerCursorOrganize; + : ToolCursor::PickerCursorOrganize; if (m_colorType.getValue() == LINES) return (isBlackBG) ? ToolCursor::PickerCursorWhiteLine - : ToolCursor::PickerCursorLine; + : ToolCursor::PickerCursorLine; else if (m_colorType.getValue() == AREAS) return (isBlackBG) ? ToolCursor::PickerCursorWhiteArea - : ToolCursor::PickerCursorArea; + : ToolCursor::PickerCursorArea; else // line&areas return (isBlackBG) ? ToolCursor::PickerCursorWhite - : ToolCursor::PickerCursor; + : ToolCursor::PickerCursor; } bool StylePickerTool::onPropertyChanged(std::string propertyName) { - if (propertyName == m_organizePalette.getName()){ - + if (propertyName == m_organizePalette.getName()) { if (m_organizePalette.getValue()) { - if (!startOrganizePalette()){ + if (!startOrganizePalette()) { m_organizePalette.setValue(false); getApplication()->getCurrentTool()->notifyToolChanged(); return false; @@ -252,48 +248,50 @@ bool StylePickerTool::onPropertyChanged(std::string propertyName) { bool StylePickerTool::startOrganizePalette() { /* Check if the organizing operation is available */ - TXshLevel* level = getApplication()->getCurrentLevel()->getLevel(); + TXshLevel *level = getApplication()->getCurrentLevel()->getLevel(); if (!level) { DVGui::error(tr("No current level.")); return false; } - if ( level->getType() != PLI_XSHLEVEL && level->getType() != TZP_XSHLEVEL - && level->getType() != PLT_XSHLEVEL ) { + if (level->getType() != PLI_XSHLEVEL && level->getType() != TZP_XSHLEVEL && + level->getType() != PLT_XSHLEVEL) { DVGui::error(tr("Current level has no available palette.")); return false; } /* palette should have more than one page to organize */ - TPalette* pal = NULL; + TPalette *pal = NULL; if (level->getType() == PLT_XSHLEVEL) pal = level->getPaletteLevel()->getPalette(); else pal = level->getSimpleLevel()->getPalette(); - if (!pal || pal->getPageCount() < 2){ - DVGui::error(tr("Palette must have more than one palette to be organized.")); + if (!pal || pal->getPageCount() < 2) { + DVGui::error( + tr("Palette must have more than one palette to be organized.")); return false; } m_paletteToBeOrganized = pal; - + std::cout << "Start Organize Palette" << std::endl; return true; } /* - If the working palette is changed, then deactivate the "organize palette" toggle. + If the working palette is changed, then deactivate the "organize palette" + toggle. */ void StylePickerTool::onImageChanged() { std::cout << "StylePickerTool::onImageChanged" << std::endl; - if (!m_organizePalette.getValue() || !m_paletteToBeOrganized)return; + if (!m_organizePalette.getValue() || !m_paletteToBeOrganized) return; - TXshLevel* level = getApplication()->getCurrentLevel()->getLevel(); + TXshLevel *level = getApplication()->getCurrentLevel()->getLevel(); if (!level) { m_organizePalette.setValue(false); getApplication()->getCurrentTool()->notifyToolChanged(); return; } - TPalette* pal = NULL; + TPalette *pal = NULL; if (level->getType() == PLT_XSHLEVEL) pal = level->getPaletteLevel()->getPalette(); else if (level->getSimpleLevel()) { @@ -306,6 +304,4 @@ void StylePickerTool::onImageChanged() { } } - StylePickerTool stylePickerTool; - diff --git a/toonz/sources/tnztools/stylepickertool.h b/toonz/sources/tnztools/stylepickertool.h index 333ac0e1..2a6982a3 100644 --- a/toonz/sources/tnztools/stylepickertool.h +++ b/toonz/sources/tnztools/stylepickertool.h @@ -13,11 +13,12 @@ class StylePickerTool final : public TTool, public QObject { TEnumProperty m_colorType; TPropertyGroup m_prop; TBoolProperty m_passivePick; - + TBoolProperty m_organizePalette; - TPalette* m_paletteToBeOrganized; + TPalette *m_paletteToBeOrganized; bool startOrganizePalette(); + public: TPropertyGroup *getProperties(int targetType) override { return &m_prop; } @@ -34,20 +35,20 @@ public: void pick(const TPointD &pos, const TMouseEvent &e); void mouseMove(const TPointD &pos, const TMouseEvent &e) override; - + int getCursorId() const override; bool onPropertyChanged(std::string propertyName); bool isOrganizePaletteActive() { return m_organizePalette.getValue(); } - /* - This function is called when either frame/column/level/scene is switched or + /* + This function is called when either frame/column/level/scene is switched or either scene/level/object is changed (see tapp.cpp). - If the working palette is changed, then deactivate the "organize palette" toggle. + If the working palette is changed, then deactivate the "organize palette" + toggle. */ void onImageChanged() override; }; - #endif \ No newline at end of file diff --git a/toonz/sources/tnztools/tooloptions.cpp b/toonz/sources/tnztools/tooloptions.cpp index 04e0611c..28ed7711 100644 --- a/toonz/sources/tnztools/tooloptions.cpp +++ b/toonz/sources/tnztools/tooloptions.cpp @@ -2182,14 +2182,16 @@ StylePickerToolOptionsBox::StylePickerToolOptionsBox( m_layout->addWidget(m_currentStyleLabel, 0); m_layout->addStretch(1); - // retrieve the "organize palette" checkbox from the layout and insert + // retrieve the "organize palette" checkbox from the layout and insert // into rightmost of the tool option bar - ToolOptionCheckbox* organizePaletteCB = - dynamic_cast(m_controls.value("Organize Palette")); + ToolOptionCheckbox *organizePaletteCB = + dynamic_cast(m_controls.value("Organize Palette")); m_layout->removeWidget(organizePaletteCB); m_layout->addWidget(new ToolOptionsBarSeparator(this), 0); m_layout->addWidget(organizePaletteCB); - organizePaletteCB->setToolTip(tr("With this option being activated, the picked style will be\nmoved to the end of the first page of the palette.")); + organizePaletteCB->setToolTip( + tr("With this option being activated, the picked style will be\nmoved to " + "the end of the first page of the palette.")); if (m_realTimePickMode) { connect(m_realTimePickMode, SIGNAL(toggled(bool)), m_currentStyleLabel, diff --git a/toonz/sources/toonz/colormodelviewer.cpp b/toonz/sources/toonz/colormodelviewer.cpp index 474a3e03..66360004 100644 --- a/toonz/sources/toonz/colormodelviewer.cpp +++ b/toonz/sources/toonz/colormodelviewer.cpp @@ -307,15 +307,16 @@ void ColorModelViewer::pick(const QPoint &p) { if (styleSelection) styleSelection->selectNone(); } - /* + /* if the Style Picker tool is current and "organize palette" is activated, - then move the picked style to the first page of the palette. + then move the picked style to the first page of the palette. */ TTool *tool = TApp::instance()->getCurrentTool()->getTool(); - if (tool->getName() == "T_StylePicker"){ - StylePickerTool* spTool = dynamic_cast(tool); - if (spTool && spTool->isOrganizePaletteActive()){ - PaletteCmd::organizePaletteStyle(ph, styleIndex); + if (tool->getName() == "T_StylePicker") { + StylePickerTool *spTool = dynamic_cast(tool); + if (spTool && spTool->isOrganizePaletteActive()) { + TPoint point = picker.getRasterPoint(pos); + PaletteCmd::organizePaletteStyle(ph, styleIndex, point); } } @@ -371,7 +372,7 @@ void ColorModelViewer::showEvent(QShowEvent *e) { void ColorModelViewer::changePickType() { TTool *tool = TApp::instance()->getCurrentTool()->getTool(); if (tool->getName() == T_StylePicker) { - StylePickerTool* stylePickerTool = dynamic_cast(tool); + StylePickerTool *stylePickerTool = dynamic_cast(tool); if (stylePickerTool->isOrganizePaletteActive()) { setToolCursor(m_imageViewer, ToolCursor::PickerCursorOrganize); return; diff --git a/toonz/sources/toonzlib/convert2tlv.cpp b/toonz/sources/toonzlib/convert2tlv.cpp index 6663848c..2fbed640 100644 --- a/toonz/sources/toonzlib/convert2tlv.cpp +++ b/toonz/sources/toonzlib/convert2tlv.cpp @@ -566,15 +566,16 @@ TPalette *Convert2Tlv::buildPalette() { page->addStyle(stylesToBeAddedToPage.at(s)); } - /* - If the palette path is empty, an initial palette with four colors are set in the palette here. - ( see Convert2Tlv::init() ) So here I make the latter three styles in the initial palette to set + /* + If the palette path is empty, an initial palette with four colors are set in + the palette here. + ( see Convert2Tlv::init() ) So here I make the latter three styles in the + initial palette to set "AutoPaint" options. */ if (m_palettePath.isEmpty()) { assert(m_palette->getStyleCount() >= 5); - for (int id = 2; id <= 4; id++) - m_palette->getStyle(id)->setFlags(1); + for (int id = 2; id <= 4; id++) m_palette->getStyle(id)->setFlags(1); } if (!m_appendDefaultPalette) return m_palette; @@ -821,14 +822,15 @@ bool Convert2Tlv::init(std::string &errorMessage) { m_it = m_level1->begin(); - /*- - If the palette is empty, make an initial palette with black, red, blue and green styles. + /*- + If the palette is empty, make an initial palette with black, red, blue and + green styles. For the latter three styles the "autopaint" option should be set. -*/ if (m_lastIndex == 0) { m_colorMap[TPixel::Black] = ++m_lastIndex; - m_colorMap[TPixel::Red] = ++m_lastIndex; - m_colorMap[TPixel::Blue] = ++m_lastIndex; + m_colorMap[TPixel::Red] = ++m_lastIndex; + m_colorMap[TPixel::Blue] = ++m_lastIndex; m_colorMap[TPixel::Green] = ++m_lastIndex; } diff --git a/toonz/sources/toonzlib/palettecmd.cpp b/toonz/sources/toonzlib/palettecmd.cpp index b0fa7f9a..3cc28a16 100644 --- a/toonz/sources/toonzlib/palettecmd.cpp +++ b/toonz/sources/toonzlib/palettecmd.cpp @@ -1173,21 +1173,70 @@ void PaletteCmd::renamePaletteStyle(TPaletteHandle *paletteHandle, // organizePaletteStyle // called in ColorModelViewer::pick() - move selected style to the first page //----------------------------------------------------------------------------- -void PaletteCmd::organizePaletteStyle(TPaletteHandle *paletteHandle, int styleId){ +namespace { + +class setStylePickedPositionUndo final : public TUndo { + TPaletteHandle *m_paletteHandle; // Used in undo and redo to notify change + int m_styleId; + TPaletteP m_palette; + TPoint m_newPos; + TPoint m_oldPos; + +public: + setStylePickedPositionUndo(TPaletteHandle *paletteHandle, int styleId, + const TPoint &newPos) + : m_paletteHandle(paletteHandle), m_styleId(styleId), m_newPos(newPos) { + m_palette = paletteHandle->getPalette(); + assert(m_palette); + TColorStyle *style = m_palette->getStyle(m_styleId); + assert(style); + m_oldPos = style->getPickedPosition(); + } + void undo() const override { + TColorStyle *style = m_palette->getStyle(m_styleId); + assert(style); + style->setPickedPosition(m_oldPos); + m_paletteHandle->notifyColorStyleChanged(false); + } + void redo() const override { + TColorStyle *style = m_palette->getStyle(m_styleId); + assert(style); + style->setPickedPosition(m_newPos); + m_paletteHandle->notifyColorStyleChanged(false); + } + int getSize() const override { return sizeof *this; } + QString getHistoryString() override { + return QObject::tr("Set Picked Position of Style#%1 in Palette%2 : %3,%4") + .arg(QString::number(m_styleId)) + .arg(QString::fromStdWString(m_palette->getPaletteName())) + .arg(QString::number(m_newPos.x)) + .arg(QString::number(m_newPos.y)); + } + int getHistoryType() override { return HistoryType::Palette; } +}; +} + +void PaletteCmd::organizePaletteStyle(TPaletteHandle *paletteHandle, + int styleId, const TPoint &point) { if (!paletteHandle) return; TPalette *palette = paletteHandle->getPalette(); if (!palette) return; // if the style is already in the first page, then do nothing - TPalette::Page* page = palette->getStylePage(styleId); + TPalette::Page *page = palette->getStylePage(styleId); if (!page || page->getIndex() == 0) return; int indexInPage = page->search(styleId); - /* - just call arrangeStyles as tentative implementation. - TODO: store the picked position into the style name somehow - */ + TUndoManager::manager()->beginBlock(); + + // call arrangeStyles() to move style to the first page arrangeStyles(paletteHandle, 0, palette->getPage(0)->getStyleCount(), - page->getIndex(), { indexInPage }); - + page->getIndex(), {indexInPage}); + // then set the picked position + setStylePickedPositionUndo *undo = + new setStylePickedPositionUndo(paletteHandle, styleId, point); + undo->redo(); + TUndoManager::manager()->add(undo); + + TUndoManager::manager()->endBlock(); } From 9cbd0e8743e7067f89dcf90121c2ae8fc1e6f0b9 Mon Sep 17 00:00:00 2001 From: shun_iwasawa Date: Fri, 26 Aug 2016 20:59:54 +0900 Subject: [PATCH 06/56] organize_palette 4 --- toonz/sources/common/tvrender/tpalette.cpp | 12 +++ toonz/sources/include/toonz/palettecmd.h | 7 ++ toonz/sources/include/tpalette.h | 3 + toonz/sources/toonz/colormodelviewer.cpp | 28 ++++++ toonz/sources/toonz/colormodelviewer.h | 2 + toonz/sources/toonzlib/palettecmd.cpp | 105 +++++++++++++++++++++ toonz/sources/toonzqt/paletteviewergui.cpp | 17 ++++ toonz/sources/toonzqt/styleeditor.cpp | 6 +- 8 files changed, 179 insertions(+), 1 deletion(-) diff --git a/toonz/sources/common/tvrender/tpalette.cpp b/toonz/sources/common/tvrender/tpalette.cpp index 3f7f9c05..902a439e 100644 --- a/toonz/sources/common/tvrender/tpalette.cpp +++ b/toonz/sources/common/tvrender/tpalette.cpp @@ -1115,3 +1115,15 @@ void TPalette::setShortcutValue(int key, int styleId) { m_shortcuts[key] = styleId; } } + +//------------------------------------------------------------------- +// Returns true if there is at least one style with picked pos value +//------------------------------------------------------------------- + +bool TPalette::hasPickedPosStyle() { + for (int i = 0; i < getStyleCount(); ++i) { + TColorStyleP style = m_styles[i].second; + if (style->getPickedPosition() != TPoint()) return true; + } + return false; +} \ No newline at end of file diff --git a/toonz/sources/include/toonz/palettecmd.h b/toonz/sources/include/toonz/palettecmd.h index da63518e..ada5ee42 100644 --- a/toonz/sources/include/toonz/palettecmd.h +++ b/toonz/sources/include/toonz/palettecmd.h @@ -92,6 +92,13 @@ DVAPI void renamePaletteStyle(TPaletteHandle *paletteHandle, DVAPI void organizePaletteStyle(TPaletteHandle *paletteHandle, int styleId, const TPoint &point); +/* +called in ColorModelViewer::repickFromColorModel(). +Pick color from the img for all styles with "picked position" value. +*/ +DVAPI void pickColorByUsingPickedPosition(TPaletteHandle *paletteHandle, + TImageP img); + } // namespace #endif diff --git a/toonz/sources/include/tpalette.h b/toonz/sources/include/tpalette.h index bf16794c..a1085ce8 100644 --- a/toonz/sources/include/tpalette.h +++ b/toonz/sources/include/tpalette.h @@ -417,6 +417,9 @@ between RGBA color components. m_isLocked = lock; } + bool hasPickedPosStyle(); // Returns true if there is at least one style with + // picked pos value + public: // Deprecated functions diff --git a/toonz/sources/toonz/colormodelviewer.cpp b/toonz/sources/toonz/colormodelviewer.cpp index 66360004..9ff95ab4 100644 --- a/toonz/sources/toonz/colormodelviewer.cpp +++ b/toonz/sources/toonz/colormodelviewer.cpp @@ -223,11 +223,28 @@ void ColorModelViewer::contextMenuEvent(QContextMenuEvent *event) { connect(loadCurrentFrame, SIGNAL(triggered()), SLOT(loadCurrentFrame())); menu.addAction(loadCurrentFrame); + if (!m_imageViewer->getImage()) { + menu.exec(event->globalPos()); + return; + } + QAction *removeColorModel = new QAction(QString(tr("Remove Color Model")), this); connect(removeColorModel, SIGNAL(triggered()), SLOT(removeColorModel())); menu.addAction(removeColorModel); + /* If there is at least one style with "picked pos" parameter, then enable + * repick command */ + TRasterImageP ri = m_imageViewer->getImage(); + if (ri && currentPalette->hasPickedPosStyle()) { + menu.addSeparator(); + QAction *repickFromColorModelAct = new QAction( + QString(tr("Update Colors by Using Picked Positions")), this); + connect(repickFromColorModelAct, SIGNAL(triggered()), + SLOT(repickFromColorModel())); + menu.addAction(repickFromColorModelAct); + } + menu.addSeparator(); QString shortcut = QString::fromStdString( @@ -595,6 +612,17 @@ void ColorModelViewer::onRefImageNotFound() { "level.")); } +//----------------------------------------------------------------------------- + +void ColorModelViewer::repickFromColorModel() { + TImageP img = m_imageViewer->getImage(); + if (!img) return; + TPaletteHandle *ph = + TApp::instance()->getPaletteController()->getCurrentLevelPalette(); + + PaletteCmd::pickColorByUsingPickedPosition(ph, img); +} + //============================================================================= OpenFloatingPanel openColorModelCommand(MI_OpenColorModel, "ColorModel", diff --git a/toonz/sources/toonz/colormodelviewer.h b/toonz/sources/toonz/colormodelviewer.h index 3a4a00fb..833a62db 100644 --- a/toonz/sources/toonz/colormodelviewer.h +++ b/toonz/sources/toonz/colormodelviewer.h @@ -63,6 +63,8 @@ protected slots: * -*/ void changePickType(); + void repickFromColorModel(); + signals: void refImageNotFound(); }; diff --git a/toonz/sources/toonzlib/palettecmd.cpp b/toonz/sources/toonzlib/palettecmd.cpp index 3cc28a16..c23f12ea 100644 --- a/toonz/sources/toonzlib/palettecmd.cpp +++ b/toonz/sources/toonzlib/palettecmd.cpp @@ -33,6 +33,7 @@ #include "tstroke.h" #include "tregion.h" #include "tlevel_io.h" +#include "tpixelutils.h" #include "historytypes.h" @@ -45,6 +46,8 @@ #include #include +#include + //=================================================================== void findPaletteLevels(set &levels, int &rowIndex, @@ -1240,3 +1243,105 @@ void PaletteCmd::organizePaletteStyle(TPaletteHandle *paletteHandle, TUndoManager::manager()->endBlock(); } + +//============================================================================= +// called in ColorModelViewer::repickFromColorModel(). +// Pick color from the img for all styles with "picked position" value. +//----------------------------------------------------------------------------- +namespace { + +class pickColorByUsingPickedPositionUndo final : public TUndo { + TPaletteHandle *m_paletteHandle; // Used in undo and redo to notify change + TPaletteP m_palette; + QHash> m_styleList; + +public: + pickColorByUsingPickedPositionUndo( + TPaletteHandle *paletteHandle, + QHash> styleList) + : m_paletteHandle(paletteHandle), m_styleList(styleList) { + m_palette = paletteHandle->getPalette(); + assert(m_palette); + } + void undo() const override { + QHash>::const_iterator i = + m_styleList.constBegin(); + while (i != m_styleList.constEnd()) { + TColorStyle *style = m_palette->getStyle(i.key()); + assert(style); + style->setMainColor(i.value().first); + ++i; + } + m_paletteHandle->notifyColorStyleChanged(false); + } + void redo() const override { + QHash>::const_iterator i = + m_styleList.constBegin(); + while (i != m_styleList.constEnd()) { + TColorStyle *style = m_palette->getStyle(i.key()); + assert(style); + style->setMainColor(i.value().second); + ++i; + } + m_paletteHandle->notifyColorStyleChanged(false); + } + int getSize() const override { return sizeof *this; } + QString getHistoryString() override { + return QObject::tr("Update Colors by Using Picked Positions in Palette %1") + .arg(QString::fromStdWString(m_palette->getPaletteName())); + } + int getHistoryType() override { return HistoryType::Palette; } +}; + +TPixel32 pickColor(TRasterImageP ri, const TPoint &rasterPoint) { + TRasterP raster; + raster = ri->getRaster(); + + if (!TRect(raster->getSize()).contains(rasterPoint)) + return TPixel32::Transparent; + + TRaster32P raster32 = raster; + if (raster32) return raster32->pixels(rasterPoint.y)[rasterPoint.x]; + + TRasterGR8P rasterGR8 = raster; + if (rasterGR8) + return toPixel32(rasterGR8->pixels(rasterPoint.y)[rasterPoint.x]); + + return TPixel32::Transparent; +} +} + +void PaletteCmd::pickColorByUsingPickedPosition(TPaletteHandle *paletteHandle, + TImageP img) { + TRasterImageP ri = img; + if (!ri) return; + + TPalette *currentPalette = paletteHandle->getPalette(); + if (!currentPalette) return; + + TDimension imgSize = ri->getRaster()->getSize(); + QHash> styleList; + + // For all styles (starting from #1 as #0 is reserved for the transparent) + for (int sId = 1; sId < currentPalette->getStyleCount(); sId++) { + TColorStyle *style = currentPalette->getStyle(sId); + TPoint pp = style->getPickedPosition(); + // If style has a valid picked position + if (pp != TPoint() && pp.x >= 0 && pp.x < imgSize.lx && pp.y >= 0 && + pp.y < imgSize.ly && style->hasMainColor()) { + TPixel32 beforeColor = style->getMainColor(); + TPixel32 afterColor = pickColor(ri, pp); + style->setMainColor(afterColor); + //... store the style in the list for undo + styleList.insert(sId, QPair(beforeColor, afterColor)); + } + } + + // if some style has been changed, then register undo and notify changes + if (!styleList.isEmpty()) { + pickColorByUsingPickedPositionUndo *undo = + new pickColorByUsingPickedPositionUndo(paletteHandle, styleList); + TUndoManager::manager()->add(undo); + paletteHandle->notifyColorStyleChanged(false, true); // set dirty flag here + } +} \ No newline at end of file diff --git a/toonz/sources/toonzqt/paletteviewergui.cpp b/toonz/sources/toonzqt/paletteviewergui.cpp index fcd489b3..fcf71054 100644 --- a/toonz/sources/toonzqt/paletteviewergui.cpp +++ b/toonz/sources/toonzqt/paletteviewergui.cpp @@ -454,6 +454,10 @@ void PageViewer::drawColorName(QPainter &p, QRect &nameRect, TColorStyle *style, name += " " + toQString(g.first) + ":" + QString::number(g.second); if (style->getFlags() != 0) name += "(autopaint)"; + TPoint pickedPos = style->getPickedPosition(); + if (pickedPos != TPoint()) + name += QString(" (%1,%2)").arg(pickedPos.x).arg(pickedPos.y); + p.drawText(nameRect.adjusted(6, 4, -6, -4), name); QColor borderCol(getTextColor()); @@ -772,10 +776,23 @@ void PageViewer::paintEvent(QPaintEvent *e) { p.drawText(indexRect, Qt::AlignCenter, QString().setNum(styleIndex)); // draw "Autopaint for lines" indicator + int offset = 0; if (style->getFlags() != 0) { QRect aflRect(chipRect.bottomLeft() + QPoint(0, -14), QSize(12, 15)); p.drawRect(aflRect); p.drawText(aflRect, Qt::AlignCenter, "A"); + offset += 12; + } + + // draw "Picked Position" indicator (not show on small chip mode) + if (style->getPickedPosition() != TPoint() && m_viewMode != SmallChips) { + QRect ppRect(chipRect.bottomLeft() + QPoint(offset, -14), + QSize(12, 15)); + p.drawRect(ppRect); + QPoint markPos = ppRect.center() + QPoint(1, 0); + p.drawEllipse(markPos, 3, 3); + p.drawLine(markPos - QPoint(5, 0), markPos + QPoint(5, 0)); + p.drawLine(markPos - QPoint(0, 5), markPos + QPoint(0, 5)); } // revert font set diff --git a/toonz/sources/toonzqt/styleeditor.cpp b/toonz/sources/toonzqt/styleeditor.cpp index 107db3e1..361b879b 100644 --- a/toonz/sources/toonzqt/styleeditor.cpp +++ b/toonz/sources/toonzqt/styleeditor.cpp @@ -3060,9 +3060,13 @@ void StyleEditor::onStyleSwitched() { QString::fromStdWString(L" Palette : " + palette->getPaletteName()); // style name - statusText += QString::fromStdWString(L" | Style#"); + statusText += QString::fromStdWString(L" | #"); statusText += QString::number(styleIndex); statusText += QString::fromStdWString(L" : " + m_editedStyle->getName()); + TPoint pickedPos = m_editedStyle->getPickedPosition(); + if (pickedPos != TPoint()) + statusText += + QString(" (Picked from %1,%2)").arg(pickedPos.x).arg(pickedPos.y); m_statusLabel->setText(statusText); } else From 4635d82930a049ecf0187c7c0f87ccb8411f30eb Mon Sep 17 00:00:00 2001 From: shun_iwasawa Date: Mon, 12 Sep 2016 19:51:52 +0900 Subject: [PATCH 07/56] numpad for palette shortcut --- toonz/sources/common/tvrender/tpalette.cpp | 43 ++++++++++----- toonz/sources/include/tools/tooloptions.h | 4 +- toonz/sources/include/toonz/preferences.h | 7 +++ toonz/sources/include/toonz/tscenehandle.h | 6 ++- .../include/toonzqt/paletteviewergui.h | 2 + toonz/sources/include/tpalette.h | 5 ++ toonz/sources/tnztools/tooloptions.cpp | 1 + toonz/sources/toonz/comboviewerpane.cpp | 44 ++++++++++++++-- toonz/sources/toonz/comboviewerpane.h | 5 ++ toonz/sources/toonz/preferencespopup.cpp | 52 ++++++++++++++++++- toonz/sources/toonz/preferencespopup.h | 4 +- toonz/sources/toonz/sceneviewerevents.cpp | 36 +++++++++++++ toonz/sources/toonz/viewerpane.cpp | 40 ++++++++++++-- toonz/sources/toonz/viewerpane.h | 3 ++ toonz/sources/toonzlib/preferences.cpp | 13 ++++- toonz/sources/toonzqt/paletteviewergui.cpp | 50 +++++++++++++++++- 16 files changed, 286 insertions(+), 29 deletions(-) diff --git a/toonz/sources/common/tvrender/tpalette.cpp b/toonz/sources/common/tvrender/tpalette.cpp index e3019080..dbdf592e 100644 --- a/toonz/sources/common/tvrender/tpalette.cpp +++ b/toonz/sources/common/tvrender/tpalette.cpp @@ -168,7 +168,8 @@ TPalette::TPalette() , m_dirtyFlag(false) , m_mutex(QMutex::Recursive) , m_isLocked(false) - , m_askOverwriteFlag(false) { + , m_askOverwriteFlag(false) + , m_shortcutScopeIndex(0) { QString tempName(QObject::tr("colors")); std::wstring pageName = tempName.toStdWString(); Page *page = addPage(pageName); @@ -851,9 +852,10 @@ void TPalette::assign(const TPalette *src, bool isFromStudioPalette) { j->second = j->second->clone(); m_styleAnimationTable[cit->first] = cit->second; } - m_globalName = src->getGlobalName(); - m_shortcuts = src->m_shortcuts; - m_currentFrame = src->m_currentFrame; + m_globalName = src->getGlobalName(); + m_shortcuts = src->m_shortcuts; + m_currentFrame = src->m_currentFrame; + m_shortcutScopeIndex = src->m_shortcutScopeIndex; // setDirtyFlag(true); } @@ -1053,22 +1055,26 @@ void TPalette::clearKeyframe(int styleId, int frame) { //------------------------------------------------------------------- int TPalette::getShortcutValue(int key) const { - assert('0' <= key && key <= '9'); - std::map::const_iterator it; - it = m_shortcuts.find(key); - if (it == m_shortcuts.end()) return -1; - int styleId = it->second; - return 0 <= styleId && styleId < getStyleCount() ? styleId : -1; + assert(Qt::Key_0 <= key && key <= Qt::Key_9); + + int shortcutIndex = (key == Qt::Key_0) ? 9 : key - Qt::Key_1; + int indexInPage = m_shortcutScopeIndex * 10 + shortcutIndex; + // shortcut is available only in the first page + return getPage(0)->getStyleId(indexInPage); } //------------------------------------------------------------------- int TPalette::getStyleShortcut(int styleId) const { assert(0 <= styleId && styleId < getStyleCount()); - std::map::const_iterator it; - for (it = m_shortcuts.begin(); it != m_shortcuts.end(); ++it) - if (it->second == styleId) return it->first; - return -1; + + Page *page = getStylePage(styleId); + // shortcut is available only in the first page + if (!page || page->getIndex() != 0) return -1; + int indexInPage = page->search(styleId); + int shortcutIndex = indexInPage - m_shortcutScopeIndex * 10; + if (shortcutIndex < 0 || shortcutIndex > 9) return -1; + return (shortcutIndex == 9) ? Qt::Key_0 : Qt::Key_1 + shortcutIndex; } //------------------------------------------------------------------- @@ -1088,3 +1094,12 @@ void TPalette::setShortcutValue(int key, int styleId) { m_shortcuts[key] = styleId; } } + +//------------------------------------------------------------------- + +void TPalette::nextShortcutScope() { + if ((m_shortcutScopeIndex + 1) * 10 < getPage(0)->getStyleCount()) + m_shortcutScopeIndex += 1; + else + m_shortcutScopeIndex = 0; +} \ No newline at end of file diff --git a/toonz/sources/include/tools/tooloptions.h b/toonz/sources/include/tools/tooloptions.h index b06a86df..abded967 100644 --- a/toonz/sources/include/tools/tooloptions.h +++ b/toonz/sources/include/tools/tooloptions.h @@ -647,7 +647,9 @@ public slots: void onToolChanged(); void onStageObjectChange(); - // signals: +signals: + // used in ComboViewer to handle Tab focus + void newPanelCreated(); // void toolOptionChange(); }; diff --git a/toonz/sources/include/toonz/preferences.h b/toonz/sources/include/toonz/preferences.h index 968fe06f..ed3fa2c2 100644 --- a/toonz/sources/include/toonz/preferences.h +++ b/toonz/sources/include/toonz/preferences.h @@ -290,6 +290,11 @@ public: return m_multiLayerStylePickerEnabled; } + void enableUseNumpadForSwitchingStyles(bool on); + bool isUseNumpadForSwitchingStylesEnabled() const { + return m_useNumpadForSwitchingStyles; + } + // Xsheet tab void setXsheetStep(int step); //!< Sets the step used for the next/prev @@ -494,6 +499,8 @@ private: std::string m_layerNameEncoding = "SJIS"; // Fixed to SJIS for now. You can // add interface if you wanna // change encoding. + // whether to use numpad and tab key shortcut for selecting styles + bool m_useNumpadForSwitchingStyles; private: Preferences(); diff --git a/toonz/sources/include/toonz/tscenehandle.h b/toonz/sources/include/toonz/tscenehandle.h index bc8ded56..75ad8cf4 100644 --- a/toonz/sources/include/toonz/tscenehandle.h +++ b/toonz/sources/include/toonz/tscenehandle.h @@ -52,7 +52,9 @@ public: } void notifyNameSceneChange() { emit nameSceneChanged(); } - void notifyPreferenceChanged() { emit preferenceChanged(); } + void notifyPreferenceChanged(const QString &prefName) { + emit preferenceChanged(prefName); + } void notifyPixelUnitSelected(bool on) { emit pixelUnitSelected(on); } @@ -76,7 +78,7 @@ signals: void castChanged(); void castFolderAdded(const TFilePath &path); void nameSceneChanged(); - void preferenceChanged(); + void preferenceChanged(const QString &prefName); void pixelUnitSelected(bool on); }; diff --git a/toonz/sources/include/toonzqt/paletteviewergui.h b/toonz/sources/include/toonzqt/paletteviewergui.h index 390722c2..1d88c1c1 100644 --- a/toonz/sources/include/toonzqt/paletteviewergui.h +++ b/toonz/sources/include/toonzqt/paletteviewergui.h @@ -199,6 +199,8 @@ protected: void zoomInChip(); void zoomOutChip(); + bool hasShortcut(int indexInPage); + protected slots: void toggleLink(); diff --git a/toonz/sources/include/tpalette.h b/toonz/sources/include/tpalette.h index bf16794c..e25b5415 100644 --- a/toonz/sources/include/tpalette.h +++ b/toonz/sources/include/tpalette.h @@ -211,6 +211,9 @@ private: //! The confirmation dialog will not be opened unless the palette is edited //! again, //! even if the palette's dirtyflag is true. + + int m_shortcutScopeIndex; + public: TPalette(); ~TPalette(); @@ -417,6 +420,8 @@ between RGBA color components. m_isLocked = lock; } + void nextShortcutScope(); + public: // Deprecated functions diff --git a/toonz/sources/tnztools/tooloptions.cpp b/toonz/sources/tnztools/tooloptions.cpp index f19ee3be..d333ad4f 100644 --- a/toonz/sources/tnztools/tooloptions.cpp +++ b/toonz/sources/tnztools/tooloptions.cpp @@ -2340,6 +2340,7 @@ un po' di codice... */ m_panels[tool] = panel; layout()->addWidget(panel); + emit newPanelCreated(); } else { // il panel c'e' gia'. panel = it->second; diff --git a/toonz/sources/toonz/comboviewerpane.cpp b/toonz/sources/toonz/comboviewerpane.cpp index 6a10ad94..8a05db10 100644 --- a/toonz/sources/toonz/comboviewerpane.cpp +++ b/toonz/sources/toonz/comboviewerpane.cpp @@ -189,6 +189,9 @@ ComboViewerPanel::ComboViewerPanel(QWidget *parent, Qt::WFlags flags) SLOT(update())); ret = ret && connect(app->getCurrentScene(), SIGNAL(sceneSwitched()), this, SLOT(onSceneSwitched())); + ret = ret && connect(m_toolOptions, SIGNAL(newPanelCreated()), this, + SLOT(updateTabFocus())); + assert(ret); // note: initializeTitleBar() refers to m_sceneViewer @@ -388,9 +391,9 @@ void ComboViewerPanel::showEvent(QShowEvent *) { ret = ret && connect(app->getCurrentTool(), SIGNAL(toolSwitched()), m_sceneViewer, SLOT(onToolSwitched())); - ret = ret && connect(sceneHandle, SIGNAL(preferenceChanged()), m_flipConsole, - SLOT(onPreferenceChanged())); - m_flipConsole->onPreferenceChanged(); + ret = ret && connect(sceneHandle, SIGNAL(preferenceChanged(const QString &)), + this, SLOT(onPreferenceChanged(const QString &))); + onPreferenceChanged(""); assert(ret); @@ -781,3 +784,38 @@ bool ComboViewerPanel::isFrameAlreadyCached(int frame) { } //----------------------------------------------------------------------------- + +void ComboViewerPanel::onPreferenceChanged(const QString &prefName) { + // if no name specified (on showEvent), then process all updates + if (prefName == "BlankCount" || prefName == "BlankColor" || + prefName.isEmpty()) + m_flipConsole->onPreferenceChanged(); + + if (prefName == "NumpadForSwitchingStyles" || prefName.isEmpty()) + updateTabFocus(); +} + +//----------------------------------------------------------------------------- + +void ComboViewerPanel::updateTabFocus() { + QList widgets = findChildren(); + if (Preferences::instance()->isUseNumpadForSwitchingStylesEnabled()) { + // disable tab focus + foreach (QWidget *widget, widgets) { + Qt::FocusPolicy policy = widget->focusPolicy(); + if (policy == Qt::TabFocus || policy == Qt::StrongFocus || + policy == Qt::WheelFocus) { + m_childrenFocusPolicies[widget] = policy; + widget->setFocusPolicy((policy == Qt::TabFocus) ? Qt::NoFocus + : Qt::ClickFocus); + } + } + } else { + // revert tab focus + QHashIterator i(m_childrenFocusPolicies); + while (i.hasNext()) { + i.next(); + i.key()->setFocusPolicy(i.value()); + } + } +} \ No newline at end of file diff --git a/toonz/sources/toonz/comboviewerpane.h b/toonz/sources/toonz/comboviewerpane.h index 8f935caa..c6864381 100644 --- a/toonz/sources/toonz/comboviewerpane.h +++ b/toonz/sources/toonz/comboviewerpane.h @@ -55,6 +55,8 @@ class ComboViewerPanel final : public TPanel, public FlipConsoleOwner { TPanelTitleBarButton *m_previewButton; TPanelTitleBarButton *m_subcameraPreviewButton; + QHash m_childrenFocusPolicies; + public: #if QT_VERSION >= 0x050500 ComboViewerPanel(QWidget *parent = 0, Qt::WindowFlags flags = 0); @@ -118,6 +120,9 @@ protected slots: void onSceneSwitched(); void enableFullPreview(bool enabled); void enableSubCameraPreview(bool enabled); + + void onPreferenceChanged(const QString &prefName); + void updateTabFocus(); }; #endif diff --git a/toonz/sources/toonz/preferencespopup.cpp b/toonz/sources/toonz/preferencespopup.cpp index f61fbc3b..6c02e7df 100644 --- a/toonz/sources/toonz/preferencespopup.cpp +++ b/toonz/sources/toonz/preferencespopup.cpp @@ -331,7 +331,7 @@ void PreferencesPopup::onChunkSizeChanged() { void PreferencesPopup::onBlankCountChanged() { if (m_blanksCount && m_blankColor) m_pref->setBlankValues(m_blanksCount->getValue(), m_blankColor->getColor()); - TApp::instance()->getCurrentScene()->notifyPreferenceChanged(); + TApp::instance()->getCurrentScene()->notifyPreferenceChanged("BlankCount"); } //----------------------------------------------------------------------------- @@ -350,7 +350,7 @@ void PreferencesPopup::onBlankColorChanged(const TPixel32 &, bool isDragging) { if (m_blanksCount && m_blankColor) m_pref->setBlankValues(m_blanksCount->getValue(), m_blankColor->getColor()); - TApp::instance()->getCurrentScene()->notifyPreferenceChanged(); + TApp::instance()->getCurrentScene()->notifyPreferenceChanged("BlankColor"); } //----------------------------------------------------------------------------- @@ -871,6 +871,45 @@ void PreferencesPopup::onFfmpegTimeoutChanged() { m_pref->setFfmpegTimeout(m_ffmpegTimeout->getValue()); } +//----------------------------------------------------------------------------- + +void PreferencesPopup::onUseNumpadForSwitchingStylesClicked(bool checked) { + if (checked) { + // check if there are any commands with numpadkey shortcuts + CommandManager *cm = CommandManager::instance(); + QList actionsList; + for (int key = Qt::Key_0; key <= Qt::Key_9; key++) { + std::string str = QKeySequence(key).toString().toStdString(); + QAction *action = cm->getActionFromShortcut(str); + if (action) actionsList.append(action); + } + QAction *tabAction = cm->getActionFromShortcut("Tab"); + if (tabAction) actionsList.append(tabAction); + // if there are actions using numpad shortcuts, notify to release them. + if (!actionsList.isEmpty()) { + QString msgStr = + tr("Numpad keys are assigned to the following commands.\nIs it OK to " + "release these shortcuts?"); + for (int a = 0; a < actionsList.size(); a++) { + msgStr += "\n" + actionsList.at(a)->iconText() + " (" + + actionsList.at(a)->shortcut().toString() + ")"; + } + int ret = DVGui::MsgBox(msgStr, tr("OK"), tr("Cancel"), 1); + if (ret == 2 || ret == 0) { // canceled + m_useNumpadForSwitchingStyles->setChecked(false); + return; + } else { // accepted, then release shortcuts + for (int a = 0; a < actionsList.size(); a++) + cm->setShortcut(actionsList[a], ""); + } + } + } + m_pref->enableUseNumpadForSwitchingStyles(checked); + // emit signal to update Palette and Viewer + TApp::instance()->getCurrentScene()->notifyPreferenceChanged( + "NumpadForSwitchingStyles"); +} + //********************************************************************************** // PrefencesPopup's constructor //********************************************************************************** @@ -1026,6 +1065,8 @@ PreferencesPopup::PreferencesPopup() new CheckBox(tr("Use the TLV Savebox to Limit Filling Operations"), this); CheckBox *minimizeSaveboxAfterEditingCB = new CheckBox(tr("Minimize Savebox after Editing"), this); + m_useNumpadForSwitchingStyles = + new CheckBox(tr("Use Numpad and Tab keys for Switching Styles"), this); //--- Xsheet ------------------------------ categoryList->addItem(tr("Xsheet")); @@ -1220,6 +1261,8 @@ PreferencesPopup::PreferencesPopup() minimizeSaveboxAfterEditingCB->setChecked( m_pref->isMinimizeSaveboxAfterEditing()); useSaveboxToLimitFillingOpCB->setChecked(m_pref->getFillOnlySavebox()); + m_useNumpadForSwitchingStyles->setChecked( + m_pref->isUseNumpadForSwitchingStylesEnabled()); QStringList scanLevelTypes; scanLevelTypes << "tif" @@ -1642,6 +1685,9 @@ PreferencesPopup::PreferencesPopup() Qt::AlignLeft | Qt::AlignVCenter); drawingFrameLay->addWidget(multiLayerStylePickerCB, 0, Qt::AlignLeft | Qt::AlignVCenter); + drawingFrameLay->addWidget(m_useNumpadForSwitchingStyles, 0, + Qt::AlignLeft | Qt::AlignVCenter); + drawingFrameLay->addStretch(1); } drawingBox->setLayout(drawingFrameLay); @@ -1972,6 +2018,8 @@ PreferencesPopup::PreferencesPopup() SLOT(onDefLevelParameterChanged())); ret = ret && connect(m_defLevelDpi, SIGNAL(valueChanged()), SLOT(onDefLevelParameterChanged())); + ret = ret && connect(m_useNumpadForSwitchingStyles, SIGNAL(clicked(bool)), + SLOT(onUseNumpadForSwitchingStylesClicked(bool))); //--- Xsheet ---------------------- ret = ret && connect(xsheetAutopanDuringPlaybackCB, SIGNAL(stateChanged(int)), diff --git a/toonz/sources/toonz/preferencespopup.h b/toonz/sources/toonz/preferencespopup.h index 7677d227..616582a7 100644 --- a/toonz/sources/toonz/preferencespopup.h +++ b/toonz/sources/toonz/preferencespopup.h @@ -68,7 +68,8 @@ private: QPushButton *m_addLevelFormat, *m_removeLevelFormat, *m_editLevelFormat; DVGui::CheckBox *m_inksOnly, *m_enableVersionControl, *m_levelsBackup, - *m_onionSkinVisibility, *m_pixelsOnlyCB, *m_onionSkinDuringPlayback; + *m_onionSkinVisibility, *m_pixelsOnlyCB, *m_onionSkinDuringPlayback, + *m_useNumpadForSwitchingStyles; DVGui::FileField *m_ffmpegPathFileFld; @@ -155,6 +156,7 @@ private slots: void onShowKeyframesOnCellAreaChanged(int); void onFfmpegPathChanged(); void onFfmpegTimeoutChanged(); + void onUseNumpadForSwitchingStylesClicked(bool); }; //********************************************************************************** diff --git a/toonz/sources/toonz/sceneviewerevents.cpp b/toonz/sources/toonz/sceneviewerevents.cpp index 17f3f3d4..6bed2c5b 100644 --- a/toonz/sources/toonz/sceneviewerevents.cpp +++ b/toonz/sources/toonz/sceneviewerevents.cpp @@ -15,6 +15,10 @@ #include "ruler.h" #include "comboviewerpane.h" +// TnzQt includes +#include "toonzqt/tselectionhandle.h" +#include "toonzqt/styleselection.h" + // TnzTools includes #include "tools/cursors.h" #include "tools/toolhandle.h" @@ -753,6 +757,38 @@ void SceneViewer::keyPressEvent(QKeyEvent *event) { tool->setViewer(this); + if (Preferences::instance()->isUseNumpadForSwitchingStylesEnabled() && + (!isTextToolActive)) { + if (Qt::Key_0 <= key && key <= Qt::Key_9) { + TPaletteHandle *ph = + TApp::instance()->getPaletteController()->getCurrentLevelPalette(); + + TPalette *palette = ph->getPalette(); + if (palette) { + int styleId = palette->getShortcutValue(key); + if (styleId >= 0) { + ph->setStyleIndex(styleId); + TStyleSelection *selection = dynamic_cast( + TApp::instance()->getCurrentSelection()->getSelection()); + if (selection) selection->selectNone(); + } + } + event->accept(); + return; + } else if (key == Qt::Key_Tab) { + TPaletteHandle *ph = + TApp::instance()->getPaletteController()->getCurrentLevelPalette(); + + TPalette *palette = ph->getPalette(); + if (palette) { + palette->nextShortcutScope(); + ph->notifyPaletteChanged(); + } + event->accept(); + return; + } + } + if (key == Qt::Key_Shift) modifiers |= Qt::SHIFT; else if (key == Qt::Key_Control) diff --git a/toonz/sources/toonz/viewerpane.cpp b/toonz/sources/toonz/viewerpane.cpp index 819a466f..f10ad1a8 100644 --- a/toonz/sources/toonz/viewerpane.cpp +++ b/toonz/sources/toonz/viewerpane.cpp @@ -259,9 +259,9 @@ void SceneViewerPanel::showEvent(QShowEvent *) { ret = ret && connect(app->getCurrentTool(), SIGNAL(toolSwitched()), m_sceneViewer, SLOT(onToolSwitched())); - ret = ret && connect(sceneHandle, SIGNAL(preferenceChanged()), m_flipConsole, - SLOT(onPreferenceChanged())); - m_flipConsole->onPreferenceChanged(); + ret = ret && connect(sceneHandle, SIGNAL(preferenceChanged(const QString &)), + this, SLOT(onPreferenceChanged(const QString &))); + onPreferenceChanged(""); assert(ret); @@ -601,3 +601,37 @@ void SceneViewerPanel::onFrameTypeChanged() { updateFrameRange(); updateFrameMarkers(); } + +//----------------------------------------------------------------------------- + +void SceneViewerPanel::onPreferenceChanged(const QString &prefName) { + // if no name specified (on showEvent), then process all updates + if (prefName == "BlankCount" || prefName == "BlankColor" || + prefName.isEmpty()) + m_flipConsole->onPreferenceChanged(); + + if (prefName == "NumpadForSwitchingStyles" || prefName.isEmpty()) { + QList widgets = findChildren(); + if (Preferences::instance()->isUseNumpadForSwitchingStylesEnabled()) { + // disable tab key + foreach (QWidget *widget, widgets) { + Qt::FocusPolicy policy = widget->focusPolicy(); + if (policy == Qt::TabFocus || policy == Qt::StrongFocus || + policy == Qt::WheelFocus) { + m_childrenFocusPolicies[widget] = policy; + widget->setFocusPolicy((policy == Qt::TabFocus) ? Qt::NoFocus + : Qt::ClickFocus); + } + } + } else { + // revert tab focus + QHashIterator i(m_childrenFocusPolicies); + while (i.hasNext()) { + i.next(); + i.key()->setFocusPolicy(i.value()); + } + } + } +} + +//----------------------------------------------------------------------------- diff --git a/toonz/sources/toonz/viewerpane.h b/toonz/sources/toonz/viewerpane.h index d308604a..16808918 100644 --- a/toonz/sources/toonz/viewerpane.h +++ b/toonz/sources/toonz/viewerpane.h @@ -38,6 +38,8 @@ class SceneViewerPanel final : public TPanel, public FlipConsoleOwner { TPanelTitleBarButton *m_subcameraPreviewButton; bool m_onionSkinActive = false; + QHash m_childrenFocusPolicies; + public: #if QT_VERSION >= 0x050500 SceneViewerPanel(QWidget *parent = 0, Qt::WindowFlags flags = 0); @@ -75,6 +77,7 @@ protected slots: void onPlayingStatusChanged(bool playing); void enableFullPreview(bool enabled); void enableSubCameraPreview(bool enabled); + void onPreferenceChanged(const QString &prefName); }; #endif diff --git a/toonz/sources/toonzlib/preferences.cpp b/toonz/sources/toonzlib/preferences.cpp index 886e841d..9af590c0 100644 --- a/toonz/sources/toonzlib/preferences.cpp +++ b/toonz/sources/toonzlib/preferences.cpp @@ -23,6 +23,7 @@ // Qt includes #include #include +#include // boost includes #include @@ -288,7 +289,8 @@ Preferences::Preferences() , m_paletteTypeOnLoadRasterImageAsColorModel(0) , m_showKeyframesOnXsheetCellArea(true) , m_precompute(true) - , m_ffmpegTimeout(30) { + , m_ffmpegTimeout(30) + , m_useNumpadForSwitchingStyles(false) { TCamera camera; m_defLevelType = PLI_XSHLEVEL; m_defLevelWidth = camera.getSize().lx; @@ -547,6 +549,8 @@ Preferences::Preferences() if (ffmpegPath != "") m_ffmpegPath = ffmpegPath; setFfmpegPath(m_ffmpegPath.toStdString()); getValue(*m_settings, "ffmpegTimeout", m_ffmpegTimeout); + getValue(*m_settings, "useNumpadForSwitchingStyles", + m_useNumpadForSwitchingStyles); } //----------------------------------------------------------------- @@ -1260,3 +1264,10 @@ int Preferences::matchLevelFormat(const TFilePath &fp) const { return (lft != m_levelFormats.end()) ? lft - m_levelFormats.begin() : -1; } + +//----------------------------------------------------------------- + +void Preferences::enableUseNumpadForSwitchingStyles(bool on) { + m_useNumpadForSwitchingStyles = on; + m_settings->setValue("useNumpadForSwitchingStyles", on ? "1" : "0"); +} \ No newline at end of file diff --git a/toonz/sources/toonzqt/paletteviewergui.cpp b/toonz/sources/toonzqt/paletteviewergui.cpp index b22622cf..43f0e81c 100644 --- a/toonz/sources/toonzqt/paletteviewergui.cpp +++ b/toonz/sources/toonzqt/paletteviewergui.cpp @@ -454,7 +454,7 @@ void PageViewer::drawColorName(QPainter &p, QRect &nameRect, TColorStyle *style, name += " " + toQString(g.first) + ":" + QString::number(g.second); if (style->getFlags() != 0) name += "(autopaint)"; - p.drawText(nameRect.adjusted(6, 4, -6, -4), name); + p.drawText(nameRect.adjusted(8, 4, -6, -4), name); QColor borderCol(getTextColor()); borderCol.setAlphaF(0.3); @@ -587,6 +587,17 @@ void PageViewer::paintEvent(QPaintEvent *e) { QRect nameRect = getColorNameRect(i); drawColorName(p, nameRect, style, styleIndex); + // if numpad shortcut is activated, draw shortcut scope + if (Preferences::instance()->isUseNumpadForSwitchingStylesEnabled() && + palette->getStyleShortcut(styleIndex) >= 0) { + p.setPen(QPen(QColor(0, 0, 0, 128), 2)); + p.drawLine(nameRect.topLeft() + QPoint(2, 1), + nameRect.bottomLeft() + QPoint(2, 0)); + p.setPen(QPen(QColor(255, 255, 255, 128), 2)); + p.drawLine(nameRect.topLeft() + QPoint(4, 1), + nameRect.bottomLeft() + QPoint(4, 0)); + } + // selezione if (m_styleSelection->isSelected(m_page->getIndex(), i)) { p.setPen(Qt::white); @@ -622,10 +633,36 @@ void PageViewer::paintEvent(QPaintEvent *e) { TColorStyle *style = m_page->getStyle(i); int styleIndex = m_page->getStyleId(i); + // if numpad shortcut is activated, draw shortcut scope + if (Preferences::instance()->isUseNumpadForSwitchingStylesEnabled() && + palette->getStyleShortcut(styleIndex) >= 0) { + QRect itemRect = getItemRect(i); + // paint dark + p.setPen(Qt::NoPen); + p.setBrush(QColor(0, 0, 0, 64)); + p.drawRect(itemRect); + // check the neighbours and draw light lines + p.setPen(QPen(QColor(255, 255, 255, 128), 2)); + // top + if (!hasShortcut(i - m_chipPerRow)) + p.drawLine(itemRect.topLeft(), itemRect.topRight() - QPoint(1, 0)); + // left + if (i % m_chipPerRow == 0 || !hasShortcut(i - 1)) + p.drawLine(itemRect.topLeft() + QPoint(0, 1), itemRect.bottomLeft()); + // bottom + if (!hasShortcut(i + m_chipPerRow)) + p.drawLine(itemRect.bottomLeft() + QPoint(1, 0), + itemRect.bottomRight()); + // right + if ((i + 1) % m_chipPerRow == 0 || !hasShortcut(i + 1)) + p.drawLine(itemRect.topRight(), + itemRect.bottomRight() - QPoint(0, 1)); + } + // draw white frame if the style is selected or current if (m_styleSelection->isSelected(m_page->getIndex(), i) || currentStyleIndex == styleIndex) { - QRect itemRect = getItemRect(i).adjusted(-1, -2, 1, 2); + QRect itemRect = getItemRect(i).adjusted(0, -1, 0, 1); p.setPen(Qt::NoPen); p.setBrush(Qt::white); p.drawRoundRect(itemRect, 7, 25); @@ -1389,6 +1426,15 @@ void PageViewer::eraseToggleLink() { m_styleSelection->eraseToggleLink(); } +//----------------------------------------------------------------------------- + +bool PageViewer::hasShortcut(int indexInPage) { + if (!m_page) return false; + if (indexInPage < 0 || indexInPage >= m_page->getStyleCount()) return false; + int styleIndex = m_page->getStyleId(indexInPage); + return (m_page->getPalette()->getStyleShortcut(styleIndex) >= 0); +} + //============================================================================= /*! \class PaletteViewerGUI::PaletteTabBar \brief The PaletteTabBar class provides a bar with tab to show From 94ecc2fcc63946e7106a578307bae01971af83f0 Mon Sep 17 00:00:00 2001 From: shun_iwasawa Date: Tue, 13 Sep 2016 16:53:46 +0900 Subject: [PATCH 08/56] revert autocenter in cleanup settings --- toonz/sources/toonz/cleanupsettingspane.cpp | 60 ++++++++++++++++++++- toonz/sources/toonz/cleanupsettingspane.h | 4 ++ 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/toonz/sources/toonz/cleanupsettingspane.cpp b/toonz/sources/toonz/cleanupsettingspane.cpp index d7e5579a..30756ba3 100644 --- a/toonz/sources/toonz/cleanupsettingspane.cpp +++ b/toonz/sources/toonz/cleanupsettingspane.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include "cleanupsettingspane.h" @@ -80,6 +81,10 @@ void CleanupSaveInField::browseDirectory() { CleanupSettingsPane::CleanupSettingsPane(QWidget *parent) : QFrame(parent), m_attached(false) { + // Autocenter + m_autocenterBox = new QGroupBox(tr("Autocenter"), this); + m_pegHolesOm = new QComboBox(this); + m_fieldGuideOm = new QComboBox(this); // Rotate&Flip QFrame *rotFlipFrame = new QFrame(this); m_rotateOm = new QComboBox(this); @@ -103,6 +108,19 @@ CleanupSettingsPane::CleanupSettingsPane(QWidget *parent) QPushButton *loadBtn = new QPushButton(tr("Load")); QPushButton *resetBtn = new QPushButton(tr("Reset")); + // Autocenter + m_autocenterBox->setCheckable(true); + QStringList pegbarHoles; + pegbarHoles << "Bottom" + << "Top" + << "Left" + << "Right"; + m_pegHolesOm->addItems(pegbarHoles); + std::vector fdgNames; + CleanupParameters::getFdgNames(fdgNames); + for (int i = 0; i < (int)fdgNames.size(); i++) + m_fieldGuideOm->addItem(QString(fdgNames[i].c_str())); + // Rotate&Flip rotFlipFrame->setObjectName("CleanupSettingsFrame"); QStringList rotate; @@ -137,6 +155,23 @@ CleanupSettingsPane::CleanupSettingsPane(QWidget *parent) mainLay->setSpacing(2); mainLay->setMargin(5); { + // Autocenter + QGridLayout *autocenterLay = new QGridLayout(); + autocenterLay->setMargin(5); + autocenterLay->setSpacing(3); + { + autocenterLay->addWidget(new QLabel(tr("Pegbar Holes")), 0, 0, + Qt::AlignRight | Qt::AlignVCenter); + autocenterLay->addWidget(m_pegHolesOm, 0, 1); + autocenterLay->addWidget(new QLabel(tr("Field Guide")), 1, 0, + Qt::AlignRight | Qt::AlignVCenter); + autocenterLay->addWidget(m_fieldGuideOm, 1, 1); + } + autocenterLay->setColumnStretch(0, 0); + autocenterLay->setColumnStretch(1, 1); + m_autocenterBox->setLayout(autocenterLay); + mainLay->addWidget(m_autocenterBox, 0); + // Rotate&Flip QGridLayout *rotFlipLay = new QGridLayout(); rotFlipLay->setMargin(5); @@ -226,7 +261,14 @@ CleanupSettingsPane::CleanupSettingsPane(QWidget *parent) //-----signal-slot connections bool ret = true; - ret = ret && connect(m_rotateOm, SIGNAL(activated(int)), + ret = ret && connect(m_autocenterBox, SIGNAL(toggled(bool)), + SLOT(onGenericSettingsChange())); + ret = ret && connect(m_pegHolesOm, SIGNAL(activated(int)), + SLOT(onGenericSettingsChange())); + ret = ret && connect(m_fieldGuideOm, SIGNAL(activated(int)), + SLOT(onGenericSettingsChange())); + + ret = ret && connect(m_rotateOm, SIGNAL(activated(int)), SLOT(onGenericSettingsChange())); ret = ret && connect(m_flipX, SIGNAL(stateChanged(int)), SLOT(onGenericSettingsChange())); @@ -336,6 +378,15 @@ void CleanupSettingsPane::updateGui(bool needsPostProcess) { void CleanupSettingsPane::updateGui(CleanupParameters *params, CleanupParameters *oldParams) { + m_autocenterBox->setChecked(params->m_autocenterType == + CleanupTypes::AUTOCENTER_FDG); + m_pegHolesOm->setCurrentIndex(params->m_pegSide - 1); + + QString fieldName = QString::fromStdString(params->getFdgName()); + int index = (fieldName.isEmpty()) ? 0 : m_fieldGuideOm->findText(fieldName); + assert(index != -1); + m_fieldGuideOm->setCurrentIndex(index); + m_rotateOm->setCurrentIndex(params->m_rotate / 90); m_flipX->setChecked(params->m_flipx); m_flipY->setChecked(params->m_flipy); @@ -462,6 +513,13 @@ void CleanupSettingsPane::onGenericSettingsChange() { CleanupSettingsModel *model = CleanupSettingsModel::instance(); CleanupParameters *params = model->getCurrentParameters(); + params->m_autocenterType = m_autocenterBox->isChecked() + ? CleanupTypes::AUTOCENTER_FDG + : CleanupTypes::AUTOCENTER_NONE; + params->m_pegSide = + (CleanupTypes::PEGS_SIDE)(m_pegHolesOm->currentIndex() + 1); + params->setFdgByName(m_fieldGuideOm->currentText().toStdString()); + params->m_rotate = m_rotateOm->currentIndex() * 90; params->m_flipx = m_flipX->isChecked(); params->m_flipy = m_flipY->isChecked(); diff --git a/toonz/sources/toonz/cleanupsettingspane.h b/toonz/sources/toonz/cleanupsettingspane.h index b0069d89..75da278a 100644 --- a/toonz/sources/toonz/cleanupsettingspane.h +++ b/toonz/sources/toonz/cleanupsettingspane.h @@ -18,6 +18,7 @@ class QComboBox; class QLabel; class QCheckBox; class CleanupPaletteViewer; +class QGroupBox; namespace DVGui { @@ -47,6 +48,9 @@ public: CleanupCameraSettingsWidget *m_cameraWidget; private: + //----Autocenter + QGroupBox *m_autocenterBox; + QComboBox *m_pegHolesOm, *m_fieldGuideOm; //----Rotate & Flip QComboBox *m_rotateOm; QCheckBox *m_flipX; From beb3057607b069c1f19f147b741d7a96f23985c1 Mon Sep 17 00:00:00 2001 From: shun_iwasawa Date: Tue, 13 Sep 2016 19:10:05 +0900 Subject: [PATCH 09/56] enable shift + tab --- toonz/sources/common/tvrender/tpalette.cpp | 19 +++++++++++++------ toonz/sources/include/tpalette.h | 2 +- toonz/sources/toonz/preferencespopup.cpp | 2 ++ toonz/sources/toonz/sceneviewerevents.cpp | 4 ++-- toonz/sources/toonz/shortcutpopup.cpp | 11 +++++++++++ 5 files changed, 29 insertions(+), 9 deletions(-) diff --git a/toonz/sources/common/tvrender/tpalette.cpp b/toonz/sources/common/tvrender/tpalette.cpp index dbdf592e..f3e229ee 100644 --- a/toonz/sources/common/tvrender/tpalette.cpp +++ b/toonz/sources/common/tvrender/tpalette.cpp @@ -1097,9 +1097,16 @@ void TPalette::setShortcutValue(int key, int styleId) { //------------------------------------------------------------------- -void TPalette::nextShortcutScope() { - if ((m_shortcutScopeIndex + 1) * 10 < getPage(0)->getStyleCount()) - m_shortcutScopeIndex += 1; - else - m_shortcutScopeIndex = 0; -} \ No newline at end of file +void TPalette::nextShortcutScope(bool invert) { + if (invert) { + if (m_shortcutScopeIndex > 0) + m_shortcutScopeIndex -= 1; + else + m_shortcutScopeIndex = getPage(0)->getStyleCount() / 10; + } else { + if ((m_shortcutScopeIndex + 1) * 10 < getPage(0)->getStyleCount()) + m_shortcutScopeIndex += 1; + else + m_shortcutScopeIndex = 0; + } +} diff --git a/toonz/sources/include/tpalette.h b/toonz/sources/include/tpalette.h index e25b5415..339186f6 100644 --- a/toonz/sources/include/tpalette.h +++ b/toonz/sources/include/tpalette.h @@ -420,7 +420,7 @@ between RGBA color components. m_isLocked = lock; } - void nextShortcutScope(); + void nextShortcutScope(bool invert); public: // Deprecated functions diff --git a/toonz/sources/toonz/preferencespopup.cpp b/toonz/sources/toonz/preferencespopup.cpp index 6c02e7df..1ee465b8 100644 --- a/toonz/sources/toonz/preferencespopup.cpp +++ b/toonz/sources/toonz/preferencespopup.cpp @@ -885,6 +885,8 @@ void PreferencesPopup::onUseNumpadForSwitchingStylesClicked(bool checked) { } QAction *tabAction = cm->getActionFromShortcut("Tab"); if (tabAction) actionsList.append(tabAction); + tabAction = cm->getActionFromShortcut("Shift+Tab"); + if (tabAction) actionsList.append(tabAction); // if there are actions using numpad shortcuts, notify to release them. if (!actionsList.isEmpty()) { QString msgStr = diff --git a/toonz/sources/toonz/sceneviewerevents.cpp b/toonz/sources/toonz/sceneviewerevents.cpp index 6bed2c5b..c55a75a0 100644 --- a/toonz/sources/toonz/sceneviewerevents.cpp +++ b/toonz/sources/toonz/sceneviewerevents.cpp @@ -775,13 +775,13 @@ void SceneViewer::keyPressEvent(QKeyEvent *event) { } event->accept(); return; - } else if (key == Qt::Key_Tab) { + } else if (key == Qt::Key_Tab || key == Qt::Key_Backtab) { TPaletteHandle *ph = TApp::instance()->getPaletteController()->getCurrentLevelPalette(); TPalette *palette = ph->getPalette(); if (palette) { - palette->nextShortcutScope(); + palette->nextShortcutScope(key == Qt::Key_Backtab); ph->notifyPaletteChanged(); } event->accept(); diff --git a/toonz/sources/toonz/shortcutpopup.cpp b/toonz/sources/toonz/shortcutpopup.cpp index 911a11f8..5e360628 100644 --- a/toonz/sources/toonz/shortcutpopup.cpp +++ b/toonz/sources/toonz/shortcutpopup.cpp @@ -10,6 +10,9 @@ #include "toonzqt/menubarcommand.h" #include "toonzqt/dvdialog.h" +// TnzLib includes +#include "toonz/preferences.h" + // Qt includes #include #include @@ -128,6 +131,14 @@ void ShortcutViewer::keyPressEvent(QKeyEvent *event) { modifiers = 0; } + // If "Use Numpad and Tab keys for Switching Styles" option is activated, + // then prevent to assign such keys + if (Preferences::instance()->isUseNumpadForSwitchingStylesEnabled() && + modifiers == 0 && (key >= Qt::Key_0 && key <= Qt::Key_9)) { + event->ignore(); + return; + } + if (m_action) { CommandManager *cm = CommandManager::instance(); QKeySequence keySequence(key + modifiers); From 640862e570f833304b05fedee84985d3b042f57e Mon Sep 17 00:00:00 2001 From: shun_iwasawa Date: Thu, 15 Sep 2016 20:31:45 +0900 Subject: [PATCH 10/56] revert link style --- .../include/toonzqt/paletteviewergui.h | 3 -- .../sources/include/toonzqt/styleselection.h | 2 +- toonz/sources/toonz/mainwindow.cpp | 2 +- toonz/sources/toonzqt/paletteviewer.cpp | 5 +- toonz/sources/toonzqt/paletteviewergui.cpp | 47 +++++++------------ toonz/sources/toonzqt/studiopaletteviewer.cpp | 1 + toonz/sources/toonzqt/styleselection.cpp | 41 +++++++++------- 7 files changed, 43 insertions(+), 58 deletions(-) diff --git a/toonz/sources/include/toonzqt/paletteviewergui.h b/toonz/sources/include/toonzqt/paletteviewergui.h index bc1d074c..3cc54aa7 100644 --- a/toonz/sources/include/toonzqt/paletteviewergui.h +++ b/toonz/sources/include/toonzqt/paletteviewergui.h @@ -199,9 +199,6 @@ protected: void zoomInChip(); void zoomOutChip(); -protected slots: - void removeLink(); - private: DVGui::LineEdit *m_renameTextField; QPoint m_dragStartPosition; diff --git a/toonz/sources/include/toonzqt/styleselection.h b/toonz/sources/include/toonzqt/styleselection.h index fb78637e..d18bccff 100644 --- a/toonz/sources/include/toonzqt/styleselection.h +++ b/toonz/sources/include/toonzqt/styleselection.h @@ -95,7 +95,7 @@ public: void toggleKeyframe(int frame); // remove link from the studio palette (if linked) - bool removeLink(); + void removeLink(); // get back the style from the studio palette (if linked) void getBackOriginalStyle(); }; diff --git a/toonz/sources/toonz/mainwindow.cpp b/toonz/sources/toonz/mainwindow.cpp index 3e5fa4f1..18037a4b 100644 --- a/toonz/sources/toonz/mainwindow.cpp +++ b/toonz/sources/toonz/mainwindow.cpp @@ -1640,7 +1640,7 @@ void MainWindow::defineActions() { createRightClickMenuAction(MI_GetColorFromStudioPalette, tr("Get Color from Studio Palette"), ""); createRightClickMenuAction(MI_ToggleLinkToStudioPalette, - tr("Toggle Link to Studio Palette"), "\\"); + tr("Toggle Link to Studio Palette"), ""); createRightClickMenuAction(MI_RemoveReferenceToStudioPalette, tr("Remove Reference to Studio Palette"), ""); createMenuEditAction(MI_Clear, tr("&Delete"), "Delete"); diff --git a/toonz/sources/toonzqt/paletteviewer.cpp b/toonz/sources/toonzqt/paletteviewer.cpp index faace8b2..b7a59ea0 100644 --- a/toonz/sources/toonzqt/paletteviewer.cpp +++ b/toonz/sources/toonzqt/paletteviewer.cpp @@ -911,10 +911,7 @@ void PaletteViewer::saveStudioPalette() { if (ret == 2 || ret == 0) return; sp->setPalette(fp, getPalette(), false); - question = "Do you want to update all linked styles in current scene ?"; - ret = DVGui::MsgBox(question, tr("Update"), tr("Don't Update"), 0); - if (ret == 1) - StudioPaletteCmd::updateAllLinkedStyles(m_paletteHandle, m_xsheetHandle); + StudioPaletteCmd::updateAllLinkedStyles(m_paletteHandle, m_xsheetHandle); palette->setDirtyFlag(false); } diff --git a/toonz/sources/toonzqt/paletteviewergui.cpp b/toonz/sources/toonzqt/paletteviewergui.cpp index 3f5dbdbb..b30936b9 100644 --- a/toonz/sources/toonzqt/paletteviewergui.cpp +++ b/toonz/sources/toonzqt/paletteviewergui.cpp @@ -1022,29 +1022,21 @@ void PageViewer::contextMenuEvent(QContextMenuEvent *event) { bool isLocked = m_page ? m_page->getPalette()->isLocked() : false; // remove links from studio palette - //if (m_viewType == LEVEL_PALETTE && m_styleSelection && - // !m_styleSelection->isEmpty() && !isLocked) { - // menu.addSeparator(); - // QAction *removeLinkAct = menu.addAction(tr("Remove Links")); - // connect(removeLinkAct, SIGNAL(triggered()), this, SLOT(removeLink())); - //} + if (m_viewType == LEVEL_PALETTE && m_styleSelection && + !m_styleSelection->isEmpty() && !isLocked) { + menu.addSeparator(); + QAction *toggleStyleLink = cmd->getAction("MI_ToggleLinkToStudioPalette"); + menu.addAction(toggleStyleLink); + QAction *removeStyleLink = + cmd->getAction("MI_RemoveReferenceToStudioPalette"); + menu.addAction(removeStyleLink); + QAction *getBackOriginalAct = + cmd->getAction("MI_GetColorFromStudioPalette"); + menu.addAction(getBackOriginalAct); + } if (((indexPage == 0 && index > 0) || (indexPage > 0 && index >= 0)) && index < getChipCount() && !isLocked) { - - std::wstring globalName = m_page->getStyle(index)->getGlobalName(); - if (m_viewType != STUDIO_PALETTE && globalName != L"" && - (globalName[0] == L'-' || globalName[0] == L'+')) - { - menu.addSeparator(); - QAction *toggleStyleLink = cmd->getAction("MI_ToggleLinkToStudioPalette"); - menu.addAction(toggleStyleLink); - QAction *removeStyleLink = cmd->getAction("MI_RemoveReferenceToStudioPalette"); - menu.addAction(removeStyleLink); - QAction *getBackOriginalAct = cmd->getAction("MI_GetColorFromStudioPalette"); - menu.addAction(getBackOriginalAct); - } - if (pasteValueAct) pasteValueAct->setEnabled(true); if (pasteColorsAct) pasteColorsAct->setEnabled(true); @@ -1063,16 +1055,18 @@ void PageViewer::contextMenuEvent(QContextMenuEvent *event) { } if (m_page) { - menu.addSeparator(); + menu.addSeparator(); QAction *newStyle = menu.addAction(tr("New Style")); connect(newStyle, SIGNAL(triggered()), SLOT(addNewColor())); QAction *newPage = menu.addAction(tr("New Page")); connect(newPage, SIGNAL(triggered()), SLOT(addNewPage())); } + /* if (m_viewType != STUDIO_PALETTE) { - menu.addAction(cmd->getAction(MI_EraseUnusedStyles)); + menu.addAction(cmd->getAction(MI_EraseUnusedStyles)); } + */ menu.exec(event->globalPos()); } @@ -1626,12 +1620,3 @@ void PageViewer::updateCommandLocks() { cmd->getAction("MI_ToggleLinkToStudioPalette")->setEnabled(!isLocked); cmd->getAction("MI_RemoveReferenceToStudioPalette")->setEnabled(!isLocked); } - -//----------------------------------------------------------------------------- -/*! remove link and revert to the normal style -*/ -void PageViewer::removeLink() { - if (!m_page || !m_styleSelection || m_styleSelection->isEmpty()) return; - - if (m_styleSelection->removeLink()) emit changeWindowTitleSignal(); -} diff --git a/toonz/sources/toonzqt/studiopaletteviewer.cpp b/toonz/sources/toonzqt/studiopaletteviewer.cpp index 052335e7..bb6b00e7 100644 --- a/toonz/sources/toonzqt/studiopaletteviewer.cpp +++ b/toonz/sources/toonzqt/studiopaletteviewer.cpp @@ -497,6 +497,7 @@ void StudioPaletteTreeViewer::onCurrentItemChanged(QTreeWidgetItem *current, m_currentPalette = StudioPalette::instance()->getPalette(newPath, false); m_studioPaletteHandle->setPalette(m_currentPalette.getPointer()); m_studioPaletteHandle->notifyPaletteSwitched(); + StudioPaletteCmd::updateAllLinkedStyles(m_levelPaletteHandle, m_xsheetHandle); } //----------------------------------------------------------------------------- diff --git a/toonz/sources/toonzqt/styleselection.cpp b/toonz/sources/toonzqt/styleselection.cpp index 0c9c07c5..1b49737a 100644 --- a/toonz/sources/toonzqt/styleselection.cpp +++ b/toonz/sources/toonzqt/styleselection.cpp @@ -505,15 +505,14 @@ void TStyleSelection::enableCommands() { enableCommand(this, MI_PasteNames, &TStyleSelection::pasteStylesName); // available only for level palette - if (m_paletteHandle->getPalette()->getGlobalName() == L"") { - enableCommand(this, MI_GetColorFromStudioPalette, - &TStyleSelection::getBackOriginalStyle); - enableCommand(this, MI_ToggleLinkToStudioPalette, - &TStyleSelection::toggleLink); - enableCommand(this, MI_RemoveReferenceToStudioPalette, - &TStyleSelection::eraseToggleLink); - - } + if (m_paletteHandle->getPalette()->getGlobalName() == L"") { + enableCommand(this, MI_GetColorFromStudioPalette, + &TStyleSelection::getBackOriginalStyle); + enableCommand(this, MI_ToggleLinkToStudioPalette, + &TStyleSelection::toggleLink); + enableCommand(this, MI_RemoveReferenceToStudioPalette, + &TStyleSelection::removeLink); + } } enableCommand(this, MI_Clear, &TStyleSelection::deleteStyles); enableCommand(this, MI_EraseUnusedStyles, &TStyleSelection::eraseUnsedStyle); @@ -1421,8 +1420,8 @@ void TStyleSelection::toggleLink() { std::vector> oldColorStylesLinked; std::vector> newColorStylesLinked; - bool somethingHasBeenLinked = false; - + bool somethingHasBeenLinked = false; + bool somethingChanged = false; bool currentStyleIsInSelection = false; TPalette::Page *page = palette->getPage(m_pageIndex); @@ -1442,6 +1441,7 @@ void TStyleSelection::toggleLink() { name[0] = name[0] == L'-' ? L'+' : L'-'; cs->setGlobalName(name); if (name[0] == L'+') somethingHasBeenLinked = true; + somethingChanged = true; } undo->setColorStyle(index, oldCs, name); @@ -1449,6 +1449,13 @@ void TStyleSelection::toggleLink() { palette->getPage(m_pageIndex)->search(m_paletteHandle->getStyleIndex())) currentStyleIsInSelection = true; } + + // if nothing changed, do not set dirty flag, nor register undo + if (!somethingChanged) { + delete undo; + return; + } + if (somethingHasBeenLinked) StudioPalette::instance()->updateLinkedColors(palette); @@ -1583,7 +1590,7 @@ public: int getSize() const override { return sizeof(*this); } QString getHistoryString() override { - return QObject::tr("Remove Link in Palette : %1") + return QObject::tr("Remove Reference in Palette : %1") .arg(QString::fromStdWString(m_palette->getPaletteName())); } int getHistoryType() override { return HistoryType::Palette; } @@ -1593,11 +1600,11 @@ public: /*! remove link from studio palette. Delete the global and the orginal names. * return true if something changed */ -bool TStyleSelection::removeLink() { +void TStyleSelection::removeLink() { TPalette *palette = getPalette(); - if (!palette || m_pageIndex < 0) return false; + if (!palette || m_pageIndex < 0) return; int n = m_styleIndicesInPage.size(); - if (n <= 0) return false; + if (n <= 0) return; TPalette::Page *page = palette->getPage(m_pageIndex); assert(page); @@ -1622,12 +1629,10 @@ bool TStyleSelection::removeLink() { } if (somethingChanged) { - palette->setDirtyFlag(true); + m_paletteHandle->notifyColorStyleChanged(false); TUndoManager::manager()->add(undo); } else delete undo; - - return somethingChanged; } //============================================================================= From 9f19cf15dacd4526bbef9049e654abe397e45140 Mon Sep 17 00:00:00 2001 From: shun_iwasawa Date: Tue, 20 Sep 2016 17:32:21 +0900 Subject: [PATCH 11/56] small fixes --- .../sources/include/toonzqt/styleselection.h | 2 ++ toonz/sources/toonzlib/studiopalettecmd.cpp | 4 ++++ toonz/sources/toonzqt/paletteviewergui.cpp | 3 ++- toonz/sources/toonzqt/styleselection.cpp | 23 +++++++++++++++++++ 4 files changed, 31 insertions(+), 1 deletion(-) diff --git a/toonz/sources/include/toonzqt/styleselection.h b/toonz/sources/include/toonzqt/styleselection.h index d18bccff..6e5099e9 100644 --- a/toonz/sources/include/toonzqt/styleselection.h +++ b/toonz/sources/include/toonzqt/styleselection.h @@ -98,6 +98,8 @@ public: void removeLink(); // get back the style from the studio palette (if linked) void getBackOriginalStyle(); + // return true if there is at least one linked style in the selection + bool hasLinkedStyle(); }; #endif // STYLESELECTION_INCLUDED diff --git a/toonz/sources/toonzlib/studiopalettecmd.cpp b/toonz/sources/toonzlib/studiopalettecmd.cpp index 8cf07e95..c8023ec4 100644 --- a/toonz/sources/toonzlib/studiopalettecmd.cpp +++ b/toonz/sources/toonzlib/studiopalettecmd.cpp @@ -501,7 +501,11 @@ void StudioPaletteCmd::loadIntoCurrentPalette(TPaletteHandle *paletteHandle, // keep the color model path unchanged TFilePath oldRefImagePath = current->getRefImgPath(); + std::wstring oldGlobalName = current->getGlobalName(); current->assign(palette, true); + // keep global name unchanged + current->setGlobalName(oldGlobalName); + current->setDirtyFlag(true); current->setRefImgPath(oldRefImagePath); diff --git a/toonz/sources/toonzqt/paletteviewergui.cpp b/toonz/sources/toonzqt/paletteviewergui.cpp index b30936b9..bf826a72 100644 --- a/toonz/sources/toonzqt/paletteviewergui.cpp +++ b/toonz/sources/toonzqt/paletteviewergui.cpp @@ -1023,7 +1023,8 @@ void PageViewer::contextMenuEvent(QContextMenuEvent *event) { // remove links from studio palette if (m_viewType == LEVEL_PALETTE && m_styleSelection && - !m_styleSelection->isEmpty() && !isLocked) { + !m_styleSelection->isEmpty() && !isLocked && + m_styleSelection->hasLinkedStyle()) { menu.addSeparator(); QAction *toggleStyleLink = cmd->getAction("MI_ToggleLinkToStudioPalette"); menu.addAction(toggleStyleLink); diff --git a/toonz/sources/toonzqt/styleselection.cpp b/toonz/sources/toonzqt/styleselection.cpp index 1b49737a..99f9bb98 100644 --- a/toonz/sources/toonzqt/styleselection.cpp +++ b/toonz/sources/toonzqt/styleselection.cpp @@ -1794,3 +1794,26 @@ void TStyleSelection::getBackOriginalStyle() { } else delete undo; } + +//----------------------------------------------------------------------------- +/*! return true if there is at least one linked style in the selection +*/ + +bool TStyleSelection::hasLinkedStyle() { + TPalette *palette = getPalette(); + if (!palette || m_pageIndex < 0 || isEmpty()) return false; + if (m_styleIndicesInPage.size() <= 0) return false; + + TPalette::Page *page = palette->getPage(m_pageIndex); + assert(page); + + // for each selected style + for (std::set::iterator it = m_styleIndicesInPage.begin(); + it != m_styleIndicesInPage.end(); ++it) { + TColorStyle *cs = page->getStyle(*it); + std::wstring gname = cs->getGlobalName(); + // if the style has link, return true + if (gname != L"" && (gname[0] == L'-' || gname[0] == L'+')) return true; + } + return false; +} From d2d7da8fa87f98a5dd53164b24225b7fee7c954b Mon Sep 17 00:00:00 2001 From: shun-iwasawa Date: Fri, 23 Sep 2016 19:54:22 +0900 Subject: [PATCH 12/56] fix libpng for msvc2015_x86 (#831) --- thirdparty/libpng-1.6.21/lib/libpng16_2015.lib | 4 ++-- thirdparty/libpng-1.6.21/lib/libpng16_2015d.lib | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/thirdparty/libpng-1.6.21/lib/libpng16_2015.lib b/thirdparty/libpng-1.6.21/lib/libpng16_2015.lib index ca4827f9..1e7bbcfe 100644 --- a/thirdparty/libpng-1.6.21/lib/libpng16_2015.lib +++ b/thirdparty/libpng-1.6.21/lib/libpng16_2015.lib @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1d6be973caafd36b6dcf9b8fcb2d030ad2e0c3c523527fad7bbf7da9f9ba5b6e -size 56118 +oid sha256:e005a1c28ab5a1f8ed57793a79c883f0b44cd5d2b25152544e3dca5fbdd616bc +size 374568 diff --git a/thirdparty/libpng-1.6.21/lib/libpng16_2015d.lib b/thirdparty/libpng-1.6.21/lib/libpng16_2015d.lib index a94d4924..1859771d 100644 --- a/thirdparty/libpng-1.6.21/lib/libpng16_2015d.lib +++ b/thirdparty/libpng-1.6.21/lib/libpng16_2015d.lib @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:be7784d0f86cf87b9dd965a32707e1a999b059d57fbeddb4066a033200e0fbc9 -size 56118 +oid sha256:f61acffbae2925d60a61bd11b6d5b09502843c89c8b3f20b89f240e050a1e916 +size 858596 From 4dff960ef078d87fdd838ad03881fd7bb9809f75 Mon Sep 17 00:00:00 2001 From: Ram Kromberg Date: Sat, 24 Sep 2016 11:40:39 +0300 Subject: [PATCH 13/56] libtiff/Makefile.am: add tif_getimage_64.c --- thirdparty/tiff-4.0.3/libtiff/Makefile.am | 1 + 1 file changed, 1 insertion(+) diff --git a/thirdparty/tiff-4.0.3/libtiff/Makefile.am b/thirdparty/tiff-4.0.3/libtiff/Makefile.am index 82fa31dc..0a47dabc 100644 --- a/thirdparty/tiff-4.0.3/libtiff/Makefile.am +++ b/thirdparty/tiff-4.0.3/libtiff/Makefile.am @@ -74,6 +74,7 @@ libtiff_la_SOURCES = \ tif_fax3sm.c \ tif_flush.c \ tif_getimage.c \ + tif_getimage_64.c \ tif_jbig.c \ tif_jpeg.c \ tif_jpeg_12.c \ From 33e7d1707e3e81a0cbf3aca8e79ac935b904f09c Mon Sep 17 00:00:00 2001 From: Jeremy Bullock Date: Mon, 26 Sep 2016 02:35:34 -0600 Subject: [PATCH 14/56] Save settings updated - Updated and Fixed (#474) * Auto-save settings updated - now auto-save will save not only the current scene but also all levels, according to preferences option. N.B. Note that the default value of "Automatically save non-scene files" is ON. Please make sure to disable it if you would like to automatically save the scene only. --- .../rooms/Default/menubar_template.xml | 3 +- .../rooms/StudioGhibli/menubar_template.xml | 1 + toonz/sources/include/toonz/preferences.h | 9 +++ toonz/sources/include/toonzqt/dvdialog.h | 17 +++- toonz/sources/toonz/iocommand.cpp | 63 +++++++++++---- toonz/sources/toonz/iocommand.h | 2 + toonz/sources/toonz/mainwindow.cpp | 5 +- toonz/sources/toonz/menubar.cpp | 1 + toonz/sources/toonz/menubarcommandids.h | 1 + toonz/sources/toonz/preferencespopup.cpp | 78 ++++++++++++++----- toonz/sources/toonz/preferencespopup.h | 9 ++- toonz/sources/toonz/tapp.cpp | 17 +++- toonz/sources/toonzlib/preferences.cpp | 19 +++++ toonz/sources/toonzqt/dvdialog.cpp | 76 ++++++++++++++++++ 14 files changed, 257 insertions(+), 44 deletions(-) diff --git a/stuff/profiles/layouts/rooms/Default/menubar_template.xml b/stuff/profiles/layouts/rooms/Default/menubar_template.xml index 5df924eb..c41c8949 100644 --- a/stuff/profiles/layouts/rooms/Default/menubar_template.xml +++ b/stuff/profiles/layouts/rooms/Default/menubar_template.xml @@ -2,9 +2,9 @@ MI_NewScene MI_LoadScene + MI_SaveAll MI_SaveScene MI_SaveSceneAs - MI_SaveAll MI_OpenRecentScene MI_RevertScene @@ -13,6 +13,7 @@ MI_NewLevel MI_LoadLevel + MI_SaveAllLevels MI_SaveLevel MI_SaveLevelAs MI_ExportLevel diff --git a/stuff/profiles/layouts/rooms/StudioGhibli/menubar_template.xml b/stuff/profiles/layouts/rooms/StudioGhibli/menubar_template.xml index eee1faf2..b78b58c7 100644 --- a/stuff/profiles/layouts/rooms/StudioGhibli/menubar_template.xml +++ b/stuff/profiles/layouts/rooms/StudioGhibli/menubar_template.xml @@ -13,6 +13,7 @@ MI_NewLevel MI_LoadLevel + MI_SaveAllLevels MI_SaveLevel MI_SaveLevelAs MI_ExportLevel diff --git a/toonz/sources/include/toonz/preferences.h b/toonz/sources/include/toonz/preferences.h index 7b8c6e41..a3c5ca4f 100644 --- a/toonz/sources/include/toonz/preferences.h +++ b/toonz/sources/include/toonz/preferences.h @@ -99,6 +99,14 @@ public: void setAutosavePeriod(int minutes); int getAutosavePeriod() const { return m_autosavePeriod; } // minutes + void enableAutosaveScene(bool on); + bool isAutosaveSceneEnabled() const { return m_autosaveSceneEnabled; } + + void enableAutosaveOtherFiles(bool on); + bool isAutosaveOtherFilesEnabled() const { + return m_autosaveOtherFilesEnabled; + } + void enableLevelsBackup(bool enabled); bool isLevelsBackupEnabled() const { return m_levelsBackupEnabled; } @@ -457,6 +465,7 @@ private: m_generatedMovieViewEnabled, m_xsheetAutopanEnabled, m_ignoreAlphaonColumn1Enabled, m_previewAlwaysOpenNewFlipEnabled, m_rewindAfterPlaybackEnabled, m_fitToFlipbookEnabled, m_autosaveEnabled, + m_autosaveSceneEnabled, m_autosaveOtherFilesEnabled, m_defaultViewerEnabled, m_pixelsOnly; bool m_rasterOptimizedMemory, m_saveUnpaintedInCleanup, m_askForOverrideRender, m_automaticSVNFolderRefreshEnabled, m_SVNEnabled, diff --git a/toonz/sources/include/toonzqt/dvdialog.h b/toonz/sources/include/toonzqt/dvdialog.h index b61e3665..6184bf51 100644 --- a/toonz/sources/include/toonzqt/dvdialog.h +++ b/toonz/sources/include/toonzqt/dvdialog.h @@ -58,10 +58,11 @@ void DVAPI MsgBoxInPopup(MsgType type, const QString &text); // ATTENZIONE: Valore di ritorno // 0 = l'utente ha chiuso la finestra (dovrebbe corrispondere ad un cancel o ad -// un NO) -// 1 = primo bottone da sx premuto -// 2 = secondo bottone da sx premuto -// 3 = terzo bottone da sx premuto +// un NO) - closed window +// 1 = primo bottone da sx premuto - first button selected +// 2 = secondo bottone da sx premuto - second button +// 3 = terzo bottone da sx premuto - third button +// 4 = fourth button int DVAPI MsgBox(MsgType type, const QString &text, const std::vector &buttons, @@ -77,6 +78,12 @@ int DVAPI MsgBox(const QString &text, const QString &button1, const QString &button2, const QString &button3, int defaultButtonIndex = 0, QWidget *parent = 0); +// QUESTION: four botton user defined +int DVAPI MsgBox(const QString &text, const QString &button1, + const QString &button2, const QString &button3, + const QString &button4, int defaultButtonIndex = 0, + QWidget *parent = 0); + Dialog DVAPI *createMsgBox(MsgType type, const QString &text, const QStringList &buttons, int defaultButtonIndex, QWidget *parent = 0); @@ -229,6 +236,8 @@ public: void addButtonBarWidget(QWidget *widget); void addButtonBarWidget(QWidget *first, QWidget *second); void addButtonBarWidget(QWidget *first, QWidget *second, QWidget *third); + void addButtonBarWidget(QWidget *first, QWidget *second, QWidget *third, + QWidget *fourth); void hideEvent(QHideEvent *event) override; diff --git a/toonz/sources/toonz/iocommand.cpp b/toonz/sources/toonz/iocommand.cpp index 00b9df17..2cb728d5 100644 --- a/toonz/sources/toonz/iocommand.cpp +++ b/toonz/sources/toonz/iocommand.cpp @@ -1176,17 +1176,21 @@ bool IoCmd::saveSceneIfNeeded(QString msg) { QString question; question = QObject::tr( "%1: the current scene has been modified.\n" - "Do you want to save your changes?") + "What would you like to do?") .arg(msg); - int ret = DVGui::MsgBox(question, QObject::tr("Save"), - QObject::tr("Discard"), QObject::tr("Cancel"), 0); - if (ret == 0 || ret == 3) { + int ret = DVGui::MsgBox( + question, QObject::tr("Save All"), QObject::tr("Save Scene Only"), + QObject::tr("Discard Changes"), QObject::tr("Cancel"), 0); + if (ret == 0 || ret == 4) { // cancel (or closed message box window) return false; } else if (ret == 1) { + // save all + if (!IoCmd::saveAll()) return false; + } else if (ret == 2) { // save if (!IoCmd::saveScene()) return false; - } else if (ret == 2) { + } else if (ret == 3) { } isLevelOrSceneIsDirty = true; @@ -1203,21 +1207,25 @@ bool IoCmd::saveSceneIfNeeded(QString msg) { if (!dirtyResources.empty()) { QString question; - question = - msg + ":" + QObject::tr(" Following file(s) are modified.\n\n"); + question = msg + ":" + + QObject::tr(" The following file(s) have been modified.\n\n"); for (int i = 0; i < dirtyResources.size(); i++) { question += " " + dirtyResources[i] + "\n"; } - question += - QObject::tr("\nAre you sure to ") + msg + QObject::tr(" anyway ?"); + question += QObject::tr("\nWhat would you like to do? "); int ret = - DVGui::MsgBox(question, QObject::tr("OK"), QObject::tr("Cancel"), 0); - if (ret == 0 || ret == 2) { + DVGui::MsgBox(question, QObject::tr("Save Changes"), + msg + QObject::tr(" Anyway"), QObject::tr("Cancel"), 0); + if (ret == 0 || ret == 3) { // cancel (or closed message box window) return false; } else if (ret == 1) { - // ok + // save non scene files + IoCmd::saveNonSceneFiles(); + return false; + } else if (ret == 2) { + // quit } isLevelOrSceneIsDirty = true; @@ -1604,7 +1612,7 @@ bool IoCmd::saveLevel(TXshSimpleLevel *sl) { } //=========================================================================== -// IoCmd::saveSound(soundPath, soundColumn, overwrite) +// IoCmd::saveAll() //--------------------------------------------------------------------------- bool IoCmd::saveAll() { @@ -1626,6 +1634,26 @@ bool IoCmd::saveAll() { return result; } +//=========================================================================== +// IoCmd::saveNonSceneFiles() +//--------------------------------------------------------------------------- + +void IoCmd::saveNonSceneFiles() { + // try to save non scene files + + TApp *app = TApp::instance(); + ToonzScene *scene = app->getCurrentScene()->getScene(); + bool untitled = scene->isUntitled(); + SceneResources resources(scene, 0); + resources.save(scene->getScenePath()); + if (untitled) scene->setUntitled(); + resources.updatePaths(); + + // for update title bar + app->getCurrentLevel()->notifyLevelTitleChange(); + app->getCurrentPalette()->notifyPaletteTitleChanged(); +} + //=========================================================================== // IoCmd::saveSound(soundPath, soundColumn, overwrite) //--------------------------------------------------------------------------- @@ -2738,3 +2766,12 @@ public: SaveAllCommandHandler() : MenuItemHandler(MI_SaveAll) {} void execute() override { IoCmd::saveAll(); } } saveAllCommandHandler; + +//============================================================================= +// Save all levels +//----------------------------------------------------------------------------- +class SaveAllLevelsCommandHandler : public MenuItemHandler { +public: + SaveAllLevelsCommandHandler() : MenuItemHandler(MI_SaveAllLevels) {} + void execute() { IoCmd::saveNonSceneFiles(); } +} saveAllLevelsCommandHandler; diff --git a/toonz/sources/toonz/iocommand.h b/toonz/sources/toonz/iocommand.h index 17f6fdb4..2415e857 100644 --- a/toonz/sources/toonz/iocommand.h +++ b/toonz/sources/toonz/iocommand.h @@ -197,6 +197,8 @@ bool saveLevel(TXshSimpleLevel *sl); bool saveAll(); +void saveNonSceneFiles(); + bool saveSound(const TFilePath &fp, TXshSoundLevel *sc, bool overwrite); bool saveSound(TXshSoundLevel *sc); diff --git a/toonz/sources/toonz/mainwindow.cpp b/toonz/sources/toonz/mainwindow.cpp index e0acfec4..b2b2e249 100644 --- a/toonz/sources/toonz/mainwindow.cpp +++ b/toonz/sources/toonz/mainwindow.cpp @@ -1558,9 +1558,9 @@ QAction *MainWindow::createToolAction(const char *id, const char *iconName, void MainWindow::defineActions() { createMenuFileAction(MI_NewScene, tr("&New Scene"), "Ctrl+N"); createMenuFileAction(MI_LoadScene, tr("&Load Scene..."), "Ctrl+L"); - createMenuFileAction(MI_SaveScene, tr("&Save Scene"), "Ctrl+S"); + createMenuFileAction(MI_SaveScene, tr("&Save Scene"), ""); createMenuFileAction(MI_SaveSceneAs, tr("&Save Scene As..."), "Ctrl+Shift+S"); - createMenuFileAction(MI_SaveAll, tr("&Save All"), ""); + createMenuFileAction(MI_SaveAll, tr("&Save All"), "Ctrl+S"); createMenuFileAction(MI_RevertScene, tr("&Revert Scene"), ""); QAction *act = CommandManager::instance()->getAction(MI_RevertScene); @@ -1579,6 +1579,7 @@ void MainWindow::defineActions() { createMenuFileAction(MI_NewLevel, tr("&New Level..."), ""); createMenuFileAction(MI_LoadLevel, tr("&Load Level..."), ""); createMenuFileAction(MI_SaveLevel, tr("&Save Level"), ""); + createMenuFileAction(MI_SaveAllLevels, tr("&Save All Levels"), ""); createMenuFileAction(MI_SaveLevelAs, tr("&Save Level As..."), ""); createMenuFileAction(MI_ExportLevel, tr("&Export Level..."), ""); createMenuFileAction(MI_ConvertFileWithInput, tr("&Convert File..."), ""); diff --git a/toonz/sources/toonz/menubar.cpp b/toonz/sources/toonz/menubar.cpp index 512c1369..83ecf2c2 100644 --- a/toonz/sources/toonz/menubar.cpp +++ b/toonz/sources/toonz/menubar.cpp @@ -1077,6 +1077,7 @@ QMenuBar *StackedMenuBar::createFullMenuBar() { fileMenu->addSeparator(); addMenuItem(fileMenu, MI_NewLevel); addMenuItem(fileMenu, MI_LoadLevel); + addMenuItem(fileMenu, MI_SaveAllLevels); addMenuItem(fileMenu, MI_SaveLevel); addMenuItem(fileMenu, MI_SaveLevelAs); addMenuItem(fileMenu, MI_ExportLevel); diff --git a/toonz/sources/toonz/menubarcommandids.h b/toonz/sources/toonz/menubarcommandids.h index ac9a5bf7..d0ec9f1a 100644 --- a/toonz/sources/toonz/menubarcommandids.h +++ b/toonz/sources/toonz/menubarcommandids.h @@ -16,6 +16,7 @@ #define MI_SaveScene "MI_SaveScene" #define MI_SaveSceneAs "MI_SaveSceneAs" #define MI_SaveAll "MI_SaveAll" +#define MI_SaveAllLevels "MI_SaveAllLevels" #define MI_RevertScene "MI_RevertScene" #define MI_LoadSubSceneFile "MI_LoadSubSceneFile" diff --git a/toonz/sources/toonz/preferencespopup.cpp b/toonz/sources/toonz/preferencespopup.cpp index 09064aa8..e310e51b 100644 --- a/toonz/sources/toonz/preferencespopup.cpp +++ b/toonz/sources/toonz/preferencespopup.cpp @@ -554,9 +554,31 @@ void PreferencesPopup::onDefaultViewerChanged(int index) { //----------------------------------------------------------------------------- -void PreferencesPopup::onAutoSaveChanged(int index) { - m_minuteFld->setEnabled(index == Qt::Checked); - m_pref->enableAutosave(index == Qt::Checked); +void PreferencesPopup::onAutoSaveChanged(bool on) { + m_pref->enableAutosave(on); + if (on && !m_autoSaveSceneCB->isChecked() && + !m_autoSaveOtherFilesCB->isChecked()) { + m_autoSaveSceneCB->setChecked(true); + m_autoSaveOtherFilesCB->setChecked(true); + } +} + +//----------------------------------------------------------------------------- + +void PreferencesPopup::onAutoSaveSceneChanged(int index) { + m_pref->enableAutosaveScene(index == Qt::Checked); + if (!m_autoSaveOtherFilesCB->isChecked() && index == Qt::Unchecked) { + m_autoSaveGroup->setChecked(false); + } +} + +//----------------------------------------------------------------------------- + +void PreferencesPopup::onAutoSaveOtherFilesChanged(int index) { + m_pref->enableAutosaveOtherFiles(index == Qt::Checked); + if (!m_autoSaveSceneCB->isChecked() && index == Qt::Unchecked) { + m_autoSaveGroup->setChecked(false); + } } //----------------------------------------------------------------------------- @@ -926,8 +948,12 @@ PreferencesPopup::PreferencesPopup() new CheckBox(tr("Use Default Viewer for Movie Formats"), this); CheckBox *minimizeRasterMemoryCB = new CheckBox(tr("Minimize Raster Memory Fragmentation *"), this); - CheckBox *autoSaveCB = new CheckBox(tr("Save Automatically Every Minutes")); - m_minuteFld = new DVGui::IntLineEdit(this, 15, 1, 60); + m_autoSaveGroup = new QGroupBox(tr("Save Automatically"), this); + m_autoSaveGroup->setCheckable(true); + m_autoSaveSceneCB = new CheckBox(tr("Automatically Save the Scene File")); + m_autoSaveOtherFilesCB = + new CheckBox(tr("Automatically Save Non-Scene Files")); + m_minuteFld = new DVGui::IntLineEdit(this, 15, 1, 60); CheckBox *replaceAfterSaveLevelAsCB = new CheckBox(tr("Replace Toonz Level after SaveLevelAs command"), this); @@ -1137,9 +1163,10 @@ PreferencesPopup::PreferencesPopup() //--- General ------------------------------ useDefaultViewerCB->setChecked(m_pref->isDefaultViewerEnabled()); minimizeRasterMemoryCB->setChecked(m_pref->isRasterOptimizedMemory()); - autoSaveCB->setChecked(m_pref->isAutosaveEnabled()); + m_autoSaveGroup->setChecked(m_pref->isAutosaveEnabled()); + m_autoSaveSceneCB->setChecked(m_pref->isAutosaveSceneEnabled()); + m_autoSaveOtherFilesCB->setChecked(m_pref->isAutosaveOtherFilesEnabled()); m_minuteFld->setValue(m_pref->getAutosavePeriod()); - m_minuteFld->setEnabled(m_pref->isAutosaveEnabled()); replaceAfterSaveLevelAsCB->setChecked( m_pref->isReplaceAfterSaveLevelAsEnabled()); @@ -1384,16 +1411,27 @@ PreferencesPopup::PreferencesPopup() Qt::AlignLeft | Qt::AlignVCenter); generalFrameLay->addWidget(minimizeRasterMemoryCB, 0, Qt::AlignLeft | Qt::AlignVCenter); - QHBoxLayout *saveAutoLay = new QHBoxLayout(); - saveAutoLay->setMargin(0); - saveAutoLay->setSpacing(15); - { - saveAutoLay->addWidget(autoSaveCB, 0); - saveAutoLay->addWidget(m_minuteFld, 0); - saveAutoLay->addStretch(1); - } - generalFrameLay->addLayout(saveAutoLay, 0); + QVBoxLayout *autoSaveOptionsLay = new QVBoxLayout(); + autoSaveOptionsLay->setMargin(10); + { + QHBoxLayout *saveAutoLay = new QHBoxLayout(); + saveAutoLay->setMargin(0); + saveAutoLay->setSpacing(5); + { + saveAutoLay->addWidget(new QLabel(tr("Interval(Minutes): "), this)); + saveAutoLay->addWidget(m_minuteFld, 0); + saveAutoLay->addStretch(1); + } + autoSaveOptionsLay->addLayout(saveAutoLay, 0); + + autoSaveOptionsLay->addWidget(m_autoSaveSceneCB, 0, + Qt::AlignLeft | Qt::AlignVCenter); + autoSaveOptionsLay->addWidget(m_autoSaveOtherFilesCB, 0, + Qt::AlignLeft | Qt::AlignVCenter); + } + m_autoSaveGroup->setLayout(autoSaveOptionsLay); + generalFrameLay->addWidget(m_autoSaveGroup); // Unit, CameraUnit QGridLayout *unitLay = new QGridLayout(); unitLay->setMargin(0); @@ -1903,8 +1941,12 @@ PreferencesPopup::PreferencesPopup() SLOT(onDefaultViewerChanged(int))); ret = ret && connect(minimizeRasterMemoryCB, SIGNAL(stateChanged(int)), this, SLOT(onRasterOptimizedMemoryChanged(int))); - ret = ret && connect(autoSaveCB, SIGNAL(stateChanged(int)), - SLOT(onAutoSaveChanged(int))); + ret = ret && connect(m_autoSaveGroup, SIGNAL(toggled(bool)), + SLOT(onAutoSaveChanged(bool))); + ret = ret && connect(m_autoSaveSceneCB, SIGNAL(stateChanged(int)), + SLOT(onAutoSaveSceneChanged(int))); + ret = ret && connect(m_autoSaveOtherFilesCB, SIGNAL(stateChanged(int)), + SLOT(onAutoSaveOtherFilesChanged(int))); ret = ret && connect(m_minuteFld, SIGNAL(editingFinished()), SLOT(onMinuteChanged())); ret = ret && connect(m_cellsDragBehaviour, SIGNAL(currentIndexChanged(int)), diff --git a/toonz/sources/toonz/preferencespopup.h b/toonz/sources/toonz/preferencespopup.h index 74290c88..134ce6e5 100644 --- a/toonz/sources/toonz/preferencespopup.h +++ b/toonz/sources/toonz/preferencespopup.h @@ -24,6 +24,7 @@ class QLineEdit; class QPushButton; class QLabel; +class QGroupBox; //============================================================== @@ -70,12 +71,14 @@ private: DVGui::CheckBox *m_inksOnly, *m_enableVersionControl, *m_levelsBackup, *m_onionSkinVisibility, *m_pixelsOnlyCB, *m_projectRootDocuments, *m_projectRootDesktop, *m_projectRootCustom, *m_projectRootStuff, - *m_onionSkinDuringPlayback; + *m_onionSkinDuringPlayback, *m_autoSaveSceneCB, *m_autoSaveOtherFilesCB; DVGui::FileField *m_customProjectRootFileField; DVGui::FileField *m_ffmpegPathFileFld; + QGroupBox *m_autoSaveGroup; + private: // QWidget* create(const QString& lbl, bool def, const char* slot); void rebuildFormatsList(); @@ -104,7 +107,9 @@ private slots: void onRasterOptimizedMemoryChanged(int index); void onSaveUnpaintedInCleanupChanged(int index); void onMinimizeSaveboxAfterEditing(int index); - void onAutoSaveChanged(int index); + void onAutoSaveChanged(bool on); + void onAutoSaveSceneChanged(int index); + void onAutoSaveOtherFilesChanged(int index); void onDefaultViewerChanged(int index); void onBlankCountChanged(); void onBlankColorChanged(const TPixel32 &, bool isDragging); diff --git a/toonz/sources/toonz/tapp.cpp b/toonz/sources/toonz/tapp.cpp index a6ef8b25..698fe265 100644 --- a/toonz/sources/toonz/tapp.cpp +++ b/toonz/sources/toonz/tapp.cpp @@ -673,16 +673,25 @@ void TApp::autosave() { } else m_autosaveSuspended = false; - if (scene->isUntitled()) { + if (scene->isUntitled() && + Preferences::instance()->isAutosaveSceneEnabled()) { DVGui::warning( - tr("It is not possible to save automatically an untitled scene.")); + tr("It is not possible to automatically save an untitled scene.")); return; } DVGui::ProgressDialog pb( "Autosaving scene..." + toQString(scene->getScenePath()), 0, 0, 1); pb.show(); - IoCmd::saveScene(); + Preferences *pref = Preferences::instance(); + if (pref->isAutosaveSceneEnabled() && pref->isAutosaveOtherFilesEnabled()) { + IoCmd::saveAll(); + } else if (pref->isAutosaveSceneEnabled()) { + IoCmd::saveScene(); + } else if (pref->isAutosaveOtherFilesEnabled()) { + IoCmd::saveNonSceneFiles(); + } + pb.setValue(1); } @@ -705,7 +714,7 @@ void TApp::onStartAutoSave() { //----------------------------------------------------------------------------- void TApp::onStopAutoSave() { - assert(!Preferences::instance()->isAutosaveEnabled()); + // assert(!Preferences::instance()->isAutosaveEnabled()); m_autosaveTimer->stop(); } diff --git a/toonz/sources/toonzlib/preferences.cpp b/toonz/sources/toonzlib/preferences.cpp index e7da85da..6545e517 100644 --- a/toonz/sources/toonzlib/preferences.cpp +++ b/toonz/sources/toonzlib/preferences.cpp @@ -255,6 +255,8 @@ Preferences::Preferences() , m_fitToFlipbookEnabled(false) , m_previewAlwaysOpenNewFlipEnabled(false) , m_autosaveEnabled(false) + , m_autosaveSceneEnabled(true) + , m_autosaveOtherFilesEnabled(true) , m_defaultViewerEnabled(false) , m_saveUnpaintedInCleanup(true) , m_askForOverrideRender(true) @@ -324,6 +326,9 @@ Preferences::Preferences() getValue(*m_settings, "sceneNumberingEnabled", m_sceneNumberingEnabled); getValue(*m_settings, "animationSheetEnabled", m_animationSheetEnabled); getValue(*m_settings, "autosaveEnabled", m_autosaveEnabled); + getValue(*m_settings, "autosaveSceneEnabled", m_autosaveSceneEnabled); + getValue(*m_settings, "autosaveOtherFilesEnabled", + m_autosaveOtherFilesEnabled); getValue(*m_settings, "defaultViewerEnabled", m_defaultViewerEnabled); getValue(*m_settings, "rasterOptimizedMemory", m_rasterOptimizedMemory); getValue(*m_settings, "saveUnpaintedInCleanup", m_saveUnpaintedInCleanup); @@ -644,6 +649,20 @@ void Preferences::enableAutosave(bool on) { //----------------------------------------------------------------- +void Preferences::enableAutosaveScene(bool on) { + m_autosaveSceneEnabled = on; + m_settings->setValue("autosaveSceneEnabled", on ? "1" : "0"); +} + +//----------------------------------------------------------------- + +void Preferences::enableAutosaveOtherFiles(bool on) { + m_autosaveOtherFilesEnabled = on; + m_settings->setValue("autosaveOtherFilesEnabled", on ? "1" : "0"); +} + +//----------------------------------------------------------------- + void Preferences::setAskForOverrideRender(bool on) { m_autosaveEnabled = on; m_settings->setValue("askForOverrideRender", on ? "1" : "0"); diff --git a/toonz/sources/toonzqt/dvdialog.cpp b/toonz/sources/toonzqt/dvdialog.cpp index 281586ef..59cfbd86 100644 --- a/toonz/sources/toonzqt/dvdialog.cpp +++ b/toonz/sources/toonzqt/dvdialog.cpp @@ -729,6 +729,23 @@ void Dialog::addButtonBarWidget(QWidget *first, QWidget *second, } } +//----------------------------------------------------------------------------- +/*! Add four widget to the button part of dialog. +*/ +void Dialog::addButtonBarWidget(QWidget *first, QWidget *second, QWidget *third, + QWidget *fourth) { + first->setMinimumSize(65, 25); + second->setMinimumSize(65, 25); + third->setMinimumSize(65, 25); + assert(m_hasButton); + if (m_hasButton) { + m_buttonLayout->addWidget(first); + m_buttonLayout->addWidget(second); + m_buttonLayout->addWidget(third); + m_buttonLayout->addWidget(fourth); + } +} + //============================================================================= RadioButtonDialog::RadioButtonDialog(const QString &labelText, @@ -1060,6 +1077,65 @@ int DVGui::MsgBox(const QString &text, const QString &button1Text, //----------------------------------------------------------------------------- +int DVGui::MsgBox(const QString &text, const QString &button1Text, + const QString &button2Text, const QString &button3Text, + const QString &button4Text, int defaultButtonIndex, + QWidget *parent) { + Dialog dialog(parent, true); + dialog.setWindowFlags(dialog.windowFlags() | Qt::WindowStaysOnTopHint); + dialog.setAlignment(Qt::AlignLeft); + QString msgBoxTitle = getMsgBoxTitle(QUESTION); + dialog.setWindowTitle(msgBoxTitle); + + QLabel *mainTextLabel = new QLabel(text, &dialog); + QPixmap iconPixmap = getMsgBoxPixmap(QUESTION); + if (!iconPixmap.isNull()) { + QLabel *iconLabel = new QLabel(&dialog); + iconLabel->setPixmap(iconPixmap); + + QHBoxLayout *mainLayout = new QHBoxLayout; + mainLayout->addWidget(iconLabel); + mainLayout->addSpacing(16); + mainLayout->addWidget(mainTextLabel); + dialog.addLayout(mainLayout); + } else + dialog.addWidget(mainTextLabel); + + // ButtonGroup: is used only to retrieve the clicked button + QButtonGroup *buttonGroup = new QButtonGroup(&dialog); + + QPushButton *button1 = new QPushButton(button1Text, &dialog); + button1->setDefault(false); + if (defaultButtonIndex == 0) button1->setDefault(true); + dialog.addButtonBarWidget(button1); + buttonGroup->addButton(button1, 1); + + QPushButton *button2 = new QPushButton(button2Text, &dialog); + button2->setDefault(false); + if (defaultButtonIndex == 1) button2->setDefault(true); + dialog.addButtonBarWidget(button2); + buttonGroup->addButton(button2, 2); + + QPushButton *button3 = new QPushButton(button3Text, &dialog); + button3->setDefault(false); + if (defaultButtonIndex == 2) button3->setDefault(true); + dialog.addButtonBarWidget(button3); + buttonGroup->addButton(button3, 3); + + QPushButton *button4 = new QPushButton(button4Text, &dialog); + button4->setDefault(false); + if (defaultButtonIndex == 3) button4->setDefault(true); + dialog.addButtonBarWidget(button4); + buttonGroup->addButton(button4, 4); + + QObject::connect(buttonGroup, SIGNAL(buttonPressed(int)), &dialog, + SLOT(done(int))); + dialog.raise(); + return dialog.exec(); +} + +//----------------------------------------------------------------------------- + int DVGui::MsgBox(const QString &text, const QString &button1, const QString &button2, int defaultButtonIndex, QWidget *parent) { From b7d07aabce16cc6ab79e136faa6fafd1a6f3f5f7 Mon Sep 17 00:00:00 2001 From: shun_iwasawa Date: Wed, 28 Sep 2016 13:59:13 +0900 Subject: [PATCH 15/56] add video capture filter settings --- stuff/config/qss/gray_048/gray_048.less | 4 + stuff/config/qss/gray_048/gray_048.qss | 3 + stuff/config/qss/gray_048/gray_048_mac.qss | 3 + stuff/config/qss/gray_072/gray_072.less | 4 + stuff/config/qss/gray_072/gray_072.qss | 3 + stuff/config/qss/gray_072/gray_072_mac.qss | 3 + stuff/config/qss/gray_072/imgs/gear.png | Bin 0 -> 15861 bytes stuff/config/qss/gray_128/gray_128.less | 4 + stuff/config/qss/gray_128/gray_128.qss | 3 + stuff/config/qss/gray_128/gray_128_mac.qss | 3 + stuff/config/qss/gray_128/imgs/gear.png | Bin 0 -> 15886 bytes toonz/sources/toonz/CMakeLists.txt | 5 +- toonz/sources/toonz/penciltestpopup.cpp | 126 +++++++++++++++++++++ toonz/sources/toonz/penciltestpopup.h | 5 + 14 files changed, 165 insertions(+), 1 deletion(-) create mode 100644 stuff/config/qss/gray_072/imgs/gear.png create mode 100644 stuff/config/qss/gray_128/imgs/gear.png diff --git a/stuff/config/qss/gray_048/gray_048.less b/stuff/config/qss/gray_048/gray_048.less index 0590e852..ef27e52e 100644 --- a/stuff/config/qss/gray_048/gray_048.less +++ b/stuff/config/qss/gray_048/gray_048.less @@ -1365,4 +1365,8 @@ QDialog #dialogButtonFrame { #LargeSizedText { font-size: 17px; +} + +#GearButton { + qproperty-icon: url("@{image_url}/gear.png"); } \ No newline at end of file diff --git a/stuff/config/qss/gray_048/gray_048.qss b/stuff/config/qss/gray_048/gray_048.qss index 69361669..599b3592 100644 --- a/stuff/config/qss/gray_048/gray_048.qss +++ b/stuff/config/qss/gray_048/gray_048.qss @@ -1369,5 +1369,8 @@ QDialog #dialogButtonFrame { #LargeSizedText { font-size: 17px; } +#GearButton { + qproperty-icon: url("../gray_072/imgs/gear.png"); +} //# sourceMappingURL=gray_048.qss.map \ No newline at end of file diff --git a/stuff/config/qss/gray_048/gray_048_mac.qss b/stuff/config/qss/gray_048/gray_048_mac.qss index 7c6a503d..e8cec366 100644 --- a/stuff/config/qss/gray_048/gray_048_mac.qss +++ b/stuff/config/qss/gray_048/gray_048_mac.qss @@ -1369,5 +1369,8 @@ QDialog #dialogButtonFrame { #LargeSizedText { font-size: 17px; } +#GearButton { + qproperty-icon: url("../gray_072/imgs/gear.png"); +} //# sourceMappingURL=gray_048_mac.qss.map \ No newline at end of file diff --git a/stuff/config/qss/gray_072/gray_072.less b/stuff/config/qss/gray_072/gray_072.less index c918bcff..aa97bd46 100644 --- a/stuff/config/qss/gray_072/gray_072.less +++ b/stuff/config/qss/gray_072/gray_072.less @@ -1365,4 +1365,8 @@ QDialog #dialogButtonFrame { #LargeSizedText { font-size: 17px; +} + +#GearButton { + qproperty-icon: url("@{image_url}/gear.png"); } \ No newline at end of file diff --git a/stuff/config/qss/gray_072/gray_072.qss b/stuff/config/qss/gray_072/gray_072.qss index 69c5a4d9..f8d06492 100644 --- a/stuff/config/qss/gray_072/gray_072.qss +++ b/stuff/config/qss/gray_072/gray_072.qss @@ -1369,5 +1369,8 @@ QDialog #dialogButtonFrame { #LargeSizedText { font-size: 17px; } +#GearButton { + qproperty-icon: url("imgs/gear.png"); +} //# sourceMappingURL=gray_072.qss.map \ No newline at end of file diff --git a/stuff/config/qss/gray_072/gray_072_mac.qss b/stuff/config/qss/gray_072/gray_072_mac.qss index 182e2534..2aba2c9d 100644 --- a/stuff/config/qss/gray_072/gray_072_mac.qss +++ b/stuff/config/qss/gray_072/gray_072_mac.qss @@ -1369,5 +1369,8 @@ QDialog #dialogButtonFrame { #LargeSizedText { font-size: 17px; } +#GearButton { + qproperty-icon: url("imgs/gear.png"); +} //# sourceMappingURL=gray_072_mac.qss.map \ No newline at end of file diff --git a/stuff/config/qss/gray_072/imgs/gear.png b/stuff/config/qss/gray_072/imgs/gear.png new file mode 100644 index 0000000000000000000000000000000000000000..7e07631b077b9cb292843e5bb5bc678c3066f2dd GIT binary patch literal 15861 zcmeI3eQXow9mkIl(k2}*d()yybjE0d3C{O!`wrVAjiE_~SxUl4_L|GxljIiL=lL#) z6I$eSVilCC!U5K%tzcW)q86dCAttf0x>FHSyN!u4w2`7RZHttYWC-HlE{S7)Tn)nq1tOY(SWjT3m6Pxf$<%=^WSE}rGQ3@b96 zOml()|3ua`_i~5o;I}|h?^Sk$x6Y-5R?yvV+X;nXhKGke!-B_5_Ca@9W>}u#c^dYh zt&zB`rs%k}HXo!ACk!ktX(VjJjJuq;YL7W+2iLU^1E;nyxV*3SuB`ThNcI=$Gg>ZPV&E7fD%^7flT3BoZm+t~lOUtYT`* z-ZBIc%ptAlX?2Vw0J8&F=3r6-TZZ7JtgUqQw$WRfoOzKPWzn&Nl(C4LqvYLkOCdi) z0eG!SQxd4Qnd~slXehtR+6o9=O-;_Kl01@Y{VpS}o5R-U0u1U@n((L1srhM-8CBF>9Z))S2ZcaW~y>Mcbn?^_l} z*OXo}8B^_$5mWmBlZf{Pm{Ma|&*HjLn#`z~gu?F7wK*HKiqP*=k$^E#VMs z@EC@!@RGoDeqE+}eSV1+bkR?%s#l{`K~QC%&Wao-=O9KR$2VR!;X`&CN02~b@UEqaYmFEFpNKqlof>h0h1=s6H**b=+Iak}-!8hl( z7KEsgt5FFxX#r;k2Hk}%SS)JAn&tT9cCw;sPIU`u&ISQ`fSK1?8dlMB&dpdjowtS{ zAHU3f@f^ebAdcH!`B1rDiwCjHUVB(gg2q0$LT+vE=i|ApQ%$3T zx&A($g)fG4-sfD)Wz@9`?^-USt|iZ%al;P5GbA@qq`Az?xd+N0&+YJb9fZ7+BuD`U zZALxXj1-7=h7EX*TF!aE6?{;kqGQ)$j%C7}V}7d2Zme?^G~Wtu+u<(;rudU#L2)gf zLLcUr(iMG}QIS|A2?7Lf5?pvbh)QrFK=3BPh3A8)1Q!AXZxUR1K8Q+iAwcjZ!G-68 zs00@R1aA^tcs__qa3MhOCc%a0gQx@-0t9aoTzEc+N^l`S@Fu~9=YyyO7Xk!t5?pvb zh)QrFK=3BPh3A8)1Q!AXZxUR1K8Q+iAwcjZ!G-68s00@R1aA^tcs__qa3MhOCc%a0 zgQx@-0t9aoTzEc+N^l`S@Fu~9=YyyO7Xk!t5?pvbh)QrFK=3BPh3A8)1Q!AXZxUR1 zK8Q+iAwcjZ7FS*AAzToLPu>p0M{H}Bjb4L~=eo4!9TAEe{R~B=zeQ0u-iMzv6g9|F z)a%_8r94VepE5IFKfjftmb}msZtO^1jgD{XKh*e%z0bdWGacU8a}ccIUc9Yy{nKsY z!`@Rr+Sz#T!3O=et}9pGZT(Z%iM!`}RYb)5~7_@wH5KqSmk7>}oac{KwjTUujxBy?=5lYfSyIq5aap zvAPq~g|Q>EfA3vAJu!J3b!J!kXlBKquRc3_N9O98d(!K&%-&TmaYIWlj@^Iajn!=R zJJib!Oxvm8%56uUd~i%{5wd%(uVGi-x1?sQ_Il5Sr#7dT)~(srdbaj2RsT%i%r5s1 zY`=8)(4~*DD}LH>;LT66nU$x<#^YwnxvxvTnX zy7$x3S9c!x=+wD}bL;n?JM&1DdG^sqz_Cql{p`E--;W-pruTpEciQfn<1se=OX}j% zSI5k3@O=G-?9@k|yIl3R^}o4`I$6~xJoLty@1()rRYO(n8BbsLz>S$bOOL*N_VR^a z{Aqml{o1J&PmEvw!B-EyQ~%mUV}QCp^X<3Zo0y$>_|1*uUtIS3WAT^YRj(hL?CR#8 zvM&tn9+w~7^Z4Y%WP7%~`vq_2+3Yu3XUrS&d&?=$k(ai9>6MvP&V$)4TegQ!-rfDc FzW|2Ka*+T4 literal 0 HcmV?d00001 diff --git a/stuff/config/qss/gray_128/gray_128.less b/stuff/config/qss/gray_128/gray_128.less index 2c13e252..f52a3a84 100644 --- a/stuff/config/qss/gray_128/gray_128.less +++ b/stuff/config/qss/gray_128/gray_128.less @@ -1190,4 +1190,8 @@ QDialog #dialogButtonFrame { #LargeSizedText { font-size: 17px; +} + +#GearButton { + qproperty-icon: url("@{image_url}/gear.png"); } \ No newline at end of file diff --git a/stuff/config/qss/gray_128/gray_128.qss b/stuff/config/qss/gray_128/gray_128.qss index 1f3a66e6..0763d1e3 100644 --- a/stuff/config/qss/gray_128/gray_128.qss +++ b/stuff/config/qss/gray_128/gray_128.qss @@ -1108,5 +1108,8 @@ QDialog #dialogButtonFrame { #LargeSizedText { font-size: 17px; } +#GearButton { + qproperty-icon: url("imgs/gear.png"); +} //# sourceMappingURL=gray_128.qss.map \ No newline at end of file diff --git a/stuff/config/qss/gray_128/gray_128_mac.qss b/stuff/config/qss/gray_128/gray_128_mac.qss index f66c40d0..8d887975 100644 --- a/stuff/config/qss/gray_128/gray_128_mac.qss +++ b/stuff/config/qss/gray_128/gray_128_mac.qss @@ -1108,5 +1108,8 @@ QDialog #dialogButtonFrame { #LargeSizedText { font-size: 17px; } +#GearButton { + qproperty-icon: url("imgs/gear.png"); +} //# sourceMappingURL=gray_128_mac.qss.map \ No newline at end of file diff --git a/stuff/config/qss/gray_128/imgs/gear.png b/stuff/config/qss/gray_128/imgs/gear.png new file mode 100644 index 0000000000000000000000000000000000000000..36477dd3d74ea4b8a4c774acea2ab23603e21d8b GIT binary patch literal 15886 zcmeI3e{2)y8OJZ7BqLBNwq_K%6=O;Tqv!kOALpBG8e+FGsriuv5xQ>Ve12_Tv3iL)LHZ|tAZ+Au5NVXj$)sDd&=pNkEqYUm+yfORwK#Q*+!2oGs$hJZ{ zmC>bw-(HFW4D#M7`y!THZ!5EH?qanuH}Hu<#5vqC-63p*TK2Gyy(2w#N6M-^XJR-fkw`Un-SMW= zbyMp`Xb(g%jkK<(-ZPK|Oc&6#{+t3rd*G$4s(1B<8m~>xj7X+3=h#6(ox{yk%5J5l zP@W+lyjH0_2V_Ib^=MiuP+nzQDhO@u?dGa-Ib60i+to}=%j;`>4C+*y@mf3(lnoFt zS0v4PXsGN%)vrqorqcT}ka)O3T4vfq>v+>NQ)uN^4CDXLLi(C?FgR zzy^n^#w0e%yMe5@Y1!%FXfN+{(Q@1^(6Yy+#Nz@l2qIsC7>QWjXN3-GO24^ZVCZsb ziD?Q9UmI3jR-7J@7irPOD>TOeH|-TUmR7tn5XC6R$!<_dWC=Da(dL{AE1#UQ^f9j` z29qfO#Cg{3q6MCd(p=2R(z2q6G+@07CkjB6MX{2iPMBG#I#eC5*8$5qhO4<$+q%K- znXMHerIu<`R?g|b+<|_3WeZk|TD4}GKBb*3$%N)ME&YsSj zLr{)yai2R!J_$0o?Nts{>NR%|U5gueIS1MjaE095-Y>_U>4+xqG3I%YQvU-}q04(d z+C(@#(YVaAJRN6UQCeV~JnfA-1zHi^ipaBaJnD*9Ci>r<2tkwtp;Dv%n-fu6$x2er zBtR^{RIaVk@V_*7H&+us+9sNDzWiUzU3oXotc;avJG+wl%-ahIR$*8X&EGU{6M+?G*|06Y&%14WuGUgkYe`FQSz zx9cF_cDV$Xk3pMJk1c8eqBWSCW4tEbS%`K5M6A7@k~7D<8t!J7mZo)4lDTnG@nNpRu$AS%Iy0KuCC7oHEI z5?lxnyh(83`5-F6g#f{u1Q(tUq7qyP5WGon;rSpc!G!?9n*kf#;0GqbmhxeU-2K+pMC%D(n~EXpDeabel|?KyYJxI(Zt%(1(Pp#j(+m` z;^+6RTe<(v@dcCL8=G9Ye`4h8DTew+@rlcawQU(?r)uNivgKzdy7OKg7Xa(|K$gyzW((H=EO@Vpa z`WA_=Jo44%JwIAAv^zXer0-jHcHzT+ym4g2;6|Oz2O61H6#s;Q{vG$8&{)Q9dd-L0Vc5V3B_m3UFylJEQ>@okyUDW3Dm#(~aBHKE4>EKvk|F4IQ r&lDP8{mnglhex06deQTji`3s9eD(Fy%%J(4Hx&+T3ZC51_vpU>v{iL$ literal 0 HcmV?d00001 diff --git a/toonz/sources/toonz/CMakeLists.txt b/toonz/sources/toonz/CMakeLists.txt index 0215c13c..6bda998c 100644 --- a/toonz/sources/toonz/CMakeLists.txt +++ b/toonz/sources/toonz/CMakeLists.txt @@ -375,10 +375,13 @@ if(WIN32) endif() if(WIN32) + # DirectShow strmiids library for Camera Capture + find_library(DSHOW_STRMIIDS_LIB strmiids) + target_link_libraries(OpenToonz_${VERSION} 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} + ${GL_LIB} ${GLUT_LIB} ${DSHOW_STRMIIDS_LIB} tnzcore tnzbase toonzlib colorfx tnzext image sound toonzqt tnztools tnzstdfx tfarm ) elseif(APPLE) diff --git a/toonz/sources/toonz/penciltestpopup.cpp b/toonz/sources/toonz/penciltestpopup.cpp index 2a74e880..9ed9cdb6 100644 --- a/toonz/sources/toonz/penciltestpopup.cpp +++ b/toonz/sources/toonz/penciltestpopup.cpp @@ -65,6 +65,11 @@ #include #include #include +#include + +#ifdef _WIN32 +#include +#endif using namespace DVGui; @@ -305,6 +310,90 @@ int letterToNum(QChar appendix) { return 0; } +#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 + } // namespace //============================================================================= @@ -547,6 +636,12 @@ PencilTestPopup::PencilTestPopup() m_captureButton = new QPushButton(tr("Capture\n[Return key]"), this); QPushButton* closeButton = new QPushButton(tr("Close"), this); + +#ifdef _WIN32 + m_captureFilterSettingsBtn = new QPushButton(this); +#else + m_captureFilterSettingsBtn = 0; +#endif //---- m_resolutionCombo->setMaximumWidth(fontMetrics().width("0000 x 0000") + 25); @@ -598,6 +693,14 @@ PencilTestPopup::PencilTestPopup() m_captureButton->setIcon(style.standardIcon(QStyle::SP_DialogOkButton)); m_captureButton->setIconSize(QSize(30, 30)); + if (m_captureFilterSettingsBtn) { + m_captureFilterSettingsBtn->setObjectName("GearButton"); + m_captureFilterSettingsBtn->setFixedSize(23, 23); + m_captureFilterSettingsBtn->setIconSize(QSize(15, 15)); + m_captureFilterSettingsBtn->setToolTip( + tr("Video Capture Filter Settings...")); + } + //---- layout ---- QHBoxLayout* mainLay = new QHBoxLayout(); mainLay->setMargin(0); @@ -617,6 +720,12 @@ PencilTestPopup::PencilTestPopup() camLay->addSpacing(10); camLay->addWidget(new QLabel(tr("Resolution:"), this), 0); camLay->addWidget(m_resolutionCombo, 1); + + if (m_captureFilterSettingsBtn) { + camLay->addSpacing(10); + camLay->addWidget(m_captureFilterSettingsBtn); + } + camLay->addStretch(0); } leftLay->addLayout(camLay, 0); @@ -788,6 +897,9 @@ PencilTestPopup::PencilTestPopup() ret = ret && connect(closeButton, SIGNAL(clicked()), this, SLOT(reject())); ret = ret && connect(m_captureButton, SIGNAL(clicked(bool)), this, SLOT(onCaptureButtonClicked(bool))); + if (m_captureFilterSettingsBtn) + ret = ret && connect(m_captureFilterSettingsBtn, SIGNAL(pressed()), this, + SLOT(onCaptureFilterSettingsBtnPressed())); assert(ret); refreshCameraList(); @@ -1403,4 +1515,18 @@ bool PencilTestPopup::importImage(QImage& image) { //----------------------------------------------------------------------------- +void PencilTestPopup::onCaptureFilterSettingsBtnPressed() { + if (!m_currentCamera || m_deviceName.isNull()) return; + + QList cameras = QCameraInfo::availableCameras(); + for (int c = 0; c < cameras.size(); c++) { + if (cameras.at(c).deviceName() == m_deviceName) { + openCaptureFilterSettings(this, cameras.at(c).description()); + return; + } + } +} + +//----------------------------------------------------------------------------- + OpenPopupCommandHandler openPencilTestPopup(MI_PencilTest); \ No newline at end of file diff --git a/toonz/sources/toonz/penciltestpopup.h b/toonz/sources/toonz/penciltestpopup.h index 94b11727..0ff31f48 100644 --- a/toonz/sources/toonz/penciltestpopup.h +++ b/toonz/sources/toonz/penciltestpopup.h @@ -21,6 +21,7 @@ class QVideoFrame; class QTimer; class QIntValidator; class QRegExpValidator; +class QPushButton; namespace DVGui { class FileField; @@ -147,6 +148,9 @@ class PencilTestPopup : public DVGui::Dialog { QImage m_whiteBGImg; + // used only for Windows + QPushButton* m_captureFilterSettingsBtn; + int m_timerId; QString m_cacheImagePath; bool m_captureWhiteBGCue; @@ -183,6 +187,7 @@ protected slots: void onCountDown(); void onCaptureButtonClicked(bool); + void onCaptureFilterSettingsBtnPressed(); }; #endif \ No newline at end of file From 779cdf5542c6b6996749f6756cd521f0794aca5a Mon Sep 17 00:00:00 2001 From: Jeremy Bullock Date: Wed, 28 Sep 2016 00:52:57 -0600 Subject: [PATCH 16/56] fix gif reader not getting all frames (#770) changed frame counting method for GIF format in order to get frame duration properly --- toonz/sources/image/ffmpeg/tiio_ffmpeg.cpp | 20 ++++++++++++++++++++ toonz/sources/image/ffmpeg/tiio_ffmpeg.h | 1 + toonz/sources/image/ffmpeg/tiio_gif.cpp | 2 +- 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/toonz/sources/image/ffmpeg/tiio_ffmpeg.cpp b/toonz/sources/image/ffmpeg/tiio_ffmpeg.cpp index 3f35abe9..9229cd22 100644 --- a/toonz/sources/image/ffmpeg/tiio_ffmpeg.cpp +++ b/toonz/sources/image/ffmpeg/tiio_ffmpeg.cpp @@ -399,6 +399,26 @@ void Ffmpeg::getFramesFromMovie(int frame) { } } +int Ffmpeg::getGifFrameCount() { + int frame = 1; + QString ffmpegCachePath = getFfmpegCache().getQString(); + QString tempPath = ffmpegCachePath + "//" + + QString::fromStdString(m_path.getName()) + + QString::fromStdString(m_path.getType()); + std::string tmpPath = tempPath.toStdString(); + QString tempName = "In%04d." + m_intermediateFormat; + tempName = tempPath + tempName; + QString tempStart; + tempStart = "In0001." + m_intermediateFormat; + tempStart = tempPath + tempStart; + while (TSystem::doesExistFileOrLevel(TFilePath(tempStart))) { + frame++; + QString number = QString("%1").arg(frame, 4, 10, QChar('0')); + tempStart = tempPath + "In" + number + "." + m_intermediateFormat; + } + return frame - 1; +} + void Ffmpeg::addToCleanUp(QString path) { if (TSystem::doesExistFileOrLevel(TFilePath(path))) { m_cleanUpList.push_back(path); diff --git a/toonz/sources/image/ffmpeg/tiio_ffmpeg.h b/toonz/sources/image/ffmpeg/tiio_ffmpeg.h index 4b3fe4f1..853110a7 100644 --- a/toonz/sources/image/ffmpeg/tiio_ffmpeg.h +++ b/toonz/sources/image/ffmpeg/tiio_ffmpeg.h @@ -41,6 +41,7 @@ public: TFilePath getFfmpegCache(); ffmpegFileInfo getInfo(); void disablePrecompute(); + int getGifFrameCount(); private: QString m_intermediateFormat, m_ffmpegPath, m_audioPath, m_audioFormat; diff --git a/toonz/sources/image/ffmpeg/tiio_gif.cpp b/toonz/sources/image/ffmpeg/tiio_gif.cpp index 089461d8..f410ddd8 100644 --- a/toonz/sources/image/ffmpeg/tiio_gif.cpp +++ b/toonz/sources/image/ffmpeg/tiio_gif.cpp @@ -190,7 +190,7 @@ TLevelReaderGif::TLevelReaderGif(const TFilePath &path) m_ly = m_size.ly; ffmpegReader->getFramesFromMovie(); - + m_frameCount = ffmpegReader->getGifFrameCount(); // set values m_info = new TImageInfo(); m_info->m_frameRate = fps; From 96a3e3c54e5552fe032d123a09140f39f8d507bc Mon Sep 17 00:00:00 2001 From: shun_iwasawa Date: Wed, 28 Sep 2016 15:19:48 +0900 Subject: [PATCH 17/56] remove find_library and small fix --- toonz/sources/toonz/CMakeLists.txt | 7 ++----- toonz/sources/toonz/penciltestpopup.cpp | 2 ++ 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/toonz/sources/toonz/CMakeLists.txt b/toonz/sources/toonz/CMakeLists.txt index 6bda998c..41ff9b35 100644 --- a/toonz/sources/toonz/CMakeLists.txt +++ b/toonz/sources/toonz/CMakeLists.txt @@ -374,14 +374,11 @@ if(WIN32) endif() endif() -if(WIN32) - # DirectShow strmiids library for Camera Capture - find_library(DSHOW_STRMIIDS_LIB strmiids) - +if(WIN32) target_link_libraries(OpenToonz_${VERSION} 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} ${DSHOW_STRMIIDS_LIB} + ${GL_LIB} ${GLUT_LIB} strmiids tnzcore tnzbase toonzlib colorfx tnzext image sound toonzqt tnztools tnzstdfx tfarm ) elseif(APPLE) diff --git a/toonz/sources/toonz/penciltestpopup.cpp b/toonz/sources/toonz/penciltestpopup.cpp index 9ed9cdb6..02fb1b22 100644 --- a/toonz/sources/toonz/penciltestpopup.cpp +++ b/toonz/sources/toonz/penciltestpopup.cpp @@ -1521,7 +1521,9 @@ void PencilTestPopup::onCaptureFilterSettingsBtnPressed() { QList cameras = QCameraInfo::availableCameras(); for (int c = 0; c < cameras.size(); c++) { if (cameras.at(c).deviceName() == m_deviceName) { +#ifdef _WIN32 openCaptureFilterSettings(this, cameras.at(c).description()); +#endif return; } } From 4cdcb009efbff8846ed93e640a260db1bef549fa Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 28 Sep 2016 12:21:59 +1000 Subject: [PATCH 18/56] Fix/Workaround bug #591 We could check for the extensions but these OpenGL options are never used, so no need to disable them. --- toonz/sources/toonzlib/stagevisitor.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/toonz/sources/toonzlib/stagevisitor.cpp b/toonz/sources/toonzlib/stagevisitor.cpp index f3746ab2..dc256dbb 100644 --- a/toonz/sources/toonzlib/stagevisitor.cpp +++ b/toonz/sources/toonzlib/stagevisitor.cpp @@ -602,6 +602,9 @@ void RasterPainter::flushRasterImages() { glDisable(GL_DITHER); glDisable(GL_LOGIC_OP); +/* disable, since these features are never enabled, and cause OpenGL to assert + * on systems that don't support them: see #591 */ +#if 0 #ifdef GL_EXT_convolution glDisable(GL_CONVOLUTION_1D_EXT); glDisable(GL_CONVOLUTION_2D_EXT); @@ -612,6 +615,7 @@ void RasterPainter::flushRasterImages() { glDisable(GL_HISTOGRAM_EXT); glDisable(GL_MINMAX_EXT); #endif +#endif #ifdef GL_EXT_texture3D glDisable(GL_TEXTURE_3D_EXT); From 3fc8809683e4e3e3b61a03275a41545442177c8d Mon Sep 17 00:00:00 2001 From: shun_iwasawa Date: Thu, 29 Sep 2016 15:07:26 +0900 Subject: [PATCH 19/56] set dirty flag on clone levels --- toonz/sources/toonz/cellselectioncommand.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/toonz/sources/toonz/cellselectioncommand.cpp b/toonz/sources/toonz/cellselectioncommand.cpp index a670e734..fa3c108e 100644 --- a/toonz/sources/toonz/cellselectioncommand.cpp +++ b/toonz/sources/toonz/cellselectioncommand.cpp @@ -1292,6 +1292,7 @@ TXshSimpleLevel *CloneLevelUndo::cloneLevel( assert(palette); dstSl->setPalette(palette->clone()); + dstSl->getPalette()->setDirtyFlag(true); } // The level clone shell was created. Now, clone the associated frames found @@ -1306,6 +1307,8 @@ TXshSimpleLevel *CloneLevelUndo::cloneLevel( dstSl->setFrame(*ft, img->cloneImage()); } + dstSl->setDirtyFlag(true); + return dstSl; } From efb7a269471c54d14c38d78f10eb54039401e58a Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 1 Oct 2016 23:03:24 +1000 Subject: [PATCH 20/56] Docs: Add links to Linux package definitions --- doc/how_to_build_linux.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/doc/how_to_build_linux.md b/doc/how_to_build_linux.md index 6bfa621d..ad5dd949 100644 --- a/doc/how_to_build_linux.md +++ b/doc/how_to_build_linux.md @@ -158,3 +158,15 @@ Then you can launch OpenToonz by running `/opt/opentoonz/bin/opentoonz`. You can change the installation path by modifying the `CMAKE_INSTALL_PREFIX` CMake variable. +---- + +# Linux Package Definitions + +It may be helpful to use existing packages as a reference when creating a package for your own distribution. + +- ArchLinux (AUR): + https://aur.archlinux.org/packages/opentoonz-git/ + +- App-Image (Portable): + https://github.com/morevnaproject/morevna-builds + From b481a50bc7250f6f47ca364b0c0fa51554b14786 Mon Sep 17 00:00:00 2001 From: Yu Chen Date: Sun, 2 Oct 2016 21:36:21 +0800 Subject: [PATCH 21/56] Update required packages list on Fedora - add qt5-qtmultimedia-devel glew-devel lzma - remove qt5-base and GLEW --- doc/how_to_build_linux.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/how_to_build_linux.md b/doc/how_to_build_linux.md index ad5dd949..e353f9a9 100644 --- a/doc/how_to_build_linux.md +++ b/doc/how_to_build_linux.md @@ -33,7 +33,7 @@ $ rpm ... (it may include some useless packages) ``` -dnf install gcc gcc-c++ automake git cmake boost boost-devel SuperLU SuperLU-devel lz4-devel libusb-devel lzo-devel libjpeg-turbo-devel GLEW libGLEW freeglut-devel freeglut SDL2 SDL2-devel freetype-devel libpng-devel qt5-base qt5-qtbase-devel qt5-qtsvg qt5-qtsvg-devel qt5-qtscript qt5-qtscript-devel qt5-qttools qt5-qttools-devel blas blas-devel +dnf install gcc gcc-c++ automake git cmake boost boost-devel SuperLU SuperLU-devel lz4-devel lzma libusb-devel lzo-devel libjpeg-turbo-devel libGLEW glew-devel freeglut-devel freeglut SDL2 SDL2-devel freetype-devel libpng-devel qt5-qtbase-devel qt5-qtsvg qt5-qtsvg-devel qt5-qtscript qt5-qtscript-devel qt5-qttools qt5-qttools-devel qt5-qtmultimedia-devel blas blas-devel ``` ### Installing required packages on ArchLinux From 1fa45a0da66a03aa9b1f10c4638fa54d79da9164 Mon Sep 17 00:00:00 2001 From: shun_iwasawa Date: Mon, 3 Oct 2016 21:04:35 +0900 Subject: [PATCH 22/56] add remove unused styles option --- .../sources/include/toonz/Naa2TlvConverter.h | 3 +- toonz/sources/include/toonzqt/imageutils.h | 6 ++-- toonz/sources/toonz/convertpopup.cpp | 36 ++++++++++++++++--- toonz/sources/toonz/convertpopup.h | 3 +- toonz/sources/toonzlib/Naa2TlvConverter.cpp | 23 ++++++++++-- toonz/sources/toonzqt/imageutils.cpp | 7 ++-- 6 files changed, 64 insertions(+), 14 deletions(-) diff --git a/toonz/sources/include/toonz/Naa2TlvConverter.h b/toonz/sources/include/toonz/Naa2TlvConverter.h index efe57655..e15fd38a 100644 --- a/toonz/sources/include/toonz/Naa2TlvConverter.h +++ b/toonz/sources/include/toonz/Naa2TlvConverter.h @@ -146,7 +146,8 @@ public: return -1; } - TToonzImageP makeTlv(bool transparentSyntheticInks); + TToonzImageP makeTlv(bool transparentSyntheticInks, + bool removeUnusedStyles = false); TVectorImageP vectorize(const TToonzImageP &ti); TVectorImageP vectorize(const TRaster32P &ras); diff --git a/toonz/sources/include/toonzqt/imageutils.h b/toonz/sources/include/toonzqt/imageutils.h index 357706d4..6c73ebe6 100644 --- a/toonz/sources/include/toonzqt/imageutils.h +++ b/toonz/sources/include/toonzqt/imageutils.h @@ -111,8 +111,10 @@ void DVAPI convertNaa2Tlv( FrameTaskNotifier *frameNotifier, //!< Observer class for frame success notifications. TPalette *palette = - 0); //!< Special conversion function from an antialiased level to tlv. - //! \sa Function ImageUtils::convert(). + 0, //!< Special conversion function from an antialiased level to tlv. + //! \sa Function ImageUtils::convert(). + bool removeUnusedStyles = + false); //! Remove unused styles from input palette. double DVAPI getQuantizedZoomFactor(double zf, bool forward); diff --git a/toonz/sources/toonz/convertpopup.cpp b/toonz/sources/toonz/convertpopup.cpp index 97ac0e6c..30c184ec 100644 --- a/toonz/sources/toonz/convertpopup.cpp +++ b/toonz/sources/toonz/convertpopup.cpp @@ -55,6 +55,8 @@ TEnv::IntVar ConvertPopupRemoveDot("ConvertPopupRemoveDot", 1); TEnv::IntVar ConvertPopupSaveToNopaint("ConvertPopupSaveToNopaint", 1); TEnv::IntVar ConvertPopupAppendDefaultPalette( "ConvertPopupAppendDefaultPalette", 0); +TEnv::IntVar ConvertPopupRemoveUnusedStyles("ConvertPopupRemoveUnusedStyles", + 0); //============================================================================= // convertPopup @@ -200,7 +202,8 @@ void ConvertPopup::Converter::convertLevel( // no AA source (retas) TPaletteP palette = popup->readUserProvidedPalette(); ImageUtils::convertNaa2Tlv(sourceFileFullPath, dstFileFullPath, from, to, - m_parent->m_notifier, palette.getPointer()); + m_parent->m_notifier, palette.getPointer(), + m_parent->m_removeUnusedStyles->isChecked()); } else { convertLevelWithConvert2Tlv(sourceFileFullPath); } @@ -441,6 +444,7 @@ ConvertPopup::ConvertPopup(bool specifyInput) m_removeDotBeforeFrameNumber->setChecked(ConvertPopupRemoveDot != 0); m_saveBackupToNopaint->setChecked(ConvertPopupSaveToNopaint != 0); m_appendDefaultPalette->setChecked(ConvertPopupAppendDefaultPalette != 0); + m_removeUnusedStyles->setChecked(ConvertPopupRemoveUnusedStyles != 0); //--- signal-slot connections qRegisterMetaType("TFilePath"); @@ -470,6 +474,9 @@ ConvertPopup::ConvertPopup(bool specifyInput) ret = ret && connect(m_convertFileFld, SIGNAL(pathChanged()), this, SLOT(onFileInChanged())); + // update unable/enable of checkboxes + onTlvModeSelected(m_tlvMode->currentText()); + assert(ret); } @@ -534,6 +541,9 @@ QFrame *ConvertPopup::createTlvSettings() { m_palettePath = new DVGui::FileField(0, QString(CreateNewPalette), true); m_tolerance = new DVGui::IntLineEdit(0, 0, 0, 255); + m_removeUnusedStyles = + new QCheckBox(tr("Remove Unused Styles from Input Palette")); + m_unpaintedFolder->setFileMode(QFileDialog::DirectoryOnly); m_unpaintedSuffix->setMaximumWidth(40); QStringList items1; @@ -585,8 +595,9 @@ QFrame *ConvertPopup::createTlvSettings() { Qt::AlignRight | Qt::AlignVCenter); gridLay->addWidget(m_tolerance, 4, 3); - gridLay->addWidget(m_appendDefaultPalette, 5, 1, 1, 3); - gridLay->addWidget(m_saveBackupToNopaint, 6, 1, 1, 3); + gridLay->addWidget(m_removeUnusedStyles, 5, 1, 1, 3); + gridLay->addWidget(m_appendDefaultPalette, 6, 1, 1, 3); + gridLay->addWidget(m_saveBackupToNopaint, 7, 1, 1, 3); } gridLay->setColumnStretch(0, 0); gridLay->setColumnStretch(1, 1); @@ -597,6 +608,9 @@ QFrame *ConvertPopup::createTlvSettings() { bool ret = true; ret = ret && connect(m_antialias, SIGNAL(currentIndexChanged(int)), this, SLOT(onAntialiasSelected(int))); + ret = ret && connect(m_palettePath, SIGNAL(pathChanged()), this, + SLOT(onPalettePathChanged())); + assert(ret); frame->setVisible(false); @@ -652,8 +666,13 @@ void ConvertPopup::onTlvModeSelected(const QString &tlvMode) { m_suffixLabel->setEnabled(usesTwoImages); m_unpaintedSuffix->setEnabled(usesTwoImages); m_antialias->setEnabled(TlvMode_PaintedFromNonAA != tlvMode); - m_palettePath->setEnabled(TlvMode_PaintedFromNonAA != tlvMode); + // m_palettePath->setEnabled(TlvMode_PaintedFromNonAA != tlvMode); m_tolerance->setEnabled(TlvMode_PaintedFromNonAA != tlvMode); + m_appendDefaultPalette->setEnabled(TlvMode_PaintedFromNonAA != tlvMode); + + m_removeUnusedStyles->setEnabled(TlvMode_PaintedFromNonAA == tlvMode && + m_palettePath->getPath() != + CreateNewPalette); m_saveBackupToNopaint->setEnabled(TlvMode_Unpainted == tlvMode); } @@ -1057,6 +1076,7 @@ void ConvertPopup::apply() { ConvertPopupSaveToNopaint = m_saveBackupToNopaint->isChecked() ? 1 : 0; ConvertPopupAppendDefaultPalette = m_appendDefaultPalette->isChecked() ? 1 : 0; + ConvertPopupRemoveUnusedStyles = m_removeUnusedStyles->isChecked() ? 1 : 0; // parameters are ok: close the dialog first close(); @@ -1174,6 +1194,14 @@ void ConvertPopup::onFormatChanged(const QString &ext) { //------------------------------------------------------------------- +void ConvertPopup::onPalettePathChanged() { + m_removeUnusedStyles->setEnabled( + m_tlvMode->currentText() == TlvMode_PaintedFromNonAA && + m_palettePath->getPath() != CreateNewPalette); +} + +//------------------------------------------------------------------- + bool ConvertPopup::isSaveTlvBackupToNopaintActive() { return m_fileFormat->currentText() == TlvExtension /*-- tlvが選択されている --*/ diff --git a/toonz/sources/toonz/convertpopup.h b/toonz/sources/toonz/convertpopup.h index cc4ff5a4..b779a07d 100644 --- a/toonz/sources/toonz/convertpopup.h +++ b/toonz/sources/toonz/convertpopup.h @@ -87,6 +87,7 @@ public slots: void onLevelConverted(const TFilePath &fullPath); void onFormatChanged(const QString &); + void onPalettePathChanged(); protected: Convert2Tlv *makeTlvConverter(const TFilePath &sourceFilePath); @@ -104,7 +105,7 @@ private: DVGui::ColorField *m_bgColorField; QFrame *m_tlvFrame; QCheckBox *m_applyAutoclose, *m_removeDotBeforeFrameNumber, - *m_saveBackupToNopaint, *m_appendDefaultPalette; + *m_saveBackupToNopaint, *m_appendDefaultPalette, *m_removeUnusedStyles; DVGui::CheckBox *m_skip; QComboBox *m_antialias, *m_tlvMode, *m_fileFormat; QLabel *m_bgColorLabel, *m_suffixLabel, *m_unpaintedFolderLabel, diff --git a/toonz/sources/toonzlib/Naa2TlvConverter.cpp b/toonz/sources/toonzlib/Naa2TlvConverter.cpp index f740f7b7..d0a5e6e6 100644 --- a/toonz/sources/toonzlib/Naa2TlvConverter.cpp +++ b/toonz/sources/toonzlib/Naa2TlvConverter.cpp @@ -1005,7 +1005,8 @@ int Naa2TlvConverter::measureThickness(int x0, int y0) { //----------------------------------------------------------------------------- -TToonzImageP Naa2TlvConverter::makeTlv(bool transparentSyntheticInks) { +TToonzImageP Naa2TlvConverter::makeTlv(bool transparentSyntheticInks, + bool removeUnusedStyles) { if (!m_valid || m_colors.empty() || m_regions.empty() || !m_regionRas) return TToonzImageP(); int lx = m_regionRas->getLx(); @@ -1025,8 +1026,9 @@ TToonzImageP Naa2TlvConverter::makeTlv(bool transparentSyntheticInks) { if (cs->getMainColor() != color) cs = 0; } if (cs == 0) { - styleId = palette->getPage(0)->addStyle(color); - cs = palette->getStyle(styleId); + styleId = palette->addStyle(color); + palette->getPage(0)->addStyle(styleId); + cs = palette->getStyle(styleId); } styleIds.append(styleId); } @@ -1035,6 +1037,21 @@ TToonzImageP Naa2TlvConverter::makeTlv(bool transparentSyntheticInks) { // int synteticInkStyleId = palette->getPage(0)->addStyle(TPixel32(0,0,0,0)); // styleIds.append(synteticInkStyleId); + // Remove unused styles from input palette + if (removeUnusedStyles) { + for (int p = palette->getPageCount() - 1; p >= 0; p--) { + TPalette::Page *page = palette->getPage(p); + for (int s = page->getStyleCount() - 1; s >= 0; s--) { + int styleId = page->getStyleId(s); + if (styleId == -1) continue; + // check if the style is used or not + if (!styleIds.contains(styleId)) page->removeStyle(s); + } + // erase empty page + if (page->getStyleCount() == 0) palette->erasePage(p); + } + } + for (int y = 0; y < ly; y++) { unsigned short *workScanLine = m_regionRas->pixels(y); TPixelCM32 *outScanLine = ras->pixels(y); diff --git a/toonz/sources/toonzqt/imageutils.cpp b/toonz/sources/toonzqt/imageutils.cpp index 24fcf113..06b67b6c 100644 --- a/toonz/sources/toonzqt/imageutils.cpp +++ b/toonz/sources/toonzqt/imageutils.cpp @@ -632,7 +632,8 @@ void convert(const TFilePath &source, const TFilePath &dest, void convertNaa2Tlv(const TFilePath &source, const TFilePath &dest, const TFrameId &from, const TFrameId &to, - FrameTaskNotifier *frameNotifier, TPalette *palette) { + FrameTaskNotifier *frameNotifier, TPalette *palette, + bool removeUnusedStyles) { std::string dstExt = dest.getType(), srcExt = source.getType(); // Load source level structure @@ -671,8 +672,8 @@ void convertNaa2Tlv(const TFilePath &source, const TFilePath &dest, converter.process(raster); - if (TToonzImageP dstImg = - converter.makeTlv(false)) // Opaque synthetic inks + if (TToonzImageP dstImg = converter.makeTlv( + false, removeUnusedStyles)) // Opaque synthetic inks { if (converter.getPalette() == 0) converter.setPalette(dstImg->getPalette()); From d8339e9782f1ebcf4ce4ea21c56cee1e523ab4e6 Mon Sep 17 00:00:00 2001 From: Jeremy Bullock Date: Thu, 6 Oct 2016 02:19:46 -0600 Subject: [PATCH 23/56] Fix for ffmpeg named with sequence names (#826) - Now ffmpeg types can have a name such as img.0001.gif or img_0001.mp4 with no crash. close #767 --- toonz/sources/common/tsystem/tfilepath.cpp | 13 ++++++++++++- toonz/sources/include/tfilepath.h | 2 +- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/toonz/sources/common/tsystem/tfilepath.cpp b/toonz/sources/common/tsystem/tfilepath.cpp index 215a042c..d16a1a32 100644 --- a/toonz/sources/common/tsystem/tfilepath.cpp +++ b/toonz/sources/common/tsystem/tfilepath.cpp @@ -480,6 +480,7 @@ bool TFilePath::isRoot() const { // ritorna ""(niente tipo, niente punto), "." (file con tipo) o ".." (file con // tipo e frame) std::string TFilePath::getDots() const { + if (isFfmpegType()) return "."; int i = getLastSlash(m_path); std::wstring str = m_path.substr(i + 1); // potrei anche avere a.b.c.d dove d e' l'estensione @@ -561,7 +562,7 @@ std::string TFilePath::getLevelName() const { std::wstring TFilePath::getLevelNameW() const { int i = getLastSlash(m_path); // cerco l'ultimo slash std::wstring str = m_path.substr(i + 1); // str e' m_path senza directory - + if (isFfmpegType()) return str; int j = str.rfind(L"."); // str[j..] = ".type" if (j == (int)std::wstring::npos) return str; // no frame; no type i = str.substr(0, j).rfind(L'.'); @@ -597,6 +598,7 @@ TFilePath TFilePath::getParentDir() const // noSlash! //----------------------------------------------------------------------------- bool TFilePath::isLevelName() const { + if (isFfmpegType()) return false; try { return getFrame() == TFrameId(TFrameId::EMPTY_FRAME); } @@ -638,6 +640,15 @@ TFrameId TFilePath::getFrame() const { //----------------------------------------------------------------------------- +bool TFilePath::isFfmpegType() const { + QString type = QString::fromStdString(getType()).toLower(); + if (type == "gif" || type == "mp4" || type == "webm") + return true; + else + return false; +} + +//----------------------------------------------------------------------------- TFilePath TFilePath::withType(const std::string &type) const { assert(type.length() < 2 || type.substr(0, 2) != ".."); int i = getLastSlash(m_path); // cerco l'ultimo slash diff --git a/toonz/sources/include/tfilepath.h b/toonz/sources/include/tfilepath.h index ee04a451..0d58b5a2 100644 --- a/toonz/sources/include/tfilepath.h +++ b/toonz/sources/include/tfilepath.h @@ -177,7 +177,7 @@ If the path is ":" a slash will be added*/ TFilePath getParentDir() const; // noSlash!; TFrameId getFrame() const; - + bool isFfmpegType() const; bool isLevelName() const; //{return getFrame() == TFrameId(TFrameId::EMPTY_FRAME);}; bool isAbsolute() const; From 3b0af2f7825e60366d8c746fc2e682c7e1e65e23 Mon Sep 17 00:00:00 2001 From: Jeremy Bullock Date: Thu, 6 Oct 2016 02:22:00 -0600 Subject: [PATCH 24/56] Fix for Multiple FFmpeg files with same name #813 (#827) * Use full path for temp ffmpeg cache names. Which allows importing multiple ffmpeg type files with the same name but different locations. close #813 --- toonz/sources/image/ffmpeg/tiio_ffmpeg.cpp | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/toonz/sources/image/ffmpeg/tiio_ffmpeg.cpp b/toonz/sources/image/ffmpeg/tiio_ffmpeg.cpp index 9229cd22..ae04e117 100644 --- a/toonz/sources/image/ffmpeg/tiio_ffmpeg.cpp +++ b/toonz/sources/image/ffmpeg/tiio_ffmpeg.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include "toonz/preferences.h" #include "toonz/toonzfolders.h" @@ -217,9 +218,9 @@ void Ffmpeg::saveSoundTrack(TSoundTrack *st) { bool Ffmpeg::checkFilesExist() { QString ffmpegCachePath = getFfmpegCache().getQString(); QString tempPath = ffmpegCachePath + "//" + - QString::fromStdString(m_path.getName()) + - QString::fromStdString(m_path.getType()) + "In0001." + - m_intermediateFormat; + m_path.getQString().remove(QRegExp(QString::fromUtf8( + "[-`~!@#$%^&*()_+=|:;<>,.?/{}\'\"\\[\\]\\\\]"))) + + "In0001." + m_intermediateFormat; if (TSystem::doesExistFileOrLevel(TFilePath(tempPath))) { return true; } else @@ -229,8 +230,9 @@ bool Ffmpeg::checkFilesExist() { ffmpegFileInfo Ffmpeg::getInfo() { QString ffmpegCachePath = getFfmpegCache().getQString(); QString tempPath = ffmpegCachePath + "//" + - QString::fromStdString(m_path.getName()) + - QString::fromStdString(m_path.getType()) + ".txt"; + m_path.getQString().remove(QRegExp(QString::fromUtf8( + "[-`~!@#$%^&*()_+=|:;<>,.?/{}\'\"\\[\\]\\\\]"))) + + ".txt"; if (QFile::exists(tempPath)) { QFile infoText(tempPath); infoText.open(QIODevice::ReadOnly); @@ -264,8 +266,8 @@ ffmpegFileInfo Ffmpeg::getInfo() { TRasterImageP Ffmpeg::getImage(int frameIndex) { QString ffmpegCachePath = getFfmpegCache().getQString(); QString tempPath = ffmpegCachePath + "//" + - QString::fromStdString(m_path.getName()) + - QString::fromStdString(m_path.getType()); + m_path.getQString().remove(QRegExp(QString::fromUtf8( + "[-`~!@#$%^&*()_+=|:;<>,.?/{}\'\"\\[\\]\\\\]"))); std::string tmpPath = tempPath.toStdString(); // QString tempPath= m_path.getQString(); QString number = QString("%1").arg(frameIndex, 4, 10, QChar('0')); @@ -356,8 +358,8 @@ int Ffmpeg::getFrameCount() { void Ffmpeg::getFramesFromMovie(int frame) { QString ffmpegCachePath = getFfmpegCache().getQString(); QString tempPath = ffmpegCachePath + "//" + - QString::fromStdString(m_path.getName()) + - QString::fromStdString(m_path.getType()); + m_path.getQString().remove(QRegExp(QString::fromUtf8( + "[-`~!@#$%^&*()_+=|:;<>,.?/{}\'\"\\[\\]\\\\]"))); std::string tmpPath = tempPath.toStdString(); QString tempName = "In%04d." + m_intermediateFormat; tempName = tempPath + tempName; From 2b9d8f3cc866a254bbc637f25c95d08c5fe54c48 Mon Sep 17 00:00:00 2001 From: Jeremy Bullock Date: Fri, 7 Oct 2016 03:59:06 -0600 Subject: [PATCH 25/56] Show info for ffmpeg levels (#824) * Show info of ffmpeg level in level settings * added frame count to filebrowser close #811 close #812 --- toonz/sources/image/ffmpeg/tiio_gif.cpp | 15 ++++++++++----- toonz/sources/image/ffmpeg/tiio_mp4.cpp | 12 +++++++++--- toonz/sources/image/ffmpeg/tiio_webm.cpp | 12 +++++++++--- toonz/sources/toonz/filebrowser.cpp | 3 ++- 4 files changed, 30 insertions(+), 12 deletions(-) diff --git a/toonz/sources/image/ffmpeg/tiio_gif.cpp b/toonz/sources/image/ffmpeg/tiio_gif.cpp index f410ddd8..0676b914 100644 --- a/toonz/sources/image/ffmpeg/tiio_gif.cpp +++ b/toonz/sources/image/ffmpeg/tiio_gif.cpp @@ -3,6 +3,7 @@ #include "tiio_gif.h" #include "trasterimage.h" #include "timageinfo.h" +#include "toonz/stage.h" #include //=========================================================== @@ -151,8 +152,9 @@ class TImageReaderGif final : public TImageReader { public: int m_frameIndex; - TImageReaderGif(const TFilePath &path, int index, TLevelReaderGif *lra) - : TImageReader(path), m_lra(lra), m_frameIndex(index) { + TImageReaderGif(const TFilePath &path, int index, TLevelReaderGif *lra, + TImageInfo *info) + : TImageReader(path), m_lra(lra), m_frameIndex(index), m_info(info) { m_lra->addRef(); } ~TImageReaderGif() { m_lra->release(); } @@ -160,9 +162,11 @@ public: TImageP load() override { return m_lra->load(m_frameIndex); } TDimension getSize() const { return m_lra->getSize(); } TRect getBBox() const { return TRect(); } + const TImageInfo *getImageInfo() const override { return m_info; } private: TLevelReaderGif *m_lra; + TImageInfo *m_info; // not implemented TImageReaderGif(const TImageReaderGif &); @@ -198,6 +202,8 @@ TLevelReaderGif::TLevelReaderGif(const TFilePath &path) m_info->m_ly = m_ly; m_info->m_bitsPerSample = 8; m_info->m_samplePerPixel = 4; + m_info->m_dpix = Stage::standardDpi; + m_info->m_dpiy = Stage::standardDpi; } //----------------------------------------------------------- @@ -220,9 +226,8 @@ TImageReaderP TLevelReaderGif::getFrameReader(TFrameId fid) { // if (IOError != 0) // throw TImageException(m_path, buildAVIExceptionString(IOError)); if (fid.getLetter() != 0) return TImageReaderP(0); - int index = fid.getNumber(); - - TImageReaderGif *irm = new TImageReaderGif(m_path, index, this); + int index = fid.getNumber(); + TImageReaderGif *irm = new TImageReaderGif(m_path, index, this, m_info); return TImageReaderP(irm); } diff --git a/toonz/sources/image/ffmpeg/tiio_mp4.cpp b/toonz/sources/image/ffmpeg/tiio_mp4.cpp index fb7d9a1b..173d6275 100644 --- a/toonz/sources/image/ffmpeg/tiio_mp4.cpp +++ b/toonz/sources/image/ffmpeg/tiio_mp4.cpp @@ -4,6 +4,7 @@ #include "trasterimage.h" #include "timageinfo.h" #include "tsound.h" +#include "toonz/stage.h" #include //=========================================================== @@ -129,8 +130,9 @@ class TImageReaderMp4 final : public TImageReader { public: int m_frameIndex; - TImageReaderMp4(const TFilePath &path, int index, TLevelReaderMp4 *lra) - : TImageReader(path), m_lra(lra), m_frameIndex(index) { + TImageReaderMp4(const TFilePath &path, int index, TLevelReaderMp4 *lra, + TImageInfo *info) + : TImageReader(path), m_lra(lra), m_frameIndex(index), m_info(info) { m_lra->addRef(); } ~TImageReaderMp4() { m_lra->release(); } @@ -138,9 +140,11 @@ public: TImageP load() override { return m_lra->load(m_frameIndex); } TDimension getSize() const { return m_lra->getSize(); } TRect getBBox() const { return TRect(); } + const TImageInfo *getImageInfo() const override { return m_info; } private: TLevelReaderMp4 *m_lra; + TImageInfo *m_info; // not implemented TImageReaderMp4(const TImageReaderMp4 &); @@ -173,6 +177,8 @@ TLevelReaderMp4::TLevelReaderMp4(const TFilePath &path) : TLevelReader(path) { m_info->m_ly = m_ly; m_info->m_bitsPerSample = 8; m_info->m_samplePerPixel = 4; + m_info->m_dpix = Stage::standardDpi; + m_info->m_dpiy = Stage::standardDpi; } //----------------------------------------------------------- @@ -197,7 +203,7 @@ TImageReaderP TLevelReaderMp4::getFrameReader(TFrameId fid) { if (fid.getLetter() != 0) return TImageReaderP(0); int index = fid.getNumber(); - TImageReaderMp4 *irm = new TImageReaderMp4(m_path, index, this); + TImageReaderMp4 *irm = new TImageReaderMp4(m_path, index, this, m_info); return TImageReaderP(irm); } diff --git a/toonz/sources/image/ffmpeg/tiio_webm.cpp b/toonz/sources/image/ffmpeg/tiio_webm.cpp index 0d9e2b27..d7800611 100644 --- a/toonz/sources/image/ffmpeg/tiio_webm.cpp +++ b/toonz/sources/image/ffmpeg/tiio_webm.cpp @@ -4,6 +4,7 @@ #include "trasterimage.h" #include "tsound.h" #include "timageinfo.h" +#include "toonz/stage.h" #include //=========================================================== @@ -133,8 +134,9 @@ class TImageReaderWebm final : public TImageReader { public: int m_frameIndex; - TImageReaderWebm(const TFilePath &path, int index, TLevelReaderWebm *lra) - : TImageReader(path), m_lra(lra), m_frameIndex(index) { + TImageReaderWebm(const TFilePath &path, int index, TLevelReaderWebm *lra, + TImageInfo *info) + : TImageReader(path), m_lra(lra), m_frameIndex(index), m_info(info) { m_lra->addRef(); } ~TImageReaderWebm() { m_lra->release(); } @@ -142,9 +144,11 @@ public: TImageP load() override { return m_lra->load(m_frameIndex); } TDimension getSize() const { return m_lra->getSize(); } TRect getBBox() const { return TRect(); } + const TImageInfo *getImageInfo() const override { return m_info; } private: TLevelReaderWebm *m_lra; + TImageInfo *m_info; // not implemented TImageReaderWebm(const TImageReaderWebm &); @@ -177,6 +181,8 @@ TLevelReaderWebm::TLevelReaderWebm(const TFilePath &path) : TLevelReader(path) { m_info->m_ly = m_ly; m_info->m_bitsPerSample = 8; m_info->m_samplePerPixel = 4; + m_info->m_dpix = Stage::standardDpi; + m_info->m_dpiy = Stage::standardDpi; } //----------------------------------------------------------- @@ -201,7 +207,7 @@ TImageReaderP TLevelReaderWebm::getFrameReader(TFrameId fid) { if (fid.getLetter() != 0) return TImageReaderP(0); int index = fid.getNumber(); - TImageReaderWebm *irm = new TImageReaderWebm(m_path, index, this); + TImageReaderWebm *irm = new TImageReaderWebm(m_path, index, this, m_info); return TImageReaderP(irm); } diff --git a/toonz/sources/toonz/filebrowser.cpp b/toonz/sources/toonz/filebrowser.cpp index f4f06e84..73f7f9a8 100644 --- a/toonz/sources/toonz/filebrowser.cpp +++ b/toonz/sources/toonz/filebrowser.cpp @@ -148,7 +148,8 @@ QMutex levelFileMutex; inline bool isMultipleFrameType(std::string type) { return (type == "tlv" || type == "tzl" || type == "pli" || type == "mov" || - type == "avi" || type == "3gp"); + type == "avi" || type == "3gp" || type == "gif" || type == "mp4" || + type == "webm"); } //============================================================================= From 3837a144362cadc194133ddcaa00abb31f1749d3 Mon Sep 17 00:00:00 2001 From: Jeremy Bullock Date: Fri, 7 Oct 2016 04:02:02 -0600 Subject: [PATCH 26/56] fix for ffmpeg export range error (#828) * This allows the export range to be specified and correctly exported in ffmpeg formats close #779 --- toonz/sources/image/ffmpeg/tiio_ffmpeg.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/toonz/sources/image/ffmpeg/tiio_ffmpeg.cpp b/toonz/sources/image/ffmpeg/tiio_ffmpeg.cpp index ae04e117..9dd86a1c 100644 --- a/toonz/sources/image/ffmpeg/tiio_ffmpeg.cpp +++ b/toonz/sources/image/ffmpeg/tiio_ffmpeg.cpp @@ -99,8 +99,9 @@ void Ffmpeg::setFrameRate(double fps) { m_frameRate = fps; } void Ffmpeg::setPath(TFilePath path) { m_path = path; } void Ffmpeg::createIntermediateImage(const TImageP &img, int frameIndex) { + m_frameCount++; QString tempPath = m_path.getQString() + "tempOut" + - QString::number(frameIndex) + "." + m_intermediateFormat; + QString::number(m_frameCount) + "." + m_intermediateFormat; std::string saveStatus = ""; TRasterImageP tempImage(img); TRasterImage *image = (TRasterImage *)tempImage->cloneImage(); @@ -128,7 +129,7 @@ void Ffmpeg::createIntermediateImage(const TImageP &img, int frameIndex) { qi->save(tempPath, format, -1); free(buffer); m_cleanUpList.push_back(tempPath); - m_frameCount++; + delete qi; delete image; } From e8903b4e25dd2ad788798f669f24167fffe54aed Mon Sep 17 00:00:00 2001 From: Jeremy Bullock Date: Fri, 7 Oct 2016 05:45:49 -0600 Subject: [PATCH 27/56] Shortcuts Selection Choice and Proposed New Shortcuts (#691) * Enabled to save shortcuts and to select from shortcut configurations of other softwares --- .../layouts/shortcuts/defopentoonz.ini | 366 +++++++++++++++++ stuff/profiles/layouts/shortcuts/otadobe.ini | 366 +++++++++++++++++ .../profiles/layouts/shortcuts/otharmony.ini | 366 +++++++++++++++++ stuff/profiles/layouts/shortcuts/otretas.ini | 366 +++++++++++++++++ toonz/sources/include/toonz/preferences.h | 6 +- .../sources/include/toonzqt/menubarcommand.h | 3 +- toonz/sources/toonz/mainwindow.cpp | 95 ++--- toonz/sources/toonz/shortcutpopup.cpp | 382 +++++++++++++++++- toonz/sources/toonz/shortcutpopup.h | 30 +- toonz/sources/toonzlib/preferences.cpp | 13 +- toonz/sources/toonzqt/menubarcommand.cpp | 9 +- 11 files changed, 1946 insertions(+), 56 deletions(-) create mode 100644 stuff/profiles/layouts/shortcuts/defopentoonz.ini create mode 100644 stuff/profiles/layouts/shortcuts/otadobe.ini create mode 100644 stuff/profiles/layouts/shortcuts/otharmony.ini create mode 100644 stuff/profiles/layouts/shortcuts/otretas.ini diff --git a/stuff/profiles/layouts/shortcuts/defopentoonz.ini b/stuff/profiles/layouts/shortcuts/defopentoonz.ini new file mode 100644 index 00000000..ebb88c62 --- /dev/null +++ b/stuff/profiles/layouts/shortcuts/defopentoonz.ini @@ -0,0 +1,366 @@ +[shortcuts] +MI_Clear=Del +MI_OnionSkin=/ +A_DecreaseBrushHardness= +A_DecreaseMaxBrushThickness=U +A_DecreaseMinBrushThickness=H +A_FxSchematicToggle= +A_IncreaseBrushHardness= +A_IncreaseMaxBrushThickness=I +A_IncreaseMinBrushThickness=J +A_ToolOption_AutoGroup= +A_ToolOption_AutoSelect%3AColumn= +A_ToolOption_AutoSelect%3ANone= +A_ToolOption_AutoSelect%3APegbar= +A_ToolOption_AutoSelectDrawing= +A_ToolOption_Autofill= +A_ToolOption_BreakSharpAngles= +A_ToolOption_BrushPreset= +A_ToolOption_EditToolActiveAxis= +A_ToolOption_EditToolActiveAxis%3ACenter= +A_ToolOption_EditToolActiveAxis%3APosition= +A_ToolOption_EditToolActiveAxis%3ARotation= +A_ToolOption_EditToolActiveAxis%3AScale= +A_ToolOption_EditToolActiveAxis%3AShear= +A_ToolOption_FrameRange=F6 +A_ToolOption_GeometricEdge= +A_ToolOption_GeometricShape= +A_ToolOption_GlobalKey= +A_ToolOption_IK= +A_ToolOption_Invert= +A_ToolOption_JoinVectors= +A_ToolOption_Manual= +A_ToolOption_Meshify= +A_ToolOption_Mode= +A_ToolOption_Mode%3AAreas= +A_ToolOption_Mode%3ALines= +A_ToolOption_Mode%3ALines%20%26%20Areas= +A_ToolOption_OnionSkin= +A_ToolOption_Orientation= +A_ToolOption_PencilMode= +A_ToolOption_PickScreen= +A_ToolOption_PreserveThickness= +A_ToolOption_PressureSensitivity=Shift+P +A_ToolOption_SegmentInk=F8 +A_ToolOption_Selective=F7 +A_ToolOption_ShowOnlyActiveSkeleton= +A_ToolOption_SkeletonMode%3AAnimate= +A_ToolOption_SkeletonMode%3ABuild%20Skeleton= +A_ToolOption_SkeletonMode%3AInverse%20Kinematics= +A_ToolOption_Smooth= +A_ToolOption_Snap= +A_ToolOption_Type= +A_ToolOption_Type%3AFreehand= +A_ToolOption_Type%3ANormal= +A_ToolOption_Type%3APolyline= +A_ToolOption_Type%3ARectangular=F5 +A_ToolOption_TypeFont= +A_ToolOption_TypeSize= +A_ToolOption_TypeStyle= +MI_ACheck= +MI_About= +MI_ActivateAllColumns= +MI_ActivateSelectedColumns= +MI_ActivateThisColumnOnly= +MI_AddFrames= +MI_AddToBatchCleanupList= +MI_AddToBatchRenderList= +MI_AdjustLevels= +MI_AdjustThickness= +MI_Antialias= +MI_ApplyMatchLines= +MI_AutoFillToggle=Shift+A +MI_Autocenter= +MI_Autorenumber= +MI_BCheck= +MI_Binarize= +MI_BlendColors= +MI_BlueChannel= +MI_BlueChannelGreyscale= +MI_BrightnessAndContrast= +MI_BringForward=] +MI_BringToFront=Ctrl+] +MI_CameraSettings= +MI_CameraStage= +MI_CameraTest= +MI_CanvasSize= +MI_Cleanup= +MI_CleanupPreview= +MI_CleanupSettings= +MI_ClearRecentImage= +MI_ClearRecentLevel= +MI_ClearRecentScene= +MI_CloneChild= +MI_CloneLevel= +MI_ClonePreview= +MI_CloseChild= +MI_Collapse= +MI_CollectAssets= +MI_CompareToSnapshot= +MI_ConvertFileWithInput= +MI_ConvertFiles= +MI_ConvertToVectors= +MI_Copy=Ctrl+C +MI_Cut=Ctrl+X +MI_DeactivateAllColumns= +MI_DeactivateSelectedColumns= +MI_DeactivateUpperColumns= +MI_DecreaseStep=";" +MI_DefineScanner= +MI_DeleteInk= +MI_DeleteMatchLines= +MI_DisableAllColumns= +MI_DisableSelectedColumns= +MI_DockingCheck= +MI_DrawingSubBackward=Q +MI_DrawingSubForward=W +MI_DrawingSubGroupBackward=Alt+Q +MI_DrawingSubGroupForward=Alt+W +MI_Dup= +MI_Duplicate=D +MI_DuplicateFile= +MI_Each2= +MI_Each3= +MI_Each4= +MI_EditLevel= +MI_EditShift= +MI_EnableAllColumns= +MI_EnableSelectedColumns= +MI_EnableThisColumnOnly= +MI_EnterGroup= +MI_EraseUnusedStyles= +MI_ExitGroup= +MI_ExplodeChild= +MI_ExportLevel= +MI_ExportScenes= +MI_ExposeResource= +MI_FieldGuide=Shift+G +MI_FileInfo= +MI_FillAreas= +MI_FillLines= +MI_FirstFrame="Alt+," +MI_FoldColumns= +MI_FrezzePreview= +MI_FullScreenWindow=Ctrl+` +MI_FxParamEditor=Ctrl+K +MI_GCheck= +MI_GetColorFromStudioPalette= +MI_GreenChannel= +MI_GreenChannelGreyscale= +MI_Group=Ctrl+G +MI_Histogram= +MI_ICheck= +MI_IOnly= +MI_ImportMagpieFile= +MI_ImportScenes= +MI_IncreaseStep="'" +MI_Increment= +MI_Ink1Check= +MI_Insert=Ins +MI_InsertFx=Ctrl+F +MI_InsertGlobalKeyframe= +MI_InsertSceneFrame= +MI_InvertKeyframeSelection= +MI_InvertSelection= +MI_LastFrame=Alt+. +MI_LevelSettings= +MI_LinesFade= +MI_Link= +MI_LoadColorModel= +MI_LoadFolder= +MI_LoadLevel= +MI_LoadScene=Ctrl+L +MI_LoadSubSceneFile= +MI_LockAllColumns=Ctrl+Alt+Shift+L +MI_LockSelectedColumns=Ctrl+Shift+L +MI_LockThisColumnOnly=Shift+L +MI_Loop=L +MI_MatteChannel= +MI_MaximizePanel=` +MI_MergeCmapped= +MI_MergeColumns= +MI_MergeFrames= +MI_NewLevel=Alt+N +MI_NewOutputFx= +MI_NewProject= +MI_NewScene=Ctrl+N +MI_NextDrawing=. +MI_NextFrame=Shift+. +MI_NextStep= +MI_NoShift= +MI_OpacityCheck=1 +MI_OpenBatchServers= +MI_OpenChild= +MI_OpenCleanupSettings= +MI_OpenColorModel= +MI_OpenComboViewer= +MI_OpenFileBrowser= +MI_OpenFileBrowser2= +MI_OpenFileViewer= +MI_OpenFilmStrip= +MI_OpenFunctionEditor= +MI_OpenHistoryPanel=Ctrl+H +MI_OpenLevelView= +MI_OpenPalette= +MI_OpenPltGizmo= +MI_OpenRecentLevel= +MI_OpenRecentScene= +MI_OpenSchematic= +MI_OpenScriptConsole= +MI_OpenStudioPalette= +MI_OpenStyleControl= +MI_OpenTMessage= +MI_OpenTasks= +MI_OpenToolOptionBar= +MI_OpenToolbar= +MI_OpenXshView= +MI_OutputSettings=Ctrl+O +MI_OverwritePalette= +MI_PCheck= +MI_Paste=Ctrl+V +MI_PasteColors= +MI_PasteInto= +MI_PasteNames= +MI_PasteValues= +MI_Pause= +MI_PencilTest= +MI_PickStyleAreas= +MI_PickStyleLines= +MI_Play=P +MI_Preferences=Ctrl+U +MI_PrevDrawing="," +MI_PrevFrame="Shift+," +MI_PrevStep= +MI_Preview=Ctrl+R +MI_PreviewFx= +MI_PreviewSettings= +MI_Print=Ctrl+P +MI_PrintXsheet= +MI_ProjectSettings= +MI_Quit=Ctrl+Q +MI_Random= +MI_RasterizePli= +MI_RedChannel= +MI_RedChannelGreyscale= +MI_Redo=Ctrl+Y +MI_Reframe1= +MI_Reframe2= +MI_Reframe3= +MI_Reframe4= +MI_RefreshTree= +MI_RegenerateFramePr= +MI_RegeneratePreview= +MI_ReloadStyle= +MI_RemoveEndpoints= +MI_RemoveGlobalKeyframe= +MI_RemoveLevel= +MI_RemoveSceneFrame= +MI_RemoveUnused= +MI_Render=Ctrl+Shift+R +MI_Renumber= +MI_ReplaceLevel= +MI_ReplaceParentDirectory= +MI_Resequence= +MI_ResetInterpolation= +MI_ResetRoomLayout= +MI_ResetScanCropbox= +MI_ResetShift= +MI_ResetStep= +MI_Reverse= +MI_RevertScene= +MI_RevertToCleanedUp= +MI_RevertToLastSaved= +MI_Rolldown= +MI_Rollup= +MI_RunScript= +MI_SafeArea= +MI_SaveAll=Ctrl+S +MI_SaveDefaultSettings= +MI_SaveLevel= +MI_SaveLevelAs= +MI_SavePaletteAs= +MI_SavePreset= +MI_SavePreviewedFrames= +MI_SaveScene=Ctrl+Shift+S +MI_SaveSceneAs= +MI_SaveSubxsheetAs= +MI_Scan= +MI_ScanSettings= +MI_SceneSettings= +MI_SelectAll=Ctrl+A +MI_SelectAllKeyframes= +MI_SelectAllKeyframesNotAfter= +MI_SelectAllKeyframesNotBefore= +MI_SelectColumnKeyframes= +MI_SelectFollowingKeysInColumn= +MI_SelectFollowingKeysInRow= +MI_SelectPreviousKeysInColumn= +MI_SelectPreviousKeysInRow= +MI_SelectRowKeyframes= +MI_SendBack=Ctrl+[ +MI_SendBackward=[ +MI_SetAcceleration= +MI_SetConstantSpeed= +MI_SetDeceleration= +MI_SetKeyframes=Z +MI_SetScanCropbox= +MI_ShiftTrace= +MI_ShortcutPopup= +MI_ShowFolderContents= +MI_Step2= +MI_Step3= +MI_Step4= +MI_SwapEnabledColumns= +MI_Swing= +MI_TCheck= +MI_TimeStretch= +MI_ToggleColumnLocks= +MI_ToggleColumnsActivation= +MI_ToggleEditInPlace= +MI_Tracking= +MI_Undo=Ctrl+Z +MI_Ungroup=Ctrl+Shift+G +MI_UnlockAllColumns=Ctrl+Alt+Shift+U +MI_UnlockSelectedColumns=Ctrl+Shift+U +MI_ViewBBox= +MI_ViewCamera= +MI_ViewColorcard= +MI_ViewFile= +MI_ViewGuide= +MI_ViewRuler= +MI_ViewTable= +MI_ZeroThick=Shift+/ +T_ActualPixelSize=N +T_Bender= +T_Brush=B +T_ControlPointEditor=C +T_Cutter= +T_Edit=E +T_Eraser=A +T_Fill=F +T_Finger= +T_Geometric=G +T_Hand=Space +T_Hook=O +T_Iron= +T_Magnet= +T_PaintBrush= +T_Pinch=M +T_Plastic=X +T_Pump= +T_RGBPicker=R +T_Rotate=Ctrl+Space +T_Ruler= +T_Selection=S +T_ShowHideFullScreen=Alt+F +T_Skeleton=V +T_StylePicker=K +T_Tape=T +T_Tracker= +T_Type=Y +T_Zoom=Shift+Space +T_ZoomFit=9 +T_ZoomReset=0 +T_Zoomin=+ +T_Zoomout=- +MI_LoadRecentImage= diff --git a/stuff/profiles/layouts/shortcuts/otadobe.ini b/stuff/profiles/layouts/shortcuts/otadobe.ini new file mode 100644 index 00000000..7a1b1720 --- /dev/null +++ b/stuff/profiles/layouts/shortcuts/otadobe.ini @@ -0,0 +1,366 @@ +[shortcuts] +MI_LoadRecentImage= +A_ToolOption_FrameRange= +A_ToolOption_SegmentInk= +A_ToolOption_Selective= +A_ToolOption_Type%3ARectangular= +MI_BringForward=Ctrl+Up +MI_BringToFront=Ctrl+Shift+Up +MI_Clear=Delete +MI_Copy=Ctrl+C +MI_Cut=Ctrl+X +MI_DrawingSubBackward=[ +MI_DrawingSubForward=] +MI_DrawingSubGroupBackward=Ctrl+[ +MI_DrawingSubGroupForward=Ctrl+] +MI_Duplicate= +MI_FullScreenWindow=Ctrl+F +MI_FxParamEditor= +MI_Group=Ctrl+G +MI_Insert=Ins +MI_InsertFx= +MI_LoadScene=Ctrl+O +MI_MaximizePanel= +MI_NewScene=Ctrl+N +MI_NextDrawing=G +MI_NextFrame=. +MI_OpacityCheck= +MI_Paste=Ctrl+V +MI_PrevDrawing=F +MI_PrevFrame="," +MI_Preview=Alt+P +MI_Quit=Ctrl+Q +MI_Redo=Ctrl+Y +MI_SaveScene=Ctrl+Shift+S +MI_SaveSceneAs=Ctrl+Alt+Shift+S +MI_SelectAll=Shift+A +MI_SendBack=Ctrl+Shift+Down +MI_SendBackward=Ctrl+Down +MI_Undo=Ctrl+Z +MI_ZeroThick=D +T_ActualPixelSize= +T_Brush=Alt+B +T_ControlPointEditor=Alt+A +T_Edit=Alt+Q +T_Eraser=Alt+E +T_Fill=Alt+K +T_Geometric=Atl+R +T_Hand= +T_Pinch= +T_Rotate= +T_Selection=Alt+V +T_StylePicker=Alt+I +T_Tape=Alt+C +T_Type= +T_Zoom=Alt+Z +T_ZoomReset=Shift+Z +T_Zoomin=Ctrl+= +T_Zoomout=Ctrl+- +A_DecreaseBrushHardness= +A_DecreaseMaxBrushThickness= +A_DecreaseMinBrushThickness= +A_FxSchematicToggle= +A_IncreaseBrushHardness= +A_IncreaseMaxBrushThickness= +A_IncreaseMinBrushThickness= +A_ToolOption_AutoGroup= +A_ToolOption_AutoSelect%3AColumn= +A_ToolOption_AutoSelect%3ANone= +A_ToolOption_AutoSelect%3APegbar= +A_ToolOption_AutoSelectDrawing= +A_ToolOption_Autofill= +A_ToolOption_BreakSharpAngles= +A_ToolOption_BrushPreset= +A_ToolOption_EditToolActiveAxis= +A_ToolOption_EditToolActiveAxis%3ACenter= +A_ToolOption_EditToolActiveAxis%3APosition= +A_ToolOption_EditToolActiveAxis%3ARotation= +A_ToolOption_EditToolActiveAxis%3AScale= +A_ToolOption_EditToolActiveAxis%3AShear= +A_ToolOption_GeometricEdge= +A_ToolOption_GeometricShape= +A_ToolOption_GlobalKey= +A_ToolOption_IK=Alt+8 +A_ToolOption_Invert= +A_ToolOption_JoinVectors= +A_ToolOption_Manual= +A_ToolOption_Meshify= +A_ToolOption_Mode= +A_ToolOption_Mode%3AAreas= +A_ToolOption_Mode%3ALines= +A_ToolOption_Mode%3ALines%20%26%20Areas= +A_ToolOption_OnionSkin= +A_ToolOption_Orientation= +A_ToolOption_PencilMode= +A_ToolOption_PickScreen= +A_ToolOption_PreserveThickness= +A_ToolOption_PressureSensitivity= +A_ToolOption_ShowOnlyActiveSkeleton= +A_ToolOption_SkeletonMode%3AAnimate= +A_ToolOption_SkeletonMode%3ABuild%20Skeleton= +A_ToolOption_SkeletonMode%3AInverse%20Kinematics= +A_ToolOption_Smooth= +A_ToolOption_Snap= +A_ToolOption_Type= +A_ToolOption_Type%3AFreehand= +A_ToolOption_Type%3ANormal= +A_ToolOption_Type%3APolyline= +A_ToolOption_TypeFont= +A_ToolOption_TypeSize= +A_ToolOption_TypeStyle= +MI_ACheck= +MI_About= +MI_ActivateAllColumns= +MI_ActivateSelectedColumns= +MI_ActivateThisColumnOnly= +MI_AddFrames=Ctrl+H +MI_AddToBatchCleanupList= +MI_AddToBatchRenderList= +MI_AdjustLevels= +MI_AdjustThickness= +MI_Antialias= +MI_ApplyMatchLines= +MI_AutoFillToggle= +MI_Autocenter= +MI_Autorenumber= +MI_BCheck= +MI_Binarize= +MI_BlendColors= +MI_BlueChannel= +MI_BlueChannelGreyscale= +MI_BrightnessAndContrast= +MI_CameraSettings= +MI_CameraStage= +MI_CameraTest= +MI_CanvasSize= +MI_Cleanup= +MI_CleanupPreview= +MI_CleanupSettings= +MI_ClearRecentImage= +MI_ClearRecentLevel= +MI_ClearRecentScene= +MI_CloneChild= +MI_CloneLevel= +MI_ClonePreview= +MI_CloseChild= +MI_Collapse= +MI_CollectAssets= +MI_CompareToSnapshot= +MI_ConvertFileWithInput= +MI_ConvertFiles= +MI_ConvertToVectors= +MI_DeactivateAllColumns= +MI_DeactivateSelectedColumns=Alt+H +MI_DeactivateUpperColumns= +MI_DecreaseStep= +MI_DefineScanner= +MI_DeleteInk= +MI_DeleteMatchLines= +MI_DisableAllColumns= +MI_DisableSelectedColumns= +MI_DockingCheck= +MI_Dup= +MI_DuplicateFile= +MI_Each2= +MI_Each3= +MI_Each4= +MI_EditLevel= +MI_EditShift= +MI_EnableAllColumns=Alt+Shift+H +MI_EnableSelectedColumns= +MI_EnableThisColumnOnly= +MI_EnterGroup=Ctrl+Return +MI_EraseUnusedStyles= +MI_ExitGroup=Backspace +MI_ExplodeChild=Ctrl+B +MI_ExportLevel= +MI_ExportScenes= +MI_ExposeResource= +MI_FieldGuide="Ctrl+'" +MI_FileInfo= +MI_FillAreas= +MI_FillLines= +MI_FirstFrame=Home +MI_FoldColumns= +MI_FrezzePreview= +MI_GCheck= +MI_GetColorFromStudioPalette= +MI_GreenChannel= +MI_GreenChannelGreyscale= +MI_Histogram= +MI_ICheck= +MI_IOnly= +MI_ImportMagpieFile= +MI_ImportScenes= +MI_IncreaseStep="+" +MI_Increment= +MI_Ink1Check= +MI_InsertGlobalKeyframe= +MI_InsertSceneFrame= +MI_InvertKeyframeSelection= +MI_InvertSelection= +MI_LastFrame=End +MI_LevelSettings= +MI_LinesFade= +MI_Link= +MI_LoadColorModel= +MI_LoadFolder= +MI_LoadLevel= +MI_LoadSubSceneFile= +MI_LockAllColumns= +MI_LockSelectedColumns= +MI_LockThisColumnOnly= +MI_Loop= +MI_MatteChannel= +MI_MergeCmapped= +MI_MergeColumns= +MI_MergeFrames= +MI_NewLevel= +MI_NewOutputFx= +MI_NewProject= +MI_NextStep= +MI_NoShift= +MI_OnionSkin=Ctrl+Alt+O +MI_OpenBatchServers= +MI_OpenChild= +MI_OpenCleanupSettings= +MI_OpenColorModel= +MI_OpenComboViewer= +MI_OpenFileBrowser= +MI_OpenFileBrowser2= +MI_OpenFileViewer= +MI_OpenFilmStrip= +MI_OpenFunctionEditor=Alt+F +MI_OpenHistoryPanel= +MI_OpenLevelView= +MI_OpenPalette= +MI_OpenPltGizmo= +MI_OpenRecentScene= +MI_OpenSchematic= +MI_OpenScriptConsole= +MI_OpenStudioPalette= +MI_OpenStyleControl= +MI_OpenTMessage= +MI_OpenTasks= +MI_OpenToolOptionBar= +MI_OpenToolbar= +MI_OpenXshView= +MI_OutputSettings= +MI_OverwritePalette= +MI_PCheck= +MI_PasteColors= +MI_PasteInto= +MI_PasteNames= +MI_PasteValues= +MI_Pause= +MI_PencilTest= +MI_PickStyleAreas= +MI_PickStyleLines= +MI_Play=Return +MI_Preferences=Ctrl+U +MI_PrevStep= +MI_PreviewFx= +MI_PreviewSettings= +MI_Print= +MI_PrintXsheet= +MI_ProjectSettings= +MI_Random= +MI_RasterizePli= +MI_RedChannel= +MI_RedChannelGreyscale= +MI_Reframe1= +MI_Reframe2= +MI_Reframe3= +MI_Reframe4= +MI_RefreshTree= +MI_RegenerateFramePr= +MI_RegeneratePreview= +MI_ReloadStyle= +MI_RemoveEndpoints= +MI_RemoveGlobalKeyframe= +MI_RemoveLevel= +MI_RemoveSceneFrame= +MI_RemoveUnused= +MI_Render=Ctrl+Alt+Shift+S +MI_Renumber= +MI_ReplaceLevel= +MI_ReplaceParentDirectory= +MI_Resequence= +MI_ResetInterpolation= +MI_ResetRoomLayout= +MI_ResetScanCropbox= +MI_ResetShift= +MI_ResetStep= +MI_Reverse= +MI_RevertScene= +MI_RevertToCleanedUp= +MI_RevertToLastSaved= +MI_Rolldown= +MI_Rollup= +MI_RunScript= +MI_SafeArea= +MI_SaveAll=Ctrl+S +MI_SaveDefaultSettings= +MI_SaveLevel= +MI_SaveLevelAs= +MI_SavePaletteAs= +MI_SavePreset= +MI_SavePreviewedFrames= +MI_SaveSubxsheetAs= +MI_Scan= +MI_ScanSettings= +MI_SceneSettings=Ctrl+F3 +MI_SelectAllKeyframes= +MI_SelectAllKeyframesNotAfter= +MI_SelectAllKeyframesNotBefore= +MI_SelectColumnKeyframes= +MI_SelectFollowingKeysInColumn= +MI_SelectFollowingKeysInRow= +MI_SelectPreviousKeysInColumn= +MI_SelectPreviousKeysInRow= +MI_SelectRowKeyframes= +MI_SetAcceleration= +MI_SetConstantSpeed= +MI_SetDeceleration= +MI_SetKeyframes=Ctrl+F6 +MI_SetScanCropbox= +MI_ShiftTrace= +MI_ShortcutPopup= +MI_ShowFolderContents= +MI_Step2= +MI_Step3= +MI_Step4= +MI_SwapEnabledColumns= +MI_Swing= +MI_TCheck= +MI_TimeStretch= +MI_ToggleColumnLocks= +MI_ToggleColumnsActivation= +MI_ToggleEditInPlace= +MI_Tracking= +MI_Ungroup=Ctrl+Shift+G +MI_UnlockAllColumns=Ctrl+Alt+Shift+L +MI_UnlockSelectedColumns=Ctrl+Shift+K +MI_ViewBBox= +MI_ViewCamera= +MI_ViewColorcard= +MI_ViewFile= +MI_ViewGuide= +MI_ViewRuler=Ctrl+Alt+Shift+R +MI_ViewTable= +T_Bender= +T_Cutter=Alt+T +T_Finger= +T_Hook= +T_Iron= +T_Magnet= +T_PaintBrush= +T_Plastic= +T_Pump= +T_RGBPicker= +T_Ruler= +T_ShowHideFullScreen=F4 +T_Skeleton= +T_Tracker= +T_ZoomFit= +MI_OpenRecentLevel= diff --git a/stuff/profiles/layouts/shortcuts/otharmony.ini b/stuff/profiles/layouts/shortcuts/otharmony.ini new file mode 100644 index 00000000..84641721 --- /dev/null +++ b/stuff/profiles/layouts/shortcuts/otharmony.ini @@ -0,0 +1,366 @@ +[shortcuts] +MI_LoadRecentImage= +A_ToolOption_FrameRange= +A_ToolOption_SegmentInk= +A_ToolOption_Selective= +A_ToolOption_Type%3ARectangular= +MI_BringForward=Ctrl+PgUp +MI_BringToFront=Ctrl+Shift+PgUp +MI_Clear=Delete +MI_Copy=Ctrl+C +MI_Cut=Ctrl+X +MI_DrawingSubBackward=[ +MI_DrawingSubForward=] +MI_DrawingSubGroupBackward=Ctrl+[ +MI_DrawingSubGroupForward=Ctrl+] +MI_Duplicate= +MI_FullScreenWindow=Ctrl+F +MI_FxParamEditor= +MI_Group=Ctrl+G +MI_Insert=Ins +MI_InsertFx= +MI_LoadScene=Ctrl+O +MI_MaximizePanel=` +MI_NewScene=Ctrl+N +MI_NextDrawing=G +MI_NextFrame=. +MI_OpacityCheck= +MI_Paste=Ctrl+V +MI_PrevDrawing=F +MI_PrevFrame="," +MI_Preview= +MI_Quit=Ctrl+Q +MI_Redo=Ctrl+Shift+Z +MI_SaveScene=Ctrl+Shift+S +MI_SaveSceneAs=Ctrl+Shift+Alt+S +MI_SelectAll=Ctrl+A +MI_SendBack=Ctrl+PgDown +MI_SendBackward=Ctrl+Shift+PgDown +MI_Undo=Ctrl+Z +MI_ZeroThick= +T_ActualPixelSize= +T_Brush=Alt+B +T_ControlPointEditor=Alt+Q +T_Edit=Shift+T +T_Eraser=Alt+E +T_Fill=Alt+I +T_Geometric=Alt+7 +T_Hand= +T_Pinch= +T_Rotate= +T_Selection=Alt+S +T_StylePicker=Alt+D +T_Tape=Alt+C +T_Type=Alt+9 +T_Zoom=Alt+Z +T_ZoomReset= +T_Zoomin=2 +T_Zoomout=1 +A_DecreaseBrushHardness= +A_DecreaseMaxBrushThickness= +A_DecreaseMinBrushThickness= +A_FxSchematicToggle= +A_IncreaseBrushHardness= +A_IncreaseMaxBrushThickness= +A_IncreaseMinBrushThickness= +A_ToolOption_AutoGroup= +A_ToolOption_AutoSelect%3AColumn= +A_ToolOption_AutoSelect%3ANone= +A_ToolOption_AutoSelect%3APegbar= +A_ToolOption_AutoSelectDrawing= +A_ToolOption_Autofill= +A_ToolOption_BreakSharpAngles= +A_ToolOption_BrushPreset= +A_ToolOption_EditToolActiveAxis= +A_ToolOption_EditToolActiveAxis%3ACenter= +A_ToolOption_EditToolActiveAxis%3APosition=Alt+2 +A_ToolOption_EditToolActiveAxis%3ARotation=Alt+3 +A_ToolOption_EditToolActiveAxis%3AScale=Alt+4 +A_ToolOption_EditToolActiveAxis%3AShear=Alt+5 +A_ToolOption_GeometricEdge= +A_ToolOption_GeometricShape= +A_ToolOption_GlobalKey= +A_ToolOption_IK= +A_ToolOption_Invert= +A_ToolOption_JoinVectors= +A_ToolOption_Manual= +A_ToolOption_Meshify= +A_ToolOption_Mode= +A_ToolOption_Mode%3AAreas= +A_ToolOption_Mode%3ALines= +A_ToolOption_Mode%3ALines%20%26%20Areas= +A_ToolOption_OnionSkin= +A_ToolOption_Orientation= +A_ToolOption_PencilMode= +A_ToolOption_PickScreen= +A_ToolOption_PreserveThickness= +A_ToolOption_PressureSensitivity= +A_ToolOption_ShowOnlyActiveSkeleton= +A_ToolOption_SkeletonMode%3AAnimate= +A_ToolOption_SkeletonMode%3ABuild%20Skeleton= +A_ToolOption_SkeletonMode%3AInverse%20Kinematics= +A_ToolOption_Smooth= +A_ToolOption_Snap= +A_ToolOption_Type= +A_ToolOption_Type%3AFreehand= +A_ToolOption_Type%3ANormal= +A_ToolOption_Type%3APolyline= +A_ToolOption_TypeFont= +A_ToolOption_TypeSize= +A_ToolOption_TypeStyle= +MI_ACheck= +MI_About= +MI_ActivateAllColumns= +MI_ActivateSelectedColumns= +MI_ActivateThisColumnOnly= +MI_AddFrames= +MI_AddToBatchCleanupList= +MI_AddToBatchRenderList= +MI_AdjustLevels= +MI_AdjustThickness= +MI_Antialias= +MI_ApplyMatchLines= +MI_AutoFillToggle= +MI_Autocenter= +MI_Autorenumber= +MI_BCheck= +MI_Binarize= +MI_BlendColors= +MI_BlueChannel= +MI_BlueChannelGreyscale= +MI_BrightnessAndContrast= +MI_CameraSettings= +MI_CameraStage= +MI_CameraTest= +MI_CanvasSize= +MI_Cleanup= +MI_CleanupPreview= +MI_CleanupSettings= +MI_ClearRecentImage= +MI_ClearRecentLevel= +MI_ClearRecentScene= +MI_CloneChild= +MI_CloneLevel= +MI_ClonePreview= +MI_CloseChild= +MI_Collapse=0 +MI_CollectAssets= +MI_CompareToSnapshot= +MI_ConvertFileWithInput= +MI_ConvertFiles= +MI_ConvertToVectors= +MI_DeactivateAllColumns= +MI_DeactivateSelectedColumns= +MI_DeactivateUpperColumns= +MI_DecreaseStep=- +MI_DefineScanner= +MI_DeleteInk= +MI_DeleteMatchLines= +MI_DisableAllColumns= +MI_DisableSelectedColumns=Alt+H +MI_DockingCheck= +MI_Dup= +MI_DuplicateFile= +MI_Each2= +MI_Each3= +MI_Each4= +MI_EditLevel= +MI_EditShift= +MI_EnableAllColumns=Alt+Shift+H +MI_EnableSelectedColumns= +MI_EnableThisColumnOnly= +MI_EnterGroup=Ctrl+Return +MI_EraseUnusedStyles= +MI_ExitGroup=Backspace +MI_ExplodeChild=Ctrl+B +MI_ExportLevel= +MI_ExportScenes= +MI_ExposeResource= +MI_FieldGuide="Ctrl+'" +MI_FileInfo= +MI_FillAreas= +MI_FillLines= +MI_FirstFrame="Shift+<" +MI_FoldColumns= +MI_FrezzePreview= +MI_GCheck= +MI_GetColorFromStudioPalette= +MI_GreenChannel= +MI_GreenChannelGreyscale= +MI_Histogram= +MI_ICheck= +MI_IOnly= +MI_ImportMagpieFile= +MI_ImportScenes= +MI_IncreaseStep="+" +MI_Increment= +MI_Ink1Check= +MI_InsertGlobalKeyframe= +MI_InsertSceneFrame= +MI_InvertKeyframeSelection= +MI_InvertSelection= +MI_LastFrame="Shift+>" +MI_LevelSettings= +MI_LinesFade= +MI_Link= +MI_LoadColorModel= +MI_LoadFolder= +MI_LoadLevel= +MI_LoadSubSceneFile= +MI_LockAllColumns=Ctrl+Shift+L +MI_LockSelectedColumns=Ctrl+Alt+L +MI_LockThisColumnOnly= +MI_Loop= +MI_MatteChannel= +MI_MergeCmapped= +MI_MergeColumns= +MI_MergeFrames= +MI_NewLevel= +MI_NewOutputFx= +MI_NewProject= +MI_NextStep= +MI_NoShift= +MI_OnionSkin=Alt+O +MI_OpenBatchServers= +MI_OpenChild= +MI_OpenCleanupSettings= +MI_OpenColorModel= +MI_OpenComboViewer= +MI_OpenFileBrowser= +MI_OpenFileBrowser2= +MI_OpenFileViewer= +MI_OpenFilmStrip= +MI_OpenFunctionEditor=Alt+F +MI_OpenHistoryPanel= +MI_OpenLevelView= +MI_OpenPalette= +MI_OpenPltGizmo= +MI_OpenRecentScene= +MI_OpenSchematic= +MI_OpenScriptConsole= +MI_OpenStudioPalette= +MI_OpenStyleControl= +MI_OpenTMessage= +MI_OpenTasks= +MI_OpenToolOptionBar= +MI_OpenToolbar= +MI_OpenXshView= +MI_OutputSettings= +MI_OverwritePalette= +MI_PCheck= +MI_PasteColors= +MI_PasteInto= +MI_PasteNames= +MI_PasteValues= +MI_Pause= +MI_PencilTest= +MI_PickStyleAreas= +MI_PickStyleLines= +MI_Play=Ctrl+Return +MI_Preferences=Ctrl+U +MI_PrevStep= +MI_PreviewFx= +MI_PreviewSettings= +MI_Print= +MI_PrintXsheet= +MI_ProjectSettings= +MI_Random= +MI_RasterizePli= +MI_RedChannel= +MI_RedChannelGreyscale= +MI_Reframe1= +MI_Reframe2= +MI_Reframe3= +MI_Reframe4= +MI_RefreshTree= +MI_RegenerateFramePr= +MI_RegeneratePreview= +MI_ReloadStyle= +MI_RemoveEndpoints= +MI_RemoveGlobalKeyframe= +MI_RemoveLevel= +MI_RemoveSceneFrame= +MI_RemoveUnused= +MI_Render= +MI_Renumber= +MI_ReplaceLevel= +MI_ReplaceParentDirectory= +MI_Resequence= +MI_ResetInterpolation= +MI_ResetRoomLayout= +MI_ResetScanCropbox= +MI_ResetShift= +MI_ResetStep= +MI_Reverse= +MI_RevertScene= +MI_RevertToCleanedUp= +MI_RevertToLastSaved= +MI_Rolldown= +MI_Rollup= +MI_RunScript= +MI_SafeArea= +MI_SaveAll=Ctrl+S +MI_SaveDefaultSettings= +MI_SaveLevel= +MI_SaveLevelAs= +MI_SavePaletteAs= +MI_SavePreset= +MI_SavePreviewedFrames= +MI_SaveSubxsheetAs= +MI_Scan=Ctrl+Shift+S +MI_ScanSettings= +MI_SceneSettings= +MI_SelectAllKeyframes= +MI_SelectAllKeyframesNotAfter= +MI_SelectAllKeyframesNotBefore= +MI_SelectColumnKeyframes= +MI_SelectFollowingKeysInColumn= +MI_SelectFollowingKeysInRow= +MI_SelectPreviousKeysInColumn= +MI_SelectPreviousKeysInRow= +MI_SelectRowKeyframes= +MI_SetAcceleration= +MI_SetConstantSpeed= +MI_SetDeceleration= +MI_SetKeyframes=F6 +MI_SetScanCropbox= +MI_ShiftTrace= +MI_ShortcutPopup= +MI_ShowFolderContents= +MI_Step2= +MI_Step3= +MI_Step4= +MI_SwapEnabledColumns= +MI_Swing= +MI_TCheck= +MI_TimeStretch= +MI_ToggleColumnLocks= +MI_ToggleColumnsActivation= +MI_ToggleEditInPlace= +MI_Tracking= +MI_Ungroup=Ctrl+Shift+G +MI_UnlockAllColumns=Ctrl+Alt+Shift+K +MI_UnlockSelectedColumns=Ctrl+Shift+K +MI_ViewBBox= +MI_ViewCamera= +MI_ViewColorcard= +MI_ViewFile= +MI_ViewGuide="Ctrl+'" +MI_ViewRuler= +MI_ViewTable= +T_Bender= +T_Cutter=Alt+T +T_Finger= +T_Hook= +T_Iron= +T_Magnet= +T_PaintBrush= +T_Plastic= +T_Pump= +T_RGBPicker= +T_Ruler= +T_ShowHideFullScreen= +T_Skeleton= +T_Tracker= +T_ZoomFit= +MI_OpenRecentLevel= diff --git a/stuff/profiles/layouts/shortcuts/otretas.ini b/stuff/profiles/layouts/shortcuts/otretas.ini new file mode 100644 index 00000000..7a1b1720 --- /dev/null +++ b/stuff/profiles/layouts/shortcuts/otretas.ini @@ -0,0 +1,366 @@ +[shortcuts] +MI_LoadRecentImage= +A_ToolOption_FrameRange= +A_ToolOption_SegmentInk= +A_ToolOption_Selective= +A_ToolOption_Type%3ARectangular= +MI_BringForward=Ctrl+Up +MI_BringToFront=Ctrl+Shift+Up +MI_Clear=Delete +MI_Copy=Ctrl+C +MI_Cut=Ctrl+X +MI_DrawingSubBackward=[ +MI_DrawingSubForward=] +MI_DrawingSubGroupBackward=Ctrl+[ +MI_DrawingSubGroupForward=Ctrl+] +MI_Duplicate= +MI_FullScreenWindow=Ctrl+F +MI_FxParamEditor= +MI_Group=Ctrl+G +MI_Insert=Ins +MI_InsertFx= +MI_LoadScene=Ctrl+O +MI_MaximizePanel= +MI_NewScene=Ctrl+N +MI_NextDrawing=G +MI_NextFrame=. +MI_OpacityCheck= +MI_Paste=Ctrl+V +MI_PrevDrawing=F +MI_PrevFrame="," +MI_Preview=Alt+P +MI_Quit=Ctrl+Q +MI_Redo=Ctrl+Y +MI_SaveScene=Ctrl+Shift+S +MI_SaveSceneAs=Ctrl+Alt+Shift+S +MI_SelectAll=Shift+A +MI_SendBack=Ctrl+Shift+Down +MI_SendBackward=Ctrl+Down +MI_Undo=Ctrl+Z +MI_ZeroThick=D +T_ActualPixelSize= +T_Brush=Alt+B +T_ControlPointEditor=Alt+A +T_Edit=Alt+Q +T_Eraser=Alt+E +T_Fill=Alt+K +T_Geometric=Atl+R +T_Hand= +T_Pinch= +T_Rotate= +T_Selection=Alt+V +T_StylePicker=Alt+I +T_Tape=Alt+C +T_Type= +T_Zoom=Alt+Z +T_ZoomReset=Shift+Z +T_Zoomin=Ctrl+= +T_Zoomout=Ctrl+- +A_DecreaseBrushHardness= +A_DecreaseMaxBrushThickness= +A_DecreaseMinBrushThickness= +A_FxSchematicToggle= +A_IncreaseBrushHardness= +A_IncreaseMaxBrushThickness= +A_IncreaseMinBrushThickness= +A_ToolOption_AutoGroup= +A_ToolOption_AutoSelect%3AColumn= +A_ToolOption_AutoSelect%3ANone= +A_ToolOption_AutoSelect%3APegbar= +A_ToolOption_AutoSelectDrawing= +A_ToolOption_Autofill= +A_ToolOption_BreakSharpAngles= +A_ToolOption_BrushPreset= +A_ToolOption_EditToolActiveAxis= +A_ToolOption_EditToolActiveAxis%3ACenter= +A_ToolOption_EditToolActiveAxis%3APosition= +A_ToolOption_EditToolActiveAxis%3ARotation= +A_ToolOption_EditToolActiveAxis%3AScale= +A_ToolOption_EditToolActiveAxis%3AShear= +A_ToolOption_GeometricEdge= +A_ToolOption_GeometricShape= +A_ToolOption_GlobalKey= +A_ToolOption_IK=Alt+8 +A_ToolOption_Invert= +A_ToolOption_JoinVectors= +A_ToolOption_Manual= +A_ToolOption_Meshify= +A_ToolOption_Mode= +A_ToolOption_Mode%3AAreas= +A_ToolOption_Mode%3ALines= +A_ToolOption_Mode%3ALines%20%26%20Areas= +A_ToolOption_OnionSkin= +A_ToolOption_Orientation= +A_ToolOption_PencilMode= +A_ToolOption_PickScreen= +A_ToolOption_PreserveThickness= +A_ToolOption_PressureSensitivity= +A_ToolOption_ShowOnlyActiveSkeleton= +A_ToolOption_SkeletonMode%3AAnimate= +A_ToolOption_SkeletonMode%3ABuild%20Skeleton= +A_ToolOption_SkeletonMode%3AInverse%20Kinematics= +A_ToolOption_Smooth= +A_ToolOption_Snap= +A_ToolOption_Type= +A_ToolOption_Type%3AFreehand= +A_ToolOption_Type%3ANormal= +A_ToolOption_Type%3APolyline= +A_ToolOption_TypeFont= +A_ToolOption_TypeSize= +A_ToolOption_TypeStyle= +MI_ACheck= +MI_About= +MI_ActivateAllColumns= +MI_ActivateSelectedColumns= +MI_ActivateThisColumnOnly= +MI_AddFrames=Ctrl+H +MI_AddToBatchCleanupList= +MI_AddToBatchRenderList= +MI_AdjustLevels= +MI_AdjustThickness= +MI_Antialias= +MI_ApplyMatchLines= +MI_AutoFillToggle= +MI_Autocenter= +MI_Autorenumber= +MI_BCheck= +MI_Binarize= +MI_BlendColors= +MI_BlueChannel= +MI_BlueChannelGreyscale= +MI_BrightnessAndContrast= +MI_CameraSettings= +MI_CameraStage= +MI_CameraTest= +MI_CanvasSize= +MI_Cleanup= +MI_CleanupPreview= +MI_CleanupSettings= +MI_ClearRecentImage= +MI_ClearRecentLevel= +MI_ClearRecentScene= +MI_CloneChild= +MI_CloneLevel= +MI_ClonePreview= +MI_CloseChild= +MI_Collapse= +MI_CollectAssets= +MI_CompareToSnapshot= +MI_ConvertFileWithInput= +MI_ConvertFiles= +MI_ConvertToVectors= +MI_DeactivateAllColumns= +MI_DeactivateSelectedColumns=Alt+H +MI_DeactivateUpperColumns= +MI_DecreaseStep= +MI_DefineScanner= +MI_DeleteInk= +MI_DeleteMatchLines= +MI_DisableAllColumns= +MI_DisableSelectedColumns= +MI_DockingCheck= +MI_Dup= +MI_DuplicateFile= +MI_Each2= +MI_Each3= +MI_Each4= +MI_EditLevel= +MI_EditShift= +MI_EnableAllColumns=Alt+Shift+H +MI_EnableSelectedColumns= +MI_EnableThisColumnOnly= +MI_EnterGroup=Ctrl+Return +MI_EraseUnusedStyles= +MI_ExitGroup=Backspace +MI_ExplodeChild=Ctrl+B +MI_ExportLevel= +MI_ExportScenes= +MI_ExposeResource= +MI_FieldGuide="Ctrl+'" +MI_FileInfo= +MI_FillAreas= +MI_FillLines= +MI_FirstFrame=Home +MI_FoldColumns= +MI_FrezzePreview= +MI_GCheck= +MI_GetColorFromStudioPalette= +MI_GreenChannel= +MI_GreenChannelGreyscale= +MI_Histogram= +MI_ICheck= +MI_IOnly= +MI_ImportMagpieFile= +MI_ImportScenes= +MI_IncreaseStep="+" +MI_Increment= +MI_Ink1Check= +MI_InsertGlobalKeyframe= +MI_InsertSceneFrame= +MI_InvertKeyframeSelection= +MI_InvertSelection= +MI_LastFrame=End +MI_LevelSettings= +MI_LinesFade= +MI_Link= +MI_LoadColorModel= +MI_LoadFolder= +MI_LoadLevel= +MI_LoadSubSceneFile= +MI_LockAllColumns= +MI_LockSelectedColumns= +MI_LockThisColumnOnly= +MI_Loop= +MI_MatteChannel= +MI_MergeCmapped= +MI_MergeColumns= +MI_MergeFrames= +MI_NewLevel= +MI_NewOutputFx= +MI_NewProject= +MI_NextStep= +MI_NoShift= +MI_OnionSkin=Ctrl+Alt+O +MI_OpenBatchServers= +MI_OpenChild= +MI_OpenCleanupSettings= +MI_OpenColorModel= +MI_OpenComboViewer= +MI_OpenFileBrowser= +MI_OpenFileBrowser2= +MI_OpenFileViewer= +MI_OpenFilmStrip= +MI_OpenFunctionEditor=Alt+F +MI_OpenHistoryPanel= +MI_OpenLevelView= +MI_OpenPalette= +MI_OpenPltGizmo= +MI_OpenRecentScene= +MI_OpenSchematic= +MI_OpenScriptConsole= +MI_OpenStudioPalette= +MI_OpenStyleControl= +MI_OpenTMessage= +MI_OpenTasks= +MI_OpenToolOptionBar= +MI_OpenToolbar= +MI_OpenXshView= +MI_OutputSettings= +MI_OverwritePalette= +MI_PCheck= +MI_PasteColors= +MI_PasteInto= +MI_PasteNames= +MI_PasteValues= +MI_Pause= +MI_PencilTest= +MI_PickStyleAreas= +MI_PickStyleLines= +MI_Play=Return +MI_Preferences=Ctrl+U +MI_PrevStep= +MI_PreviewFx= +MI_PreviewSettings= +MI_Print= +MI_PrintXsheet= +MI_ProjectSettings= +MI_Random= +MI_RasterizePli= +MI_RedChannel= +MI_RedChannelGreyscale= +MI_Reframe1= +MI_Reframe2= +MI_Reframe3= +MI_Reframe4= +MI_RefreshTree= +MI_RegenerateFramePr= +MI_RegeneratePreview= +MI_ReloadStyle= +MI_RemoveEndpoints= +MI_RemoveGlobalKeyframe= +MI_RemoveLevel= +MI_RemoveSceneFrame= +MI_RemoveUnused= +MI_Render=Ctrl+Alt+Shift+S +MI_Renumber= +MI_ReplaceLevel= +MI_ReplaceParentDirectory= +MI_Resequence= +MI_ResetInterpolation= +MI_ResetRoomLayout= +MI_ResetScanCropbox= +MI_ResetShift= +MI_ResetStep= +MI_Reverse= +MI_RevertScene= +MI_RevertToCleanedUp= +MI_RevertToLastSaved= +MI_Rolldown= +MI_Rollup= +MI_RunScript= +MI_SafeArea= +MI_SaveAll=Ctrl+S +MI_SaveDefaultSettings= +MI_SaveLevel= +MI_SaveLevelAs= +MI_SavePaletteAs= +MI_SavePreset= +MI_SavePreviewedFrames= +MI_SaveSubxsheetAs= +MI_Scan= +MI_ScanSettings= +MI_SceneSettings=Ctrl+F3 +MI_SelectAllKeyframes= +MI_SelectAllKeyframesNotAfter= +MI_SelectAllKeyframesNotBefore= +MI_SelectColumnKeyframes= +MI_SelectFollowingKeysInColumn= +MI_SelectFollowingKeysInRow= +MI_SelectPreviousKeysInColumn= +MI_SelectPreviousKeysInRow= +MI_SelectRowKeyframes= +MI_SetAcceleration= +MI_SetConstantSpeed= +MI_SetDeceleration= +MI_SetKeyframes=Ctrl+F6 +MI_SetScanCropbox= +MI_ShiftTrace= +MI_ShortcutPopup= +MI_ShowFolderContents= +MI_Step2= +MI_Step3= +MI_Step4= +MI_SwapEnabledColumns= +MI_Swing= +MI_TCheck= +MI_TimeStretch= +MI_ToggleColumnLocks= +MI_ToggleColumnsActivation= +MI_ToggleEditInPlace= +MI_Tracking= +MI_Ungroup=Ctrl+Shift+G +MI_UnlockAllColumns=Ctrl+Alt+Shift+L +MI_UnlockSelectedColumns=Ctrl+Shift+K +MI_ViewBBox= +MI_ViewCamera= +MI_ViewColorcard= +MI_ViewFile= +MI_ViewGuide= +MI_ViewRuler=Ctrl+Alt+Shift+R +MI_ViewTable= +T_Bender= +T_Cutter=Alt+T +T_Finger= +T_Hook= +T_Iron= +T_Magnet= +T_PaintBrush= +T_Plastic= +T_Pump= +T_RGBPicker= +T_Ruler= +T_ShowHideFullScreen=F4 +T_Skeleton= +T_Tracker= +T_ZoomFit= +MI_OpenRecentLevel= diff --git a/toonz/sources/include/toonz/preferences.h b/toonz/sources/include/toonz/preferences.h index a3c5ca4f..3b32f868 100644 --- a/toonz/sources/include/toonz/preferences.h +++ b/toonz/sources/include/toonz/preferences.h @@ -415,6 +415,9 @@ public: int getTextureSize() const { return m_textureSize; } bool useDrawPixel() { return m_textureSize == 0; } + void setShortcutPreset(std::string preset); + QString getShortcutPreset() { return m_shortcutPreset; } + int getShmMax() const { return m_shmmax; } //! \sa The \p sysctl unix command. @@ -442,7 +445,8 @@ private: std::vector m_levelFormats; QString m_units, m_cameraUnits, m_scanLevelType, m_currentRoomChoice, - m_oldUnits, m_oldCameraUnits, m_ffmpegPath, m_customProjectRoot; + m_oldUnits, m_oldCameraUnits, m_ffmpegPath, m_shortcutPreset, + m_customProjectRoot; double m_defLevelWidth, m_defLevelHeight, m_defLevelDpi; diff --git a/toonz/sources/include/toonzqt/menubarcommand.h b/toonz/sources/include/toonzqt/menubarcommand.h index 869b1be6..b1b677b2 100644 --- a/toonz/sources/include/toonzqt/menubarcommand.h +++ b/toonz/sources/include/toonzqt/menubarcommand.h @@ -145,7 +145,8 @@ public: std::string getShortcutFromId(CommandId id); int getKeyFromShortcut(const std::string &shortcut); int getKeyFromId(CommandId id); - void setShortcut(QAction *action, std::string shortcutString); + void setShortcut(QAction *action, std::string shortcutString, + bool keepDefault = true); QAction *getAction(CommandId id, bool createIfNeeded = false); diff --git a/toonz/sources/toonz/mainwindow.cpp b/toonz/sources/toonz/mainwindow.cpp index f6061354..8609f34b 100644 --- a/toonz/sources/toonz/mainwindow.cpp +++ b/toonz/sources/toonz/mainwindow.cpp @@ -1558,8 +1558,8 @@ QAction *MainWindow::createToolAction(const char *id, const char *iconName, void MainWindow::defineActions() { createMenuFileAction(MI_NewScene, tr("&New Scene"), "Ctrl+N"); createMenuFileAction(MI_LoadScene, tr("&Load Scene..."), "Ctrl+L"); - createMenuFileAction(MI_SaveScene, tr("&Save Scene"), ""); - createMenuFileAction(MI_SaveSceneAs, tr("&Save Scene As..."), "Ctrl+Shift+S"); + createMenuFileAction(MI_SaveScene, tr("&Save Scene"), "Ctrl+Shift+S"); + createMenuFileAction(MI_SaveSceneAs, tr("&Save Scene As..."), ""); createMenuFileAction(MI_SaveAll, tr("&Save All"), "Ctrl+S"); createMenuFileAction(MI_RevertScene, tr("&Revert Scene"), ""); @@ -1576,7 +1576,7 @@ void MainWindow::defineActions() { ""); createMenuFileAction(MI_ClearRecentLevel, tr("&Clear Recent level File List"), ""); - createMenuFileAction(MI_NewLevel, tr("&New Level..."), ""); + createMenuFileAction(MI_NewLevel, tr("&New Level..."), "Alt+N"); createMenuFileAction(MI_LoadLevel, tr("&Load Level..."), ""); createMenuFileAction(MI_SaveLevel, tr("&Save Level"), ""); createMenuFileAction(MI_SaveAllLevels, tr("&Save All Levels"), ""); @@ -1591,9 +1591,9 @@ void MainWindow::defineActions() { createMenuFileAction(MI_ProjectSettings, tr("&Project Settings..."), ""); createMenuFileAction(MI_SaveDefaultSettings, tr("&Save Default Settings"), ""); - createMenuFileAction(MI_OutputSettings, tr("&Output Settings..."), ""); + createMenuFileAction(MI_OutputSettings, tr("&Output Settings..."), "Ctrl+O"); createMenuFileAction(MI_PreviewSettings, tr("&Preview Settings..."), ""); - createMenuFileAction(MI_Render, tr("&Render"), ""); + createMenuFileAction(MI_Render, tr("&Render"), "Ctrl+Shift+R"); createMenuFileAction(MI_Preview, tr("&Preview"), "Ctrl+R"); createRightClickMenuAction(MI_SavePreviewedFrames, tr("&Save Previewed Frames"), ""); @@ -1608,13 +1608,13 @@ void MainWindow::defineActions() { MI_FreezePreview, tr("Freeze Preview"), tr("Unfreeze Preview")); // createAction(MI_SavePreview, "&Save Preview", ""); createRightClickMenuAction(MI_SavePreset, tr("&Save As Preset"), ""); - createMenuFileAction(MI_Preferences, tr("&Preferences..."), ""); + createMenuFileAction(MI_Preferences, tr("&Preferences..."), "Ctrl+U"); createMenuFileAction(MI_ShortcutPopup, tr("&Configure Shortcuts..."), ""); createMenuFileAction(MI_PrintXsheet, tr("&Print Xsheet"), ""); createMenuFileAction("MI_RunScript", tr("Run Script..."), ""); createMenuFileAction("MI_OpenScriptConsole", tr("Open Script Console..."), ""); - createMenuFileAction(MI_Print, tr("&Print Current Frame..."), ""); + createMenuFileAction(MI_Print, tr("&Print Current Frame..."), "Ctrl+P"); createMenuFileAction(MI_Quit, tr("&Quit"), "Ctrl+Q"); #ifndef NDEBUG createMenuFileAction("MI_ReloadStyle", tr("Reload qss"), ""); @@ -1647,7 +1647,7 @@ void MainWindow::defineActions() { createMenuEditAction(MI_Clear, tr("&Delete"), "Delete"); createMenuEditAction(MI_Insert, tr("&Insert"), "Ins"); createMenuEditAction(MI_Group, tr("&Group"), "Ctrl+G"); - createMenuEditAction(MI_Ungroup, tr("&Ungroup"), ""); + createMenuEditAction(MI_Ungroup, tr("&Ungroup"), "Ctrl+Shift+G"); createMenuEditAction(MI_BringToFront, tr("&Bring to Front"), "Ctrl+]"); createMenuEditAction(MI_BringForward, tr("&Bring Forward"), "]"); createMenuEditAction(MI_SendBack, tr("&Send Back"), "Ctrl+["); @@ -1752,8 +1752,8 @@ void MainWindow::defineActions() { createMenuCellsAction(MI_Increment, tr("&Autoexpose"), ""); createMenuCellsAction(MI_Dup, tr("&Repeat..."), ""); createMenuCellsAction(MI_ResetStep, tr("&Reset Step"), ""); - createMenuCellsAction(MI_IncreaseStep, tr("&Increase Step"), ""); - createMenuCellsAction(MI_DecreaseStep, tr("&Decrease Step"), ""); + createMenuCellsAction(MI_IncreaseStep, tr("&Increase Step"), "'"); + createMenuCellsAction(MI_DecreaseStep, tr("&Decrease Step"), ";"); createMenuCellsAction(MI_Step2, tr("&Step 2"), ""); createMenuCellsAction(MI_Step3, tr("&Step 3"), ""); createMenuCellsAction(MI_Step4, tr("&Step 4"), ""); @@ -1767,26 +1767,26 @@ void MainWindow::defineActions() { createMenuCellsAction(MI_Autorenumber, tr("&Autorenumber"), ""); createMenuCellsAction(MI_CloneLevel, tr("&Clone"), ""); createMenuCellsAction(MI_DrawingSubForward, - tr("Drawing Substitution Forward"), "."); + tr("Drawing Substitution Forward"), "W"); createMenuCellsAction(MI_DrawingSubBackward, - tr("Drawing Substitution Backward"), ","); + tr("Drawing Substitution Backward"), "Q"); createMenuCellsAction(MI_DrawingSubGroupForward, - tr("Similar Drawing Substitution Forward"), "Ctrl+."); + tr("Similar Drawing Substitution Forward"), "Alt+W"); createMenuCellsAction(MI_DrawingSubGroupBackward, - tr("Similar Drawing Substitution Backward"), "Ctrl+,"); + tr("Similar Drawing Substitution Backward"), "Alt+Q"); createMenuCellsAction(MI_Reframe1, tr("1's"), ""); createMenuCellsAction(MI_Reframe2, tr("2's"), ""); createMenuCellsAction(MI_Reframe3, tr("3's"), ""); createMenuCellsAction(MI_Reframe4, tr("4's"), ""); - createRightClickMenuAction(MI_SetKeyframes, tr("&Set Key"), ""); + createRightClickMenuAction(MI_SetKeyframes, tr("&Set Key"), "Z"); createToggle(MI_ViewCamera, tr("&Camera Box"), "", ViewCameraToggleAction ? 1 : 0, MenuViewCommandType); createToggle(MI_ViewTable, tr("&Table"), "", ViewTableToggleAction ? 1 : 0, MenuViewCommandType); - createToggle(MI_FieldGuide, tr("&Field Guide"), "", + createToggle(MI_FieldGuide, tr("&Field Guide"), "Shift+G", FieldGuideToggleAction ? 1 : 0, MenuViewCommandType); createToggle(MI_ViewBBox, tr("&Raster Bounding Box"), "", ViewBBoxToggleAction ? 1 : 0, MenuViewCommandType); @@ -1845,18 +1845,16 @@ void MainWindow::defineActions() { createToggle(MI_Link, tr("Link Flipbooks"), "", LinkToggleAction ? 1 : 0, MenuViewCommandType); - createPlaybackAction(MI_Play, tr("Play"), ""); - createPlaybackAction(MI_Loop, tr("Loop"), ""); + createPlaybackAction(MI_Play, tr("Play"), "P"); + createPlaybackAction(MI_Loop, tr("Loop"), "L"); createPlaybackAction(MI_Pause, tr("Pause"), ""); - createPlaybackAction(MI_FirstFrame, tr("First Frame"), ""); - createPlaybackAction(MI_LastFrame, tr("Last Frame"), ""); - createPlaybackAction(MI_PrevFrame, tr("Previous Frame"), "Shift+A"); - createPlaybackAction(MI_NextFrame, tr("Next Frame"), "Shift+S"); + createPlaybackAction(MI_FirstFrame, tr("First Frame"), "Alt+,"); + createPlaybackAction(MI_LastFrame, tr("Last Frame"), "Alt+."); + createPlaybackAction(MI_PrevFrame, tr("Previous Frame"), "Shift+,"); + createPlaybackAction(MI_NextFrame, tr("Next Frame"), "Shift+."); - createAction(MI_NextDrawing, tr("Next Drawing"), "Shift+X", - PlaybackCommandType); - createAction(MI_PrevDrawing, tr("Prev Drawing"), "Shift+Z", - PlaybackCommandType); + createAction(MI_NextDrawing, tr("Next Drawing"), ".", PlaybackCommandType); + createAction(MI_PrevDrawing, tr("Prev Drawing"), ",", PlaybackCommandType); createAction(MI_NextStep, tr("Next Step"), "", PlaybackCommandType); createAction(MI_PrevStep, tr("Prev Step"), "", PlaybackCommandType); @@ -1871,7 +1869,7 @@ void MainWindow::defineActions() { createViewerAction(MI_CompareToSnapshot, tr("Compare to Snapshot"), ""); createFillAction(MI_AutoFillToggle, - tr("Toggle Autofill on Current Palette Color"), ""); + tr("Toggle Autofill on Current Palette Color"), "Shift+A"); toggle = createToggle(MI_DockingCheck, tr("&Lock Room Panes"), "", @@ -1913,7 +1911,7 @@ void MainWindow::defineActions() { // createAction(MI_Export, "Export", "Ctrl+E"); createMenuWindowsAction(MI_OpenComboViewer, tr("&ComboViewer"), ""); - createMenuWindowsAction(MI_OpenHistoryPanel, tr("&History"), ""); + createMenuWindowsAction(MI_OpenHistoryPanel, tr("&History"), "Ctrl+H"); createMenuWindowsAction(MI_ResetRoomLayout, tr("&Reset to Default Rooms"), ""); @@ -1925,7 +1923,7 @@ void MainWindow::defineActions() { createRightClickMenuAction(MI_BlendColors, tr("&Blend colors"), ""); - createToggle(MI_OnionSkin, tr("Onion Skin Toggle"), "//", false, + createToggle(MI_OnionSkin, tr("Onion Skin Toggle"), "/", false, RightClickMenuCommandType); createToggle(MI_ZeroThick, tr("Zero Thick Lines"), "Shift+/", false, RightClickMenuCommandType); @@ -1996,12 +1994,16 @@ void MainWindow::defineActions() { createRightClickMenuAction(MI_DisableAllColumns, tr("OFF All"), ""); createRightClickMenuAction(MI_DisableSelectedColumns, tr("OFF Selected"), ""); createRightClickMenuAction(MI_SwapEnabledColumns, tr("Swap ON/OFF"), ""); - createRightClickMenuAction(MI_LockThisColumnOnly, tr("Lock This Only"), ""); - createRightClickMenuAction(MI_LockSelectedColumns, tr("Lock Selected"), ""); - createRightClickMenuAction(MI_LockAllColumns, tr("Lock All"), ""); + createRightClickMenuAction(MI_LockThisColumnOnly, tr("Lock This Only"), + "Shift+L"); + createRightClickMenuAction(MI_LockSelectedColumns, tr("Lock Selected"), + "Ctrl+Shift+L"); + createRightClickMenuAction(MI_LockAllColumns, tr("Lock All"), + "Ctrl+Alt+Shift+L"); createRightClickMenuAction(MI_UnlockSelectedColumns, tr("Unlock Selected"), - ""); - createRightClickMenuAction(MI_UnlockAllColumns, tr("Unlock All"), ""); + "Ctrl+Shift+U"); + createRightClickMenuAction(MI_UnlockAllColumns, tr("Unlock All"), + "Ctrl+Alt+Shift+U"); createRightClickMenuAction(MI_ToggleColumnLocks, tr("Swap Lock/Unlock"), ""); /*-- カレントカラムの右側のカラムを全て非表示にするコマンド --*/ createRightClickMenuAction(MI_DeactivateUpperColumns, @@ -2017,31 +2019,32 @@ void MainWindow::defineActions() { createToolAction(T_Eraser, "eraser", tr("Eraser Tool"), "A"); createToolAction(T_Tape, "tape", tr("Tape Tool"), "T"); createToolAction(T_StylePicker, "stylepicker", tr("Style Picker Tool"), "K"); - createToolAction(T_RGBPicker, "RGBpicker", tr("RGB Picker Tool"), ""); + createToolAction(T_RGBPicker, "RGBpicker", tr("RGB Picker Tool"), "R"); createToolAction(T_ControlPointEditor, "controlpointeditor", tr("Control Point Editor Tool"), "C"); - createToolAction(T_Pinch, "pinch", tr("Pinch Tool"), "P"); + createToolAction(T_Pinch, "pinch", tr("Pinch Tool"), "M"); createToolAction(T_Pump, "pump", tr("Pump Tool"), ""); createToolAction(T_Magnet, "magnet", tr("Magnet Tool"), ""); createToolAction(T_Bender, "bender", tr("Bender Tool"), ""); createToolAction(T_Iron, "iron", tr("Iron Tool"), ""); createToolAction(T_Cutter, "cutter", tr("Cutter Tool"), ""); - createToolAction(T_Skeleton, "skeleton", tr("Skeleton Tool"), ""); + createToolAction(T_Skeleton, "skeleton", tr("Skeleton Tool"), "V"); createToolAction(T_Tracker, "tracker", tr("Tracker Tool"), ""); - createToolAction(T_Hook, "hook", tr("Hook Tool"), ""); + createToolAction(T_Hook, "hook", tr("Hook Tool"), "O"); createToolAction(T_Zoom, "zoom", tr("Zoom Tool"), "Shift+Space"); createToolAction(T_Rotate, "rotate", tr("Rotate Tool"), "Ctrl+Space"); createToolAction(T_Hand, "hand", tr("Hand Tool"), "Space"); - createToolAction(T_Plastic, "plastic", tr("Plastic Tool"), ""); + createToolAction(T_Plastic, "plastic", tr("Plastic Tool"), "X"); createToolAction(T_Ruler, "ruler", tr("Ruler Tool"), ""); createToolAction(T_Finger, "finger", tr("Finger Tool"), ""); createViewerAction(V_ZoomIn, tr("Zoom In"), "+"); createViewerAction(V_ZoomOut, tr("Zoom Out"), "-"); createViewerAction(V_ZoomReset, tr("Reset View"), "0"); - createViewerAction(V_ZoomFit, tr("Fit to Window"), ""); + createViewerAction(V_ZoomFit, tr("Fit to Window"), "9"); createViewerAction(V_ActualPixelSize, tr("Actual Pixel Size"), "N"); - createViewerAction(V_ShowHideFullScreen, tr("Show//Hide Full Screen"), ""); + createViewerAction(V_ShowHideFullScreen, tr("Show//Hide Full Screen"), + "Alt+F"); CommandManager::instance()->setToggleTexts(V_ShowHideFullScreen, tr("Full Screen Mode"), tr("Exit Full Screen Mode")); @@ -2051,13 +2054,13 @@ void MainWindow::defineActions() { createToolOptionsAction("A_ToolOption_GlobalKey", tr("Global Key"), ""); createToolOptionsAction("A_IncreaseMaxBrushThickness", - tr("Brush size - Increase max"), ""); + tr("Brush size - Increase max"), "I"); createToolOptionsAction("A_DecreaseMaxBrushThickness", - tr("Brush size - Decrease max"), ""); + tr("Brush size - Decrease max"), "U"); createToolOptionsAction("A_IncreaseMinBrushThickness", - tr("Brush size - Increase min"), ""); + tr("Brush size - Increase min"), "J"); createToolOptionsAction("A_DecreaseMinBrushThickness", - tr("Brush size - Decrease min"), ""); + tr("Brush size - Decrease min"), "H"); createToolOptionsAction("A_IncreaseBrushHardness", tr("Brush hardness - Increase"), ""); createToolOptionsAction("A_DecreaseBrushHardness", @@ -2076,7 +2079,7 @@ void MainWindow::defineActions() { createToolOptionsAction("A_ToolOption_PreserveThickness", tr("Preserve Thickness"), ""); createToolOptionsAction("A_ToolOption_PressureSensitivity", - tr("Pressure Sensitivity"), ""); + tr("Pressure Sensitivity"), "Shift+P"); createToolOptionsAction("A_ToolOption_SegmentInk", tr("Segment Ink"), "F8"); createToolOptionsAction("A_ToolOption_Selective", tr("Selective"), "F7"); createToolOptionsAction("A_ToolOption_Smooth", tr("Smooth"), ""); diff --git a/toonz/sources/toonz/shortcutpopup.cpp b/toonz/sources/toonz/shortcutpopup.cpp index 911a11f8..dda5bc8f 100644 --- a/toonz/sources/toonz/shortcutpopup.cpp +++ b/toonz/sources/toonz/shortcutpopup.cpp @@ -5,8 +5,13 @@ // Tnz6 includes #include "menubarcommandids.h" #include "tapp.h" +#include "tenv.h" +#include "tsystem.h" +#include "toonz/preferences.h" +#include "toonz/toonzfolders.h" // TnzQt includes +#include "toonzqt/gutil.h" #include "toonzqt/menubarcommand.h" #include "toonzqt/dvdialog.h" @@ -24,6 +29,9 @@ #include #include #include +#include +#include +#include // STD includes #include @@ -155,7 +163,7 @@ void ShortcutViewer::keyPressEvent(QKeyEvent *event) { void ShortcutViewer::removeShortcut() { if (m_action) { - CommandManager::instance()->setShortcut(m_action, ""); + CommandManager::instance()->setShortcut(m_action, "", false); emit shortcutChanged(); update(); } @@ -339,14 +347,32 @@ void ShortcutTree::onShortcutChanged() { ShortcutPopup::ShortcutPopup() : Dialog(TApp::instance()->getMainWindow(), false, false, "Shortcut") { setWindowTitle(tr("Configure Shortcuts")); + m_presetChoiceCB = new QComboBox(this); + buildPresets(); + m_presetChoiceCB->setCurrentIndex(0); m_list = new ShortcutTree(this); m_list->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); m_list->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); m_list->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); - m_sViewer = new ShortcutViewer(this); - m_removeBtn = new QPushButton(tr("Remove"), this); + m_sViewer = new ShortcutViewer(this); + m_removeBtn = new QPushButton(tr("Remove"), this); + m_loadShortcutsPopup = NULL; + m_saveShortcutsPopup = NULL; + m_dialog = NULL; + m_exportButton = new QPushButton(tr("Export Current Shortcuts"), this); + m_exportButton->setToolTip(tr("Export Current Shortcuts")); + m_deletePresetButton = new QPushButton("Delete", this); + m_deletePresetButton->setToolTip(tr("Delete Current Preset")); + m_deletePresetButton->setIcon(QIcon(":Resources/delete_on.png")); + m_savePresetButton = new QPushButton("Save As", this); + m_savePresetButton->setToolTip(tr("Save Current Shortcuts as New Preset")); + m_savePresetButton->setIcon(QIcon(":Resources/saveas_on.png")); + m_loadPresetButton = new QPushButton(tr("Apply")); + m_loadPresetButton->setToolTip(tr("Use selected preset as shortcuts")); + m_loadPresetButton->setIcon(QIcon(":Resources/green.png")); + m_clearAllShortcutsButton = new QPushButton(tr("Clear All Shortcuts")); QLabel *noSearchResultLabel = new QLabel(tr("Couldn't find any matching command."), this); noSearchResultLabel->setHidden(true); @@ -383,6 +409,28 @@ ShortcutPopup::ShortcutPopup() bottomLayout->addWidget(m_removeBtn, 0); } m_topLayout->addLayout(bottomLayout, 0); + m_topLayout->addSpacing(10); + QHBoxLayout *presetLay = new QHBoxLayout(); + presetLay->setMargin(0); + presetLay->setSpacing(5); + { + presetLay->addWidget(new QLabel("Preset:", this), 0); + presetLay->addWidget(m_presetChoiceCB, 1); + presetLay->addWidget(m_loadPresetButton, 0); + presetLay->addWidget(m_savePresetButton, 0); + presetLay->addWidget(m_deletePresetButton, 0); + } + m_topLayout->addLayout(presetLay, 0); + m_topLayout->addSpacing(10); + QHBoxLayout *exportLay = new QHBoxLayout(); + exportLay->setMargin(0); + exportLay->setSpacing(5); + { + exportLay->addWidget(m_exportButton, 0); + exportLay->addWidget(m_clearAllShortcutsButton, 0); + } + m_topLayout->addLayout(exportLay, 0); + // m_topLayout->addWidget(m_exportButton, 0); } connect(m_list, SIGNAL(actionSelected(QAction *)), m_sViewer, @@ -397,6 +445,14 @@ ShortcutPopup::ShortcutPopup() SLOT(setHidden(bool))); connect(searchEdit, SIGNAL(textChanged(const QString &)), this, SLOT(onSearchTextChanged(const QString &))); + connect(m_presetChoiceCB, SIGNAL(currentIndexChanged(int)), + SLOT(onPresetChanged(int))); + connect(m_exportButton, SIGNAL(clicked()), SLOT(onExportButton())); + connect(m_deletePresetButton, SIGNAL(clicked()), SLOT(onDeletePreset())); + connect(m_savePresetButton, SIGNAL(clicked()), SLOT(onSavePreset())); + connect(m_loadPresetButton, SIGNAL(clicked()), SLOT(onLoadPreset())); + connect(m_clearAllShortcutsButton, SIGNAL(clicked()), + SLOT(clearAllShortcuts())); } //----------------------------------------------------------------------------- @@ -415,4 +471,324 @@ void ShortcutPopup::onSearchTextChanged(const QString &text) { //----------------------------------------------------------------------------- +void ShortcutPopup::onPresetChanged(int index) { + if (m_presetChoiceCB->currentText() == "Load from file...") { + importPreset(); + } +} + +//----------------------------------------------------------------------------- + +void ShortcutPopup::clearAllShortcuts(bool warning) { + if (warning) { + QString question(tr("This will erase ALL shortcuts. Continue?")); + int ret = + DVGui::MsgBox(question, QObject::tr("OK"), QObject::tr("Cancel"), 0); + if (ret == 0 || ret == 2) { + // cancel (or closed message box window) + return; + } + showDialog("Clearing All Shortcuts"); + } + for (int commandType = UndefinedCommandType; commandType <= MenuCommandType; + commandType++) { + std::vector actions; + CommandManager::instance()->getActions((CommandType)commandType, actions); + for (QAction *action : actions) { + qApp->processEvents(); + m_sViewer->setAction(action); + m_sViewer->removeShortcut(); + } + } + setCurrentPresetPref("DELETED"); + // if warning is true, this was called directly- need to hide the dialog after + if (warning) m_dialog->hide(); +} + +//----------------------------------------------------------------------------- + +void ShortcutPopup::setPresetShortcuts(TFilePath fp) { + QSettings preset(toQString(fp), QSettings::IniFormat); + preset.beginGroup("shortcuts"); + QStringList allIds = preset.allKeys(); + QAction *action; + for (QString id : allIds) { + QByteArray ba = id.toLatin1(); + const char *charId = ba.data(); + action = CommandManager::instance()->getAction((CommandId)charId); + CommandManager::instance()->setShortcut( + action, preset.value(id).toString().toStdString(), false); + } + preset.endGroup(); + emit m_sViewer->shortcutChanged(); + m_dialog->hide(); + buildPresets(); + setCurrentPresetPref(QString::fromStdString(fp.getName())); +} + +//----------------------------------------------------------------------------- + +bool ShortcutPopup::showConfirmDialog() { + QString question(tr("This will overwrite all current shortcuts. Continue?")); + int ret = + DVGui::MsgBox(question, QObject::tr("OK"), QObject::tr("Cancel"), 0); + if (ret == 0 || ret == 2) { + // cancel (or closed message box window) + return false; + } else + return true; +} + +//----------------------------------------------------------------------------- + +bool ShortcutPopup::showOverwriteDialog(QString name) { + QString question(tr("A file named ") + name + + tr(" already exists. Do you want to replace it?")); + int ret = DVGui::MsgBox(question, QObject::tr("Yes"), QObject::tr("No"), 0); + if (ret == 0 || ret == 2) { + // cancel (or closed message box window) + return false; + } else + return true; +} + +//----------------------------------------------------------------------------- + +void ShortcutPopup::showDialog(QString text) { + if (m_dialog == NULL) { + m_dialogLabel = new QLabel("", this); + m_dialog = new DVGui::Dialog(this, false, false); + m_dialog->setWindowTitle(tr("OpenToonz - Setting Shortcuts")); + m_dialog->setModal(false); + + m_dialog->setTopMargin(10); + m_dialog->setTopSpacing(10); + m_dialog->setLabelWidth(500); + m_dialog->beginVLayout(); + m_dialog->addWidget(m_dialogLabel, false); + m_dialog->endVLayout(); + } + m_dialogLabel->setText(text); + m_dialog->show(); +} + +//----------------------------------------------------------------------------- + +void ShortcutPopup::onExportButton(TFilePath fp) { + if (fp == TFilePath()) { + m_saveShortcutsPopup = new GenericSaveFilePopup("Save Current Shortcuts"); + m_saveShortcutsPopup->addFilterType("ini"); + fp = m_saveShortcutsPopup->getPath(); + if (fp == TFilePath()) return; + } + showDialog("Saving Shortcuts"); + QString shortcutString = "[shortcuts]\n"; + for (int commandType = UndefinedCommandType; commandType <= MenuCommandType; + commandType++) { + std::vector actions; + CommandManager::instance()->getActions((CommandType)commandType, actions); + for (QAction *action : actions) { + qApp->processEvents(); + std::string id = CommandManager::instance()->getIdFromAction(action); + std::string shortcut = + CommandManager::instance()->getShortcutFromAction(action); + if (shortcut != "") { + shortcutString = shortcutString + QString::fromStdString(id) + "=" + + QString::fromStdString(shortcut) + "\n"; + } + } + } + QFile file(fp.getQString()); + file.open(QIODevice::WriteOnly | QIODevice::Text); + QTextStream out(&file); + out << shortcutString; + file.close(); + m_dialog->hide(); +} + +//----------------------------------------------------------------------------- + +void ShortcutPopup::onDeletePreset() { + // change this to 4 once RETAS shortcuts are updated + if (m_presetChoiceCB->currentIndex() <= 3) { + DVGui::MsgBox(DVGui::CRITICAL, tr("Included presets cannot be deleted.")); + return; + } + + QString question(tr("Are you sure you want to delete the preset: ") + + m_presetChoiceCB->currentText() + tr("?")); + int ret = DVGui::MsgBox(question, QObject::tr("Yes"), QObject::tr("No"), 0); + if (ret == 0 || ret == 2) { + // cancel (or closed message box window) + return; + } + TFilePath presetDir = + ToonzFolder::getMyModuleDir() + TFilePath("shortcutpresets"); + QString presetName = m_presetChoiceCB->currentText(); + if (TSystem::doesExistFileOrLevel(presetDir + + TFilePath(presetName + ".ini"))) { + TSystem::deleteFile(presetDir + TFilePath(presetName + ".ini")); + buildPresets(); + m_presetChoiceCB->setCurrentIndex(0); + } + if (Preferences::instance()->getShortcutPreset() == presetName) + setCurrentPresetPref("DELETED"); + getCurrentPresetPref(); +} + +//----------------------------------------------------------------------------- + +void ShortcutPopup::importPreset() { + m_loadShortcutsPopup = new GenericLoadFilePopup("Load Shortcuts File"); + m_loadShortcutsPopup->addFilterType("ini"); + TFilePath shortcutPath = m_loadShortcutsPopup->getPath(); + if (shortcutPath == TFilePath()) { + m_presetChoiceCB->setCurrentIndex(0); + return; + } + if (!showConfirmDialog()) return; + + TFilePath presetDir = + ToonzFolder::getMyModuleDir() + TFilePath("shortcutpresets"); + if (!TSystem::doesExistFileOrLevel(presetDir)) { + TSystem::mkDir(presetDir); + } + QString name = shortcutPath.withoutParentDir().getQString(); + std::string strName = name.toStdString(); + if (TSystem::doesExistFileOrLevel(presetDir + TFilePath(name))) { + if (!showOverwriteDialog(name)) return; + } + showDialog("Importing Shortcuts"); + TSystem::copyFile(presetDir + TFilePath(name), shortcutPath, true); + clearAllShortcuts(false); + setPresetShortcuts(presetDir + TFilePath(name)); + return; +} + +//----------------------------------------------------------------------------- + +void ShortcutPopup::onLoadPreset() { + QString preset = m_presetChoiceCB->currentText(); + TFilePath presetDir = + ToonzFolder::getMyModuleDir() + TFilePath("shortcutpresets"); + TFilePath defaultPresetDir = + ToonzFolder::getProfileFolder() + TFilePath("layouts/shortcuts"); + if (preset == "") return; + if (preset == "Load from file...") { + importPreset(); + return; + } + + if (!showConfirmDialog()) return; + showDialog("Setting Shortcuts"); + if (preset == "OpenToonz") { + clearAllShortcuts(false); + TFilePath fp = defaultPresetDir + TFilePath("defopentoonz.ini"); + setPresetShortcuts(fp); + return; + } else if (preset == "Toon Boom Harmony") { + clearAllShortcuts(false); + TFilePath fp = defaultPresetDir + TFilePath("otharmony.ini"); + setPresetShortcuts(fp); + return; + } else if (preset == "Adobe Animate(Flash)") { + clearAllShortcuts(false); + TFilePath fp = defaultPresetDir + TFilePath("otadobe.ini"); + setPresetShortcuts(fp); + return; + } else if (preset == "RETAS PaintMan") { + clearAllShortcuts(false); + TFilePath fp = defaultPresetDir + TFilePath("otretas.ini"); + setPresetShortcuts(fp); + return; + } else if (TSystem::doesExistFileOrLevel(presetDir + + TFilePath(preset + ".ini"))) { + clearAllShortcuts(false); + TFilePath fp = presetDir + TFilePath(preset + ".ini"); + setPresetShortcuts(fp); + return; + } + m_dialog->hide(); +} + +//----------------------------------------------------------------------------- + +QStringList ShortcutPopup::buildPresets() { + QStringList presets; + presets << "" + << "OpenToonz" + //<< "RETAS PaintMan" + << "Toon Boom Harmony" + << "Adobe Animate(Flash)"; + TFilePath presetDir = + ToonzFolder::getMyModuleDir() + TFilePath("shortcutpresets"); + if (TSystem::doesExistFileOrLevel(presetDir)) { + TFilePathSet fps = TSystem::readDirectory(presetDir, true, true, false); + QStringList customPresets; + for (TFilePath fp : fps) { + if (fp.getType() == "ini") { + customPresets << QString::fromStdString(fp.getName()); + std::string name = fp.getName(); + } + } + customPresets.sort(); + presets = presets + customPresets; + } + presets << tr("Load from file..."); + m_presetChoiceCB->clear(); + m_presetChoiceCB->addItems(presets); + return presets; +} + +//----------------------------------------------------------------------------- + +void ShortcutPopup::onSavePreset() { + QString presetName = DVGui::getText("Enter Preset Name", "Preset Name:", ""); + if (presetName == "") return; + TFilePath presetDir = + ToonzFolder::getMyModuleDir() + TFilePath("shortcutpresets"); + if (!TSystem::doesExistFileOrLevel(presetDir)) { + TSystem::mkDir(presetDir); + } + TFilePath fp; + fp = presetDir + TFilePath(presetName + ".ini"); + if (TSystem::doesExistFileOrLevel(fp)) { + if (!showOverwriteDialog(QString::fromStdString(fp.getName()))) return; + } + onExportButton(fp); + + buildPresets(); + setCurrentPresetPref(presetName); +} + +//----------------------------------------------------------------------------- + +void ShortcutPopup::showEvent(QShowEvent *se) { getCurrentPresetPref(); } + +//----------------------------------------------------------------------------- + +void ShortcutPopup::setCurrentPresetPref(QString name) { + Preferences::instance()->setShortcutPreset(name.toStdString()); + getCurrentPresetPref(); +} + +//----------------------------------------------------------------------------- + +void ShortcutPopup::getCurrentPresetPref() { + QString name = Preferences::instance()->getShortcutPreset(); + if (name == "DELETED") + m_presetChoiceCB->setCurrentText(""); + else if (name == "defopentoonz") + m_presetChoiceCB->setCurrentText("OpenToonz"); + else if (name == "otharmony") + m_presetChoiceCB->setCurrentText("Toon Boom Harmony"); + else if (name == "otadobe") + m_presetChoiceCB->setCurrentText("Adobe Animate(Flash)"); + else if (name == "otretas") + m_presetChoiceCB->setCurrentText("RETAS PaintMan"); + + else + m_presetChoiceCB->setCurrentText(name); +} + OpenPopupCommandHandler openShortcutPopup(MI_ShortcutPopup); diff --git a/toonz/sources/toonz/shortcutpopup.h b/toonz/sources/toonz/shortcutpopup.h index 2044ac6d..142d04fa 100644 --- a/toonz/sources/toonz/shortcutpopup.h +++ b/toonz/sources/toonz/shortcutpopup.h @@ -5,7 +5,8 @@ #include #include - +#include +#include "filebrowserpopup.h" #include "toonzqt/dvdialog.h" // forward declaration @@ -92,13 +93,40 @@ class ShortcutPopup final : public DVGui::Dialog { QPushButton *m_removeBtn; ShortcutViewer *m_sViewer; ShortcutTree *m_list; + QComboBox *m_presetChoiceCB; + DVGui::Dialog *m_dialog; + GenericLoadFilePopup *m_loadShortcutsPopup; + GenericSaveFilePopup *m_saveShortcutsPopup; + QPushButton *m_exportButton; + QPushButton *m_deletePresetButton; + QPushButton *m_savePresetButton; + QPushButton *m_loadPresetButton; + QPushButton *m_clearAllShortcutsButton; + QLabel *m_dialogLabel; public: ShortcutPopup(); ~ShortcutPopup(); +private: + void setPresetShortcuts(TFilePath fp); + void showDialog(QString text); + bool showConfirmDialog(); + bool showOverwriteDialog(QString name); + void importPreset(); + QStringList buildPresets(); + void showEvent(QShowEvent *se) override; + void setCurrentPresetPref(QString preset); + void getCurrentPresetPref(); + protected slots: + void clearAllShortcuts(bool warning = true); void onSearchTextChanged(const QString &text); + void onPresetChanged(int index); + void onExportButton(TFilePath fp = TFilePath()); + void onDeletePreset(); + void onSavePreset(); + void onLoadPreset(); }; #endif // SHORTCUTPOPUP_H diff --git a/toonz/sources/toonzlib/preferences.cpp b/toonz/sources/toonzlib/preferences.cpp index 6545e517..2418bc85 100644 --- a/toonz/sources/toonzlib/preferences.cpp +++ b/toonz/sources/toonzlib/preferences.cpp @@ -292,7 +292,8 @@ Preferences::Preferences() , m_projectRoot(0x08) , m_customProjectRoot("") , m_precompute(true) - , m_ffmpegTimeout(30) { + , m_ffmpegTimeout(30) + , m_shortcutPreset("defopentoonz") { TCamera camera; m_defLevelType = PLI_XSHLEVEL; m_defLevelWidth = camera.getSize().lx; @@ -557,6 +558,9 @@ Preferences::Preferences() if (ffmpegPath != "") m_ffmpegPath = ffmpegPath; setFfmpegPath(m_ffmpegPath.toStdString()); getValue(*m_settings, "ffmpegTimeout", m_ffmpegTimeout); + QString shortcutPreset = m_settings->value("shortcutPreset").toString(); + if (shortcutPreset != "") m_shortcutPreset = shortcutPreset; + setShortcutPreset(m_shortcutPreset.toStdString()); } //----------------------------------------------------------------- @@ -1242,6 +1246,13 @@ void Preferences::setFfmpegPath(std::string path) { //----------------------------------------------------------------- +void Preferences::setShortcutPreset(std::string preset) { + m_shortcutPreset = QString::fromStdString(preset); + m_settings->setValue("shortcutPreset", m_shortcutPreset); +} + +//----------------------------------------------------------------- + void Preferences::setPrecompute(bool enabled) { m_precompute = enabled; } //----------------------------------------------------------------- diff --git a/toonz/sources/toonzqt/menubarcommand.cpp b/toonz/sources/toonzqt/menubarcommand.cpp index 5e9612f5..723cfda5 100644 --- a/toonz/sources/toonzqt/menubarcommand.cpp +++ b/toonz/sources/toonzqt/menubarcommand.cpp @@ -279,7 +279,8 @@ int CommandManager::getKeyFromId(const char *id) { //--------------------------------------------------------- -void CommandManager::setShortcut(QAction *action, std::string shortcutString) { +void CommandManager::setShortcut(QAction *action, std::string shortcutString, + bool keepDefault) { QString shortcut = QString::fromStdString(shortcutString); std::string oldShortcutString = action->shortcut().toString().toStdString(); @@ -296,7 +297,7 @@ void CommandManager::setShortcut(QAction *action, std::string shortcutString) { if (node->m_type == ZoomCommandType && ks.count() > 1) { DVGui::warning( - QObject::tr("It is not possible to assing a shortcut with modifiers to " + QObject::tr("It is not possible to assign a shortcut with modifiers to " "the visualization commands.")); return; } @@ -328,7 +329,9 @@ void CommandManager::setShortcut(QAction *action, std::string shortcutString) { settings.beginGroup("shortcuts"); settings.setValue(QString::fromStdString(node->m_id), QString::fromStdString(shortcutString)); - if (oldActionId != "") settings.remove(oldActionId); + if (keepDefault) { + if (oldActionId != "") settings.remove(oldActionId); + } settings.endGroup(); } From db5f54040cd95320ad8ecb531d6add7697cdfb67 Mon Sep 17 00:00:00 2001 From: shun_iwasawa Date: Thu, 13 Oct 2016 18:55:22 +0900 Subject: [PATCH 28/56] locator popup --- toonz/sources/include/toonzqt/flipconsole.h | 3 +- toonz/sources/tnztools/brushtool.cpp | 2 + toonz/sources/tnztools/vectorerasertool.cpp | 2 + toonz/sources/toonz/CMakeLists.txt | 2 + toonz/sources/toonz/Resources/locator.png | Bin 0 -> 17965 bytes .../sources/toonz/Resources/locator_click.png | Bin 0 -> 17951 bytes .../sources/toonz/Resources/locator_over.png | Bin 0 -> 17951 bytes toonz/sources/toonz/colormodelviewer.cpp | 2 +- toonz/sources/toonz/flipbook.h | 3 +- toonz/sources/toonz/locatorpopup.cpp | 117 ++++++++++++++++++ toonz/sources/toonz/locatorpopup.h | 34 +++++ toonz/sources/toonz/magpiefileimportpopup.cpp | 2 +- toonz/sources/toonz/sceneviewer.cpp | 19 ++- toonz/sources/toonz/sceneviewer.h | 6 + toonz/sources/toonz/sceneviewerevents.cpp | 15 +++ toonz/sources/toonz/toonz.qrc | 3 + toonz/sources/toonzqt/flipconsole.cpp | 12 +- 17 files changed, 210 insertions(+), 12 deletions(-) create mode 100644 toonz/sources/toonz/Resources/locator.png create mode 100644 toonz/sources/toonz/Resources/locator_click.png create mode 100644 toonz/sources/toonz/Resources/locator_over.png create mode 100644 toonz/sources/toonz/locatorpopup.cpp create mode 100644 toonz/sources/toonz/locatorpopup.h diff --git a/toonz/sources/include/toonzqt/flipconsole.h b/toonz/sources/include/toonzqt/flipconsole.h index f7d54e63..5e7c32ae 100644 --- a/toonz/sources/include/toonzqt/flipconsole.h +++ b/toonz/sources/include/toonzqt/flipconsole.h @@ -214,7 +214,8 @@ public: eFilledRaster = 0x4000000, // Used only in LineTest eDefineLoadBox = 0x8000000, eUseLoadBox = 0x10000000, - eEnd = 0x20000000 + eLocator = 0x20000000, + eEnd = 0x40000000 }; static const UINT cFullConsole = eEnd - 1; diff --git a/toonz/sources/tnztools/brushtool.cpp b/toonz/sources/tnztools/brushtool.cpp index 3272da2f..84599e9a 100644 --- a/toonz/sources/tnztools/brushtool.cpp +++ b/toonz/sources/tnztools/brushtool.cpp @@ -1688,6 +1688,8 @@ void BrushTool::draw() { } else { tglDrawCircle(m_brushPos, 0.5 * m_minThick); tglDrawCircle(m_brushPos, 0.5 * m_maxThick); + std::cout << "BRUSH m_brushPos = " << m_brushPos.x << ", " << m_brushPos.y + << std::endl; } } diff --git a/toonz/sources/tnztools/vectorerasertool.cpp b/toonz/sources/tnztools/vectorerasertool.cpp index 18d75023..a1c8c54d 100644 --- a/toonz/sources/tnztools/vectorerasertool.cpp +++ b/toonz/sources/tnztools/vectorerasertool.cpp @@ -427,6 +427,8 @@ void EraserTool::draw() { if (m_eraseType.getValue() == NORMAL_ERASE) { tglColor(TPixel32(255, 0, 255)); tglDrawCircle(m_brushPos, m_pointSize); + std::cout << "ERASER m_brushPos = " << m_brushPos.x << ", " + << m_brushPos.y << std::endl; } if ((m_eraseType.getValue() == FREEHAND_ERASE || m_eraseType.getValue() == POLYLINE_ERASE) && diff --git a/toonz/sources/toonz/CMakeLists.txt b/toonz/sources/toonz/CMakeLists.txt index 41ff9b35..2f6670fd 100644 --- a/toonz/sources/toonz/CMakeLists.txt +++ b/toonz/sources/toonz/CMakeLists.txt @@ -140,6 +140,7 @@ set(MOC_HEADERS historypane.h cleanupsettingspane.h penciltestpopup.h + locatorpopup.h # Tracker file dummyprocessor.h metnum.h @@ -298,6 +299,7 @@ set(SOURCES historypane.cpp cleanupsettingspane.cpp penciltestpopup.cpp + locatorpopup.cpp # Tracker file dummyprocessor.cpp metnum.cpp diff --git a/toonz/sources/toonz/Resources/locator.png b/toonz/sources/toonz/Resources/locator.png new file mode 100644 index 0000000000000000000000000000000000000000..439df635825289980146e046d42a79f93ba043e9 GIT binary patch literal 17965 zcmeI4dr;JN9>8NkOSPh&TCH_@%W6BQ4N3OFK3rCj$ANZrMJQNrlx&h+LSeHc0ao;? zM?D?&`p^Qt>S4V>uW**pTCC`u*XvcQXc5~^&sVioTdm&Ejt`_BdcW-QTOuwt*6})> z$qw*ce)&G~`+R@DZ@$SNS?ZknoBn-A^hFS)e|lPS29QI+@1UqY;ID4+Hw%Gy#FsWx zK#+cerQcr2+Bb$HNMZ+@nIq;np0!e3VH`Rik<<%}sBtkK)|;Sh z-L*%nVd(^Iw$Xt*d`V0mn^wj%Gs>oBQe`ht7Fs*O-q+^00tbbRNNW6r1zy4GPtXSZ zTETZ|7}IJ3D&h+X+C(X!Cdc8_Byl{WF~-HC6rtB?OqMvpXwjJs&uDZw5s%>pjIf}D z-U@yUxTf=?wf6mg+5aF2mOP8^O9UJx^wuIwmq1=Pbj5?OZ-exxHkLSX!C z4`$Mlpjlu|1ygMU(5y*3Ly8=q$#Dht;Bs}sTxgP#q~&RhGiqY9Suf3%3S(?occZSQ z)8&szCPl_BEp3#*QG&?S;Z|I4#ffpa#fsxHCqd0_J{%m)y61-RK@e8lB=;fH?Ct|> zMVb^zMPB5(GCwqBb#r_nDcadW(!*drug8XU4azh_3)Gs#6>vN_Eyk|5Vc~{lR)Ixp zP4@~S>7|(TWIGs$V_DitS{S`9KAu7iM#hD@+y(1f(T(}as~83GU;4!QXq zu9G>cSlW2Nb+AU!90lBWotBX{8Y#WWgqq!?9wds1N6k2>A(TsJvKU-ChSX6okj&W~ zfu`{+D4}G5Oh=jv4T4eeZib=^GzeifphmO7jatAE>cSb9%S{tzBWZyl!nnC3R2nOQ z^*UF!j=^dU6v-J((e0z~Kmi*lc0Q697-=gfXyINCRmV{AlWYPd!Aeq6nY2^V24QF$ zcH3yzX@x91&DcBBsSH8Tzs$Vn7^QiP_io!O=qjMqvlD@Hi=`ybBznLKQMUJkes4GI z9>9i47nTC{L8OB7mN5LiBm<^^FsQ~NmM;bWLgMoW0tBgBrsg;)0 zZsxaLH9Eb6CK`6t_txYFPflhY&O3L%t#mL-7&l$fAbA;JS-WPFZZfT)7YBV|pgXdI zi_INlGH-!nIZ{tuP#ox)O*$NWFhcsx|ZISY{>N z2?uY|W`L(Zj6L3H)EjMB_u=jqPS(#94)sCa9$1f+Q446_+ARP)WrFNhp#kE=8E2l8OtGP$X4ciZDSX6&EC- zNUFFLVS-93E=WR=RBf7~B2gVCt zNuBhGqMCIX>PxAK;cq47)q^Q))kN$c6k8@fpR~>)( z5vusH1fQwxW^?Na;p2o=&dI%yjj`ne%Rl%a$v3iX_PlxXs!w{kBNwmMWM^l4R-~P6 zzIyd)O8Uy@o_%_7Y|TgQUq3T23PHB->^~_gIy%}pXU?sYhYvfeKlsw0#UZ)JPMx~t zpFe*-Nl|A8FaMAqu-0=fy0*5~nVsF%@zqx@tZ5sv&>6cZS=;MR-+amMM37}0H|*Ha zw#pfMC8qhZGwbRXj>~LR`QhEWc1;;mV^}}+lNBpgOo&YM=WorajZD0r>+|8SO|FTp zsn~m_=v&cR-T2$M?F|iIXTMUjKjp&t^VcU0jC4*W5)wLG`T4bL$kjvNIr?8y)3!Z_ z4j$Y+o*=evitYQ?=f<7zw&jkkEWpe27gWB?3lP&Xe+o!pB#X}QqPws1PZ*LljXKSmNm?r-0_3Jr1Kf5@y z%1FO+^z$VBnuBAI)rZ_eh7LViUtgaXwZ9)Tvrp5utaIni{Q>b66%{?z#HaqbW%rXK zmL}hPXyM+ysbWdVi;qVyDH4Q;Nl`;m63ru1r%Y+ep1S$<6W_KCO<6Ig|NH@s4Gq_d z4I_HTL`FnJO#9)+jRlpXFRZ6^?VCoYPuo4awb@?X`n$!XPZSq{K+P|wj(W2Ei@BSl zmrz9{`Tne&oT#j!&`P zmDRdu#`GcN)|}Jd`(Ir4q3cS_l+nN1URQT<*7PCO|G9LD_INz6jvF`b*CvBu!* zv-Z~d4qCVL$dMzjp754}6|`Vh{pU}_VHmct<@^^14jeFT&AHU(jIC%mT7V#XPGL9Z z+c&r5oj88%SmXE`J7aClqh8-{tFEqI@b+ifFJzXX%K2 zMYCqtud<9EpEPaS0HLg`vCru(<4-R5ZbwXH@7}%Jqi0Nh^OFnCjErp)Y_>~RZglWP zMFg^;vGIrLA5U9;i>sG>JU4OGB|6Tjqb?fFmy-bUoKGh4+t~ogF U;a44`^g@^Pl&Q&YPs%O-A8HLkh5!Hn literal 0 HcmV?d00001 diff --git a/toonz/sources/toonz/Resources/locator_click.png b/toonz/sources/toonz/Resources/locator_click.png new file mode 100644 index 0000000000000000000000000000000000000000..80452210f4fca35dcc2ec4c89ce5c871af70a125 GIT binary patch literal 17951 zcmeI4dvp}l8NeqhG$es4h+?F;u82XI%wr$foo*IGHZ(yt#t=*Z4=_73n~d(xEW49r z6JGKVls4fZ2nq)jEU2L^c#MdE1XD#5BSoYYET%N2X#xQ)rGOCWo!#8sA=%(4$9g`4Ix zNgO2q#vw1P8-gHX68VB6smM8=VnlB$&5ABAHR$yLZ3MB64*F>32~N_vxME&N*Pq$7 zSFhvQbbX=8i93CnTnV3D>E|X?<`yuOPcT+iKiZyP3sS&=my>8+(CZNbR4`p1@=Jlg zG~2$@=+L8US6JBZb%jV#lYNZ#c&cMNfc3Y2!DDvr=m)92wBm}zH0g70V_F+USj>R%! znTU;qCh7tM|eS3o_cBZ+tS;zvHxD+Dgc_hKd= z37du1R5;Z(0FBD@bF?J-3q;Xl4=>j|muwZXI#GX| zgO)hEytGjQM+u^U#3|fB;lu;DmBMj_ldxttA5M|w-4!u>5GD$@Dt#z4yZZoJk)i#g0E6x*=qph7dUK&ed8Bl^Kl{X%6 z9j;NV$N=}z({h6{WOcdCsKreiK%zJ^YPDEsly#FFZsI^BS2$ZvC#7)KBhbTs9+Xhp zqtKD(!h&Fo+08MG5lq8vF`_1m(T!Tc5bDA?m&?r(787lSbBW=mN2qK*0M=`TVjY9k z94e9%xEWWE!UG;YRP21TKfuXbIb9F;a-=#&il1x~DhU+L$Ys*b$Qy)XZP-<#(bI}p zcA4=#)2R+Y*uTQO_Za0RoN%q}6?PTU>fK2|bW7#5pUWr)D@5Ji5Bt5^uzLU-CSO=Q z{11@|Q7Gg5-z6C!sxdtmQ5oJY#N$o!P8I{Hxek#GAut)P5IyJ`y#?#vk%nPxS*NRB2MdFRWq6wYGB60f(h4o8XMCK?UqL4jM* zyxHViP6~A9pi2z(N_N7A^%zrl3mq$xJ8VyBsDn-;aqz(i`Mb+hdAPgjq-&ch4|g|> zT22&r$xe1f>o%;glJASdw`>!@vmnlHHkl0I%G!OnyG0%!P!Qq+)0QyMA`bQy-XjpC_IC^6wt@Jt9ij>00(qZB!VyY2^&(HZ>!&Y?>!2qd9O zYPeKkf=U`LNJ5p=aH+xsl{8$Cges}wQiTaBX}BN>RZ_#H3KLY)a6uBPq=risCa9$0 zf+SQ)4VNlRP)WlDNvM()PIl7N(r`f%s-%WX6(*>p;esSoNe!1OOi)R~1xcuq z8ZK3sppu3Ql29czT&gfZB@GuOp-O7FRAGWj8ZJmemDF&l!UUBxT#$q+so_$E2`Xv0 zAPH6Snz$08Z+PGY@LGp*@cstjAGw#nyB~B+cD@rqD(^**Cl?^d#VbIzAxJ5XAnnr; zgj$0jw~H&Ly*Cy?ZmiC6WE2FCu3YKNW(tQaYMwc06R~%=G>-pt_}@#H|FV6eSl9mU zAK${sY;IKC?ayt!DeIN^ zdBEaLmZ`00FTPg2bm`tTYu8?)XV0GfG`;4&yh$r}(>p%jclPr6m-7DgP{r9(r;-*g zUi?Z;&4ObBHZ(aoxpL3Wofj*-Uev$yug{K8{EN>rv}5(^)s8=(I(2HpsK$4;6^%-2 zeEo|Db=#IVx%=I{@a6oGpBz2<_59WfsjTd_vHJ#Akm>22lly*r;K1HTUM=`r#V}#V zow-{E-M=bf!h{KX8;Hcj#JL3%C$3ufiNC$6si_0;&6qK7I(}gy!`$=6Wc1$`ZN}vO zlP6E!_Qo5=GD&hEPqw_(I_|fx?_T+bKCkSXj>pyQ+ZVUuLw5X@LxU4C;xn?c`jF3m z^i5mat2ZH)d!}xBw5IgE_4avRG&eWLA@w+(TvaVm{g-S^n71)y%Di3 zyOAYFzOZ?8Qk6qL_r?dE&i;M-_I;g@tnqrcG-$ljQ3wbGHC0PjAc)t`}P^ z15#I?tUtWth-b*qp-C(B9UUFZYinyiI(=IBiflW1GBLU8{f8$#clgcP+Lvl-YK)(D zl-0Yo*PS_kMVd1wcU)V0`;z~hKR>tCzjNw)uI;n%A(!_*UTX(#hb`Swmw(&mb$HUd z$G>ds?ChMke*Lh~`)4@&F37kqehigdb$aX8t+RIR+0%LH+_`gmEB6c=)i`J4;m4bQ zQ(aBPow8MIPFc8@rI_F@C~ zL3{ga7PI;N{ViX8HuJ6}TOUjPS=HDZ*ETJhW#4e`!r>#A+~7R)VoJjE<41ru3LM#Z zsO`Q0_}?!JM~G$XSvPkm_BK}d!)N4I Pxa4HzI(|Q9`uzU^n?E}{ literal 0 HcmV?d00001 diff --git a/toonz/sources/toonz/Resources/locator_over.png b/toonz/sources/toonz/Resources/locator_over.png new file mode 100644 index 0000000000000000000000000000000000000000..80452210f4fca35dcc2ec4c89ce5c871af70a125 GIT binary patch literal 17951 zcmeI4dvp}l8NeqhG$es4h+?F;u82XI%wr$foo*IGHZ(yt#t=*Z4=_73n~d(xEW49r z6JGKVls4fZ2nq)jEU2L^c#MdE1XD#5BSoYYET%N2X#xQ)rGOCWo!#8sA=%(4$9g`4Ix zNgO2q#vw1P8-gHX68VB6smM8=VnlB$&5ABAHR$yLZ3MB64*F>32~N_vxME&N*Pq$7 zSFhvQbbX=8i93CnTnV3D>E|X?<`yuOPcT+iKiZyP3sS&=my>8+(CZNbR4`p1@=Jlg zG~2$@=+L8US6JBZb%jV#lYNZ#c&cMNfc3Y2!DDvr=m)92wBm}zH0g70V_F+USj>R%! znTU;qCh7tM|eS3o_cBZ+tS;zvHxD+Dgc_hKd= z37du1R5;Z(0FBD@bF?J-3q;Xl4=>j|muwZXI#GX| zgO)hEytGjQM+u^U#3|fB;lu;DmBMj_ldxttA5M|w-4!u>5GD$@Dt#z4yZZoJk)i#g0E6x*=qph7dUK&ed8Bl^Kl{X%6 z9j;NV$N=}z({h6{WOcdCsKreiK%zJ^YPDEsly#FFZsI^BS2$ZvC#7)KBhbTs9+Xhp zqtKD(!h&Fo+08MG5lq8vF`_1m(T!Tc5bDA?m&?r(787lSbBW=mN2qK*0M=`TVjY9k z94e9%xEWWE!UG;YRP21TKfuXbIb9F;a-=#&il1x~DhU+L$Ys*b$Qy)XZP-<#(bI}p zcA4=#)2R+Y*uTQO_Za0RoN%q}6?PTU>fK2|bW7#5pUWr)D@5Ji5Bt5^uzLU-CSO=Q z{11@|Q7Gg5-z6C!sxdtmQ5oJY#N$o!P8I{Hxek#GAut)P5IyJ`y#?#vk%nPxS*NRB2MdFRWq6wYGB60f(h4o8XMCK?UqL4jM* zyxHViP6~A9pi2z(N_N7A^%zrl3mq$xJ8VyBsDn-;aqz(i`Mb+hdAPgjq-&ch4|g|> zT22&r$xe1f>o%;glJASdw`>!@vmnlHHkl0I%G!OnyG0%!P!Qq+)0QyMA`bQy-XjpC_IC^6wt@Jt9ij>00(qZB!VyY2^&(HZ>!&Y?>!2qd9O zYPeKkf=U`LNJ5p=aH+xsl{8$Cges}wQiTaBX}BN>RZ_#H3KLY)a6uBPq=risCa9$0 zf+SQ)4VNlRP)WlDNvM()PIl7N(r`f%s-%WX6(*>p;esSoNe!1OOi)R~1xcuq z8ZK3sppu3Ql29czT&gfZB@GuOp-O7FRAGWj8ZJmemDF&l!UUBxT#$q+so_$E2`Xv0 zAPH6Snz$08Z+PGY@LGp*@cstjAGw#nyB~B+cD@rqD(^**Cl?^d#VbIzAxJ5XAnnr; zgj$0jw~H&Ly*Cy?ZmiC6WE2FCu3YKNW(tQaYMwc06R~%=G>-pt_}@#H|FV6eSl9mU zAK${sY;IKC?ayt!DeIN^ zdBEaLmZ`00FTPg2bm`tTYu8?)XV0GfG`;4&yh$r}(>p%jclPr6m-7DgP{r9(r;-*g zUi?Z;&4ObBHZ(aoxpL3Wofj*-Uev$yug{K8{EN>rv}5(^)s8=(I(2HpsK$4;6^%-2 zeEo|Db=#IVx%=I{@a6oGpBz2<_59WfsjTd_vHJ#Akm>22lly*r;K1HTUM=`r#V}#V zow-{E-M=bf!h{KX8;Hcj#JL3%C$3ufiNC$6si_0;&6qK7I(}gy!`$=6Wc1$`ZN}vO zlP6E!_Qo5=GD&hEPqw_(I_|fx?_T+bKCkSXj>pyQ+ZVUuLw5X@LxU4C;xn?c`jF3m z^i5mat2ZH)d!}xBw5IgE_4avRG&eWLA@w+(TvaVm{g-S^n71)y%Di3 zyOAYFzOZ?8Qk6qL_r?dE&i;M-_I;g@tnqrcG-$ljQ3wbGHC0PjAc)t`}P^ z15#I?tUtWth-b*qp-C(B9UUFZYinyiI(=IBiflW1GBLU8{f8$#clgcP+Lvl-YK)(D zl-0Yo*PS_kMVd1wcU)V0`;z~hKR>tCzjNw)uI;n%A(!_*UTX(#hb`Swmw(&mb$HUd z$G>ds?ChMke*Lh~`)4@&F37kqehigdb$aX8t+RIR+0%LH+_`gmEB6c=)i`J4;m4bQ zQ(aBPow8MIPFc8@rI_F@C~ zL3{ga7PI;N{ViX8HuJ6}TOUjPS=HDZ*ETJhW#4e`!r>#A+~7R)VoJjE<41ru3LM#Z zsO`Q0_}?!JM~G$XSvPkm_BK}d!)N4I Pxa4HzI(|Q9`uzU^n?E}{ literal 0 HcmV?d00001 diff --git a/toonz/sources/toonz/colormodelviewer.cpp b/toonz/sources/toonz/colormodelviewer.cpp index 9ff95ab4..e4b0085c 100644 --- a/toonz/sources/toonz/colormodelviewer.cpp +++ b/toonz/sources/toonz/colormodelviewer.cpp @@ -85,7 +85,7 @@ ColorModelViewer::ColorModelViewer(QWidget *parent) FlipConsole::eCompare | FlipConsole::eCustomize | FlipConsole::eSave | FlipConsole::eFilledRaster | FlipConsole::eDefineLoadBox | FlipConsole::eUseLoadBox | - FlipConsole::eDefineSubCamera)), + FlipConsole::eDefineSubCamera | FlipConsole::eLocator)), eDontKeepFilesOpened, true) , m_mode(0) , m_currentRefImgPath(TFilePath()) { diff --git a/toonz/sources/toonz/flipbook.h b/toonz/sources/toonz/flipbook.h index a116f3c7..b9e13ee0 100644 --- a/toonz/sources/toonz/flipbook.h +++ b/toonz/sources/toonz/flipbook.h @@ -179,7 +179,8 @@ public: FlipBook(QWidget *parent = 0, QString viewerTitle = QString(), UINT flipConsoleButtonMask = FlipConsole::cFullConsole & (~(FlipConsole::eFilledRaster | - FlipConsole::eDefineSubCamera)), + FlipConsole::eDefineSubCamera | + FlipConsole::eLocator)), UCHAR flags = 0, bool isColorModel = false); ~FlipBook(); void setLevel(const TFilePath &path, TPalette *palette = 0, int from = -1, diff --git a/toonz/sources/toonz/locatorpopup.cpp b/toonz/sources/toonz/locatorpopup.cpp new file mode 100644 index 00000000..048626e6 --- /dev/null +++ b/toonz/sources/toonz/locatorpopup.cpp @@ -0,0 +1,117 @@ +#include "locatorpopup.h" + +// TnzLib includes +#include "toonz/txshlevelhandle.h" +#include "toonz/tframehandle.h" +#include "toonz/preferences.h" +#include "toonz/stage2.h" + +// Tnz6 includes +#include "tapp.h" +#include "sceneviewer.h" + +#include + +LocatorPopup::LocatorPopup(QWidget *parent) + : QDialog(parent), m_initialZoom(true) { + m_viewer = new SceneViewer(NULL); + m_viewer->setParent(parent); + m_viewer->setIsLocator(); + + //---- layout + QVBoxLayout *mainLayout = new QVBoxLayout(); + mainLayout->setMargin(0); + mainLayout->addWidget(m_viewer, 1); + setLayout(mainLayout); + + bool ret = true; + // When zoom changed, change window title. + ret = connect(m_viewer, SIGNAL(onZoomChanged()), SLOT(changeWindowTitle())); + ret = ret && + connect(m_viewer, SIGNAL(previewToggled()), SLOT(changeWindowTitle())); + assert(ret); + + resize(400, 400); +} + +//----------------------------------------------------------------------------- + +void LocatorPopup::onChangeViewAff(const TAffine &affine, const TPointD &pos) { + TAffine curAff = m_viewer->getSceneMatrix(); + TAffine newAff(curAff.a11, 0, -pos.x * curAff.a11, 0, curAff.a22, + -pos.y * curAff.a22); + m_viewer->setViewMatrix(newAff, 0); + m_viewer->setViewMatrix(newAff, 1); + m_viewer->update(); +} + +//----------------------------------------------------------------------------- + +void LocatorPopup::showEvent(QShowEvent *) { + // zoom the locator for the first time + if (m_initialZoom) { + for (int z = 0; z < 4; z++) m_viewer->zoomQt(true, false); + m_initialZoom = false; + } + + TApp *app = TApp::instance(); + TFrameHandle *frameHandle = app->getCurrentFrame(); + TXshLevelHandle *levelHandle = app->getCurrentLevel(); + + bool ret = true; + ret = ret && connect(frameHandle, SIGNAL(frameSwitched()), this, + SLOT(changeWindowTitle())); + ret = ret && connect(levelHandle, SIGNAL(xshLevelSwitched(TXshLevel *)), this, + SLOT(changeWindowTitle())); + assert(ret); + + changeWindowTitle(); +} + +//----------------------------------------------------------------------------- + +void LocatorPopup::hideEvent(QHideEvent *) { + TApp *app = TApp::instance(); + disconnect(app->getCurrentLevel()); + disconnect(app->getCurrentFrame()); +} + +//----------------------------------------------------------------------------- + +void LocatorPopup::changeWindowTitle() { + TApp *app = TApp::instance(); + // put the titlebar texts in this string + QString name = tr("Locator"); + + bool showZoomFactor = false; + + // if the frame type is "scene editing" + if (app->getCurrentFrame()->isEditingScene()) { + if (m_viewer->isPreviewEnabled()) showZoomFactor = true; + + // If the current level exists and some option is set in the preference, + // set the zoom value to the current level's dpi + else if (Preferences::instance() + ->isActualPixelViewOnSceneEditingModeEnabled() && + app->getCurrentLevel()->getSimpleLevel() && + !CleanupPreviewCheck::instance() + ->isEnabled() // cleanup preview must be OFF + && + !CameraTestCheck::instance() + ->isEnabled()) // camera test mode must be OFF neither + showZoomFactor = true; + } + // if the frame type is "level editing" + else { + TXshLevel *level = app->getCurrentLevel()->getLevel(); + if (level) showZoomFactor = true; + } + + if (showZoomFactor) { + name = name + " Zoom : " + + QString::number((int)(100.0 * sqrt(m_viewer->getViewMatrix().det()) * + m_viewer->getDpiFactor())) + + "%"; + } + setWindowTitle(name); +} \ No newline at end of file diff --git a/toonz/sources/toonz/locatorpopup.h b/toonz/sources/toonz/locatorpopup.h new file mode 100644 index 00000000..7745e2ac --- /dev/null +++ b/toonz/sources/toonz/locatorpopup.h @@ -0,0 +1,34 @@ +#pragma once + +#ifndef LOCATORPOPUP_H +#define LOCATORPOPUP_H + +#include "tgeometry.h" +#include + +class SceneViewer; + +//============================================================================= +// LoactorPopup +//----------------------------------------------------------------------------- + +class LocatorPopup : public QDialog { + Q_OBJECT + SceneViewer* m_viewer; + bool m_initialZoom; + +public: + LocatorPopup(QWidget* parent = 0); + SceneViewer* viewer() { return m_viewer; } + + void onChangeViewAff(const TAffine& affine, const TPointD& curPos); + +protected: + void showEvent(QShowEvent*); + void hideEvent(QHideEvent*); + +protected slots: + void changeWindowTitle(); +}; + +#endif \ No newline at end of file diff --git a/toonz/sources/toonz/magpiefileimportpopup.cpp b/toonz/sources/toonz/magpiefileimportpopup.cpp index 5134d722..72a90abc 100644 --- a/toonz/sources/toonz/magpiefileimportpopup.cpp +++ b/toonz/sources/toonz/magpiefileimportpopup.cpp @@ -124,7 +124,7 @@ MagpieFileImportPopup::MagpieFileImportPopup() FlipConsole::eRed | FlipConsole::eGreen | FlipConsole::eBlue | FlipConsole::eMatte | FlipConsole::eDefineSubCamera | FlipConsole::eDefineLoadBox | FlipConsole::eUseLoadBox | - FlipConsole::eFilledRaster)); + FlipConsole::eFilledRaster | FlipConsole::eLocator)); m_flipbook = new FlipBook(this, tr("Import Magpie File"), buttonMask); m_flipbook->setFixedHeight(250); frameLayout->addWidget(m_flipbook); diff --git a/toonz/sources/toonz/sceneviewer.cpp b/toonz/sources/toonz/sceneviewer.cpp index d039b34c..6873009c 100644 --- a/toonz/sources/toonz/sceneviewer.cpp +++ b/toonz/sources/toonz/sceneviewer.cpp @@ -10,6 +10,7 @@ #include "viewerdraw.h" #include "menubarcommandids.h" #include "ruler.h" +#include "locatorpopup.h" // TnzTools includes #include "tools/cursors.h" @@ -501,9 +502,9 @@ SceneViewer::SceneViewer(ImageUtils::FullScreenWidget *parent) , m_sideRasterPos() , m_topRasterPos() , m_toolDisableReason("") - , m_editPreviewSubCamera(false) { - assert(parent); - + , m_editPreviewSubCamera(false) + , m_locator(NULL) + , m_isLocator(false) { m_visualSettings.m_sceneProperties = TApp::instance()->getCurrentScene()->getScene()->getProperties(); // Enables multiple key input. @@ -880,6 +881,9 @@ void SceneViewer::hideEvent(QHideEvent *) { ToolHandle *toolHandle = app->getCurrentTool(); if (toolHandle) toolHandle->disconnect(this); + + // hide locator + if (m_locator && m_locator->isVisible()) m_locator->hide(); } //----------------------------------------------------------------------------- @@ -967,7 +971,7 @@ void SceneViewer::drawBuildVars() { } TTool *tool = app->getCurrentTool()->getTool(); - if (tool) tool->setViewer(this); + if (tool && !m_isLocator) tool->setViewer(this); } //----------------------------------------------------------------------------- @@ -1358,6 +1362,13 @@ void SceneViewer::drawOverlay() { // use // another glContext if (tool->getName() == "T_RGBPicker") tool->onImageChanged(); + + // draw cross at the center of the locator window + if (m_isLocator) { + glColor3d(1.0, 0.0, 0.0); + tglDrawSegment(TPointD(-5, 0), TPointD(5, 0)); + tglDrawSegment(TPointD(0, -5), TPointD(0, 5)); + } } } diff --git a/toonz/sources/toonz/sceneviewer.h b/toonz/sources/toonz/sceneviewer.h index 68ed8ded..0941505b 100644 --- a/toonz/sources/toonz/sceneviewer.h +++ b/toonz/sources/toonz/sceneviewer.h @@ -33,6 +33,7 @@ class Ruler; class QMenu; class SceneViewer; +class LocatorPopup; namespace ImageUtils { class FullScreenWidget; @@ -135,6 +136,9 @@ class SceneViewer final : public QGLWidget, TOP_3D, } m_current3DDevice; + LocatorPopup *m_locator; + bool m_isLocator; + // iwsw commented out temporarily // Ghibli3DLutUtil * m_ghibli3DLutUtil; public: @@ -230,6 +234,8 @@ public: void setFocus(Qt::FocusReason reason) { QWidget::setFocus(reason); }; + void setIsLocator() { m_isLocator = true; } + public: // SceneViewer's gadget public functions TPointD winToWorld(const QPoint &pos) const; diff --git a/toonz/sources/toonz/sceneviewerevents.cpp b/toonz/sources/toonz/sceneviewerevents.cpp index 17f3f3d4..8ca05858 100644 --- a/toonz/sources/toonz/sceneviewerevents.cpp +++ b/toonz/sources/toonz/sceneviewerevents.cpp @@ -14,6 +14,7 @@ #include "onionskinmaskgui.h" #include "ruler.h" #include "comboviewerpane.h" +#include "locatorpopup.h" // TnzTools includes #include "tools/cursors.h" @@ -180,6 +181,14 @@ void SceneViewer::onButtonPressed(FlipConsole::EGadget button) { m_editPreviewSubCamera = !m_editPreviewSubCamera; update(); break; + + // open locator. Create one for the first time + case FlipConsole::eLocator: + if (!m_locator) m_locator = new LocatorPopup(this); + m_locator->show(); + m_locator->raise(); + m_locator->activateWindow(); + break; } } @@ -349,6 +358,10 @@ void SceneViewer::mouseMoveEvent(QMouseEvent *event) { false); TPointD pos = tool->getMatrix().inv() * winToWorld(curPos); + if (m_locator) { + m_locator->onChangeViewAff(m_viewAff[m_viewMode], pos); + } + TObjectHandle *objHandle = TApp::instance()->getCurrentObject(); if (tool->getToolType() & TTool::LevelTool && !objHandle->isSpline()) { pos.x /= m_dpiScale.x; @@ -375,6 +388,7 @@ void SceneViewer::mouseMoveEvent(QMouseEvent *event) { // panning panQt(curPos - m_pos); m_pos = curPos; + return; } } @@ -973,6 +987,7 @@ void SceneViewer::contextMenuEvent(QContextMenuEvent *e) { #endif if (m_freezedStatus != NO_FREEZED) return; + if (m_isLocator) return; TPoint winPos(e->pos().x(), height() - e->pos().y()); std::vector columnIndices; diff --git a/toonz/sources/toonz/toonz.qrc b/toonz/sources/toonz/toonz.qrc index 75aa7a16..b279cd14 100644 --- a/toonz/sources/toonz/toonz.qrc +++ b/toonz/sources/toonz/toonz.qrc @@ -442,5 +442,8 @@ Resources/finger_rollover.svg Resources/ruler.svg Resources/ruler_rollover.svg + Resources/locator.png + Resources/locator_click.png + Resources/locator_over.png diff --git a/toonz/sources/toonzqt/flipconsole.cpp b/toonz/sources/toonzqt/flipconsole.cpp index 706bb6ed..1caa5ac0 100644 --- a/toonz/sources/toonzqt/flipconsole.cpp +++ b/toonz/sources/toonzqt/flipconsole.cpp @@ -1234,16 +1234,19 @@ void FlipConsole::createPlayToolBar(bool withCustomWidget) { if (m_gadgetsMask & eRed || m_gadgetsMask & eGRed) m_colorFilterSep = m_playToolBar->addSeparator(); - // Sound & Histogram - if (m_gadgetsMask & eSound || m_gadgetsMask & eHisto) { + // Sound & Histogram & Locator + if (m_gadgetsMask & eSound || m_gadgetsMask & eHisto || + m_gadgetsMask & eLocator) { if (m_gadgetsMask & eSound) { createButton(eSound, "sound", tr("&Soundtrack "), true); m_soundSep = m_playToolBar->addSeparator(); } - if (m_gadgetsMask & eHisto) { + if (m_gadgetsMask & eHisto) createButton(eHisto, "histograms", tr("&Histogram"), false); + if (m_gadgetsMask & eLocator) + createButton(eLocator, "locator", tr("&Locator"), false); + if (m_gadgetsMask & eHisto || m_gadgetsMask & eLocator) m_histoSep = m_playToolBar->addSeparator(); - } } if (m_gadgetsMask & eFilledRaster) { @@ -1572,6 +1575,7 @@ void FlipConsole::doButtonPressed(UINT button) { case eHisto: case eSaveImg: case eSave: + case eLocator: // nothing to do return; From 472b705fd56dd01095133eae59d198df7a14e459 Mon Sep 17 00:00:00 2001 From: shun_iwasawa Date: Tue, 18 Oct 2016 12:02:45 +0900 Subject: [PATCH 29/56] fix load scene for relative project folder --- toonz/sources/include/toonz/tproject.h | 2 +- toonz/sources/toonz/filebrowserpopup.cpp | 12 +++++------- toonz/sources/toonzlib/tproject.cpp | 8 +++++--- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/toonz/sources/include/toonz/tproject.h b/toonz/sources/include/toonz/tproject.h index 399f5f64..08982132 100644 --- a/toonz/sources/include/toonz/tproject.h +++ b/toonz/sources/include/toonz/tproject.h @@ -57,7 +57,7 @@ public: bool isConstantFolder(int index) const; TFilePath getFolder(int index) const; - TFilePath getFolder(std::string name) const; + TFilePath getFolder(std::string name, bool absolute = false) const; TFilePath getScenesPath() const; diff --git a/toonz/sources/toonz/filebrowserpopup.cpp b/toonz/sources/toonz/filebrowserpopup.cpp index 8bbda391..6ab99c77 100644 --- a/toonz/sources/toonz/filebrowserpopup.cpp +++ b/toonz/sources/toonz/filebrowserpopup.cpp @@ -485,17 +485,15 @@ bool LoadScenePopup::execute() { void LoadScenePopup::initFolder() { setInitialFolderByCurrentRoom(); } void LoadScenePopup::setInitialFolderByCurrentRoom() { - QString roomName = TApp::instance()->getCurrentRoomName(); + QString roomName = TApp::instance()->getCurrentRoomName(); + TProjectP project = TProjectManager::instance()->getCurrentProject(); TFilePath scenePath; if (roomName == "Cleanup" || roomName == "InknPaint") - scenePath = TProjectManager::instance()->getCurrentProject()->getFolder( - TProject::Drawings); + scenePath = project->getFolder(TProject::Drawings, true); else if (roomName == "PltEdit") - scenePath = TProjectManager::instance()->getCurrentProject()->getFolder( - TProject::Palettes); + scenePath = project->getFolder(TProject::Palettes, true); else - scenePath = TProjectManager::instance()->getCurrentProject()->getFolder( - TProject::Scenes); + scenePath = project->getFolder(TProject::Scenes, true); setFolder(scenePath); } diff --git a/toonz/sources/toonzlib/tproject.cpp b/toonz/sources/toonzlib/tproject.cpp index ec9ef5a3..0a6b82e2 100644 --- a/toonz/sources/toonzlib/tproject.cpp +++ b/toonz/sources/toonzlib/tproject.cpp @@ -298,13 +298,15 @@ void TProject::setFolder(string name) { setFolder(name, TFilePath(name)); } //------------------------------------------------------------------- /*! Returns the path of the folder named with \b name.\n Returns TFilePath() if there isn't a folder named with \b name. - \note The returned path could be a relative path. + \note The returned path could be a relative path if \b absolute is + false. */ -TFilePath TProject::getFolder(string name) const { +TFilePath TProject::getFolder(string name, bool absolute) const { std::map::const_iterator it; it = m_folders.find(name); if (it != m_folders.end()) - return it->second; + return (absolute) ? makeAbsolute(getProjectFolder(), it->second) + : it->second; else return TFilePath(); } From bfe8613d31807d83bc9040c52377cc43e12a7f28 Mon Sep 17 00:00:00 2001 From: Jeremy Bullock Date: Tue, 18 Oct 2016 00:29:19 -0600 Subject: [PATCH 30/56] Startup popup when OT starts (#793) * startup popup which provides quick access to new project, new scene and open recent scenes. --- stuff/config/qss/gray_048/gray_048.less | 2 +- stuff/config/qss/gray_048/gray_048.qss | 2 +- stuff/config/qss/gray_048/gray_048_mac.qss | 2 +- stuff/config/qss/gray_072/gray_072.less | 2 +- stuff/config/qss/gray_072/gray_072.qss | 2 +- stuff/config/qss/gray_072/gray_072_mac.qss | 2 +- stuff/config/qss/gray_128/gray_128.less | 2 +- stuff/config/qss/gray_128/gray_128.qss | 2 +- stuff/config/qss/gray_128/gray_128_mac.qss | 2 +- .../rooms/Default/menubar_template.xml | 1 + toonz/sources/include/toonz/preferences.h | 6 +- .../include/toonzqt/camerasettingswidget.h | 1 + toonz/sources/toonz/CMakeLists.txt | 2 + toonz/sources/toonz/Resources/startup.png | Bin 0 -> 6403 bytes toonz/sources/toonz/mainwindow.cpp | 9 +- toonz/sources/toonz/mainwindow.h | 2 + toonz/sources/toonz/menubar.cpp | 1 + toonz/sources/toonz/menubarcommandids.h | 1 + toonz/sources/toonz/preferencespopup.cpp | 13 + toonz/sources/toonz/preferencespopup.h | 1 + toonz/sources/toonz/startuppopup.cpp | 914 ++++++++++++++++++ toonz/sources/toonz/startuppopup.h | 109 +++ toonz/sources/toonz/toonz.qrc | 1 + toonz/sources/toonzlib/preferences.cpp | 9 + 24 files changed, 1077 insertions(+), 11 deletions(-) create mode 100644 toonz/sources/toonz/Resources/startup.png create mode 100644 toonz/sources/toonz/startuppopup.cpp create mode 100644 toonz/sources/toonz/startuppopup.h diff --git a/stuff/config/qss/gray_048/gray_048.less b/stuff/config/qss/gray_048/gray_048.less index ef27e52e..9ed5281f 100644 --- a/stuff/config/qss/gray_048/gray_048.less +++ b/stuff/config/qss/gray_048/gray_048.less @@ -748,7 +748,7 @@ DvDirTreeView { /*---------------------------------------------------------------------------*/ #CleanupSettingsFrame, #LoadLevelFrame, -#SolidLineFrame{ +#SolidLineFrame { border: 1px solid @m_baseTxtColor; } diff --git a/stuff/config/qss/gray_048/gray_048.qss b/stuff/config/qss/gray_048/gray_048.qss index 599b3592..97438d38 100644 --- a/stuff/config/qss/gray_048/gray_048.qss +++ b/stuff/config/qss/gray_048/gray_048.qss @@ -764,7 +764,7 @@ DvDirTreeView { /*---------------------------------------------------------------------------*/ /* Cleanup Settings, LoadLevel, PsdSettingsPopup, FxSettingsPopup, RenameAsToonzPopup */ /*---------------------------------------------------------------------------*/ -#CleanupSettingsFrame, +#CleanupSettingsFrame, #LoadLevelFrame, #SolidLineFrame { border: 1px solid #e6e6e6; diff --git a/stuff/config/qss/gray_048/gray_048_mac.qss b/stuff/config/qss/gray_048/gray_048_mac.qss index e8cec366..f731688a 100644 --- a/stuff/config/qss/gray_048/gray_048_mac.qss +++ b/stuff/config/qss/gray_048/gray_048_mac.qss @@ -764,7 +764,7 @@ DvDirTreeView { /*---------------------------------------------------------------------------*/ /* Cleanup Settings, LoadLevel, PsdSettingsPopup, FxSettingsPopup, RenameAsToonzPopup */ /*---------------------------------------------------------------------------*/ -#CleanupSettingsFrame, +#CleanupSettingsFrame, #LoadLevelFrame, #SolidLineFrame { border: 1px solid #e6e6e6; diff --git a/stuff/config/qss/gray_072/gray_072.less b/stuff/config/qss/gray_072/gray_072.less index aa97bd46..aedaa861 100644 --- a/stuff/config/qss/gray_072/gray_072.less +++ b/stuff/config/qss/gray_072/gray_072.less @@ -747,7 +747,7 @@ DvDirTreeView { /*---------------------------------------------------------------------------*/ #CleanupSettingsFrame, #LoadLevelFrame, -#SolidLineFrame{ +#SolidLineFrame { border: 1px solid @m_baseTxtColor; } diff --git a/stuff/config/qss/gray_072/gray_072.qss b/stuff/config/qss/gray_072/gray_072.qss index f8d06492..105fad96 100644 --- a/stuff/config/qss/gray_072/gray_072.qss +++ b/stuff/config/qss/gray_072/gray_072.qss @@ -764,7 +764,7 @@ DvDirTreeView { /*---------------------------------------------------------------------------*/ /* Cleanup Settings, LoadLevel, PsdSettingsPopup, FxSettingsPopup, RenameAsToonzPopup */ /*---------------------------------------------------------------------------*/ -#CleanupSettingsFrame, +#CleanupSettingsFrame, #LoadLevelFrame, #SolidLineFrame { border: 1px solid #e6e6e6; diff --git a/stuff/config/qss/gray_072/gray_072_mac.qss b/stuff/config/qss/gray_072/gray_072_mac.qss index 2aba2c9d..e49f3590 100644 --- a/stuff/config/qss/gray_072/gray_072_mac.qss +++ b/stuff/config/qss/gray_072/gray_072_mac.qss @@ -764,7 +764,7 @@ DvDirTreeView { /*---------------------------------------------------------------------------*/ /* Cleanup Settings, LoadLevel, PsdSettingsPopup, FxSettingsPopup, RenameAsToonzPopup */ /*---------------------------------------------------------------------------*/ -#CleanupSettingsFrame, +#CleanupSettingsFrame, #LoadLevelFrame, #SolidLineFrame { border: 1px solid #e6e6e6; diff --git a/stuff/config/qss/gray_128/gray_128.less b/stuff/config/qss/gray_128/gray_128.less index f52a3a84..0d233843 100644 --- a/stuff/config/qss/gray_128/gray_128.less +++ b/stuff/config/qss/gray_128/gray_128.less @@ -595,7 +595,7 @@ DvDirTreeView { /*---------------------------------------------------------------------------*/ #CleanupSettingsFrame, #LoadLevelFrame, -#SolidLineFrame{ +#SolidLineFrame { border: 1px solid rgb(20,20,20); } diff --git a/stuff/config/qss/gray_128/gray_128.qss b/stuff/config/qss/gray_128/gray_128.qss index 0763d1e3..5e5eac7c 100644 --- a/stuff/config/qss/gray_128/gray_128.qss +++ b/stuff/config/qss/gray_128/gray_128.qss @@ -526,7 +526,7 @@ DvDirTreeView { /*---------------------------------------------------------------------------*/ /* Cleanup Settings, LoadLevel, PsdSettingsPopup, FxSettingsPopup, RenameAsToonzPopup */ /*---------------------------------------------------------------------------*/ -#CleanupSettingsFrame, +#CleanupSettingsFrame, #LoadLevelFrame, #SolidLineFrame { border: 1px solid #141414; diff --git a/stuff/config/qss/gray_128/gray_128_mac.qss b/stuff/config/qss/gray_128/gray_128_mac.qss index 8d887975..4093fe52 100644 --- a/stuff/config/qss/gray_128/gray_128_mac.qss +++ b/stuff/config/qss/gray_128/gray_128_mac.qss @@ -526,7 +526,7 @@ DvDirTreeView { /*---------------------------------------------------------------------------*/ /* Cleanup Settings, LoadLevel, PsdSettingsPopup, FxSettingsPopup, RenameAsToonzPopup */ /*---------------------------------------------------------------------------*/ -#CleanupSettingsFrame, +#CleanupSettingsFrame, #LoadLevelFrame, #SolidLineFrame { border: 1px solid #141414; diff --git a/stuff/profiles/layouts/rooms/Default/menubar_template.xml b/stuff/profiles/layouts/rooms/Default/menubar_template.xml index c41c8949..6c9f3b87 100644 --- a/stuff/profiles/layouts/rooms/Default/menubar_template.xml +++ b/stuff/profiles/layouts/rooms/Default/menubar_template.xml @@ -234,6 +234,7 @@ MI_ResetRoomLayout + MI_StartupPopup MI_About \ No newline at end of file diff --git a/toonz/sources/include/toonz/preferences.h b/toonz/sources/include/toonz/preferences.h index 3b32f868..37b9bd18 100644 --- a/toonz/sources/include/toonz/preferences.h +++ b/toonz/sources/include/toonz/preferences.h @@ -118,6 +118,9 @@ public: return m_replaceAfterSaveLevelAs; } + void enableStartupPopup(bool on); + bool isStartupPopupEnabled() { return m_startupPopupEnabled; } + void setProjectRoot(int index); int getProjectRoot() { return m_projectRoot; } @@ -474,7 +477,8 @@ private: bool m_rasterOptimizedMemory, m_saveUnpaintedInCleanup, m_askForOverrideRender, m_automaticSVNFolderRefreshEnabled, m_SVNEnabled, m_levelsBackupEnabled, m_minimizeSaveboxAfterEditing, - m_sceneNumberingEnabled, m_animationSheetEnabled, m_inksOnly; + m_sceneNumberingEnabled, m_animationSheetEnabled, m_inksOnly, + m_startupPopupEnabled; bool m_fillOnlySavebox, m_show0ThickLines, m_regionAntialias; bool m_onionSkinDuringPlayback; TPixel32 m_viewerBGColor, m_previewBGColor, m_chessboardColor1, diff --git a/toonz/sources/include/toonzqt/camerasettingswidget.h b/toonz/sources/include/toonzqt/camerasettingswidget.h index 18fc23bf..1b2a9959 100644 --- a/toonz/sources/include/toonzqt/camerasettingswidget.h +++ b/toonz/sources/include/toonzqt/camerasettingswidget.h @@ -71,6 +71,7 @@ protected: //--------------------------------------------------------------- class DVAPI CameraSettingsWidget final : public QFrame { + friend class StartupPopup; Q_OBJECT bool m_forCleanup; diff --git a/toonz/sources/toonz/CMakeLists.txt b/toonz/sources/toonz/CMakeLists.txt index 41ff9b35..484cfee0 100644 --- a/toonz/sources/toonz/CMakeLists.txt +++ b/toonz/sources/toonz/CMakeLists.txt @@ -100,6 +100,7 @@ set(MOC_HEADERS selectionutils.h shifttracetool.h shortcutpopup.h + startuppopup.h subcameramanager.h subscenecommand.h svncleanupdialog.h @@ -232,6 +233,7 @@ set(SOURCES scriptconsolepanel.cpp shifttracetool.cpp shortcutpopup.cpp + startuppopup.cpp subcameramanager.cpp timestretchpopup.cpp trackerpopup.cpp diff --git a/toonz/sources/toonz/Resources/startup.png b/toonz/sources/toonz/Resources/startup.png new file mode 100644 index 0000000000000000000000000000000000000000..10757e0c75046ab1d071693561c0d0988f219e75 GIT binary patch literal 6403 zcmV+e8T{snP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000gyNkl>2)o4#9`KA}LRfg(kL4k_|b)YgKIup`J8+*M(AbzohE z@v&>8JBy6F?zS?zGmFgFDvFM~YP-0yDuV6ukVjc)0I}s&n$kiGg|>u)I6eko5)~DK7&(IV0f1)(!aoC0&3EM*!Xikl>@e%>Z5y z2>%Me|EQ=C#K>t9P6nV52*1M*n=t?)dEcYB!&fpnkBVg~6%&FOSsqp{fF=N~yfB5I z&A|u&9|QP3_kAN5<|~W1IP#mV;Q(%@VnPrjORxZ7Gs6h8?x#*jc*`CX11BkRV8~#3OA~I(~catH@08Z3vb!DhZFzdIk%#mSW4H zw{iSp73Cs9j1VO4bkCi<2yZU^&}XsYlN>V|g$s-E%UQpnTqFqcumZ~?(;pvDT+9|T z>aNzHp}h`Wy#@d_#DD-7h+YTWwZ+`NJpJc6=-PtmXl2m@Ot$HS9)J!*1l=z8EWKuSKN7aoXU5DNAsn zy$+RU{uAtZk`JK5hij@iPoR{FH9>;q19F)h&)oY8LgkM0o{fFI_}lLFK6RMyKKnJ! zwbnrM;6^0JIL`E0IeRT46j87S@34o}=wIT7kG3Zlq!PP@cOXS zoR?%r&v{JcZcG$%%|{1^lM^|D1Zz+bs}D=Gw}f(;980sGbPC^ge5>DL1puvG&DgZ} zb=WX$R$?v_5S?-lt}8}={}mWdiy(#_q6yZ_@$--vo#GI7rRx&@{lmuryT{4qqo~sD z9xhLO74N&Z9q7f3xT!ds1VMu333FAsPGQ?m{v+ViYPKEUI$Q+Hjt;){L1_lC$!|W| zxP#w}RC2%7^M1E+o?5<_@hIfHMH_Pz!m+;%Uc^t$edpV&9%NC@=i=MJ#H*eQR}F&A zK&M}cKt6hM@5-E1+VO1CHA_qk-a0A1TzsFEDl*?X(<4`{vKB6!Wj zq$yZ4ztAD9;>?$*IKAEN{oY*qVW9tlimAxHzU9+#URD9GkSfvN7iLG#h!nW<%LWkA z)tuesZtkz-y=|8nM9F;Te@a{G{!A{WhdF>MAz`VCFN zijQ<$TK)XBQ!d9@`AbcU)=97cpt0k;;Q7&EF-~EIn;kCCm*7dw$Dht}zF^sH57ZAf zkXW(jRiM9L&DDSKbSOpdd zAxlI1Iniu4cGNqCrN)g7mgb<6$!vcHf9eDZt-FG17s&s%LT3p ze!=SM5zphiZZtTBu>(toFe(==eINwO-F=l@;bn(G=($3k!^EkO5m>wU*u%8kHN^s+ zUk)Q$g&wBMa)AnKj~iR*#Do=D4Hq}oBeus)$NblPiEK)lero1nrGaN}wuio88T)!g zvu(CGkCa!0hGPWct>9I8fPnTka;^ zba0-3SRjE-Dbr8IbOX4He{cy_goqwbOjxY5K$>rkM8Q&ed48#f=jfQHs!$={TK4aUHido5|M}Y)3rA)sv#44YD=Ul}j&^^ou_ zqhx|LDJe@d+nLGEd!4p)HU+C-sRLB8;6WwO`xr-G1rh-k7%7J`c$%gI#ZM`+O)1i^ zkn!x6L&Q#Y$pouO@Ax0aC#aATJ0{@wQG_UvJ#LOeSfAC5`nEH{B3P9IO$A>m@KUg( zZh{V$;1GeK0FG}bHIR7Ds%V0xZ93@iT?QE*oVqOF_qi|gVW-9YYFduLY%v8(ARpOicm>+WBV5P67SwwKO$5_yvsJB5E*T@sA@7V6Hkk6K)XQ`eT8L3>n_|E&)h%f!yQG5E(0&fz z)HoQzz&yr5WcPM`!tH zgy-#4^cBuY;RW@)$j^tH5|uF6$zYM?xKHZjX*O}Xo;CJ+?tM}4zj$_ap|jP zDs%;tZiOB^h{UuRD1#RvY3md+;Z zKmQ$STC`|3TtK(!1^^&7d=%2+(~&iL2Igku3GSE!0A0NXys`5|ZhNqxrD4(u#`hB10>nz>w0e| zHtbl7R~Bx>#AN3Iq-mqlu|oYcR;Zu$+ID;QHT-4QOK3JU`W!zSY##Ngu`8&GNG19w zr{;47M`+S(m!6*NOkdtTk9N{Ry!)p^yUFe1VXJpx#K;j@e>D$$?^2HSEEv+0QvO z5j~}|rvsm9-@~4>-}t==#ntOA*u3uznEH&EnLZEC=Wc)%Ht2iWQPZqNv!M}b@#%PA z@?unf)^rE}5ECAYX=$@CGkqRz^mbzF;Z4}P_X3{DUq_{eAV!j4 z*#+om<9-}%+>fx3aAc<3f$_==B*mm6COi%@nH)W)Zgkwdh89B;&R+cy*Lyny8i(_3 zr?I2q^Gg-~aei*u;tP zRALBX5Rs3xKdg*Oz_hd+Y(M!=m*MWDv z+57&8jTNs7{vIEZg!bkTe8uys03a+}hOB9Eu)-YhIEnT8*9G=*RRlqTHPl&`y8&Ac zz71nvk3)EbA_|J$R8&^{2zFRnShx(?IZ9YzqS8VTBv{h$-2LmZtM&_A?z(tOj6x$2 zXB&sz2Wnw7UUj-AI!2CZGnKHwNF{|JNU+351{v1oy@vmu*^bk#CjbDEifBYx$6$Ze zDRlRoaK1(cOi;xkWtjNA<-j1H$%Yx@d#e^a|YXZXJdeCj|L|0!c zl?Z|$!4eM{WQdPSME2O(7$2VrgW)C$-~B5tUAcDaPlm|=E07Q$i}7QUkdhn=Q-}dw z#&(!-1!gl91cC^P`YzV;G6X>ofksYAKoA587C{gM2^K*RBv=GN5JQ~*4*=I=m=N$` R-uwUn002ovPDHLkV1h?F1knHh literal 0 HcmV?d00001 diff --git a/toonz/sources/toonz/mainwindow.cpp b/toonz/sources/toonz/mainwindow.cpp index 8609f34b..afca0114 100644 --- a/toonz/sources/toonz/mainwindow.cpp +++ b/toonz/sources/toonz/mainwindow.cpp @@ -12,6 +12,7 @@ #include "iocommand.h" #include "tapp.h" #include "comboviewerpane.h" +#include "startuppopup.h" // TnzTools includes #include "tools/toolcommandids.h" @@ -1275,6 +1276,12 @@ void MainWindow::onMenuCheckboxChanged() { void MainWindow::showEvent(QShowEvent *event) { getCurrentRoom()->layout()->setEnabled(true); // See main function in // main.cpp + if (Preferences::instance()->isStartupPopupEnabled() && + !m_startupPopupShown) { + StartupPopup *startupPopup = new StartupPopup(); + startupPopup->show(); + m_startupPopupShown = true; + } } extern const char *applicationName; extern const char *applicationVersion; @@ -1920,7 +1927,7 @@ void MainWindow::defineActions() { tr("Toggle Main Window's Full Screen Mode"), "Ctrl+`"); createMenuWindowsAction(MI_About, tr("&About OpenToonz..."), ""); - + createMenuWindowsAction(MI_StartupPopup, tr("&Startup Popup..."), "Alt+S"); createRightClickMenuAction(MI_BlendColors, tr("&Blend colors"), ""); createToggle(MI_OnionSkin, tr("Onion Skin Toggle"), "/", false, diff --git a/toonz/sources/toonz/mainwindow.h b/toonz/sources/toonz/mainwindow.h index 8efc118b..4eb088a9 100644 --- a/toonz/sources/toonz/mainwindow.h +++ b/toonz/sources/toonz/mainwindow.h @@ -67,6 +67,7 @@ class MainWindow final : public QMainWindow { Q_OBJECT bool m_saveSettingsOnQuit; + bool m_startupPopupShown = false; int m_oldRoomIndex; QString m_currentRoomsChoice; UpdateChecker *m_updateChecker; @@ -212,6 +213,7 @@ signals: }; class RecentFiles { + friend class StartupPopup; QList m_recentScenes; QList m_recentLevels; QList m_recentFlipbookImages; diff --git a/toonz/sources/toonz/menubar.cpp b/toonz/sources/toonz/menubar.cpp index 83ecf2c2..c5782452 100644 --- a/toonz/sources/toonz/menubar.cpp +++ b/toonz/sources/toonz/menubar.cpp @@ -1344,6 +1344,7 @@ QMenuBar *StackedMenuBar::createFullMenuBar() { //---Help Menu QMenu *helpMenu = addMenu(tr("Help"), fullMenuBar); + addMenuItem(helpMenu, MI_StartupPopup); addMenuItem(helpMenu, MI_About); return fullMenuBar; diff --git a/toonz/sources/toonz/menubarcommandids.h b/toonz/sources/toonz/menubarcommandids.h index d0ec9f1a..6c79b5e4 100644 --- a/toonz/sources/toonz/menubarcommandids.h +++ b/toonz/sources/toonz/menubarcommandids.h @@ -311,5 +311,6 @@ #define MI_PreviewFx "MI_PreviewFx" #define MI_About "MI_About" +#define MI_StartupPopup "MI_StartupPopup" #define MI_PencilTest "MI_PencilTest" #endif diff --git a/toonz/sources/toonz/preferencespopup.cpp b/toonz/sources/toonz/preferencespopup.cpp index e310e51b..d9cca439 100644 --- a/toonz/sources/toonz/preferencespopup.cpp +++ b/toonz/sources/toonz/preferencespopup.cpp @@ -583,6 +583,12 @@ void PreferencesPopup::onAutoSaveOtherFilesChanged(int index) { //----------------------------------------------------------------------------- +void PreferencesPopup::onStartupPopupChanged(int index) { + m_pref->enableStartupPopup(index == Qt::Checked); +} + +//----------------------------------------------------------------------------- + void PreferencesPopup::onKeyframeTypeChanged(int index) { m_pref->setKeyframeType(index + 2); } @@ -953,6 +959,8 @@ PreferencesPopup::PreferencesPopup() m_autoSaveSceneCB = new CheckBox(tr("Automatically Save the Scene File")); m_autoSaveOtherFilesCB = new CheckBox(tr("Automatically Save Non-Scene Files")); + CheckBox *startupPopupCB = + new CheckBox(tr("Show Startup Window when OpenToonz Starts")); m_minuteFld = new DVGui::IntLineEdit(this, 15, 1, 60); CheckBox *replaceAfterSaveLevelAsCB = new CheckBox(tr("Replace Toonz Level after SaveLevelAs command"), this); @@ -1167,6 +1175,7 @@ PreferencesPopup::PreferencesPopup() m_autoSaveSceneCB->setChecked(m_pref->isAutosaveSceneEnabled()); m_autoSaveOtherFilesCB->setChecked(m_pref->isAutosaveOtherFilesEnabled()); m_minuteFld->setValue(m_pref->getAutosavePeriod()); + startupPopupCB->setChecked(m_pref->isStartupPopupEnabled()); replaceAfterSaveLevelAsCB->setChecked( m_pref->isReplaceAfterSaveLevelAsEnabled()); @@ -1432,6 +1441,8 @@ PreferencesPopup::PreferencesPopup() } m_autoSaveGroup->setLayout(autoSaveOptionsLay); generalFrameLay->addWidget(m_autoSaveGroup); + generalFrameLay->addWidget(startupPopupCB, 0, + Qt::AlignLeft | Qt::AlignVCenter); // Unit, CameraUnit QGridLayout *unitLay = new QGridLayout(); unitLay->setMargin(0); @@ -1949,6 +1960,8 @@ PreferencesPopup::PreferencesPopup() SLOT(onAutoSaveOtherFilesChanged(int))); ret = ret && connect(m_minuteFld, SIGNAL(editingFinished()), SLOT(onMinuteChanged())); + ret = ret && connect(startupPopupCB, SIGNAL(stateChanged(int)), + SLOT(onStartupPopupChanged(int))); ret = ret && connect(m_cellsDragBehaviour, SIGNAL(currentIndexChanged(int)), SLOT(onDragCellsBehaviourChanged(int))); ret = ret && connect(m_undoMemorySize, SIGNAL(editingFinished()), diff --git a/toonz/sources/toonz/preferencespopup.h b/toonz/sources/toonz/preferencespopup.h index 134ce6e5..8a499739 100644 --- a/toonz/sources/toonz/preferencespopup.h +++ b/toonz/sources/toonz/preferencespopup.h @@ -110,6 +110,7 @@ private slots: void onAutoSaveChanged(bool on); void onAutoSaveSceneChanged(int index); void onAutoSaveOtherFilesChanged(int index); + void onStartupPopupChanged(int index); void onDefaultViewerChanged(int index); void onBlankCountChanged(); void onBlankColorChanged(const TPixel32 &, bool isDragging); diff --git a/toonz/sources/toonz/startuppopup.cpp b/toonz/sources/toonz/startuppopup.cpp new file mode 100644 index 00000000..018198ce --- /dev/null +++ b/toonz/sources/toonz/startuppopup.cpp @@ -0,0 +1,914 @@ + + +#include "startuppopup.h" + +// Tnz6 includes +#include "mainwindow.h" +#include "tapp.h" +#include "iocommand.h" +#include "toutputproperties.h" +#include "toonzqt/flipconsole.h" +#include "menubarcommandids.h" +#include "tenv.h" +#include "toonz/stage.h" + +// TnzQt includes +#include "toonzqt/menubarcommand.h" +#include "toonzqt/gutil.h" +#include "toonzqt/doublefield.h" + +// TnzLib includes +#include "toonz/toonzscene.h" +#include "toonz/txsheet.h" +#include "toonz/levelproperties.h" +#include "toonz/sceneproperties.h" +#include "toonz/tcamera.h" +#include "toonz/tscenehandle.h" +#include "toonz/txsheethandle.h" +#include "toonz/preferences.h" +#include "toonz/tproject.h" + +// TnzCore includes +#include "tsystem.h" +#include "filebrowsermodel.h" + +// Qt includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; +using namespace DVGui; + +namespace { + +// the first value in the preset list +const QString custom = QObject::tr(""); + +QString removeZeros(QString srcStr) { + if (!srcStr.contains('.')) return srcStr; + + for (int i = srcStr.length() - 1; i >= 0; i--) { + if (srcStr.at(i) == '0') + srcStr.chop(1); + else if (srcStr.at(i) == '.') { + srcStr.chop(1); + break; + } else + break; + } + return srcStr; +} +} // namespace + +//============================================================================= +/*! \class StartupPopup + \brief The StartupPopup class provides a modal dialog to + bring up recent files or create a new scene. + + Inherits \b Dialog. +*/ +//----------------------------------------------------------------------------- + +StartupPopup::StartupPopup() + : Dialog(TApp::instance()->getMainWindow(), true, true, "StartupPopup") { + setWindowTitle(tr("OpenToonz Startup")); + + m_projectBox = new QGroupBox(tr("Choose Project"), this); + m_sceneBox = new QGroupBox(tr("Create a New Scene"), this); + m_recentBox = new QGroupBox(tr("Open Scene"), this); + m_projectBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + m_nameFld = new LineEdit(this); + m_pathFld = new FileField(this); + m_sceneNameLabel = new QLabel(tr("Scene Name:")); + m_widthLabel = new QLabel(tr("Width:"), this); + m_widthFld = new MeasuredDoubleLineEdit(this); + m_heightLabel = new QLabel(tr("Height:"), this); + m_heightFld = new MeasuredDoubleLineEdit(this); + m_dpiLabel = new QLabel(tr("DPI:"), this); + m_dpiFld = new DoubleLineEdit(this, 120); + m_resXLabel = new QLabel(tr("X"), this); + m_resXFld = new DoubleLineEdit(this); + m_resYFld = new DoubleLineEdit(this); + m_resTextLabel = new QLabel(tr("Resolution:"), this); + m_fpsLabel = new QLabel(tr("Frame Rate:"), this); + m_fpsFld = new DoubleLineEdit(this, 24.0); + m_cameraSettingsWidget = new CameraSettingsWidget(false); + m_presetCombo = new QComboBox(this); + m_unitsCB = new QComboBox(this); + m_addPresetBtn = new QPushButton(tr("Add"), this); + m_removePresetBtn = new QPushButton(tr("Remove"), this); + m_showAtStartCB = new QCheckBox(tr("Show this at startup"), this); + QPushButton *createButton = new QPushButton(tr("Create Scene"), this); + QPushButton *newProjectButton = new QPushButton(tr("New Project..."), this); + QPushButton *loadOtherSceneButton = + new QPushButton(tr("Open Another Scene..."), this); + m_projectsCB = new QComboBox(this); + QStringList type; + type << tr("pixel") << tr("cm") << tr("mm") << tr("inch") << tr("field"); + m_unitsCB->addItems(type); + + // Exclude all character which cannot fit in a filepath (Win). + // Dots are also prohibited since they are internally managed by Toonz. + QRegExp rx("[^\\\\/:?*.\"<>|]+"); + m_nameFld->setValidator(new QRegExpValidator(rx, this)); + + m_widthFld->setMeasure("camera.lx"); + m_heightFld->setMeasure("camera.ly"); + + m_widthFld->setRange(0.1, (std::numeric_limits::max)()); + m_heightFld->setRange(0.1, (std::numeric_limits::max)()); + m_fpsFld->setRange(1.0, (std::numeric_limits::max)()); + m_dpiFld->setRange(1.0, (std::numeric_limits::max)()); + m_resXFld->setRange(0.1, (std::numeric_limits::max)()); + m_resYFld->setRange(0.1, (std::numeric_limits::max)()); + m_showAtStartCB->setChecked(Preferences::instance()->isStartupPopupEnabled()); + m_showAtStartCB->setStyleSheet("QCheckBox{ background-color: none; }"); + m_addPresetBtn->setStyleSheet( + "QPushButton { padding-left: 4px; padding-right: 4px;}"); + m_removePresetBtn->setStyleSheet( + "QPushButton { padding-left: 4px; padding-right: 4px;}"); + QLabel *label = new QLabel(); + label->setPixmap(QPixmap(":Resources/startup.png")); + m_projectBox->setObjectName("SolidLineFrame"); + m_sceneBox->setObjectName("SolidLineFrame"); + m_recentBox->setObjectName("SolidLineFrame"); + m_projectBox->setContentsMargins(10, 10, 10, 10); + m_sceneBox->setContentsMargins(10, 10, 10, 10); + m_recentBox->setContentsMargins(10, 10, 10, 10); + m_recentBox->setFixedWidth(200); + m_sceneBox->setMinimumWidth(480); + m_projectBox->setMinimumWidth(480); + m_buttonFrame->setFixedHeight(30); + //--- layout + m_topLayout->setMargin(0); + m_topLayout->setSpacing(0); + { + QGridLayout *guiLay = new QGridLayout(); + QHBoxLayout *projectLay = new QHBoxLayout(); + QGridLayout *newSceneLay = new QGridLayout(); + m_recentSceneLay = new QVBoxLayout(); + guiLay->setMargin(10); + guiLay->setVerticalSpacing(10); + guiLay->setHorizontalSpacing(10); + + guiLay->addWidget(label, 0, 0, 1, 2, Qt::AlignLeft); + + projectLay->setSpacing(8); + projectLay->setMargin(8); + { + projectLay->addWidget(m_projectsCB, 1); + projectLay->addWidget(newProjectButton, 0); + } + m_projectBox->setLayout(projectLay); + guiLay->addWidget(m_projectBox, 1, 0, 1, 1, Qt::AlignCenter); + + newSceneLay->setMargin(8); + newSceneLay->setVerticalSpacing(8); + newSceneLay->setHorizontalSpacing(8); + { + // Scene Name + newSceneLay->addWidget(m_sceneNameLabel, 0, 0, + Qt::AlignRight | Qt::AlignVCenter); + newSceneLay->addWidget(m_nameFld, 0, 1, 1, 3); + + // Save In + newSceneLay->addWidget(new QLabel(tr("Save In:")), 1, 0, + Qt::AlignRight | Qt::AlignVCenter); + newSceneLay->addWidget(m_pathFld, 1, 1, 1, 3); + newSceneLay->addWidget(new QLabel(tr("Camera Size:")), 2, 0, + Qt::AlignRight | Qt::AlignVCenter); + QHBoxLayout *resListLay = new QHBoxLayout(); + resListLay->setSpacing(3); + resListLay->setMargin(1); + { + resListLay->addWidget(m_presetCombo, 1); + resListLay->addWidget(m_addPresetBtn, 0); + resListLay->addWidget(m_removePresetBtn, 0); + } + newSceneLay->addLayout(resListLay, 2, 1, 1, 3, Qt::AlignLeft); + + // Width - Height + newSceneLay->addWidget(m_widthLabel, 3, 0, + Qt::AlignRight | Qt::AlignVCenter); + newSceneLay->addWidget(m_widthFld, 3, 1); + newSceneLay->addWidget(m_heightLabel, 3, 2, + Qt::AlignRight | Qt::AlignVCenter); + newSceneLay->addWidget(m_heightFld, 3, 3); + + newSceneLay->addWidget(m_resTextLabel, 4, 0, 1, 1, Qt::AlignRight); + newSceneLay->addWidget(m_resXFld, 4, 1); + newSceneLay->addWidget(m_resXLabel, 4, 2, 1, 1, Qt::AlignCenter); + newSceneLay->addWidget(m_resYFld, 4, 3); + newSceneLay->addWidget(new QLabel(tr("Units:")), 5, 0, + Qt::AlignRight | Qt::AlignVCenter); + newSceneLay->addWidget(m_unitsCB, 5, 1, 1, 1); + newSceneLay->addWidget(m_dpiLabel, 5, 2, + Qt::AlignRight | Qt::AlignVCenter); + newSceneLay->addWidget(m_dpiFld, 5, 3, 1, 1); + newSceneLay->addWidget(m_fpsLabel, 6, 0, + Qt::AlignRight | Qt::AlignVCenter); + newSceneLay->addWidget(m_fpsFld, 6, 1, 1, 1); + newSceneLay->addWidget(createButton, 7, 1, 1, 3, Qt::AlignLeft); + } + m_sceneBox->setLayout(newSceneLay); + guiLay->addWidget(m_sceneBox, 2, 0, 4, 1, Qt::AlignLeft); + + m_recentSceneLay->setMargin(8); + m_recentSceneLay->setSpacing(8); + { + // Recent Scene List + m_recentBox->setLayout(m_recentSceneLay); + guiLay->addWidget(m_recentBox, 1, 1, 4, 1, Qt::AlignTop); + guiLay->addWidget(loadOtherSceneButton, 5, 1, 1, 1, Qt::AlignRight); + } + m_topLayout->addLayout(guiLay, 0); + } + + m_buttonLayout->setMargin(0); + m_buttonLayout->setSpacing(10); + { m_buttonLayout->addWidget(m_showAtStartCB, Qt::AlignLeft); } + + TApp *app = TApp::instance(); + TSceneHandle *sceneHandle = app->getCurrentScene(); + + //---- signal-slot connections + bool ret = true; + ret = ret && connect(sceneHandle, SIGNAL(sceneChanged()), this, + SLOT(onSceneChanged())); + ret = ret && connect(sceneHandle, SIGNAL(sceneSwitched()), this, + SLOT(onSceneChanged())); + ret = ret && connect(newProjectButton, SIGNAL(clicked()), this, + SLOT(onNewProjectButtonPressed())); + ret = ret && connect(loadOtherSceneButton, SIGNAL(clicked()), this, + SLOT(onLoadSceneButtonPressed())); + ret = ret && connect(m_projectsCB, SIGNAL(currentIndexChanged(int)), + SLOT(onProjectChanged(int))); + ret = ret && + connect(createButton, SIGNAL(clicked()), this, SLOT(onCreateButton())); + ret = ret && connect(m_showAtStartCB, SIGNAL(stateChanged(int)), this, + SLOT(onShowAtStartChanged(int))); + ret = ret && connect(m_widthFld, SIGNAL(valueChanged()), this, + SLOT(updateResolution())); + ret = ret && connect(m_heightFld, SIGNAL(valueChanged()), this, + SLOT(updateResolution())); + ret = ret && + connect(m_resXFld, SIGNAL(valueChanged()), this, SLOT(updateSize())); + ret = ret && + connect(m_resYFld, SIGNAL(valueChanged()), this, SLOT(updateSize())); + ret = ret && connect(m_dpiFld, SIGNAL(editingFinished()), this, + SLOT(onDpiChanged())); + ret = ret && connect(m_presetCombo, SIGNAL(activated(const QString &)), + SLOT(onPresetSelected(const QString &))); + ret = ret && connect(m_addPresetBtn, SIGNAL(clicked()), SLOT(addPreset())); + ret = ret && connect(m_unitsCB, SIGNAL(currentIndexChanged(int)), + SLOT(onCameraUnitChanged(int))); + ret = ret && + connect(m_removePresetBtn, SIGNAL(clicked()), SLOT(removePreset())); + ret = ret && connect(m_nameFld, SIGNAL(returnPressedNow()), createButton, + SLOT(animateClick())); + assert(ret); +} + +//----------------------------------------------------------------------------- + +void StartupPopup::showEvent(QShowEvent *) { + loadPresetList(); + updateProjectCB(); + m_nameFld->setFocus(); + m_pathFld->setPath(TApp::instance() + ->getCurrentScene() + ->getScene() + ->getProject() + ->getScenesPath() + .getQString()); + TDimensionD cameraSize = TApp::instance() + ->getCurrentScene() + ->getScene() + ->getCurrentCamera() + ->getSize(); + TDimension cameraRes = TApp::instance() + ->getCurrentScene() + ->getScene() + ->getCurrentCamera() + ->getRes(); + double fps = TApp::instance() + ->getCurrentScene() + ->getScene() + ->getProperties() + ->getOutputProperties() + ->getFrameRate(); + m_widthFld->setValue(cameraSize.lx); + m_heightFld->setValue(cameraSize.ly); + if (Preferences::instance()->getCameraUnits() == "pixel") { + m_widthFld->setDecimals(0); + m_heightFld->setDecimals(0); + m_resTextLabel->hide(); + m_resXFld->hide(); + m_resYFld->hide(); + m_resXLabel->hide(); + m_dpiFld->hide(); + m_dpiLabel->hide(); + } else { + m_widthFld->setDecimals(4); + m_heightFld->setDecimals(4); + m_resXFld->show(); + m_resYFld->show(); + m_resXLabel->show(); + m_resTextLabel->show(); + m_dpiFld->show(); + m_dpiLabel->show(); + } + + m_fpsFld->setValue(fps); + m_unitsCB->setCurrentText(Preferences::instance()->getCameraUnits()); + m_dpi = cameraRes.lx / cameraSize.lx; + m_xRes = cameraRes.lx; + m_yRes = cameraRes.ly; + m_resXFld->setValue(m_xRes); + m_resYFld->setValue(m_yRes); + m_resXFld->setDecimals(0); + m_resYFld->setDecimals(0); + m_dpiFld->setValue(m_dpi); + + int boxWidth = m_sceneBox->width(); + int boxHeight = m_sceneBox->height(); + m_sceneBox->setFixedWidth(boxWidth); + m_projectBox->setFixedWidth(boxWidth); + m_recentBox->setMinimumHeight(boxHeight); + + // update recent scenes + // clear items if they exist first + + if (m_recentSceneLay->count() > 0) { + QLayoutItem *child; + while (m_recentSceneLay->count() != 0) { + child = m_recentSceneLay->takeAt(0); + delete child; + } + } + + m_sceneNames = RecentFiles::instance()->getFilesNameList(RecentFiles::Scene); + m_recentNamesLabels = QVector(m_sceneNames.count()); + + if (m_sceneNames.count() <= 0) { + m_recentSceneLay->addWidget(new QLabel(tr("No Recent Scenes"), this), 1, + Qt::AlignTop); + } else { + int i = 0; + for (QString name : m_sceneNames) { + if (i > 9) break; // box can hold 10 scenes + QString justName = QString::fromStdString(TFilePath(name).getName()); + m_recentNamesLabels[i] = new StartupLabel(justName, this, i); + m_recentSceneLay->addWidget(m_recentNamesLabels[i], i, Qt::AlignTop); + i++; + } + m_recentSceneLay->addStretch(100); + } + + bool ret = true; + for (int i = 0; i < m_recentNamesLabels.count() && i < 7; i++) { + ret = ret && connect(m_recentNamesLabels[i], SIGNAL(wasClicked(int)), this, + SLOT(onRecentSceneClicked(int))); + } + assert(ret); + // center window + this->move(QApplication::desktop()->screen()->rect().center() - + this->rect().center()); +} + +//----------------------------------------------------------------------------- + +void StartupPopup::onCreateButton() { + if (m_nameFld->text().trimmed() == "") { + DVGui::warning(tr("The name cannot be empty.")); + m_nameFld->setFocus(); + return; + } + if (!TSystem::doesExistFileOrLevel(TFilePath(m_pathFld->getPath()))) { + DVGui::warning(tr("The chosen file path is not valid.")); + m_pathFld->setFocus(); + return; + } + + if (m_widthFld->getValue() < 1) { + DVGui::warning(tr("The width must be 1 or more.")); + m_widthFld->setFocus(); + return; + } + if (m_heightFld->getValue() < 1) { + DVGui::warning(tr("The height must be 1 or more.")); + m_heightFld->setFocus(); + return; + } + if (m_fpsFld->getValue() < 1) { + DVGui::warning(tr("The frame rate must be 1 or more.")); + m_fpsFld->setFocus(); + return; + } + if (TSystem::doesExistFileOrLevel( + TFilePath(m_pathFld->getPath()) + + TFilePath(m_nameFld->text().trimmed().toStdWString() + L".tnz"))) { + QString question; + question = QObject::tr( + "The file name already exists." + "\nDo you want to overwrite it?"); + int ret = DVGui::MsgBox(question, QObject::tr("Yes"), QObject::tr("No"), 0); + if (ret == 0 || ret == 2) { + // no (or closed message box window) + return; + ; + } + } + CommandManager::instance()->execute(MI_NewScene); + TApp::instance()->getCurrentScene()->getScene()->setScenePath( + TFilePath(m_pathFld->getPath()) + + TFilePath(m_nameFld->text().trimmed().toStdWString())); + TDimensionD size = + TDimensionD(m_widthFld->getValue(), m_heightFld->getValue()); + TDimension res = TDimension(m_xRes, m_yRes); + double fps = m_fpsFld->getValue(); + TApp::instance() + ->getCurrentScene() + ->getScene() + ->getProperties() + ->getOutputProperties() + ->setFrameRate(fps); + TApp::instance()->getCurrentScene()->getScene()->getCurrentCamera()->setSize( + size); + TApp::instance()->getCurrentScene()->getScene()->getCurrentCamera()->setRes( + res); + // this one is debatable - should the scene be saved right away? + // IoCmd::saveScene(); + // this makes sure the scene viewers update to the right fps + TApp::instance()->getCurrentScene()->notifySceneSwitched(); + + hide(); +} + +//----------------------------------------------------------------------------- + +void StartupPopup::updateProjectCB() { + m_updating = true; + m_projectPaths.clear(); + m_projectsCB->clear(); + + TFilePath sandboxFp = TProjectManager::instance()->getSandboxProjectFolder() + + "sandbox_otprj.xml"; + m_projectPaths.push_back(sandboxFp); + m_projectsCB->addItem("sandbox"); + + std::vector prjRoots; + TProjectManager::instance()->getProjectRoots(prjRoots); + for (int i = 0; i < prjRoots.size(); i++) { + TFilePathSet fps; + TSystem::readDirectory_Dir_ReadExe(fps, prjRoots[i]); + + TFilePathSet::iterator it; + for (it = fps.begin(); it != fps.end(); ++it) { + TFilePath fp(*it); + if (TProjectManager::instance()->isProject(fp)) { + m_projectPaths.push_back( + TProjectManager::instance()->projectFolderToProjectPath(fp)); + m_projectsCB->addItem(QString::fromStdString(fp.getName())); + } + } + } + int i; + for (i = 0; i < m_projectPaths.size(); i++) { + if (TProjectManager::instance()->getCurrentProjectPath() == + m_projectPaths[i]) { + m_projectsCB->setCurrentIndex(i); + break; + } + } + m_pathFld->setPath(TApp::instance() + ->getCurrentScene() + ->getScene() + ->getProject() + ->getScenesPath() + .getQString()); + m_updating = false; +} + +//----------------------------------------------------------------------------- + +void StartupPopup::onProjectChanged(int index) { + if (m_updating) return; + TFilePath projectFp = m_projectPaths[index]; + + TProjectManager::instance()->setCurrentProjectPath(projectFp); + + IoCmd::newScene(); + m_pathFld->setPath(TApp::instance() + ->getCurrentScene() + ->getScene() + ->getProject() + ->getScenesPath() + .getQString()); + m_fpsFld->setValue(TApp::instance() + ->getCurrentScene() + ->getScene() + ->getProperties() + ->getOutputProperties() + ->getFrameRate()); + TDimension res = TApp::instance() + ->getCurrentScene() + ->getScene() + ->getCurrentCamera() + ->getRes(); + m_xRes = res.lx; + m_yRes = res.ly; + m_resXFld->setValue(m_xRes); + m_resYFld->setValue(m_yRes); + TDimensionD size = TApp::instance() + ->getCurrentScene() + ->getScene() + ->getCurrentCamera() + ->getSize(); + m_widthFld->setValue(size.lx); + m_heightFld->setValue(size.ly); + m_dpi = m_xRes / size.lx; + m_dpiFld->setValue(m_dpi); +} + +//----------------------------------------------------------------------------- + +void StartupPopup::loadPresetList() { + m_presetCombo->clear(); + m_presetCombo->addItem("..."); + m_presetListFile = ToonzFolder::getReslistPath(false).getQString(); + QFile file(m_presetListFile); + if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { + QTextStream in(&file); + while (!in.atEnd()) { + QString line = in.readLine().trimmed(); + if (line != "") m_presetCombo->addItem(line); + } + } + m_presetCombo->setCurrentIndex(0); +} + +//----------------------------------------------------------------------------- + +void StartupPopup::savePresetList() { + QFile file(m_presetListFile); + if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) return; + QTextStream out(&file); + int n = m_presetCombo->count(); + for (int i = 1; i < n; i++) out << m_presetCombo->itemText(i) << "\n"; +} + +//----------------------------------------------------------------------------- + +void StartupPopup::addPreset() { + int xRes = (int)(m_widthFld->getValue() * m_dpi); + int yRes = (int)(m_heightFld->getValue() * m_dpi); + double lx = m_widthFld->getValue(); + double ly = m_heightFld->getValue(); + double ar = m_widthFld->getValue() / m_heightFld->getValue(); + + QString presetString; + presetString = QString::number(xRes) + "x" + QString::number(yRes) + ", " + + removeZeros(QString::number(lx)) + "x" + + removeZeros(QString::number(ly)) + ", " + + aspectRatioValueToString(ar); + + bool ok; + QString qs; + while (1) { + qs = DVGui::getText(tr("Preset name"), + tr("Enter the name for %1").arg(presetString), "", &ok); + + if (!ok) return; + + if (qs.indexOf(",") != -1) + QMessageBox::warning(this, tr("Error : Preset Name is Invalid"), + tr("The preset name must not use ','(comma).")); + else + break; + } + + int oldn = m_presetCombo->count(); + m_presetCombo->addItem(qs + "," + presetString); + int newn = m_presetCombo->count(); + m_presetCombo->blockSignals(true); + m_presetCombo->setCurrentIndex(m_presetCombo->count() - 1); + m_presetCombo->blockSignals(false); + + savePresetList(); +} + +//----------------------------------------------------------------------------- + +void StartupPopup::removePreset() { + int index = m_presetCombo->currentIndex(); + if (index <= 0) return; + + // confirmation dialog + int ret = DVGui::MsgBox(QObject::tr("Deleting \"%1\".\nAre you sure?") + .arg(m_presetCombo->currentText()), + QObject::tr("Delete"), QObject::tr("Cancel")); + if (ret == 0 || ret == 2) return; + + m_presetCombo->removeItem(index); + m_presetCombo->setCurrentIndex(0); + savePresetList(); +} + +//----------------------------------------------------------------------------- + +void StartupPopup::onPresetSelected(const QString &str) { + if (str == custom || str.isEmpty()) return; + QString name, arStr; + int xres = 0, yres = 0; + double fx = -1.0, fy = -1.0; + QString xoffset = "", yoffset = ""; + double ar; + + if (parsePresetString(str, name, xres, yres, fx, fy, xoffset, yoffset, ar, + false)) { + m_xRes = xres; + m_yRes = yres; + // The current solution is to preserve the DPI so that scenes are less + // likely to become incompatible with pixels only mode in the future + // Commented below is the default behavior of the camera settings widget + // m_widthFld->setValue(m_heightFld->getValue() * ar); + // m_dpiFld->setValue(m_xRes / m_widthFld->getValue()); + + // here is the system that preserves dpi + m_widthFld->setValue((double)xres / (double)m_dpi); + m_heightFld->setValue((double)yres / (double)m_dpi); + if (Preferences::instance()->getPixelsOnly()) { + m_widthFld->setValue((double)xres / Stage::standardDpi); + m_heightFld->setValue((double)yres / Stage::standardDpi); + m_dpiFld->setValue(Stage::standardDpi); + } + m_resXFld->setValue(m_xRes); + m_resYFld->setValue(m_yRes); + } else { + QMessageBox::warning( + this, tr("Bad camera preset"), + tr("'%1' doesn't seem to be a well formed camera preset. \n" + "Possibly the preset file has been corrupted") + .arg(str)); + } +} + +//-------------------------------------------------------------------------- + +bool StartupPopup::parsePresetString(const QString &str, QString &name, + int &xres, int &yres, double &fx, + double &fy, QString &xoffset, + QString &yoffset, double &ar, + bool forCleanup) { + /* + parsing preset string with QString::split(). + !NOTE! fx/fy (camera size in inch) and xoffset/yoffset (camera offset used in + cleanup camera) are optional, + in order to keep compatibility with default (Harlequin's) reslist.txt + */ + + QStringList tokens = str.split(",", QString::SkipEmptyParts); + + if (!(tokens.count() == 3 || + (!forCleanup && tokens.count() == 4) || /*- with "fx x fy" token -*/ + (forCleanup && + tokens.count() == + 6))) /*- with "fx x fy", xoffset and yoffset tokens -*/ + return false; + /*- name -*/ + name = tokens[0]; + + /*- xres, yres (like: 1024x768) -*/ + QStringList values = tokens[1].split("x"); + if (values.count() != 2) return false; + bool ok; + xres = values[0].toInt(&ok); + if (!ok) return false; + yres = values[1].toInt(&ok); + if (!ok) return false; + + if (tokens.count() >= 4) { + /*- fx, fy -*/ + values = tokens[2].split("x"); + if (values.count() != 2) return false; + fx = values[0].toDouble(&ok); + if (!ok) return false; + fy = values[1].toDouble(&ok); + if (!ok) return false; + + /*- xoffset, yoffset -*/ + if (forCleanup) { + xoffset = tokens[3]; + yoffset = tokens[4]; + /*- remove single space -*/ + if (xoffset.startsWith(' ')) xoffset.remove(0, 1); + if (yoffset.startsWith(' ')) yoffset.remove(0, 1); + } + } + + /*- AR -*/ + ar = aspectRatioStringToValue(tokens.last()); + + return true; +} + +//----------------------------------------------------------------------------- + +double StartupPopup::aspectRatioStringToValue(const QString &s) { + if (s == "") { + return 1; + } + int i = s.indexOf("/"); + if (i <= 0 || i + 1 >= s.length()) return s.toDouble(); + int num = s.left(i).toInt(); + int den = s.mid(i + 1).toInt(); + if (den <= 0) den = 1; + return (double)num / (double)den; +} + +//----------------------------------------------------------------------------- + +// A/R : value => string (e.g. '4/3' or '1.23') +QString StartupPopup::aspectRatioValueToString(double value, int width, + int height) { + double v = value; + + if (width != 0 && height != 0) { + if (areAlmostEqual(value, (double)width / (double)height, 1e-3)) + return QString("%1/%2").arg(width).arg(height); + } + + double iv = tround(v); + if (fabs(iv - v) > 0.01) { + for (int d = 2; d < 20; d++) { + int n = tround(v * d); + if (fabs(n - v * d) <= 0.01) + return QString::number(n) + "/" + QString::number(d); + } + return QString::number(value, 'f', 5); + } else { + return QString::number((int)iv); + } +} + +//----------------------------------------------------------------------------- + +void StartupPopup::onNewProjectButtonPressed() { + CommandManager::instance()->execute(MI_NewProject); +} + +//----------------------------------------------------------------------------- + +void StartupPopup::onSceneChanged() { + // close the box if a recent scene has been selected + if (!TApp::instance()->getCurrentScene()->getScene()->isUntitled()) { + hide(); + } else { + updateProjectCB(); + } +} + +//----------------------------------------------------------------------------- + +void StartupPopup::onDpiChanged() { + if (Preferences::instance()->getPixelsOnly()) { + m_dpi = Stage::standardDpi; + m_dpiFld->setValue(Stage::standardDpi); + updateResolution(); + } else { + m_dpi = m_dpiFld->getValue(); + updateResolution(); + } +} + +//----------------------------------------------------------------------------- + +void StartupPopup::onLoadSceneButtonPressed() { + CommandManager::instance()->execute(MI_LoadScene); +} + +//----------------------------------------------------------------------------- + +void StartupPopup::onRecentSceneClicked(int index) { + if (index < 0) return; + QString path = + RecentFiles::instance()->getFilePath(index, RecentFiles::Scene); + IoCmd::loadScene(TFilePath(path.toStdWString()), false); + RecentFiles::instance()->moveFilePath(index, 0, RecentFiles::Scene); + RecentFiles::instance()->refreshRecentFilesMenu(RecentFiles::Scene); + hide(); +} + +//----------------------------------------------------------------------------- + +void StartupPopup::onCameraUnitChanged(int index) { + Preferences *pref = Preferences::instance(); + QStringList type; + type << tr("pixel") << tr("cm") << tr("mm") << tr("inch") << tr("field"); + + double width = m_widthFld->getValue(); + double height = m_heightFld->getValue(); + if (index != 0) { + pref->setPixelsOnly(false); + pref->setCameraUnits(type[index].toStdString()); + m_widthFld->setDecimals(4); + m_heightFld->setDecimals(4); + m_resTextLabel->show(); + m_resXFld->show(); + m_resYFld->show(); + m_resXLabel->show(); + m_dpiFld->show(); + m_dpiLabel->show(); + m_widthFld->setMeasure("camera.lx"); + m_heightFld->setMeasure("camera.ly"); + m_widthFld->setValue(width); + m_heightFld->setValue(height); + } else { + pref->setPixelsOnly(true); + pref->setUnits("pixel"); + pref->setCameraUnits("pixel"); + m_widthFld->setDecimals(0); + m_heightFld->setDecimals(0); + m_resTextLabel->hide(); + m_resXFld->hide(); + m_resYFld->hide(); + m_resXLabel->hide(); + m_dpiFld->hide(); + m_dpiLabel->hide(); + m_dpiFld->setValue(Stage::standardDpi); + m_widthFld->setMeasure("camera.lx"); + m_heightFld->setMeasure("camera.ly"); + m_widthFld->setValue(m_xRes / Stage::standardDpi); + m_heightFld->setValue(m_yRes / Stage::standardDpi); + } +} + +//----------------------------------------------------------------------------- + +void StartupPopup::onShowAtStartChanged(int index) { + Preferences::instance()->enableStartupPopup(index); +} + +//----------------------------------------------------------------------------- + +void StartupPopup::updateResolution() { + if (Preferences::instance()->getPixelsOnly()) { + if (m_dpiFld->getValue() != Stage::standardDpi) { + m_dpiFld->setValue(Stage::standardDpi); + } + m_xRes = m_widthFld->getValue() * Stage::standardDpi; + m_yRes = m_heightFld->getValue() * Stage::standardDpi; + m_resXFld->setValue(m_xRes); + m_resYFld->setValue(m_yRes); + } else { + m_xRes = m_widthFld->getValue() * m_dpi; + m_yRes = m_heightFld->getValue() * m_dpi; + m_resXFld->setValue(m_xRes); + m_resYFld->setValue(m_yRes); + } + m_presetCombo->setCurrentIndex(0); +} + +//----------------------------------------------------------------------------- + +void StartupPopup::updateSize() { + m_xRes = m_resXFld->getValue(); + m_yRes = m_resYFld->getValue(); + if (Preferences::instance()->getPixelsOnly()) { + if (m_dpiFld->getValue() != Stage::standardDpi) { + m_dpiFld->setValue(Stage::standardDpi); + } + m_widthFld->setValue((double)m_xRes / Stage::standardDpi); + m_heightFld->setValue((double)m_yRes / Stage::standardDpi); + } else { + m_widthFld->setValue((double)m_xRes / m_dpi); + m_heightFld->setValue((double)m_yRes / m_dpi); + } + m_presetCombo->setCurrentIndex(0); +} + +//----------------------------------------------------------------------------- + +StartupLabel::StartupLabel(const QString &text, QWidget *parent, int index) + : QLabel(parent), m_index(index) { + setText(text); +} + +StartupLabel::~StartupLabel() {} + +void StartupLabel::mousePressEvent(QMouseEvent *event) { + m_text = text(); + std::string strText = m_text.toStdString(); + emit wasClicked(m_index); +} + +OpenPopupCommandHandler openStartupPopup(MI_StartupPopup); diff --git a/toonz/sources/toonz/startuppopup.h b/toonz/sources/toonz/startuppopup.h new file mode 100644 index 00000000..cd1e33d3 --- /dev/null +++ b/toonz/sources/toonz/startuppopup.h @@ -0,0 +1,109 @@ +#pragma once + +#ifndef STARTUPPOPUP_H +#define STARTUPPOPUP_H + +#include "toonzqt/dvdialog.h" +#include "toonzqt/doublefield.h" +#include "toonzqt/intfield.h" +#include "toonzqt/filefield.h" +#include "toonzqt/camerasettingswidget.h" +#include +#include +#include +#include + +// forward declaration +class QLabel; +class QComboBox; +class StartupLabel; + +//============================================================================= +// LevelCreatePopup +//----------------------------------------------------------------------------- + +class StartupPopup final : public DVGui::Dialog { + Q_OBJECT + + DVGui::LineEdit *m_nameFld; + DVGui::FileField *m_pathFld; + QLabel *m_widthLabel; + QLabel *m_heightLabel; + QLabel *m_fpsLabel; + QLabel *m_resXLabel; + QLabel *m_resTextLabel; + QLabel *m_dpiLabel; + QLabel *m_sceneNameLabel; + DVGui::DoubleLineEdit *m_dpiFld; + DVGui::MeasuredDoubleLineEdit *m_widthFld; + DVGui::MeasuredDoubleLineEdit *m_heightFld; + DVGui::DoubleLineEdit *m_fpsFld; + DVGui::DoubleLineEdit *m_resXFld; + DVGui::DoubleLineEdit *m_resYFld; + QList m_sceneNames; + QList m_projectPaths; + QCheckBox *m_showAtStartCB; + QComboBox *m_projectsCB; + QComboBox *m_unitsCB; + QPushButton *m_loadOtherSceneButton; + QPushButton *m_newProjectButton; + QComboBox *m_presetCombo; + QPushButton *m_addPresetBtn, *m_removePresetBtn; + CameraSettingsWidget *m_cameraSettingsWidget; + double m_dpi; + int m_xRes, m_yRes; + bool m_updating = false; + QString m_presetListFile; + QGroupBox *m_projectBox; + QGroupBox *m_sceneBox; + QGroupBox *m_recentBox; + QVBoxLayout *m_recentSceneLay; + QVector m_recentNamesLabels; + +public: + StartupPopup(); + +protected: + void showEvent(QShowEvent *) override; + void loadPresetList(); + void savePresetList(); + QString aspectRatioValueToString(double value, int width = 0, int height = 0); + double aspectRatioStringToValue(const QString &s); + bool parsePresetString(const QString &str, QString &name, int &xres, + int &yres, double &fx, double &fy, QString &xoffset, + QString &yoffset, double &ar, bool forCleanup = false); + +public slots: + void onRecentSceneClicked(int index); + void onCreateButton(); + void onShowAtStartChanged(int index); + void updateProjectCB(); + void onProjectChanged(int index); + void onNewProjectButtonPressed(); + void onLoadSceneButtonPressed(); + void onSceneChanged(); + void updateResolution(); + void updateSize(); + void onDpiChanged(); + void addPreset(); + void removePreset(); + void onPresetSelected(const QString &str); + void onCameraUnitChanged(int index); +}; + +class StartupLabel : public QLabel { + Q_OBJECT +public: + explicit StartupLabel(const QString &text = "", QWidget *parent = 0, + int index = -1); + ~StartupLabel(); + QString m_text; + int m_index; +signals: + void wasClicked(int index); + +protected: + void mousePressEvent(QMouseEvent *event); +}; + +#endif // STARTUPPOPUP_H diff --git a/toonz/sources/toonz/toonz.qrc b/toonz/sources/toonz/toonz.qrc index 75aa7a16..cbc6f884 100644 --- a/toonz/sources/toonz/toonz.qrc +++ b/toonz/sources/toonz/toonz.qrc @@ -264,6 +264,7 @@ Resources/standard.png Resources/standard_on.png Resources/standard_over.png + Resources/startup.png Resources/start_off.png Resources/start_on.png Resources/stop_off.png diff --git a/toonz/sources/toonzlib/preferences.cpp b/toonz/sources/toonzlib/preferences.cpp index 2418bc85..07f7fcf5 100644 --- a/toonz/sources/toonzlib/preferences.cpp +++ b/toonz/sources/toonzlib/preferences.cpp @@ -257,6 +257,7 @@ Preferences::Preferences() , m_autosaveEnabled(false) , m_autosaveSceneEnabled(true) , m_autosaveOtherFilesEnabled(true) + , m_startupPopupEnabled(true) , m_defaultViewerEnabled(false) , m_saveUnpaintedInCleanup(true) , m_askForOverrideRender(true) @@ -330,6 +331,7 @@ Preferences::Preferences() getValue(*m_settings, "autosaveSceneEnabled", m_autosaveSceneEnabled); getValue(*m_settings, "autosaveOtherFilesEnabled", m_autosaveOtherFilesEnabled); + getValue(*m_settings, "startupPopupEnabled", m_startupPopupEnabled); getValue(*m_settings, "defaultViewerEnabled", m_defaultViewerEnabled); getValue(*m_settings, "rasterOptimizedMemory", m_rasterOptimizedMemory); getValue(*m_settings, "saveUnpaintedInCleanup", m_saveUnpaintedInCleanup); @@ -667,6 +669,13 @@ void Preferences::enableAutosaveOtherFiles(bool on) { //----------------------------------------------------------------- +void Preferences::enableStartupPopup(bool on) { + m_startupPopupEnabled = on; + m_settings->setValue("startupPopupEnabled", on ? "1" : "0"); +} + +//----------------------------------------------------------------- + void Preferences::setAskForOverrideRender(bool on) { m_autosaveEnabled = on; m_settings->setValue("askForOverrideRender", on ? "1" : "0"); From b81709de216dafd19132bcf110f6ed8215c897ae Mon Sep 17 00:00:00 2001 From: shun_iwasawa Date: Tue, 18 Oct 2016 17:06:02 +0900 Subject: [PATCH 31/56] highlight recent items on mouse hover --- stuff/config/qss/gray_048/gray_048.less | 7 +++++++ stuff/config/qss/gray_048/gray_048.qss | 8 +++++++- stuff/config/qss/gray_048/gray_048_mac.qss | 8 +++++++- stuff/config/qss/gray_072/gray_072.less | 7 +++++++ stuff/config/qss/gray_072/gray_072.qss | 8 +++++++- stuff/config/qss/gray_072/gray_072_mac.qss | 8 +++++++- stuff/config/qss/gray_128/gray_128.less | 7 +++++++ stuff/config/qss/gray_128/gray_128.qss | 8 +++++++- stuff/config/qss/gray_128/gray_128_mac.qss | 8 +++++++- toonz/sources/toonz/startuppopup.cpp | 7 +++++-- 10 files changed, 68 insertions(+), 8 deletions(-) diff --git a/stuff/config/qss/gray_048/gray_048.less b/stuff/config/qss/gray_048/gray_048.less index 9ed5281f..c170ed21 100644 --- a/stuff/config/qss/gray_048/gray_048.less +++ b/stuff/config/qss/gray_048/gray_048.less @@ -1369,4 +1369,11 @@ QDialog #dialogButtonFrame { #GearButton { qproperty-icon: url("@{image_url}/gear.png"); +} + +#StartupLabel { + padding: 3px; + &:hover { + .baseBG(light, 10%); + } } \ No newline at end of file diff --git a/stuff/config/qss/gray_048/gray_048.qss b/stuff/config/qss/gray_048/gray_048.qss index 97438d38..0c17daf7 100644 --- a/stuff/config/qss/gray_048/gray_048.qss +++ b/stuff/config/qss/gray_048/gray_048.qss @@ -764,7 +764,7 @@ DvDirTreeView { /*---------------------------------------------------------------------------*/ /* Cleanup Settings, LoadLevel, PsdSettingsPopup, FxSettingsPopup, RenameAsToonzPopup */ /*---------------------------------------------------------------------------*/ -#CleanupSettingsFrame, +#CleanupSettingsFrame, #LoadLevelFrame, #SolidLineFrame { border: 1px solid #e6e6e6; @@ -1372,5 +1372,11 @@ QDialog #dialogButtonFrame { #GearButton { qproperty-icon: url("../gray_072/imgs/gear.png"); } +#StartupLabel { + padding: 3px; +} +#StartupLabel:hover { + background-color: #4a4a4a; +} //# sourceMappingURL=gray_048.qss.map \ No newline at end of file diff --git a/stuff/config/qss/gray_048/gray_048_mac.qss b/stuff/config/qss/gray_048/gray_048_mac.qss index f731688a..1217245c 100644 --- a/stuff/config/qss/gray_048/gray_048_mac.qss +++ b/stuff/config/qss/gray_048/gray_048_mac.qss @@ -764,7 +764,7 @@ DvDirTreeView { /*---------------------------------------------------------------------------*/ /* Cleanup Settings, LoadLevel, PsdSettingsPopup, FxSettingsPopup, RenameAsToonzPopup */ /*---------------------------------------------------------------------------*/ -#CleanupSettingsFrame, +#CleanupSettingsFrame, #LoadLevelFrame, #SolidLineFrame { border: 1px solid #e6e6e6; @@ -1372,5 +1372,11 @@ QDialog #dialogButtonFrame { #GearButton { qproperty-icon: url("../gray_072/imgs/gear.png"); } +#StartupLabel { + padding: 3px; +} +#StartupLabel:hover { + background-color: #4a4a4a; +} //# sourceMappingURL=gray_048_mac.qss.map \ No newline at end of file diff --git a/stuff/config/qss/gray_072/gray_072.less b/stuff/config/qss/gray_072/gray_072.less index aedaa861..60044ee4 100644 --- a/stuff/config/qss/gray_072/gray_072.less +++ b/stuff/config/qss/gray_072/gray_072.less @@ -1369,4 +1369,11 @@ QDialog #dialogButtonFrame { #GearButton { qproperty-icon: url("@{image_url}/gear.png"); +} + +#StartupLabel { + padding: 3px; + &:hover { + .baseBG(light, 10%); + } } \ No newline at end of file diff --git a/stuff/config/qss/gray_072/gray_072.qss b/stuff/config/qss/gray_072/gray_072.qss index 105fad96..824600c8 100644 --- a/stuff/config/qss/gray_072/gray_072.qss +++ b/stuff/config/qss/gray_072/gray_072.qss @@ -764,7 +764,7 @@ DvDirTreeView { /*---------------------------------------------------------------------------*/ /* Cleanup Settings, LoadLevel, PsdSettingsPopup, FxSettingsPopup, RenameAsToonzPopup */ /*---------------------------------------------------------------------------*/ -#CleanupSettingsFrame, +#CleanupSettingsFrame, #LoadLevelFrame, #SolidLineFrame { border: 1px solid #e6e6e6; @@ -1372,5 +1372,11 @@ QDialog #dialogButtonFrame { #GearButton { qproperty-icon: url("imgs/gear.png"); } +#StartupLabel { + padding: 3px; +} +#StartupLabel:hover { + background-color: #626262; +} //# sourceMappingURL=gray_072.qss.map \ No newline at end of file diff --git a/stuff/config/qss/gray_072/gray_072_mac.qss b/stuff/config/qss/gray_072/gray_072_mac.qss index e49f3590..3c89f266 100644 --- a/stuff/config/qss/gray_072/gray_072_mac.qss +++ b/stuff/config/qss/gray_072/gray_072_mac.qss @@ -764,7 +764,7 @@ DvDirTreeView { /*---------------------------------------------------------------------------*/ /* Cleanup Settings, LoadLevel, PsdSettingsPopup, FxSettingsPopup, RenameAsToonzPopup */ /*---------------------------------------------------------------------------*/ -#CleanupSettingsFrame, +#CleanupSettingsFrame, #LoadLevelFrame, #SolidLineFrame { border: 1px solid #e6e6e6; @@ -1372,5 +1372,11 @@ QDialog #dialogButtonFrame { #GearButton { qproperty-icon: url("imgs/gear.png"); } +#StartupLabel { + padding: 3px; +} +#StartupLabel:hover { + background-color: #626262; +} //# sourceMappingURL=gray_072_mac.qss.map \ No newline at end of file diff --git a/stuff/config/qss/gray_128/gray_128.less b/stuff/config/qss/gray_128/gray_128.less index 0d233843..168a2817 100644 --- a/stuff/config/qss/gray_128/gray_128.less +++ b/stuff/config/qss/gray_128/gray_128.less @@ -1194,4 +1194,11 @@ QDialog #dialogButtonFrame { #GearButton { qproperty-icon: url("@{image_url}/gear.png"); +} + +#StartupLabel { + padding: 3px; + &:hover { + .baseBG(light, 10%); + } } \ No newline at end of file diff --git a/stuff/config/qss/gray_128/gray_128.qss b/stuff/config/qss/gray_128/gray_128.qss index 5e5eac7c..ee884560 100644 --- a/stuff/config/qss/gray_128/gray_128.qss +++ b/stuff/config/qss/gray_128/gray_128.qss @@ -526,7 +526,7 @@ DvDirTreeView { /*---------------------------------------------------------------------------*/ /* Cleanup Settings, LoadLevel, PsdSettingsPopup, FxSettingsPopup, RenameAsToonzPopup */ /*---------------------------------------------------------------------------*/ -#CleanupSettingsFrame, +#CleanupSettingsFrame, #LoadLevelFrame, #SolidLineFrame { border: 1px solid #141414; @@ -1111,5 +1111,11 @@ QDialog #dialogButtonFrame { #GearButton { qproperty-icon: url("imgs/gear.png"); } +#StartupLabel { + padding: 3px; +} +#StartupLabel:hover { + background-color: #9a9a9a; +} //# sourceMappingURL=gray_128.qss.map \ No newline at end of file diff --git a/stuff/config/qss/gray_128/gray_128_mac.qss b/stuff/config/qss/gray_128/gray_128_mac.qss index 4093fe52..a7b90c2d 100644 --- a/stuff/config/qss/gray_128/gray_128_mac.qss +++ b/stuff/config/qss/gray_128/gray_128_mac.qss @@ -526,7 +526,7 @@ DvDirTreeView { /*---------------------------------------------------------------------------*/ /* Cleanup Settings, LoadLevel, PsdSettingsPopup, FxSettingsPopup, RenameAsToonzPopup */ /*---------------------------------------------------------------------------*/ -#CleanupSettingsFrame, +#CleanupSettingsFrame, #LoadLevelFrame, #SolidLineFrame { border: 1px solid #141414; @@ -1111,5 +1111,11 @@ QDialog #dialogButtonFrame { #GearButton { qproperty-icon: url("imgs/gear.png"); } +#StartupLabel { + padding: 3px; +} +#StartupLabel:hover { + background-color: #9a9a9a; +} //# sourceMappingURL=gray_128_mac.qss.map \ No newline at end of file diff --git a/toonz/sources/toonz/startuppopup.cpp b/toonz/sources/toonz/startuppopup.cpp index 018198ce..bf8c375e 100644 --- a/toonz/sources/toonz/startuppopup.cpp +++ b/toonz/sources/toonz/startuppopup.cpp @@ -221,8 +221,8 @@ StartupPopup::StartupPopup() m_sceneBox->setLayout(newSceneLay); guiLay->addWidget(m_sceneBox, 2, 0, 4, 1, Qt::AlignLeft); - m_recentSceneLay->setMargin(8); - m_recentSceneLay->setSpacing(8); + m_recentSceneLay->setMargin(5); + m_recentSceneLay->setSpacing(2); { // Recent Scene List m_recentBox->setLayout(m_recentSceneLay); @@ -367,6 +367,8 @@ void StartupPopup::showEvent(QShowEvent *) { if (i > 9) break; // box can hold 10 scenes QString justName = QString::fromStdString(TFilePath(name).getName()); m_recentNamesLabels[i] = new StartupLabel(justName, this, i); + m_recentNamesLabels[i]->setToolTip( + name.remove(0, name.indexOf(" ") + 1)); // remove "#. " prefix m_recentSceneLay->addWidget(m_recentNamesLabels[i], i, Qt::AlignTop); i++; } @@ -901,6 +903,7 @@ void StartupPopup::updateSize() { StartupLabel::StartupLabel(const QString &text, QWidget *parent, int index) : QLabel(parent), m_index(index) { setText(text); + setObjectName("StartupLabel"); } StartupLabel::~StartupLabel() {} From 999fe6d43b25f0f1788cc7e4cb91d21929b6e057 Mon Sep 17 00:00:00 2001 From: shun_iwasawa Date: Tue, 18 Oct 2016 12:52:24 +0900 Subject: [PATCH 32/56] fixes --- toonz/sources/tnztools/brushtool.cpp | 2 -- toonz/sources/tnztools/vectorerasertool.cpp | 2 -- toonz/sources/toonz/locatorpopup.cpp | 2 +- toonz/sources/toonz/locatorpopup.h | 2 +- toonz/sources/toonz/sceneviewer.cpp | 6 +++--- toonz/sources/toonz/sceneviewerevents.cpp | 5 +++-- 6 files changed, 8 insertions(+), 11 deletions(-) diff --git a/toonz/sources/tnztools/brushtool.cpp b/toonz/sources/tnztools/brushtool.cpp index 84599e9a..3272da2f 100644 --- a/toonz/sources/tnztools/brushtool.cpp +++ b/toonz/sources/tnztools/brushtool.cpp @@ -1688,8 +1688,6 @@ void BrushTool::draw() { } else { tglDrawCircle(m_brushPos, 0.5 * m_minThick); tglDrawCircle(m_brushPos, 0.5 * m_maxThick); - std::cout << "BRUSH m_brushPos = " << m_brushPos.x << ", " << m_brushPos.y - << std::endl; } } diff --git a/toonz/sources/tnztools/vectorerasertool.cpp b/toonz/sources/tnztools/vectorerasertool.cpp index a1c8c54d..18d75023 100644 --- a/toonz/sources/tnztools/vectorerasertool.cpp +++ b/toonz/sources/tnztools/vectorerasertool.cpp @@ -427,8 +427,6 @@ void EraserTool::draw() { if (m_eraseType.getValue() == NORMAL_ERASE) { tglColor(TPixel32(255, 0, 255)); tglDrawCircle(m_brushPos, m_pointSize); - std::cout << "ERASER m_brushPos = " << m_brushPos.x << ", " - << m_brushPos.y << std::endl; } if ((m_eraseType.getValue() == FREEHAND_ERASE || m_eraseType.getValue() == POLYLINE_ERASE) && diff --git a/toonz/sources/toonz/locatorpopup.cpp b/toonz/sources/toonz/locatorpopup.cpp index 048626e6..434ca520 100644 --- a/toonz/sources/toonz/locatorpopup.cpp +++ b/toonz/sources/toonz/locatorpopup.cpp @@ -36,7 +36,7 @@ LocatorPopup::LocatorPopup(QWidget *parent) //----------------------------------------------------------------------------- -void LocatorPopup::onChangeViewAff(const TAffine &affine, const TPointD &pos) { +void LocatorPopup::onChangeViewAff(const TPointD &pos) { TAffine curAff = m_viewer->getSceneMatrix(); TAffine newAff(curAff.a11, 0, -pos.x * curAff.a11, 0, curAff.a22, -pos.y * curAff.a22); diff --git a/toonz/sources/toonz/locatorpopup.h b/toonz/sources/toonz/locatorpopup.h index 7745e2ac..2dc3448a 100644 --- a/toonz/sources/toonz/locatorpopup.h +++ b/toonz/sources/toonz/locatorpopup.h @@ -21,7 +21,7 @@ public: LocatorPopup(QWidget* parent = 0); SceneViewer* viewer() { return m_viewer; } - void onChangeViewAff(const TAffine& affine, const TPointD& curPos); + void onChangeViewAff(const TPointD& curPos); protected: void showEvent(QShowEvent*); diff --git a/toonz/sources/toonz/sceneviewer.cpp b/toonz/sources/toonz/sceneviewer.cpp index 6873009c..1b521a29 100644 --- a/toonz/sources/toonz/sceneviewer.cpp +++ b/toonz/sources/toonz/sceneviewer.cpp @@ -1104,7 +1104,7 @@ void SceneViewer::drawCameraStand() { // Show white background when level editing mode. TTool *tool = TApp::instance()->getCurrentTool()->getTool(); if (m_drawEditingLevel && tool && tool->isEnabled()) { - tool->setViewer(this); + if (!m_isLocator) tool->setViewer(this); glPushMatrix(); if (m_referenceMode == CAMERA3D_REFERENCE) { mult3DMatrix(); @@ -1366,8 +1366,8 @@ void SceneViewer::drawOverlay() { // draw cross at the center of the locator window if (m_isLocator) { glColor3d(1.0, 0.0, 0.0); - tglDrawSegment(TPointD(-5, 0), TPointD(5, 0)); - tglDrawSegment(TPointD(0, -5), TPointD(0, 5)); + tglDrawSegment(TPointD(-4, 0), TPointD(5, 0)); + tglDrawSegment(TPointD(0, -4), TPointD(0, 5)); } } } diff --git a/toonz/sources/toonz/sceneviewerevents.cpp b/toonz/sources/toonz/sceneviewerevents.cpp index 8ca05858..d07163fb 100644 --- a/toonz/sources/toonz/sceneviewerevents.cpp +++ b/toonz/sources/toonz/sceneviewerevents.cpp @@ -356,10 +356,11 @@ void SceneViewer::mouseMoveEvent(QMouseEvent *event) { TMouseEvent toonzEvent; initToonzEvent(toonzEvent, event, height(), m_pressure, m_tabletEvent, false); - TPointD pos = tool->getMatrix().inv() * winToWorld(curPos); + TPointD worldPos = winToWorld(curPos); + TPointD pos = tool->getMatrix().inv() * worldPos; if (m_locator) { - m_locator->onChangeViewAff(m_viewAff[m_viewMode], pos); + m_locator->onChangeViewAff(worldPos); } TObjectHandle *objHandle = TApp::instance()->getCurrentObject(); From 576fce9726fd713e09b4cd9132881ad7d5def101 Mon Sep 17 00:00:00 2001 From: Jeremy Bullock Date: Thu, 20 Oct 2016 12:22:08 -0600 Subject: [PATCH 33/56] Unify all scrollbars to same style --- stuff/config/qss/gray_048/gray_048.less | 6 +++--- stuff/config/qss/gray_048/gray_048.qss | 21 ++++++++++++++++++++- stuff/config/qss/gray_048/gray_048_mac.qss | 21 ++++++++++++++++++++- stuff/config/qss/gray_072/gray_072.less | 4 ++-- stuff/config/qss/gray_072/gray_072.qss | 21 ++++++++++++++++++++- stuff/config/qss/gray_072/gray_072_mac.qss | 21 ++++++++++++++++++++- stuff/config/qss/gray_128/gray_128.less | 5 +++-- stuff/config/qss/gray_128/gray_128.qss | 21 ++++++++++++++++++++- stuff/config/qss/gray_128/gray_128_mac.qss | 21 ++++++++++++++++++++- 9 files changed, 128 insertions(+), 13 deletions(-) diff --git a/stuff/config/qss/gray_048/gray_048.less b/stuff/config/qss/gray_048/gray_048.less index c170ed21..f1aee149 100644 --- a/stuff/config/qss/gray_048/gray_048.less +++ b/stuff/config/qss/gray_048/gray_048.less @@ -1,4 +1,4 @@ - +// out: gray_048.qss /* LESS Definitions */ /*Image URL*/ @@ -821,7 +821,7 @@ ParamsPage { } } /* Customize QScrollBar vertical*/ -#XsheetScrollBar { +QScrollBar, #XsheetScrollBar { .baseBG(light, 10%); border: 1px solid black; @@ -890,7 +890,7 @@ ParamsPage { } } - &::add-page { + &::add-page, &::sub-page { background: none; } } diff --git a/stuff/config/qss/gray_048/gray_048.qss b/stuff/config/qss/gray_048/gray_048.qss index 0c17daf7..c2938b5f 100644 --- a/stuff/config/qss/gray_048/gray_048.qss +++ b/stuff/config/qss/gray_048/gray_048.qss @@ -841,11 +841,13 @@ ParamsPage { background-color: #000080; } /* Customize QScrollBar vertical*/ +QScrollBar, #XsheetScrollBar { background-color: #4a4a4a; border: 1px solid black; /* buttons */ } +QScrollBar:vertical, #XsheetScrollBar:vertical { width: 18px; margin-left: 0px; @@ -853,6 +855,7 @@ ParamsPage { margin-top: 20px; margin-bottom: 20px; } +QScrollBar:horizontal, #XsheetScrollBar:horizontal { height: 18px; margin-left: 20px; @@ -860,59 +863,75 @@ ParamsPage { margin-top: 0px; margin-bottom: 0px; } +QScrollBar::handle, #XsheetScrollBar::handle { border-width: 4; image-position: center center; } +QScrollBar::handle:vertical, #XsheetScrollBar::handle:vertical { border-image: url("../gray_072/imgs/sb_g_vhandle.png") 4; image: url("../gray_072/imgs/sb_g_vline.png"); min-height: 40px; } +QScrollBar::handle:horizontal, #XsheetScrollBar::handle:horizontal { border-image: url("../gray_072/imgs/sb_g_hhandle.png") 4; image: url("../gray_072/imgs/sb_g_hline.png"); min-width: 40px; } +QScrollBar::add-line, #XsheetScrollBar::add-line { subcontrol-origin: margin; } +QScrollBar::add-line:vertical, #XsheetScrollBar::add-line:vertical { image: url("../gray_072/imgs/sb_g_downarrow.png"); height: 20px; subcontrol-position: bottom; } +QScrollBar::add-line:vertical:pressed, #XsheetScrollBar::add-line:vertical:pressed { image: url("../gray_072/imgs/sb_g_downarrow_pressed.png"); } +QScrollBar::add-line:horizontal, #XsheetScrollBar::add-line:horizontal { image: url("../gray_072/imgs/sb_g_rarrow.png"); width: 20px; subcontrol-position: right; } +QScrollBar::add-line:horizontal:pressed, #XsheetScrollBar::add-line:horizontal:pressed { image: url("../gray_072/imgs/sb_g_rarrow_pressed.png"); } +QScrollBar::sub-line, #XsheetScrollBar::sub-line { subcontrol-origin: margin; } +QScrollBar::sub-line:vertical, #XsheetScrollBar::sub-line:vertical { image: url("../gray_072/imgs/sb_g_uparrow.png"); height: 20px; subcontrol-position: top; } +QScrollBar::sub-line:vertical:pressed, #XsheetScrollBar::sub-line:vertical:pressed { image: url("../gray_072/imgs/sb_g_uparrow_pressed.png"); } +QScrollBar::sub-line:horizontal, #XsheetScrollBar::sub-line:horizontal { image: url("../gray_072/imgs/sb_g_larrow.png"); width: 20px; subcontrol-position: left; } +QScrollBar::sub-line:horizontal:pressed, #XsheetScrollBar::sub-line:horizontal:pressed { image: url("../gray_072/imgs/sb_g_larrow_pressed.png"); } -#XsheetScrollBar::add-page { +QScrollBar::add-page, +#XsheetScrollBar::add-page, +QScrollBar::sub-page, +#XsheetScrollBar::sub-page { background: none; } #noteTextEdit { diff --git a/stuff/config/qss/gray_048/gray_048_mac.qss b/stuff/config/qss/gray_048/gray_048_mac.qss index 1217245c..ed3fda06 100644 --- a/stuff/config/qss/gray_048/gray_048_mac.qss +++ b/stuff/config/qss/gray_048/gray_048_mac.qss @@ -841,11 +841,13 @@ ParamsPage { background-color: #000080; } /* Customize QScrollBar vertical*/ +QScrollBar, #XsheetScrollBar { background-color: #4a4a4a; border: 1px solid black; /* buttons */ } +QScrollBar:vertical, #XsheetScrollBar:vertical { width: 18px; margin-left: 0px; @@ -853,6 +855,7 @@ ParamsPage { margin-top: 20px; margin-bottom: 20px; } +QScrollBar:horizontal, #XsheetScrollBar:horizontal { height: 18px; margin-left: 20px; @@ -860,59 +863,75 @@ ParamsPage { margin-top: 0px; margin-bottom: 0px; } +QScrollBar::handle, #XsheetScrollBar::handle { border-width: 4; image-position: center center; } +QScrollBar::handle:vertical, #XsheetScrollBar::handle:vertical { border-image: url("../gray_072/imgs/sb_g_vhandle.png") 4; image: url("../gray_072/imgs/sb_g_vline.png"); min-height: 40px; } +QScrollBar::handle:horizontal, #XsheetScrollBar::handle:horizontal { border-image: url("../gray_072/imgs/sb_g_hhandle.png") 4; image: url("../gray_072/imgs/sb_g_hline.png"); min-width: 40px; } +QScrollBar::add-line, #XsheetScrollBar::add-line { subcontrol-origin: margin; } +QScrollBar::add-line:vertical, #XsheetScrollBar::add-line:vertical { image: url("../gray_072/imgs/sb_g_downarrow.png"); height: 20px; subcontrol-position: bottom; } +QScrollBar::add-line:vertical:pressed, #XsheetScrollBar::add-line:vertical:pressed { image: url("../gray_072/imgs/sb_g_downarrow_pressed.png"); } +QScrollBar::add-line:horizontal, #XsheetScrollBar::add-line:horizontal { image: url("../gray_072/imgs/sb_g_rarrow.png"); width: 20px; subcontrol-position: right; } +QScrollBar::add-line:horizontal:pressed, #XsheetScrollBar::add-line:horizontal:pressed { image: url("../gray_072/imgs/sb_g_rarrow_pressed.png"); } +QScrollBar::sub-line, #XsheetScrollBar::sub-line { subcontrol-origin: margin; } +QScrollBar::sub-line:vertical, #XsheetScrollBar::sub-line:vertical { image: url("../gray_072/imgs/sb_g_uparrow.png"); height: 20px; subcontrol-position: top; } +QScrollBar::sub-line:vertical:pressed, #XsheetScrollBar::sub-line:vertical:pressed { image: url("../gray_072/imgs/sb_g_uparrow_pressed.png"); } +QScrollBar::sub-line:horizontal, #XsheetScrollBar::sub-line:horizontal { image: url("../gray_072/imgs/sb_g_larrow.png"); width: 20px; subcontrol-position: left; } +QScrollBar::sub-line:horizontal:pressed, #XsheetScrollBar::sub-line:horizontal:pressed { image: url("../gray_072/imgs/sb_g_larrow_pressed.png"); } -#XsheetScrollBar::add-page { +QScrollBar::add-page, +#XsheetScrollBar::add-page, +QScrollBar::sub-page, +#XsheetScrollBar::sub-page { background: none; } #noteTextEdit { diff --git a/stuff/config/qss/gray_072/gray_072.less b/stuff/config/qss/gray_072/gray_072.less index 60044ee4..3cc5e1b5 100644 --- a/stuff/config/qss/gray_072/gray_072.less +++ b/stuff/config/qss/gray_072/gray_072.less @@ -821,7 +821,7 @@ ParamsPage { } } /* Customize QScrollBar vertical*/ -#XsheetScrollBar { +QScrollBar, #XsheetScrollBar { .baseBG(light, 10%); border: 1px solid black; @@ -890,7 +890,7 @@ ParamsPage { } } - &::add-page { + &::add-page, &::sub-page { background: none; } } diff --git a/stuff/config/qss/gray_072/gray_072.qss b/stuff/config/qss/gray_072/gray_072.qss index 824600c8..7fcce508 100644 --- a/stuff/config/qss/gray_072/gray_072.qss +++ b/stuff/config/qss/gray_072/gray_072.qss @@ -841,11 +841,13 @@ ParamsPage { background-color: #000080; } /* Customize QScrollBar vertical*/ +QScrollBar, #XsheetScrollBar { background-color: #626262; border: 1px solid black; /* buttons */ } +QScrollBar:vertical, #XsheetScrollBar:vertical { width: 18px; margin-left: 0px; @@ -853,6 +855,7 @@ ParamsPage { margin-top: 20px; margin-bottom: 20px; } +QScrollBar:horizontal, #XsheetScrollBar:horizontal { height: 18px; margin-left: 20px; @@ -860,59 +863,75 @@ ParamsPage { margin-top: 0px; margin-bottom: 0px; } +QScrollBar::handle, #XsheetScrollBar::handle { border-width: 4; image-position: center center; } +QScrollBar::handle:vertical, #XsheetScrollBar::handle:vertical { border-image: url("imgs/sb_g_vhandle.png") 4; image: url("imgs/sb_g_vline.png"); min-height: 40px; } +QScrollBar::handle:horizontal, #XsheetScrollBar::handle:horizontal { border-image: url("imgs/sb_g_hhandle.png") 4; image: url("imgs/sb_g_hline.png"); min-width: 40px; } +QScrollBar::add-line, #XsheetScrollBar::add-line { subcontrol-origin: margin; } +QScrollBar::add-line:vertical, #XsheetScrollBar::add-line:vertical { image: url("imgs/sb_g_downarrow.png"); height: 20px; subcontrol-position: bottom; } +QScrollBar::add-line:vertical:pressed, #XsheetScrollBar::add-line:vertical:pressed { image: url("imgs/sb_g_downarrow_pressed.png"); } +QScrollBar::add-line:horizontal, #XsheetScrollBar::add-line:horizontal { image: url("imgs/sb_g_rarrow.png"); width: 20px; subcontrol-position: right; } +QScrollBar::add-line:horizontal:pressed, #XsheetScrollBar::add-line:horizontal:pressed { image: url("imgs/sb_g_rarrow_pressed.png"); } +QScrollBar::sub-line, #XsheetScrollBar::sub-line { subcontrol-origin: margin; } +QScrollBar::sub-line:vertical, #XsheetScrollBar::sub-line:vertical { image: url("imgs/sb_g_uparrow.png"); height: 20px; subcontrol-position: top; } +QScrollBar::sub-line:vertical:pressed, #XsheetScrollBar::sub-line:vertical:pressed { image: url("imgs/sb_g_uparrow_pressed.png"); } +QScrollBar::sub-line:horizontal, #XsheetScrollBar::sub-line:horizontal { image: url("imgs/sb_g_larrow.png"); width: 20px; subcontrol-position: left; } +QScrollBar::sub-line:horizontal:pressed, #XsheetScrollBar::sub-line:horizontal:pressed { image: url("imgs/sb_g_larrow_pressed.png"); } -#XsheetScrollBar::add-page { +QScrollBar::add-page, +#XsheetScrollBar::add-page, +QScrollBar::sub-page, +#XsheetScrollBar::sub-page { background: none; } #noteTextEdit { diff --git a/stuff/config/qss/gray_072/gray_072_mac.qss b/stuff/config/qss/gray_072/gray_072_mac.qss index 3c89f266..80997ec2 100644 --- a/stuff/config/qss/gray_072/gray_072_mac.qss +++ b/stuff/config/qss/gray_072/gray_072_mac.qss @@ -841,11 +841,13 @@ ParamsPage { background-color: #000080; } /* Customize QScrollBar vertical*/ +QScrollBar, #XsheetScrollBar { background-color: #626262; border: 1px solid black; /* buttons */ } +QScrollBar:vertical, #XsheetScrollBar:vertical { width: 18px; margin-left: 0px; @@ -853,6 +855,7 @@ ParamsPage { margin-top: 20px; margin-bottom: 20px; } +QScrollBar:horizontal, #XsheetScrollBar:horizontal { height: 18px; margin-left: 20px; @@ -860,59 +863,75 @@ ParamsPage { margin-top: 0px; margin-bottom: 0px; } +QScrollBar::handle, #XsheetScrollBar::handle { border-width: 4; image-position: center center; } +QScrollBar::handle:vertical, #XsheetScrollBar::handle:vertical { border-image: url("imgs/sb_g_vhandle.png") 4; image: url("imgs/sb_g_vline.png"); min-height: 40px; } +QScrollBar::handle:horizontal, #XsheetScrollBar::handle:horizontal { border-image: url("imgs/sb_g_hhandle.png") 4; image: url("imgs/sb_g_hline.png"); min-width: 40px; } +QScrollBar::add-line, #XsheetScrollBar::add-line { subcontrol-origin: margin; } +QScrollBar::add-line:vertical, #XsheetScrollBar::add-line:vertical { image: url("imgs/sb_g_downarrow.png"); height: 20px; subcontrol-position: bottom; } +QScrollBar::add-line:vertical:pressed, #XsheetScrollBar::add-line:vertical:pressed { image: url("imgs/sb_g_downarrow_pressed.png"); } +QScrollBar::add-line:horizontal, #XsheetScrollBar::add-line:horizontal { image: url("imgs/sb_g_rarrow.png"); width: 20px; subcontrol-position: right; } +QScrollBar::add-line:horizontal:pressed, #XsheetScrollBar::add-line:horizontal:pressed { image: url("imgs/sb_g_rarrow_pressed.png"); } +QScrollBar::sub-line, #XsheetScrollBar::sub-line { subcontrol-origin: margin; } +QScrollBar::sub-line:vertical, #XsheetScrollBar::sub-line:vertical { image: url("imgs/sb_g_uparrow.png"); height: 20px; subcontrol-position: top; } +QScrollBar::sub-line:vertical:pressed, #XsheetScrollBar::sub-line:vertical:pressed { image: url("imgs/sb_g_uparrow_pressed.png"); } +QScrollBar::sub-line:horizontal, #XsheetScrollBar::sub-line:horizontal { image: url("imgs/sb_g_larrow.png"); width: 20px; subcontrol-position: left; } +QScrollBar::sub-line:horizontal:pressed, #XsheetScrollBar::sub-line:horizontal:pressed { image: url("imgs/sb_g_larrow_pressed.png"); } -#XsheetScrollBar::add-page { +QScrollBar::add-page, +#XsheetScrollBar::add-page, +QScrollBar::sub-page, +#XsheetScrollBar::sub-page { background: none; } #noteTextEdit { diff --git a/stuff/config/qss/gray_128/gray_128.less b/stuff/config/qss/gray_128/gray_128.less index 168a2817..8c8e4606 100644 --- a/stuff/config/qss/gray_128/gray_128.less +++ b/stuff/config/qss/gray_128/gray_128.less @@ -1,3 +1,4 @@ +// out: gray_128.qss /* LESS Definitions */ /*Image URL*/ @@ -661,7 +662,7 @@ ParamsPage { } } /* Customize QScrollBar vertical*/ -#XsheetScrollBar { +QScrollBar, #XsheetScrollBar { background-color: rgb(160,160,160); border: 1px solid black; @@ -730,7 +731,7 @@ ParamsPage { } } - &::add-page { + &::add-page, &::sub-page { background: none; } } diff --git a/stuff/config/qss/gray_128/gray_128.qss b/stuff/config/qss/gray_128/gray_128.qss index ee884560..34b1a6cf 100644 --- a/stuff/config/qss/gray_128/gray_128.qss +++ b/stuff/config/qss/gray_128/gray_128.qss @@ -591,11 +591,13 @@ ParamsPage { background-color: #000080; } /* Customize QScrollBar vertical*/ +QScrollBar, #XsheetScrollBar { background-color: #a0a0a0; border: 1px solid black; /* buttons */ } +QScrollBar:vertical, #XsheetScrollBar:vertical { width: 18px; margin-left: 0px; @@ -603,6 +605,7 @@ ParamsPage { margin-top: 20px; margin-bottom: 20px; } +QScrollBar:horizontal, #XsheetScrollBar:horizontal { height: 18px; margin-left: 20px; @@ -610,59 +613,75 @@ ParamsPage { margin-top: 0px; margin-bottom: 0px; } +QScrollBar::handle, #XsheetScrollBar::handle { border-width: 4; image-position: center center; } +QScrollBar::handle:vertical, #XsheetScrollBar::handle:vertical { border-image: url("imgs/sb_g_vhandle.png") 4; image: url("imgs/sb_g_vline.png"); min-height: 40px; } +QScrollBar::handle:horizontal, #XsheetScrollBar::handle:horizontal { border-image: url("imgs/sb_g_hhandle.png") 4; image: url("imgs/sb_g_hline.png"); min-width: 40px; } +QScrollBar::add-line, #XsheetScrollBar::add-line { subcontrol-origin: margin; } +QScrollBar::add-line:vertical, #XsheetScrollBar::add-line:vertical { image: url("imgs/sb_g_downarrow.png"); height: 20px; subcontrol-position: bottom; } +QScrollBar::add-line:vertical:pressed, #XsheetScrollBar::add-line:vertical:pressed { image: url("imgs/sb_g_downarrow_pressed.png"); } +QScrollBar::add-line:horizontal, #XsheetScrollBar::add-line:horizontal { image: url("imgs/sb_g_rarrow.png"); width: 20px; subcontrol-position: right; } +QScrollBar::add-line:horizontal:pressed, #XsheetScrollBar::add-line:horizontal:pressed { image: url("imgs/sb_g_rarrow_pressed.png"); } +QScrollBar::sub-line, #XsheetScrollBar::sub-line { subcontrol-origin: margin; } +QScrollBar::sub-line:vertical, #XsheetScrollBar::sub-line:vertical { image: url("imgs/sb_g_uparrow.png"); height: 20px; subcontrol-position: top; } +QScrollBar::sub-line:vertical:pressed, #XsheetScrollBar::sub-line:vertical:pressed { image: url("imgs/sb_g_uparrow_pressed.png"); } +QScrollBar::sub-line:horizontal, #XsheetScrollBar::sub-line:horizontal { image: url("imgs/sb_g_larrow.png"); width: 20px; subcontrol-position: left; } +QScrollBar::sub-line:horizontal:pressed, #XsheetScrollBar::sub-line:horizontal:pressed { image: url("imgs/sb_g_larrow_pressed.png"); } -#XsheetScrollBar::add-page { +QScrollBar::add-page, +#XsheetScrollBar::add-page, +QScrollBar::sub-page, +#XsheetScrollBar::sub-page { background: none; } XsheetViewer { diff --git a/stuff/config/qss/gray_128/gray_128_mac.qss b/stuff/config/qss/gray_128/gray_128_mac.qss index a7b90c2d..eed5003d 100644 --- a/stuff/config/qss/gray_128/gray_128_mac.qss +++ b/stuff/config/qss/gray_128/gray_128_mac.qss @@ -591,11 +591,13 @@ ParamsPage { background-color: #000080; } /* Customize QScrollBar vertical*/ +QScrollBar, #XsheetScrollBar { background-color: #a0a0a0; border: 1px solid black; /* buttons */ } +QScrollBar:vertical, #XsheetScrollBar:vertical { width: 18px; margin-left: 0px; @@ -603,6 +605,7 @@ ParamsPage { margin-top: 20px; margin-bottom: 20px; } +QScrollBar:horizontal, #XsheetScrollBar:horizontal { height: 18px; margin-left: 20px; @@ -610,59 +613,75 @@ ParamsPage { margin-top: 0px; margin-bottom: 0px; } +QScrollBar::handle, #XsheetScrollBar::handle { border-width: 4; image-position: center center; } +QScrollBar::handle:vertical, #XsheetScrollBar::handle:vertical { border-image: url("imgs/sb_g_vhandle.png") 4; image: url("imgs/sb_g_vline.png"); min-height: 40px; } +QScrollBar::handle:horizontal, #XsheetScrollBar::handle:horizontal { border-image: url("imgs/sb_g_hhandle.png") 4; image: url("imgs/sb_g_hline.png"); min-width: 40px; } +QScrollBar::add-line, #XsheetScrollBar::add-line { subcontrol-origin: margin; } +QScrollBar::add-line:vertical, #XsheetScrollBar::add-line:vertical { image: url("imgs/sb_g_downarrow.png"); height: 20px; subcontrol-position: bottom; } +QScrollBar::add-line:vertical:pressed, #XsheetScrollBar::add-line:vertical:pressed { image: url("imgs/sb_g_downarrow_pressed.png"); } +QScrollBar::add-line:horizontal, #XsheetScrollBar::add-line:horizontal { image: url("imgs/sb_g_rarrow.png"); width: 20px; subcontrol-position: right; } +QScrollBar::add-line:horizontal:pressed, #XsheetScrollBar::add-line:horizontal:pressed { image: url("imgs/sb_g_rarrow_pressed.png"); } +QScrollBar::sub-line, #XsheetScrollBar::sub-line { subcontrol-origin: margin; } +QScrollBar::sub-line:vertical, #XsheetScrollBar::sub-line:vertical { image: url("imgs/sb_g_uparrow.png"); height: 20px; subcontrol-position: top; } +QScrollBar::sub-line:vertical:pressed, #XsheetScrollBar::sub-line:vertical:pressed { image: url("imgs/sb_g_uparrow_pressed.png"); } +QScrollBar::sub-line:horizontal, #XsheetScrollBar::sub-line:horizontal { image: url("imgs/sb_g_larrow.png"); width: 20px; subcontrol-position: left; } +QScrollBar::sub-line:horizontal:pressed, #XsheetScrollBar::sub-line:horizontal:pressed { image: url("imgs/sb_g_larrow_pressed.png"); } -#XsheetScrollBar::add-page { +QScrollBar::add-page, +#XsheetScrollBar::add-page, +QScrollBar::sub-page, +#XsheetScrollBar::sub-page { background: none; } XsheetViewer { From d4ffc77bb9e94001a696a5253511616358bc96b2 Mon Sep 17 00:00:00 2001 From: shun_iwasawa Date: Fri, 21 Oct 2016 20:50:52 +0900 Subject: [PATCH 34/56] save format properties --- toonz/sources/toonzlib/outputproperties.cpp | 2 +- toonz/sources/toonzlib/sceneproperties.cpp | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/toonz/sources/toonzlib/outputproperties.cpp b/toonz/sources/toonzlib/outputproperties.cpp index 39517526..0ea61b2f 100644 --- a/toonz/sources/toonzlib/outputproperties.cpp +++ b/toonz/sources/toonzlib/outputproperties.cpp @@ -97,7 +97,7 @@ TOutputProperties &TOutputProperties::operator=(const TOutputProperties &src) { std::map::const_iterator sft, sfEnd = src.m_formatProperties.end(); - for (sft = src.m_formatProperties.end(); sft != sfEnd; ++sft) + for (sft = src.m_formatProperties.begin(); sft != sfEnd; ++sft) m_formatProperties[sft->first] = sft->second->clone(); return *this; diff --git a/toonz/sources/toonzlib/sceneproperties.cpp b/toonz/sources/toonzlib/sceneproperties.cpp index 154bfd51..76b6e25c 100644 --- a/toonz/sources/toonzlib/sceneproperties.cpp +++ b/toonz/sources/toonzlib/sceneproperties.cpp @@ -80,8 +80,6 @@ void TSceneProperties::assign(const TSceneProperties *sprop) { for (int i = 0; i < (int)m_cameras.size(); i++) m_cameras[i] = new TCamera(*m_cameras[i]); } - *m_outputProp = *sprop->m_outputProp; - *m_previewProp = *sprop->m_previewProp; m_bgColor = sprop->m_bgColor; m_markerDistance = sprop->m_markerDistance; m_markerOffset = sprop->m_markerOffset; From 0148381f16179ed8d3dd1d3f134edf684e1d8de8 Mon Sep 17 00:00:00 2001 From: shun_iwasawa Date: Wed, 26 Oct 2016 16:27:19 +0900 Subject: [PATCH 35/56] fix studiopalette drag --- toonz/sources/toonzqt/studiopaletteviewer.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/toonz/sources/toonzqt/studiopaletteviewer.cpp b/toonz/sources/toonzqt/studiopaletteviewer.cpp index bb6b00e7..1ba4e37c 100644 --- a/toonz/sources/toonzqt/studiopaletteviewer.cpp +++ b/toonz/sources/toonzqt/studiopaletteviewer.cpp @@ -1050,6 +1050,8 @@ void StudioPaletteTreeViewer::dropEvent(QDropEvent *event) { resetDropItem(); + if (newPath.isEmpty()) return; + const QMimeData *mimeData = event->mimeData(); const PaletteData *paletteData = dynamic_cast(mimeData); if (paletteData) { From 9ec2d133f1af2263f5aa48d648e669f8a07806fb Mon Sep 17 00:00:00 2001 From: Jeremy Bullock Date: Wed, 26 Oct 2016 03:37:43 -0600 Subject: [PATCH 36/56] rounded brush cap default (#872) * Changed default vector brush cap to "rounded" close #766 --- toonz/sources/tnztools/brushtool.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/toonz/sources/tnztools/brushtool.cpp b/toonz/sources/tnztools/brushtool.cpp index 3272da2f..1585aa85 100644 --- a/toonz/sources/tnztools/brushtool.cpp +++ b/toonz/sources/tnztools/brushtool.cpp @@ -45,7 +45,7 @@ using namespace ToolUtils; TEnv::DoubleVar VectorBrushMinSize("InknpaintVectorBrushMinSize", 1); TEnv::DoubleVar VectorBrushMaxSize("InknpaintVectorBrushMaxSize", 5); -TEnv::IntVar VectorCapStyle("InknpaintVectorCapStyle", 0); +TEnv::IntVar VectorCapStyle("InknpaintVectorCapStyle", 1); TEnv::IntVar VectorJoinStyle("InknpaintVectorJoinStyle", 0); TEnv::IntVar VectorMiterValue("InknpaintVectorMiterValue", 4); TEnv::DoubleVar RasterBrushMinSize("InknpaintRasterBrushMinSize", 1); From f2b2c436ef91dcd3b538828fed131a46c38c2a32 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 28 Oct 2016 16:48:26 +1100 Subject: [PATCH 37/56] Fix for crash inserting a keyframe (#798) Make a copy of `TParamChange` in `FunctionTreeModel::onChange()` since the notifier would run later on (via Qt's event loop). --- toonz/sources/toonzqt/functiontreeviewer.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/toonz/sources/toonzqt/functiontreeviewer.cpp b/toonz/sources/toonzqt/functiontreeviewer.cpp index bcfcd2c8..58be7a8b 100644 --- a/toonz/sources/toonzqt/functiontreeviewer.cpp +++ b/toonz/sources/toonzqt/functiontreeviewer.cpp @@ -1184,11 +1184,14 @@ void FunctionTreeModel::onChange(const TParamChange &tpc) { struct Func final : public TFunctorInvoker::BaseFunctor { FunctionTreeModel *m_obj; - const TParamChange *m_tpc; + // Use a copy of 'TParamChange' since callers declare + // and free this value on the stack, + // so we can't ensure its valid later on when the notifier executes. + const TParamChange m_tpc; Func(FunctionTreeModel *obj, const TParamChange *tpc) - : m_obj(obj), m_tpc(tpc) {} - void operator()() override { m_obj->onParamChange(m_tpc->m_dragging); } + : m_obj(obj), m_tpc(*tpc) {} + void operator()() override { m_obj->onParamChange(m_tpc.m_dragging); } }; QMetaObject::invokeMethod(TFunctorInvoker::instance(), "invoke", From 7e1154bda42be2edb368570fdef054f6cf3f07ea Mon Sep 17 00:00:00 2001 From: Jeremy Bullock Date: Thu, 27 Oct 2016 23:53:33 -0600 Subject: [PATCH 38/56] Fix for FFmpeg renders wrong range if previous exported range was bigger (#814) * fix render using old render range for changed range --- toonz/sources/toonzlib/movierenderer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/toonz/sources/toonzlib/movierenderer.cpp b/toonz/sources/toonzlib/movierenderer.cpp index 924ce5bd..e9f4ed46 100644 --- a/toonz/sources/toonzlib/movierenderer.cpp +++ b/toonz/sources/toonzlib/movierenderer.cpp @@ -209,7 +209,6 @@ void MovieRenderer::Imp::prepareForStart() { if (TSystem::doesExistFileOrLevel(fp)) { bool remove = false; - // In case the raster specifics are different from those of a currently // existing movie, erase it try { @@ -217,7 +216,8 @@ void MovieRenderer::Imp::prepareForStart() { lr->loadInfo(); const TImageInfo *info = lr->getImageInfo(); - if (!info || info->m_lx != imageSize.lx || info->m_ly != imageSize.ly) + if (!info || info->m_lx != imageSize.lx || + info->m_ly != imageSize.ly || fp.isFfmpegType()) TSystem::removeFileOrLevel(fp); // nothrow } catch (...) { // Same if the level could not be read/opened From 6f12250419f72f0c0347572062a9022d90c8b6e1 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 28 Oct 2016 19:09:35 +1100 Subject: [PATCH 39/56] CMake: minor cleanup --- toonz/sources/CMakeLists.txt | 2 +- toonz/sources/tnztools/CMakeLists.txt | 2 +- toonz/sources/toonz/CMakeLists.txt | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/toonz/sources/CMakeLists.txt b/toonz/sources/CMakeLists.txt index af8ea55c..b06a20d4 100644 --- a/toonz/sources/CMakeLists.txt +++ b/toonz/sources/CMakeLists.txt @@ -92,7 +92,7 @@ elseif(UNIX) else() set(PLATFORM 32) endif() - if (CMAKE_SYSTEM_NAME MATCHES "Linux") + if(CMAKE_SYSTEM_NAME MATCHES "Linux") add_definitions(-DLINUX) else() message(WARNING "Support for generic Unix (Not Apple or Linux) isn't yet working!") diff --git a/toonz/sources/tnztools/CMakeLists.txt b/toonz/sources/tnztools/CMakeLists.txt index 8f2b1c28..c597e31d 100644 --- a/toonz/sources/tnztools/CMakeLists.txt +++ b/toonz/sources/tnztools/CMakeLists.txt @@ -11,7 +11,7 @@ set(MOC_HEADERS ../include/tools/screenpicker.h rgbpickertool.h rulertool.h - stylepickertool.h + stylepickertool.h ) set(HEADERS ${MOC_HEADERS} diff --git a/toonz/sources/toonz/CMakeLists.txt b/toonz/sources/toonz/CMakeLists.txt index 62ee3382..43f9bb4d 100644 --- a/toonz/sources/toonz/CMakeLists.txt +++ b/toonz/sources/toonz/CMakeLists.txt @@ -141,7 +141,7 @@ set(MOC_HEADERS historypane.h cleanupsettingspane.h penciltestpopup.h - locatorpopup.h + locatorpopup.h # Tracker file dummyprocessor.h metnum.h @@ -301,7 +301,7 @@ set(SOURCES historypane.cpp cleanupsettingspane.cpp penciltestpopup.cpp - locatorpopup.cpp + locatorpopup.cpp # Tracker file dummyprocessor.cpp metnum.cpp @@ -378,7 +378,7 @@ if(WIN32) endif() endif() -if(WIN32) +if(WIN32) target_link_libraries(OpenToonz_${VERSION} Qt5::WinMain Qt5::Core Qt5::Gui Qt5::Network Qt5::OpenGL Qt5::Svg Qt5::Xml Qt5::Script Qt5::Widgets Qt5::PrintSupport Qt5::Multimedia @@ -434,10 +434,10 @@ if(APPLE) get_target_property(loc OpenToonz_${VERSION} MACOSX_BUNDLE_NAME) message(" ==> App Bundle: " ${loc}) message(" ==> Mach-o: " ${bin}) - foreach (lib ${EXTRA_LIBS}) + foreach(lib ${EXTRA_LIBS}) message(" copy:" ${lib} "==>" ${CMAKE_CURRENT_BINARY_DIR}/OpenToonz_${VERSION}.app/Contents/MacOS/) add_custom_command(TARGET OpenToonz_${VERSION} POST_BUILD COMMAND cp ${lib} ${CMAKE_CURRENT_BINARY_DIR}/OpenToonz_${VERSION}.app/Contents/MacOS/) - endforeach () + endforeach() add_custom_command(TARGET OpenToonz_${VERSION} POST_BUILD COMMAND From 5b4b9efd3e332c55db9e493b6cbedeaf4d860621 Mon Sep 17 00:00:00 2001 From: Jeremy Bullock Date: Fri, 28 Oct 2016 03:34:26 -0600 Subject: [PATCH 40/56] buttons on viewer and combo unified (#873) - Added Safearea button and Field Guide button to the viewer title bar - Also modified layout of the viewer title bar --- toonz/sources/toonz/viewerpane.cpp | 77 ++++++++++++++++++++++-------- 1 file changed, 57 insertions(+), 20 deletions(-) diff --git a/toonz/sources/toonz/viewerpane.cpp b/toonz/sources/toonz/viewerpane.cpp index 819a466f..33e34342 100644 --- a/toonz/sources/toonz/viewerpane.cpp +++ b/toonz/sources/toonz/viewerpane.cpp @@ -326,25 +326,49 @@ void SceneViewerPanel::initializeTitleBar(TPanelTitleBar *titleBar) { TPanelTitleBarButtonSet *viewModeButtonSet; m_referenceModeBs = viewModeButtonSet = new TPanelTitleBarButtonSet(); - int x = -188; + int x = -232; int iconWidth = 17; TPanelTitleBarButton *button; - button = new TPanelTitleBarButton(titleBar, ":Resources/freeze.png", - ":Resources/freeze_over.png", - ":Resources/freeze_on.png"); - button->setToolTip(tr("Freeze")); - titleBar->add(QPoint(x, 2), button); - ret = ret && connect(button, SIGNAL(toggled(bool)), m_sceneViewer, - SLOT(freeze(bool))); - ret = ret && connect(m_sceneViewer, SIGNAL(freezeStateChanged(bool)), button, - SLOT(setPressed(bool))); + // buttons for show / hide toggle for the field guide and the safe area + TPanelTitleBarButtonForSafeArea *safeAreaButton = + new TPanelTitleBarButtonForSafeArea(titleBar, ":Resources/safearea.png", + ":Resources/safearea_over.png", + ":Resources/safearea_on.png"); + safeAreaButton->setToolTip(tr("Safe Area (Right Click to Select)")); + titleBar->add(QPoint(x, 1), safeAreaButton); + ret = ret && connect(safeAreaButton, SIGNAL(toggled(bool)), + CommandManager::instance()->getAction(MI_SafeArea), + SLOT(trigger())); + ret = ret && connect(CommandManager::instance()->getAction(MI_SafeArea), + SIGNAL(triggered(bool)), safeAreaButton, + SLOT(setPressed(bool))); + // initialize state + safeAreaButton->setPressed( + CommandManager::instance()->getAction(MI_SafeArea)->isChecked()); + + button = new TPanelTitleBarButton(titleBar, ":Resources/fieldguide.png", + ":Resources/fieldguide_over.png", + ":Resources/fieldguide_on.png"); + button->setToolTip(tr("Field Guide")); + x += 5 + iconWidth; + titleBar->add(QPoint(x, 1), button); + ret = ret && connect(button, SIGNAL(toggled(bool)), + CommandManager::instance()->getAction(MI_FieldGuide), + SLOT(trigger())); + ret = ret && connect(CommandManager::instance()->getAction(MI_FieldGuide), + SIGNAL(triggered(bool)), button, SLOT(setPressed(bool))); + // initialize state + button->setPressed( + CommandManager::instance()->getAction(MI_FieldGuide)->isChecked()); + + // view mode toggles button = new TPanelTitleBarButton(titleBar, ":Resources/standard.png", ":Resources/standard_over.png", ":Resources/standard_on.png"); button->setToolTip(tr("Camera Stand View")); - x += 18 + iconWidth; - titleBar->add(QPoint(x, 2), button); + x += 10 + iconWidth; + titleBar->add(QPoint(x, 1), button); button->setButtonSet(viewModeButtonSet, SceneViewer::NORMAL_REFERENCE); button->setPressed(true); @@ -352,25 +376,37 @@ void SceneViewerPanel::initializeTitleBar(TPanelTitleBar *titleBar) { ":Resources/3D_over.png", ":Resources/3D_on.png"); button->setToolTip(tr("3D View")); - x += 5 + iconWidth; - titleBar->add(QPoint(x, 2), button); + x += 19; // width of standard.png = 18pixels + titleBar->add(QPoint(x, 1), button); button->setButtonSet(viewModeButtonSet, SceneViewer::CAMERA3D_REFERENCE); button = new TPanelTitleBarButton(titleBar, ":Resources/view_camera.png", ":Resources/view_camera_over.png", ":Resources/view_camera_on.png"); button->setToolTip(tr("Camera View")); - x += 5 + iconWidth; - titleBar->add(QPoint(x, 2), button); + x += 18; // width of 3D.png = 18pixels + titleBar->add(QPoint(x, 1), button); button->setButtonSet(viewModeButtonSet, SceneViewer::CAMERA_REFERENCE); ret = ret && connect(viewModeButtonSet, SIGNAL(selected(int)), m_sceneViewer, SLOT(setReferenceMode(int))); + // freeze button + button = new TPanelTitleBarButton(titleBar, ":Resources/freeze.png", + ":Resources/freeze_over.png", + ":Resources/freeze_on.png"); + x += 10 + 19; // width of viewcamera.png = 18pixels + + button->setToolTip(tr("Freeze")); // RC1 + titleBar->add(QPoint(x, 1), button); + ret = ret && connect(button, SIGNAL(toggled(bool)), m_sceneViewer, + SLOT(freeze(bool))); + + // preview toggles m_previewButton = new TPanelTitleBarButton( titleBar, ":Resources/viewpreview.png", ":Resources/viewpreview_over.png", ":Resources/viewpreview_on.png"); - x += 18 + iconWidth; - titleBar->add(QPoint(x, 2), m_previewButton); + x += 5 + iconWidth; + titleBar->add(QPoint(x, 1), m_previewButton); m_previewButton->setToolTip(tr("Preview")); ret = ret && connect(m_previewButton, SIGNAL(toggled(bool)), SLOT(enableFullPreview(bool))); @@ -379,8 +415,9 @@ void SceneViewerPanel::initializeTitleBar(TPanelTitleBar *titleBar) { new TPanelTitleBarButton(titleBar, ":Resources/subcamera_preview.png", ":Resources/subcamera_preview_over.png", ":Resources/subcamera_preview_on.png"); - x += 5 + iconWidth; - titleBar->add(QPoint(x, 2), m_subcameraPreviewButton); + x += 28; // width of viewpreview.png =28pixels + + titleBar->add(QPoint(x, 1), m_subcameraPreviewButton); m_subcameraPreviewButton->setToolTip(tr("Sub-camera Preview")); ret = ret && connect(m_subcameraPreviewButton, SIGNAL(toggled(bool)), SLOT(enableSubCameraPreview(bool))); From 754d4551b7fe36bce497e987f67234b8fb81c4a7 Mon Sep 17 00:00:00 2001 From: shun_iwasawa Date: Fri, 28 Oct 2016 20:05:27 +0900 Subject: [PATCH 41/56] fix not to browse initial description text --- toonz/sources/include/toonzqt/filefield.h | 4 +++- toonz/sources/toonz/convertpopup.cpp | 7 ++++--- toonz/sources/toonzqt/filefield.cpp | 8 ++++++-- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/toonz/sources/include/toonzqt/filefield.h b/toonz/sources/include/toonzqt/filefield.h index f5a65f8b..944f2d1f 100644 --- a/toonz/sources/include/toonzqt/filefield.h +++ b/toonz/sources/include/toonzqt/filefield.h @@ -53,6 +53,8 @@ class DVAPI FileField : public QWidget { QStringList m_filters; QFileDialog::FileMode m_fileMode; QString m_windowTitle; + QString m_descriptionText; // if the initial text is not path, set the string + // here and prevent browsing protected: // used in the child class for CleanupSettings QPushButton *m_fileBrowseButton; @@ -73,7 +75,7 @@ public: static BrowserPopupController *m_browserPopupController; FileField(QWidget *parent = 0, QString path = QString(), - bool readOnly = false); + bool readOnly = false, bool doNotBrowseInitialPath = false); ~FileField() {} /*! Set what the user may select in the file dialog: diff --git a/toonz/sources/toonz/convertpopup.cpp b/toonz/sources/toonz/convertpopup.cpp index 30c184ec..7ed582e9 100644 --- a/toonz/sources/toonz/convertpopup.cpp +++ b/toonz/sources/toonz/convertpopup.cpp @@ -529,7 +529,7 @@ QFrame *ConvertPopup::createTlvSettings() { m_tlvMode = new QComboBox(); m_unpaintedFolderLabel = new QLabel(tr("Unpainted File Folder:")); m_unpaintedFolder = - new DVGui::FileField(0, QString(tr("Same as Painted")), true); + new DVGui::FileField(0, QString(tr("Same as Painted")), true, true); m_suffixLabel = new QLabel(tr(" Unpainted File Suffix:")); m_unpaintedSuffix = new DVGui::LineEdit("_np"); m_applyAutoclose = new QCheckBox(tr("Apply Autoclose")); @@ -538,8 +538,9 @@ QFrame *ConvertPopup::createTlvSettings() { m_appendDefaultPalette = new QCheckBox(tr("Append Default Palette")); m_antialias = new QComboBox(); m_antialiasIntensity = new DVGui::IntLineEdit(0, 50, 0, 100); - m_palettePath = new DVGui::FileField(0, QString(CreateNewPalette), true); - m_tolerance = new DVGui::IntLineEdit(0, 0, 0, 255); + m_palettePath = + new DVGui::FileField(0, QString(CreateNewPalette), true, true); + m_tolerance = new DVGui::IntLineEdit(0, 0, 0, 255); m_removeUnusedStyles = new QCheckBox(tr("Remove Unused Styles from Input Palette")); diff --git a/toonz/sources/toonzqt/filefield.cpp b/toonz/sources/toonzqt/filefield.cpp index 3a32da2b..1832f080 100644 --- a/toonz/sources/toonzqt/filefield.cpp +++ b/toonz/sources/toonzqt/filefield.cpp @@ -18,7 +18,8 @@ FileField::BrowserPopupController *FileField::m_browserPopupController = 0; // FileField //----------------------------------------------------------------------------- -FileField::FileField(QWidget *parent, QString path, bool readOnly) +FileField::FileField(QWidget *parent, QString path, bool readOnly, + bool doNotBrowseInitialPath) : QWidget(parent) , m_filters(QStringList()) , m_fileMode(QFileDialog::DirectoryOnly) @@ -33,6 +34,9 @@ FileField::FileField(QWidget *parent, QString path, bool readOnly) m_fileBrowseButton->setMinimumSize(20, WidgetHeight); m_fileBrowseButton->setObjectName("PushButton_NoPadding"); + // if the initial text is not path, set the string here and prevent browsing + if (doNotBrowseInitialPath) m_descriptionText = path; + QHBoxLayout *mainLayout = new QHBoxLayout(); mainLayout->setMargin(0); mainLayout->setSpacing(1); @@ -90,7 +94,7 @@ void FileField::browseDirectory() { if (!m_browserPopupController) return; m_browserPopupController->openPopup( m_filters, (m_fileMode == QFileDialog::DirectoryOnly), - m_lastSelectedPath); + (m_lastSelectedPath == m_descriptionText) ? "" : m_lastSelectedPath); if (m_browserPopupController->isExecute()) directory = m_browserPopupController->getPath(); From 6deabad43601a890afd7808ae8331863c789099f Mon Sep 17 00:00:00 2001 From: Zoe Pentaleri Date: Sun, 30 Oct 2016 04:20:39 -0400 Subject: [PATCH 42/56] Update required package list for Debian / Ubuntu - add qttools5-dev --- doc/how_to_build_linux.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/how_to_build_linux.md b/doc/how_to_build_linux.md index e353f9a9..ffba401c 100644 --- a/doc/how_to_build_linux.md +++ b/doc/how_to_build_linux.md @@ -16,7 +16,7 @@ You will need to install some dependencies before you can build. Depending on yo ### Installing required packages on Debian / Ubuntu ``` -$ sudo apt-get install build-essential git cmake pkg-config libboost-all-dev qt5-default qtbase5-dev libqt5svg5-dev qtscript5-dev qttools5-dev-tools libqt5opengl5-dev qtmultimedia5-dev libsuperlu-dev liblz4-dev libusb-1.0-0-dev liblzo2-dev libpng-dev libjpeg-dev libglew-dev freeglut3-dev libsdl2-dev libfreetype6-dev +$ sudo apt-get install build-essential git cmake pkg-config libboost-all-dev qt5-default qtbase5-dev libqt5svg5-dev qtscript5-dev qttools5-dev qttools5-dev-tools libqt5opengl5-dev qtmultimedia5-dev libsuperlu-dev liblz4-dev libusb-1.0-0-dev liblzo2-dev libpng-dev libjpeg-dev libglew-dev freeglut3-dev libsdl2-dev libfreetype6-dev ``` Notes: From cede7cbd4792a55e542ca2fe3f31dfb4efb2691f Mon Sep 17 00:00:00 2001 From: shun_iwasawa Date: Mon, 31 Oct 2016 19:45:48 +0900 Subject: [PATCH 43/56] enable shortcut in paletteviewer --- toonz/sources/toonz/CMakeLists.txt | 2 + toonz/sources/toonz/comboviewerpane.cpp | 40 ++----- toonz/sources/toonz/comboviewerpane.h | 10 +- toonz/sources/toonz/sceneviewer.h | 2 + toonz/sources/toonz/sceneviewerevents.cpp | 39 ++----- .../toonz/styleshortcutselectivepanel.cpp | 109 ++++++++++++++++++ .../toonz/styleshortcutselectivepanel.h | 38 ++++++ toonz/sources/toonz/tpanels.cpp | 3 +- toonz/sources/toonz/tpanels.h | 3 +- toonz/sources/toonz/viewerpane.cpp | 42 ++----- toonz/sources/toonz/viewerpane.h | 9 +- toonz/sources/toonzqt/paletteviewergui.cpp | 18 +++ 12 files changed, 206 insertions(+), 109 deletions(-) create mode 100644 toonz/sources/toonz/styleshortcutselectivepanel.cpp create mode 100644 toonz/sources/toonz/styleshortcutselectivepanel.h diff --git a/toonz/sources/toonz/CMakeLists.txt b/toonz/sources/toonz/CMakeLists.txt index 62ee3382..a14ea2c6 100644 --- a/toonz/sources/toonz/CMakeLists.txt +++ b/toonz/sources/toonz/CMakeLists.txt @@ -142,6 +142,7 @@ set(MOC_HEADERS cleanupsettingspane.h penciltestpopup.h locatorpopup.h + styleshortcutselectivepanel.h # Tracker file dummyprocessor.h metnum.h @@ -302,6 +303,7 @@ set(SOURCES cleanupsettingspane.cpp penciltestpopup.cpp locatorpopup.cpp + styleshortcutselectivepanel.cpp # Tracker file dummyprocessor.cpp metnum.cpp diff --git a/toonz/sources/toonz/comboviewerpane.cpp b/toonz/sources/toonz/comboviewerpane.cpp index 8a05db10..325f01aa 100644 --- a/toonz/sources/toonz/comboviewerpane.cpp +++ b/toonz/sources/toonz/comboviewerpane.cpp @@ -86,7 +86,7 @@ ComboViewerPanel::ComboViewerPanel(QWidget *parent, Qt::WindowFlags flags) #else ComboViewerPanel::ComboViewerPanel(QWidget *parent, Qt::WFlags flags) #endif - : TPanel(parent) { + : StyleShortcutSelectivePanel(parent) { TApp *app = TApp::instance(); QFrame *hbox = new QFrame(this); @@ -103,6 +103,7 @@ ComboViewerPanel::ComboViewerPanel(QWidget *parent, Qt::WFlags flags) ImageUtils::FullScreenWidget *fsWidget = new ImageUtils::FullScreenWidget(this); fsWidget->setWidget(m_sceneViewer = new SceneViewer(fsWidget)); + m_sceneViewer->setIsStyleShortcutSelective(); #if defined(Q_OS_WIN) && (QT_VERSION >= 0x050500) && (QT_VERSION < 0x050600) // Workaround for QTBUG-48288 @@ -339,7 +340,8 @@ ComboViewerPanel::~ComboViewerPanel() { //----------------------------------------------------------------------------- -void ComboViewerPanel::showEvent(QShowEvent *) { +void ComboViewerPanel::showEvent(QShowEvent *event) { + StyleShortcutSelectivePanel::showEvent(event); TApp *app = TApp::instance(); TFrameHandle *frameHandle = app->getCurrentFrame(); TSceneHandle *sceneHandle = app->getCurrentScene(); @@ -391,9 +393,6 @@ void ComboViewerPanel::showEvent(QShowEvent *) { ret = ret && connect(app->getCurrentTool(), SIGNAL(toolSwitched()), m_sceneViewer, SLOT(onToolSwitched())); - ret = ret && connect(sceneHandle, SIGNAL(preferenceChanged(const QString &)), - this, SLOT(onPreferenceChanged(const QString &))); - onPreferenceChanged(""); assert(ret); @@ -406,7 +405,8 @@ void ComboViewerPanel::showEvent(QShowEvent *) { //----------------------------------------------------------------------------- -void ComboViewerPanel::hideEvent(QHideEvent *) { +void ComboViewerPanel::hideEvent(QHideEvent *event) { + StyleShortcutSelectivePanel::hideEvent(event); TApp *app = TApp::instance(); disconnect(app->getCurrentScene()); disconnect(app->getCurrentLevel()); @@ -791,31 +791,5 @@ void ComboViewerPanel::onPreferenceChanged(const QString &prefName) { prefName.isEmpty()) m_flipConsole->onPreferenceChanged(); - if (prefName == "NumpadForSwitchingStyles" || prefName.isEmpty()) - updateTabFocus(); + StyleShortcutSelectivePanel::onPreferenceChanged(prefName); } - -//----------------------------------------------------------------------------- - -void ComboViewerPanel::updateTabFocus() { - QList widgets = findChildren(); - if (Preferences::instance()->isUseNumpadForSwitchingStylesEnabled()) { - // disable tab focus - foreach (QWidget *widget, widgets) { - Qt::FocusPolicy policy = widget->focusPolicy(); - if (policy == Qt::TabFocus || policy == Qt::StrongFocus || - policy == Qt::WheelFocus) { - m_childrenFocusPolicies[widget] = policy; - widget->setFocusPolicy((policy == Qt::TabFocus) ? Qt::NoFocus - : Qt::ClickFocus); - } - } - } else { - // revert tab focus - QHashIterator i(m_childrenFocusPolicies); - while (i.hasNext()) { - i.next(); - i.key()->setFocusPolicy(i.value()); - } - } -} \ No newline at end of file diff --git a/toonz/sources/toonz/comboviewerpane.h b/toonz/sources/toonz/comboviewerpane.h index c6864381..e8368300 100644 --- a/toonz/sources/toonz/comboviewerpane.h +++ b/toonz/sources/toonz/comboviewerpane.h @@ -3,7 +3,7 @@ #ifndef COMBOVIEWER_PANE_INCLUDED #define COMBOVIEWER_PANE_INCLUDED -#include "pane.h" +#include "styleshortcutselectivepanel.h" #include "sceneviewer.h" #include "toonzqt/intfield.h" #include "toonzqt/keyframenavigator.h" @@ -37,7 +37,8 @@ enum CV_Parts { }; //----------------------------------------------------------------------------- -class ComboViewerPanel final : public TPanel, public FlipConsoleOwner { +class ComboViewerPanel final : public StyleShortcutSelectivePanel, + public FlipConsoleOwner { Q_OBJECT SceneViewer *m_sceneViewer; @@ -55,8 +56,6 @@ class ComboViewerPanel final : public TPanel, public FlipConsoleOwner { TPanelTitleBarButton *m_previewButton; TPanelTitleBarButton *m_subcameraPreviewButton; - QHash m_childrenFocusPolicies; - public: #if QT_VERSION >= 0x050500 ComboViewerPanel(QWidget *parent = 0, Qt::WindowFlags flags = 0); @@ -121,8 +120,7 @@ protected slots: void enableFullPreview(bool enabled); void enableSubCameraPreview(bool enabled); - void onPreferenceChanged(const QString &prefName); - void updateTabFocus(); + void onPreferenceChanged(const QString &prefName) override; }; #endif diff --git a/toonz/sources/toonz/sceneviewer.h b/toonz/sources/toonz/sceneviewer.h index 0941505b..1362f661 100644 --- a/toonz/sources/toonz/sceneviewer.h +++ b/toonz/sources/toonz/sceneviewer.h @@ -138,6 +138,7 @@ class SceneViewer final : public QGLWidget, LocatorPopup *m_locator; bool m_isLocator; + bool m_isStyleShortcutSelective; // iwsw commented out temporarily // Ghibli3DLutUtil * m_ghibli3DLutUtil; @@ -235,6 +236,7 @@ public: void setFocus(Qt::FocusReason reason) { QWidget::setFocus(reason); }; void setIsLocator() { m_isLocator = true; } + void setIsStyleShortcutSelective() { m_isStyleShortcutSelective = true; } public: // SceneViewer's gadget public functions diff --git a/toonz/sources/toonz/sceneviewerevents.cpp b/toonz/sources/toonz/sceneviewerevents.cpp index 201a5530..c7270fd4 100644 --- a/toonz/sources/toonz/sceneviewerevents.cpp +++ b/toonz/sources/toonz/sceneviewerevents.cpp @@ -772,36 +772,15 @@ void SceneViewer::keyPressEvent(QKeyEvent *event) { tool->setViewer(this); - if (Preferences::instance()->isUseNumpadForSwitchingStylesEnabled() && - (!isTextToolActive)) { - if (Qt::Key_0 <= key && key <= Qt::Key_9) { - TPaletteHandle *ph = - TApp::instance()->getPaletteController()->getCurrentLevelPalette(); - - TPalette *palette = ph->getPalette(); - if (palette) { - int styleId = palette->getShortcutValue(key); - if (styleId >= 0) { - ph->setStyleIndex(styleId); - TStyleSelection *selection = dynamic_cast( - TApp::instance()->getCurrentSelection()->getSelection()); - if (selection) selection->selectNone(); - } - } - event->accept(); - return; - } else if (key == Qt::Key_Tab || key == Qt::Key_Backtab) { - TPaletteHandle *ph = - TApp::instance()->getPaletteController()->getCurrentLevelPalette(); - - TPalette *palette = ph->getPalette(); - if (palette) { - palette->nextShortcutScope(key == Qt::Key_Backtab); - ph->notifyPaletteChanged(); - } - event->accept(); - return; - } + // If this object is child of Viewer or ComboViewer + // (m_isStyleShortcutSelective = true), + // then consider about shortcut for the current style selection. + if (m_isStyleShortcutSelective && + Preferences::instance()->isUseNumpadForSwitchingStylesEnabled() && + (!isTextToolActive) && ((Qt::Key_0 <= key && key <= Qt::Key_9) || + key == Qt::Key_Tab || key == Qt::Key_Backtab)) { + event->ignore(); + return; } if (key == Qt::Key_Shift) diff --git a/toonz/sources/toonz/styleshortcutselectivepanel.cpp b/toonz/sources/toonz/styleshortcutselectivepanel.cpp new file mode 100644 index 00000000..57b1fab6 --- /dev/null +++ b/toonz/sources/toonz/styleshortcutselectivepanel.cpp @@ -0,0 +1,109 @@ +#include "styleshortcutselectivepanel.h" + +// TnzLib includes +#include "toonz/tscenehandle.h" +#include "toonz/preferences.h" +#include "toonz/palettecontroller.h" +#include "toonz/tpalettehandle.h" + +// TnzTools includes +#include "tools/toolhandle.h" +#include "tools/toolcommandids.h" + +// TnzQt includes +#include "toonzqt/tselectionhandle.h" +#include "toonzqt/styleselection.h" + +// Tnz6 includes +#include "tapp.h" + +#include + +//----------------------------------------------------------------------------- + +void StyleShortcutSelectivePanel::keyPressEvent(QKeyEvent *event) { + if (!Preferences::instance()->isUseNumpadForSwitchingStylesEnabled()) return; + TTool *tool = TApp::instance()->getCurrentTool()->getTool(); + if (!tool) return; + if (tool->getName() == T_Type && tool->isActive()) return; + + int key = event->key(); + if (Qt::Key_0 <= key && key <= Qt::Key_9) { + TPaletteHandle *ph = + TApp::instance()->getPaletteController()->getCurrentLevelPalette(); + + TPalette *palette = ph->getPalette(); + if (palette) { + int styleId = palette->getShortcutValue(key); + if (styleId >= 0) { + ph->setStyleIndex(styleId); + TStyleSelection *selection = dynamic_cast( + TApp::instance()->getCurrentSelection()->getSelection()); + if (selection) selection->selectNone(); + } + } + event->accept(); + } else if (key == Qt::Key_Tab || key == Qt::Key_Backtab) { + TPaletteHandle *ph = + TApp::instance()->getPaletteController()->getCurrentLevelPalette(); + + TPalette *palette = ph->getPalette(); + if (palette) { + palette->nextShortcutScope(key == Qt::Key_Backtab); + ph->notifyPaletteChanged(); + } + event->accept(); + } +} + +//----------------------------------------------------------------------------- + +void StyleShortcutSelectivePanel::showEvent(QShowEvent *event) { + TPanel::showEvent(event); + bool ret = connect(TApp::instance()->getCurrentScene(), + SIGNAL(preferenceChanged(const QString &)), this, + SLOT(onPreferenceChanged(const QString &))); + onPreferenceChanged(""); + assert(ret); +} + +//----------------------------------------------------------------------------- + +void StyleShortcutSelectivePanel::hideEvent(QHideEvent *event) { + TPanel::hideEvent(event); + disconnect(TApp::instance()->getCurrentScene(), + SIGNAL(preferenceChanged(const QString &)), this, + SLOT(onPreferenceChanged(const QString &))); +} + +//----------------------------------------------------------------------------- + +void StyleShortcutSelectivePanel::onPreferenceChanged(const QString &prefName) { + if (prefName == "NumpadForSwitchingStyles" || prefName.isEmpty()) + updateTabFocus(); +} + +//----------------------------------------------------------------------------- + +void StyleShortcutSelectivePanel::updateTabFocus() { + QList widgets = findChildren(); + if (Preferences::instance()->isUseNumpadForSwitchingStylesEnabled()) { + // disable tab focus + foreach (QWidget *widget, widgets) { + Qt::FocusPolicy policy = widget->focusPolicy(); + if (policy == Qt::TabFocus || policy == Qt::StrongFocus || + policy == Qt::WheelFocus) { + m_childrenFocusPolicies[widget] = policy; + widget->setFocusPolicy((policy == Qt::TabFocus) ? Qt::NoFocus + : Qt::ClickFocus); + } + } + } else { + // revert tab focus + QHashIterator i(m_childrenFocusPolicies); + while (i.hasNext()) { + i.next(); + i.key()->setFocusPolicy(i.value()); + } + } +} \ No newline at end of file diff --git a/toonz/sources/toonz/styleshortcutselectivepanel.h b/toonz/sources/toonz/styleshortcutselectivepanel.h new file mode 100644 index 00000000..cacf5ce0 --- /dev/null +++ b/toonz/sources/toonz/styleshortcutselectivepanel.h @@ -0,0 +1,38 @@ +#pragma once + +#ifndef STYLE_SHORTCUT_SELECTIVE_PANEL_H +#define STYLE_SHORTCUT_SELECTIVE_PANEL_H + +#include "pane.h" + +//============================================================================= +// StyleShortcutSelectivePanel +//----------------------------------------------------------------------------- +// StyleShortcutSelectivePanel class is inherited by panels which can select +// the current style by 0-9 number keys if the Preferences option +// "Use Numpad and Tab keys for Switching Styles" is active. +// Currently inherited by ComboViewer, Viewer and Palette +//----------------------------------------------------------------------------- + +class StyleShortcutSelectivePanel : public TPanel { + Q_OBJECT + + QHash m_childrenFocusPolicies; + +public: + StyleShortcutSelectivePanel( + QWidget *parent = 0, Qt::WindowFlags flags = 0, + TDockWidget::Orientation orientation = TDockWidget::vertical) + : TPanel(parent, flags, orientation) {} + +protected: + void keyPressEvent(QKeyEvent *event) override; + void showEvent(QShowEvent *) override; + void hideEvent(QHideEvent *) override; + +protected slots: + virtual void onPreferenceChanged(const QString &prefName); + void updateTabFocus(); +}; + +#endif \ No newline at end of file diff --git a/toonz/sources/toonz/tpanels.cpp b/toonz/sources/toonz/tpanels.cpp index 74fee6a7..70dc4b13 100644 --- a/toonz/sources/toonz/tpanels.cpp +++ b/toonz/sources/toonz/tpanels.cpp @@ -402,7 +402,8 @@ public: // PaletteViewer //----------------------------------------------------------------------------- -PaletteViewerPanel::PaletteViewerPanel(QWidget *parent) : TPanel(parent) { +PaletteViewerPanel::PaletteViewerPanel(QWidget *parent) + : StyleShortcutSelectivePanel(parent) { m_paletteHandle = new TPaletteHandle(); connect(m_paletteHandle, SIGNAL(colorStyleSwitched()), SLOT(onColorStyleSwitched())); diff --git a/toonz/sources/toonz/tpanels.h b/toonz/sources/toonz/tpanels.h index ed6cbf83..c0ff58b6 100644 --- a/toonz/sources/toonz/tpanels.h +++ b/toonz/sources/toonz/tpanels.h @@ -4,6 +4,7 @@ #define TPANELS_INCLUDED #include "pane.h" +#include "styleshortcutselectivepanel.h" #include "tpalette.h" #include "trenderer.h" @@ -27,7 +28,7 @@ class ToolOptions; // PaletteViewerPanel //--------------------------------------------------------- -class PaletteViewerPanel final : public TPanel { +class PaletteViewerPanel final : public StyleShortcutSelectivePanel { Q_OBJECT TPaletteHandle *m_paletteHandle; diff --git a/toonz/sources/toonz/viewerpane.cpp b/toonz/sources/toonz/viewerpane.cpp index f10ad1a8..ca8db6c1 100644 --- a/toonz/sources/toonz/viewerpane.cpp +++ b/toonz/sources/toonz/viewerpane.cpp @@ -77,7 +77,7 @@ SceneViewerPanel::SceneViewerPanel(QWidget *parent, Qt::WindowFlags flags) #else SceneViewerPanel::SceneViewerPanel(QWidget *parent, Qt::WFlags flags) #endif - : TPanel(parent) { + : StyleShortcutSelectivePanel(parent) { QFrame *hbox = new QFrame(this); hbox->setFrameStyle(QFrame::StyledPanel); hbox->setObjectName("ViewerPanel"); @@ -94,6 +94,7 @@ SceneViewerPanel::SceneViewerPanel(QWidget *parent, Qt::WFlags flags) new ImageUtils::FullScreenWidget(viewer); fsWidget->setWidget(m_sceneViewer = new SceneViewer(fsWidget)); + m_sceneViewer->setIsStyleShortcutSelective(); bool ret = true; ret = ret && connect(m_sceneViewer, SIGNAL(onZoomChanged()), @@ -220,7 +221,8 @@ SceneViewerPanel::~SceneViewerPanel() {} //----------------------------------------------------------------------------- -void SceneViewerPanel::showEvent(QShowEvent *) { +void SceneViewerPanel::showEvent(QShowEvent *event) { + StyleShortcutSelectivePanel::showEvent(event); TApp *app = TApp::instance(); TFrameHandle *frameHandle = app->getCurrentFrame(); TSceneHandle *sceneHandle = app->getCurrentScene(); @@ -259,10 +261,6 @@ void SceneViewerPanel::showEvent(QShowEvent *) { ret = ret && connect(app->getCurrentTool(), SIGNAL(toolSwitched()), m_sceneViewer, SLOT(onToolSwitched())); - ret = ret && connect(sceneHandle, SIGNAL(preferenceChanged(const QString &)), - this, SLOT(onPreferenceChanged(const QString &))); - onPreferenceChanged(""); - assert(ret); // Aggiorno FPS al valore definito nel viewer corrente. @@ -272,7 +270,8 @@ void SceneViewerPanel::showEvent(QShowEvent *) { //----------------------------------------------------------------------------- -void SceneViewerPanel::hideEvent(QHideEvent *) { +void SceneViewerPanel::hideEvent(QHideEvent *event) { + StyleShortcutSelectivePanel::hideEvent(event); TApp *app = TApp::instance(); TFrameHandle *frameHandle = app->getCurrentFrame(); TSceneHandle *sceneHandle = app->getCurrentScene(); @@ -305,9 +304,6 @@ void SceneViewerPanel::hideEvent(QHideEvent *) { disconnect(app->getCurrentTool(), SIGNAL(toolSwitched()), m_sceneViewer, SLOT(onToolSwitched())); - disconnect(sceneHandle, SIGNAL(preferenceChanged()), m_flipConsole, - SLOT(onPreferenceChanged())); - m_flipConsole->setActive(false); } @@ -605,33 +601,13 @@ void SceneViewerPanel::onFrameTypeChanged() { //----------------------------------------------------------------------------- void SceneViewerPanel::onPreferenceChanged(const QString &prefName) { - // if no name specified (on showEvent), then process all updates + // if no name specified (on StyleShortcutSelectivePanel::showEvent), + // then process all updates if (prefName == "BlankCount" || prefName == "BlankColor" || prefName.isEmpty()) m_flipConsole->onPreferenceChanged(); - if (prefName == "NumpadForSwitchingStyles" || prefName.isEmpty()) { - QList widgets = findChildren(); - if (Preferences::instance()->isUseNumpadForSwitchingStylesEnabled()) { - // disable tab key - foreach (QWidget *widget, widgets) { - Qt::FocusPolicy policy = widget->focusPolicy(); - if (policy == Qt::TabFocus || policy == Qt::StrongFocus || - policy == Qt::WheelFocus) { - m_childrenFocusPolicies[widget] = policy; - widget->setFocusPolicy((policy == Qt::TabFocus) ? Qt::NoFocus - : Qt::ClickFocus); - } - } - } else { - // revert tab focus - QHashIterator i(m_childrenFocusPolicies); - while (i.hasNext()) { - i.next(); - i.key()->setFocusPolicy(i.value()); - } - } - } + StyleShortcutSelectivePanel::onPreferenceChanged(prefName); } //----------------------------------------------------------------------------- diff --git a/toonz/sources/toonz/viewerpane.h b/toonz/sources/toonz/viewerpane.h index 16808918..e75eaca6 100644 --- a/toonz/sources/toonz/viewerpane.h +++ b/toonz/sources/toonz/viewerpane.h @@ -3,7 +3,7 @@ #ifndef VIEWER_PANE_INCLUDED #define VIEWER_PANE_INCLUDED -#include "pane.h" +#include "styleshortcutselectivepanel.h" #include "sceneviewer.h" #include "toonzqt/intfield.h" #include "toonzqt/keyframenavigator.h" @@ -25,7 +25,8 @@ class Ruler; class FlipConsole; class TXshLevel; -class SceneViewerPanel final : public TPanel, public FlipConsoleOwner { +class SceneViewerPanel final : public StyleShortcutSelectivePanel, + public FlipConsoleOwner { Q_OBJECT friend class SceneViewer; @@ -38,8 +39,6 @@ class SceneViewerPanel final : public TPanel, public FlipConsoleOwner { TPanelTitleBarButton *m_subcameraPreviewButton; bool m_onionSkinActive = false; - QHash m_childrenFocusPolicies; - public: #if QT_VERSION >= 0x050500 SceneViewerPanel(QWidget *parent = 0, Qt::WindowFlags flags = 0); @@ -77,7 +76,7 @@ protected slots: void onPlayingStatusChanged(bool playing); void enableFullPreview(bool enabled); void enableSubCameraPreview(bool enabled); - void onPreferenceChanged(const QString &prefName); + void onPreferenceChanged(const QString &prefName) override; }; #endif diff --git a/toonz/sources/toonzqt/paletteviewergui.cpp b/toonz/sources/toonzqt/paletteviewergui.cpp index a692b712..4cabe0d6 100644 --- a/toonz/sources/toonzqt/paletteviewergui.cpp +++ b/toonz/sources/toonzqt/paletteviewergui.cpp @@ -593,6 +593,7 @@ void PageViewer::paintEvent(QPaintEvent *e) { // if numpad shortcut is activated, draw shortcut scope if (Preferences::instance()->isUseNumpadForSwitchingStylesEnabled() && + m_viewType == LEVEL_PALETTE && palette->getStyleShortcut(styleIndex) >= 0) { p.setPen(QPen(QColor(0, 0, 0, 128), 2)); p.drawLine(nameRect.topLeft() + QPoint(2, 1), @@ -639,6 +640,7 @@ void PageViewer::paintEvent(QPaintEvent *e) { // if numpad shortcut is activated, draw shortcut scope if (Preferences::instance()->isUseNumpadForSwitchingStylesEnabled() && + m_viewType == LEVEL_PALETTE && palette->getStyleShortcut(styleIndex) >= 0) { QRect itemRect = getItemRect(i); // paint dark @@ -832,6 +834,22 @@ void PageViewer::paintEvent(QPaintEvent *e) { p.drawLine(markPos - QPoint(0, 5), markPos + QPoint(0, 5)); } + // if numpad shortcut is activated, draw shortcut number on top + if (Preferences::instance()->isUseNumpadForSwitchingStylesEnabled() && + m_viewType == LEVEL_PALETTE && + palette->getStyleShortcut(styleIndex) >= 0 && + m_viewMode != SmallChips) { + int key = palette->getStyleShortcut(styleIndex); + int shortcut = key - Qt::Key_0; + QRect ssRect(chipRect.center().x() - 8, chipRect.top() - 11, 16, 20); + p.setBrush(Qt::gray); + p.drawChord(ssRect, 0, -180 * 16); + tmpFont.setPointSize(6); + p.setFont(tmpFont); + p.drawText(ssRect.adjusted(0, 10, 0, 0), Qt::AlignCenter, + QString().setNum(shortcut)); + } + // revert font set p.setFont(preFont); // revert brush From b6833a875937d2a35bd391f384ee02a29c33380a Mon Sep 17 00:00:00 2001 From: Jeremy Bullock Date: Tue, 1 Nov 2016 20:40:28 -0600 Subject: [PATCH 44/56] Sound playback in the viewer (#788) * enable sound playback in Viewer with button in the flip console being pressed close #133 --- toonz/sources/include/toonzqt/flipconsole.h | 1 + toonz/sources/toonz/viewerpane.cpp | 72 ++++++++++++++++++++- toonz/sources/toonz/viewerpane.h | 11 ++++ 3 files changed, 81 insertions(+), 3 deletions(-) diff --git a/toonz/sources/include/toonzqt/flipconsole.h b/toonz/sources/include/toonzqt/flipconsole.h index 5e7c32ae..93e493fb 100644 --- a/toonz/sources/include/toonzqt/flipconsole.h +++ b/toonz/sources/include/toonzqt/flipconsole.h @@ -250,6 +250,7 @@ public: void enableButton(UINT button, bool enable, bool doShowHide = true); void showCurrentFrame(); int getCurrentFrame() const { return m_currentFrame; } + int getCurrentFps() const { return m_fps; } void setChecked(UINT button, bool state); bool isChecked(UINT button) const; void setCurrentFrame(int frame, bool forceResetting = false); diff --git a/toonz/sources/toonz/viewerpane.cpp b/toonz/sources/toonz/viewerpane.cpp index 33e34342..deae824e 100644 --- a/toonz/sources/toonz/viewerpane.cpp +++ b/toonz/sources/toonz/viewerpane.cpp @@ -120,7 +120,7 @@ SceneViewerPanel::SceneViewerPanel(QWidget *parent, Qt::WFlags flags) int buttons = FlipConsole::cFullConsole; - buttons &= (~FlipConsole::eSound); + // buttons &= (~FlipConsole::eSound); buttons &= (~FlipConsole::eFilledRaster); buttons &= (~FlipConsole::eDefineLoadBox); buttons &= (~FlipConsole::eUseLoadBox); @@ -150,6 +150,10 @@ SceneViewerPanel::SceneViewerPanel(QWidget *parent, Qt::WFlags flags) connect(m_flipConsole, SIGNAL(buttonPressed(FlipConsole::EGadget)), m_sceneViewer, SLOT(onButtonPressed(FlipConsole::EGadget))); + ret = + ret && connect(m_flipConsole, SIGNAL(buttonPressed(FlipConsole::EGadget)), + this, SLOT(onButtonPressed(FlipConsole::EGadget))); + ret = ret && connect(m_sceneViewer, SIGNAL(previewStatusChanged()), this, SLOT(update())); @@ -157,7 +161,8 @@ SceneViewerPanel::SceneViewerPanel(QWidget *parent, Qt::WFlags flags) SLOT(onSceneSwitched())); assert(ret); - + m_flipConsole->setChecked(FlipConsole::eSound, true); + m_playSound = m_flipConsole->isChecked(FlipConsole::eSound); m_flipConsole->setFrameRate(app->getCurrentScene() ->getScene() ->getProperties() @@ -474,6 +479,12 @@ void SceneViewerPanel::onXshLevelSwitched(TXshLevel *) { changeWindowTitle(); } //----------------------------------------------------------------------------- void SceneViewerPanel::onPlayingStatusChanged(bool playing) { + if (playing) { + m_playing = true; + } else { + m_playing = false; + m_first = true; + } if (Preferences::instance()->getOnionSkinDuringPlayback()) return; OnionSkinMask osm = TApp::instance()->getCurrentOnionSkin()->getOnionSkinMask(); @@ -578,7 +589,6 @@ void SceneViewerPanel::onSceneChanged() { updateFrameRange(); updateFrameMarkers(); changeWindowTitle(); - TApp *app = TApp::instance(); ToonzScene *scene = app->getCurrentScene()->getScene(); assert(scene); @@ -588,6 +598,7 @@ void SceneViewerPanel::onSceneChanged() { int frameIndex = TApp::instance()->getCurrentFrame()->getFrameIndex(); if (m_keyFrameButton->getCurrentFrame() != frameIndex) m_keyFrameButton->setCurrentFrame(frameIndex); + hasSoundtrack(); } //----------------------------------------------------------------------------- @@ -615,6 +626,14 @@ void SceneViewerPanel::onFrameSwitched() { m_flipConsole->setCurrentFrame(frameIndex + 1); if (m_keyFrameButton->getCurrentFrame() != frameIndex) m_keyFrameButton->setCurrentFrame(frameIndex); + + if (m_playing && m_playSound) { + if (m_first == true && hasSoundtrack()) { + playAudioFrame(frameIndex); + } else if (m_hasSoundtrack) { + playAudioFrame(frameIndex); + } + } } //----------------------------------------------------------------------------- @@ -638,3 +657,50 @@ void SceneViewerPanel::onFrameTypeChanged() { updateFrameRange(); updateFrameMarkers(); } + +void SceneViewerPanel::playAudioFrame(int frame) { + if (m_first) { + m_first = false; + m_fps = TApp::instance() + ->getCurrentScene() + ->getScene() + ->getProperties() + ->getOutputProperties() + ->getFrameRate(); + m_samplesPerFrame = m_sound->getSampleRate() / abs(m_fps); + } + if (!m_sound) return; + m_viewerFps = m_flipConsole->getCurrentFps(); + double s0 = frame * m_samplesPerFrame, s1 = s0 + m_samplesPerFrame; + + // make the sound stop if the viewerfps is higher so the next sound can play + // on time. + if (m_fps < m_viewerFps) + TApp::instance()->getCurrentXsheet()->getXsheet()->stopScrub(); + TApp::instance()->getCurrentXsheet()->getXsheet()->play(m_sound, s0, s1, + false); +} + +bool SceneViewerPanel::hasSoundtrack() { + if (m_sound != NULL) { + m_sound = NULL; + m_hasSoundtrack = false; + m_first = true; + } + TXsheetHandle *xsheetHandle = TApp::instance()->getCurrentXsheet(); + TXsheet::SoundProperties *prop = new TXsheet::SoundProperties(); + m_sound = xsheetHandle->getXsheet()->makeSound(prop); + if (m_sound == NULL) { + m_hasSoundtrack = false; + return false; + } else { + m_hasSoundtrack = true; + return true; + } +} + +void SceneViewerPanel::onButtonPressed(FlipConsole::EGadget button) { + if (button == FlipConsole::eSound) { + m_playSound = !m_playSound; + } +} \ No newline at end of file diff --git a/toonz/sources/toonz/viewerpane.h b/toonz/sources/toonz/viewerpane.h index d308604a..b398fe46 100644 --- a/toonz/sources/toonz/viewerpane.h +++ b/toonz/sources/toonz/viewerpane.h @@ -37,6 +37,14 @@ class SceneViewerPanel final : public TPanel, public FlipConsoleOwner { TPanelTitleBarButton *m_previewButton; TPanelTitleBarButton *m_subcameraPreviewButton; bool m_onionSkinActive = false; + bool m_playSound = true; + bool m_hasSoundtrack = false; + bool m_playing = false; + double m_fps; + int m_viewerFps; + double m_samplesPerFrame; + bool m_first = true; + TSoundTrack *m_sound = NULL; public: #if QT_VERSION >= 0x050500 @@ -58,6 +66,8 @@ protected: void createPlayToolBar(); void addColorMaskButton(QWidget *parent, const char *iconSVGName, int id); void enableFlipConsoleForCamerastand(bool on); + void playAudioFrame(int frame); + bool hasSoundtrack(); public slots: @@ -66,6 +76,7 @@ public slots: void onXshLevelSwitched(TXshLevel *); void updateFrameRange(); void updateFrameMarkers(); + void onButtonPressed(FlipConsole::EGadget button); protected slots: From 7d08f6e97e57732c94835f536f2efa9e008d7cb6 Mon Sep 17 00:00:00 2001 From: shun_iwasawa Date: Mon, 31 Oct 2016 20:48:50 +0900 Subject: [PATCH 45/56] small fixes and change default shortcuts --- stuff/profiles/layouts/shortcuts/defopentoonz.ini | 6 +++--- stuff/profiles/layouts/shortcuts/otharmony.ini | 6 +++--- toonz/sources/toonz/CMakeLists.txt | 4 ++-- toonz/sources/toonz/comboviewerpane.cpp | 10 +++++----- toonz/sources/toonz/comboviewerpane.h | 4 ++-- toonz/sources/toonz/mainwindow.cpp | 6 +++--- toonz/sources/toonz/sceneviewer.h | 4 ++-- toonz/sources/toonz/sceneviewerevents.cpp | 7 ++++--- ...panel.cpp => styleshortcutswitchablepanel.cpp} | 15 ++++++++------- ...tivepanel.h => styleshortcutswitchablepanel.h} | 15 ++++++++------- toonz/sources/toonz/tpanels.cpp | 2 +- toonz/sources/toonz/tpanels.h | 4 ++-- toonz/sources/toonz/viewerpane.cpp | 10 +++++----- toonz/sources/toonz/viewerpane.h | 4 ++-- toonz/sources/toonzlib/preferences.cpp | 2 +- 15 files changed, 51 insertions(+), 48 deletions(-) rename toonz/sources/toonz/{styleshortcutselectivepanel.cpp => styleshortcutswitchablepanel.cpp} (88%) rename toonz/sources/toonz/{styleshortcutselectivepanel.h => styleshortcutswitchablepanel.h} (70%) diff --git a/stuff/profiles/layouts/shortcuts/defopentoonz.ini b/stuff/profiles/layouts/shortcuts/defopentoonz.ini index ebb88c62..27ec3123 100644 --- a/stuff/profiles/layouts/shortcuts/defopentoonz.ini +++ b/stuff/profiles/layouts/shortcuts/defopentoonz.ini @@ -188,7 +188,7 @@ MI_NextDrawing=. MI_NextFrame=Shift+. MI_NextStep= MI_NoShift= -MI_OpacityCheck=1 +MI_OpacityCheck=Alt+1 MI_OpenBatchServers= MI_OpenChild= MI_OpenCleanupSettings= @@ -359,8 +359,8 @@ T_Tape=T T_Tracker= T_Type=Y T_Zoom=Shift+Space -T_ZoomFit=9 -T_ZoomReset=0 +T_ZoomFit=Alt+9 +T_ZoomReset=Alt+0 T_Zoomin=+ T_Zoomout=- MI_LoadRecentImage= diff --git a/stuff/profiles/layouts/shortcuts/otharmony.ini b/stuff/profiles/layouts/shortcuts/otharmony.ini index 84641721..3675e6d6 100644 --- a/stuff/profiles/layouts/shortcuts/otharmony.ini +++ b/stuff/profiles/layouts/shortcuts/otharmony.ini @@ -54,8 +54,8 @@ T_Tape=Alt+C T_Type=Alt+9 T_Zoom=Alt+Z T_ZoomReset= -T_Zoomin=2 -T_Zoomout=1 +T_Zoomin=Alt+2 +T_Zoomout=Alt+1 A_DecreaseBrushHardness= A_DecreaseMaxBrushThickness= A_DecreaseMinBrushThickness= @@ -143,7 +143,7 @@ MI_CloneChild= MI_CloneLevel= MI_ClonePreview= MI_CloseChild= -MI_Collapse=0 +MI_Collapse=Alt+0 MI_CollectAssets= MI_CompareToSnapshot= MI_ConvertFileWithInput= diff --git a/toonz/sources/toonz/CMakeLists.txt b/toonz/sources/toonz/CMakeLists.txt index 1d2b21d3..c6849a18 100644 --- a/toonz/sources/toonz/CMakeLists.txt +++ b/toonz/sources/toonz/CMakeLists.txt @@ -142,7 +142,7 @@ set(MOC_HEADERS cleanupsettingspane.h penciltestpopup.h locatorpopup.h - styleshortcutselectivepanel.h + styleshortcutswitchablepanel.h # Tracker file dummyprocessor.h metnum.h @@ -303,7 +303,7 @@ set(SOURCES cleanupsettingspane.cpp penciltestpopup.cpp locatorpopup.cpp - styleshortcutselectivepanel.cpp + styleshortcutswitchablepanel.cpp # Tracker file dummyprocessor.cpp metnum.cpp diff --git a/toonz/sources/toonz/comboviewerpane.cpp b/toonz/sources/toonz/comboviewerpane.cpp index 325f01aa..c5920056 100644 --- a/toonz/sources/toonz/comboviewerpane.cpp +++ b/toonz/sources/toonz/comboviewerpane.cpp @@ -86,7 +86,7 @@ ComboViewerPanel::ComboViewerPanel(QWidget *parent, Qt::WindowFlags flags) #else ComboViewerPanel::ComboViewerPanel(QWidget *parent, Qt::WFlags flags) #endif - : StyleShortcutSelectivePanel(parent) { + : StyleShortcutSwitchablePanel(parent) { TApp *app = TApp::instance(); QFrame *hbox = new QFrame(this); @@ -103,7 +103,7 @@ ComboViewerPanel::ComboViewerPanel(QWidget *parent, Qt::WFlags flags) ImageUtils::FullScreenWidget *fsWidget = new ImageUtils::FullScreenWidget(this); fsWidget->setWidget(m_sceneViewer = new SceneViewer(fsWidget)); - m_sceneViewer->setIsStyleShortcutSelective(); + m_sceneViewer->setIsStyleShortcutSwitchable(); #if defined(Q_OS_WIN) && (QT_VERSION >= 0x050500) && (QT_VERSION < 0x050600) // Workaround for QTBUG-48288 @@ -341,7 +341,7 @@ ComboViewerPanel::~ComboViewerPanel() { //----------------------------------------------------------------------------- void ComboViewerPanel::showEvent(QShowEvent *event) { - StyleShortcutSelectivePanel::showEvent(event); + StyleShortcutSwitchablePanel::showEvent(event); TApp *app = TApp::instance(); TFrameHandle *frameHandle = app->getCurrentFrame(); TSceneHandle *sceneHandle = app->getCurrentScene(); @@ -406,7 +406,7 @@ void ComboViewerPanel::showEvent(QShowEvent *event) { //----------------------------------------------------------------------------- void ComboViewerPanel::hideEvent(QHideEvent *event) { - StyleShortcutSelectivePanel::hideEvent(event); + StyleShortcutSwitchablePanel::hideEvent(event); TApp *app = TApp::instance(); disconnect(app->getCurrentScene()); disconnect(app->getCurrentLevel()); @@ -791,5 +791,5 @@ void ComboViewerPanel::onPreferenceChanged(const QString &prefName) { prefName.isEmpty()) m_flipConsole->onPreferenceChanged(); - StyleShortcutSelectivePanel::onPreferenceChanged(prefName); + StyleShortcutSwitchablePanel::onPreferenceChanged(prefName); } diff --git a/toonz/sources/toonz/comboviewerpane.h b/toonz/sources/toonz/comboviewerpane.h index e8368300..d7f2ea05 100644 --- a/toonz/sources/toonz/comboviewerpane.h +++ b/toonz/sources/toonz/comboviewerpane.h @@ -3,7 +3,7 @@ #ifndef COMBOVIEWER_PANE_INCLUDED #define COMBOVIEWER_PANE_INCLUDED -#include "styleshortcutselectivepanel.h" +#include "styleshortcutswitchablepanel.h" #include "sceneviewer.h" #include "toonzqt/intfield.h" #include "toonzqt/keyframenavigator.h" @@ -37,7 +37,7 @@ enum CV_Parts { }; //----------------------------------------------------------------------------- -class ComboViewerPanel final : public StyleShortcutSelectivePanel, +class ComboViewerPanel final : public StyleShortcutSwitchablePanel, public FlipConsoleOwner { Q_OBJECT diff --git a/toonz/sources/toonz/mainwindow.cpp b/toonz/sources/toonz/mainwindow.cpp index afca0114..23c7403a 100644 --- a/toonz/sources/toonz/mainwindow.cpp +++ b/toonz/sources/toonz/mainwindow.cpp @@ -1689,7 +1689,7 @@ void MainWindow::defineActions() { MenuScanCleanupCommandType); CameraTestCheck::instance()->setToggle(toggle); - createToggle(MI_OpacityCheck, tr("&Opacity Check"), "1", false, + createToggle(MI_OpacityCheck, tr("&Opacity Check"), "Alt+1", false, MenuScanCleanupCommandType); createMenuScanCleanupAction(MI_Cleanup, tr("&Cleanup"), ""); @@ -2047,8 +2047,8 @@ void MainWindow::defineActions() { createViewerAction(V_ZoomIn, tr("Zoom In"), "+"); createViewerAction(V_ZoomOut, tr("Zoom Out"), "-"); - createViewerAction(V_ZoomReset, tr("Reset View"), "0"); - createViewerAction(V_ZoomFit, tr("Fit to Window"), "9"); + createViewerAction(V_ZoomReset, tr("Reset View"), "Alt+0"); + createViewerAction(V_ZoomFit, tr("Fit to Window"), "Alt+9"); createViewerAction(V_ActualPixelSize, tr("Actual Pixel Size"), "N"); createViewerAction(V_ShowHideFullScreen, tr("Show//Hide Full Screen"), "Alt+F"); diff --git a/toonz/sources/toonz/sceneviewer.h b/toonz/sources/toonz/sceneviewer.h index 1362f661..10276dc4 100644 --- a/toonz/sources/toonz/sceneviewer.h +++ b/toonz/sources/toonz/sceneviewer.h @@ -138,7 +138,7 @@ class SceneViewer final : public QGLWidget, LocatorPopup *m_locator; bool m_isLocator; - bool m_isStyleShortcutSelective; + bool m_isStyleShortcutSwitchable; // iwsw commented out temporarily // Ghibli3DLutUtil * m_ghibli3DLutUtil; @@ -236,7 +236,7 @@ public: void setFocus(Qt::FocusReason reason) { QWidget::setFocus(reason); }; void setIsLocator() { m_isLocator = true; } - void setIsStyleShortcutSelective() { m_isStyleShortcutSelective = true; } + void setIsStyleShortcutSwitchable() { m_isStyleShortcutSwitchable = true; } public: // SceneViewer's gadget public functions diff --git a/toonz/sources/toonz/sceneviewerevents.cpp b/toonz/sources/toonz/sceneviewerevents.cpp index c7270fd4..fbaea5ea 100644 --- a/toonz/sources/toonz/sceneviewerevents.cpp +++ b/toonz/sources/toonz/sceneviewerevents.cpp @@ -775,10 +775,11 @@ void SceneViewer::keyPressEvent(QKeyEvent *event) { // If this object is child of Viewer or ComboViewer // (m_isStyleShortcutSelective = true), // then consider about shortcut for the current style selection. - if (m_isStyleShortcutSelective && + if (m_isStyleShortcutSwitchable && Preferences::instance()->isUseNumpadForSwitchingStylesEnabled() && - (!isTextToolActive) && ((Qt::Key_0 <= key && key <= Qt::Key_9) || - key == Qt::Key_Tab || key == Qt::Key_Backtab)) { + (!isTextToolActive) && event->modifiers() == Qt::NoModifier && + ((Qt::Key_0 <= key && key <= Qt::Key_9) || key == Qt::Key_Tab || + key == Qt::Key_Backtab)) { event->ignore(); return; } diff --git a/toonz/sources/toonz/styleshortcutselectivepanel.cpp b/toonz/sources/toonz/styleshortcutswitchablepanel.cpp similarity index 88% rename from toonz/sources/toonz/styleshortcutselectivepanel.cpp rename to toonz/sources/toonz/styleshortcutswitchablepanel.cpp index 57b1fab6..4b8ada43 100644 --- a/toonz/sources/toonz/styleshortcutselectivepanel.cpp +++ b/toonz/sources/toonz/styleshortcutswitchablepanel.cpp @@ -1,4 +1,4 @@ -#include "styleshortcutselectivepanel.h" +#include "styleshortcutswitchablepanel.h" // TnzLib includes #include "toonz/tscenehandle.h" @@ -21,12 +21,12 @@ //----------------------------------------------------------------------------- -void StyleShortcutSelectivePanel::keyPressEvent(QKeyEvent *event) { +void StyleShortcutSwitchablePanel::keyPressEvent(QKeyEvent *event) { if (!Preferences::instance()->isUseNumpadForSwitchingStylesEnabled()) return; TTool *tool = TApp::instance()->getCurrentTool()->getTool(); if (!tool) return; if (tool->getName() == T_Type && tool->isActive()) return; - + if (event->modifiers() != Qt::NoModifier) return; int key = event->key(); if (Qt::Key_0 <= key && key <= Qt::Key_9) { TPaletteHandle *ph = @@ -58,7 +58,7 @@ void StyleShortcutSelectivePanel::keyPressEvent(QKeyEvent *event) { //----------------------------------------------------------------------------- -void StyleShortcutSelectivePanel::showEvent(QShowEvent *event) { +void StyleShortcutSwitchablePanel::showEvent(QShowEvent *event) { TPanel::showEvent(event); bool ret = connect(TApp::instance()->getCurrentScene(), SIGNAL(preferenceChanged(const QString &)), this, @@ -69,7 +69,7 @@ void StyleShortcutSelectivePanel::showEvent(QShowEvent *event) { //----------------------------------------------------------------------------- -void StyleShortcutSelectivePanel::hideEvent(QHideEvent *event) { +void StyleShortcutSwitchablePanel::hideEvent(QHideEvent *event) { TPanel::hideEvent(event); disconnect(TApp::instance()->getCurrentScene(), SIGNAL(preferenceChanged(const QString &)), this, @@ -78,14 +78,15 @@ void StyleShortcutSelectivePanel::hideEvent(QHideEvent *event) { //----------------------------------------------------------------------------- -void StyleShortcutSelectivePanel::onPreferenceChanged(const QString &prefName) { +void StyleShortcutSwitchablePanel::onPreferenceChanged( + const QString &prefName) { if (prefName == "NumpadForSwitchingStyles" || prefName.isEmpty()) updateTabFocus(); } //----------------------------------------------------------------------------- -void StyleShortcutSelectivePanel::updateTabFocus() { +void StyleShortcutSwitchablePanel::updateTabFocus() { QList widgets = findChildren(); if (Preferences::instance()->isUseNumpadForSwitchingStylesEnabled()) { // disable tab focus diff --git a/toonz/sources/toonz/styleshortcutselectivepanel.h b/toonz/sources/toonz/styleshortcutswitchablepanel.h similarity index 70% rename from toonz/sources/toonz/styleshortcutselectivepanel.h rename to toonz/sources/toonz/styleshortcutswitchablepanel.h index cacf5ce0..ce689331 100644 --- a/toonz/sources/toonz/styleshortcutselectivepanel.h +++ b/toonz/sources/toonz/styleshortcutswitchablepanel.h @@ -1,26 +1,27 @@ #pragma once -#ifndef STYLE_SHORTCUT_SELECTIVE_PANEL_H -#define STYLE_SHORTCUT_SELECTIVE_PANEL_H +#ifndef STYLE_SHORTCUT_SWITCHABLE_PANEL_H +#define STYLE_SHORTCUT_SWITCHABLE_PANEL_H #include "pane.h" //============================================================================= -// StyleShortcutSelectivePanel +// StyleShortcutSwitchablePanel //----------------------------------------------------------------------------- -// StyleShortcutSelectivePanel class is inherited by panels which can select -// the current style by 0-9 number keys if the Preferences option +// StyleShortcutSwitchablePanel class is subclass of TPanel and +// inherited by panels which can select the current style by 0-9 +// number keys if the Preferences option // "Use Numpad and Tab keys for Switching Styles" is active. // Currently inherited by ComboViewer, Viewer and Palette //----------------------------------------------------------------------------- -class StyleShortcutSelectivePanel : public TPanel { +class StyleShortcutSwitchablePanel : public TPanel { Q_OBJECT QHash m_childrenFocusPolicies; public: - StyleShortcutSelectivePanel( + StyleShortcutSwitchablePanel( QWidget *parent = 0, Qt::WindowFlags flags = 0, TDockWidget::Orientation orientation = TDockWidget::vertical) : TPanel(parent, flags, orientation) {} diff --git a/toonz/sources/toonz/tpanels.cpp b/toonz/sources/toonz/tpanels.cpp index 70dc4b13..8ed57959 100644 --- a/toonz/sources/toonz/tpanels.cpp +++ b/toonz/sources/toonz/tpanels.cpp @@ -403,7 +403,7 @@ public: //----------------------------------------------------------------------------- PaletteViewerPanel::PaletteViewerPanel(QWidget *parent) - : StyleShortcutSelectivePanel(parent) { + : StyleShortcutSwitchablePanel(parent) { m_paletteHandle = new TPaletteHandle(); connect(m_paletteHandle, SIGNAL(colorStyleSwitched()), SLOT(onColorStyleSwitched())); diff --git a/toonz/sources/toonz/tpanels.h b/toonz/sources/toonz/tpanels.h index c0ff58b6..d6501d8d 100644 --- a/toonz/sources/toonz/tpanels.h +++ b/toonz/sources/toonz/tpanels.h @@ -4,7 +4,7 @@ #define TPANELS_INCLUDED #include "pane.h" -#include "styleshortcutselectivepanel.h" +#include "styleshortcutswitchablepanel.h" #include "tpalette.h" #include "trenderer.h" @@ -28,7 +28,7 @@ class ToolOptions; // PaletteViewerPanel //--------------------------------------------------------- -class PaletteViewerPanel final : public StyleShortcutSelectivePanel { +class PaletteViewerPanel final : public StyleShortcutSwitchablePanel { Q_OBJECT TPaletteHandle *m_paletteHandle; diff --git a/toonz/sources/toonz/viewerpane.cpp b/toonz/sources/toonz/viewerpane.cpp index 68356e1d..ef676e7f 100644 --- a/toonz/sources/toonz/viewerpane.cpp +++ b/toonz/sources/toonz/viewerpane.cpp @@ -77,7 +77,7 @@ SceneViewerPanel::SceneViewerPanel(QWidget *parent, Qt::WindowFlags flags) #else SceneViewerPanel::SceneViewerPanel(QWidget *parent, Qt::WFlags flags) #endif - : StyleShortcutSelectivePanel(parent) { + : StyleShortcutSwitchablePanel(parent) { QFrame *hbox = new QFrame(this); hbox->setFrameStyle(QFrame::StyledPanel); hbox->setObjectName("ViewerPanel"); @@ -94,7 +94,7 @@ SceneViewerPanel::SceneViewerPanel(QWidget *parent, Qt::WFlags flags) new ImageUtils::FullScreenWidget(viewer); fsWidget->setWidget(m_sceneViewer = new SceneViewer(fsWidget)); - m_sceneViewer->setIsStyleShortcutSelective(); + m_sceneViewer->setIsStyleShortcutSwitchable(); bool ret = true; ret = ret && connect(m_sceneViewer, SIGNAL(onZoomChanged()), @@ -222,7 +222,7 @@ SceneViewerPanel::~SceneViewerPanel() {} //----------------------------------------------------------------------------- void SceneViewerPanel::showEvent(QShowEvent *event) { - StyleShortcutSelectivePanel::showEvent(event); + StyleShortcutSwitchablePanel::showEvent(event); TApp *app = TApp::instance(); TFrameHandle *frameHandle = app->getCurrentFrame(); TSceneHandle *sceneHandle = app->getCurrentScene(); @@ -271,7 +271,7 @@ void SceneViewerPanel::showEvent(QShowEvent *event) { //----------------------------------------------------------------------------- void SceneViewerPanel::hideEvent(QHideEvent *event) { - StyleShortcutSelectivePanel::hideEvent(event); + StyleShortcutSwitchablePanel::hideEvent(event); TApp *app = TApp::instance(); TFrameHandle *frameHandle = app->getCurrentFrame(); TSceneHandle *sceneHandle = app->getCurrentScene(); @@ -644,7 +644,7 @@ void SceneViewerPanel::onPreferenceChanged(const QString &prefName) { prefName.isEmpty()) m_flipConsole->onPreferenceChanged(); - StyleShortcutSelectivePanel::onPreferenceChanged(prefName); + StyleShortcutSwitchablePanel::onPreferenceChanged(prefName); } //----------------------------------------------------------------------------- diff --git a/toonz/sources/toonz/viewerpane.h b/toonz/sources/toonz/viewerpane.h index e75eaca6..699873fb 100644 --- a/toonz/sources/toonz/viewerpane.h +++ b/toonz/sources/toonz/viewerpane.h @@ -3,7 +3,7 @@ #ifndef VIEWER_PANE_INCLUDED #define VIEWER_PANE_INCLUDED -#include "styleshortcutselectivepanel.h" +#include "styleshortcutswitchablepanel.h" #include "sceneviewer.h" #include "toonzqt/intfield.h" #include "toonzqt/keyframenavigator.h" @@ -25,7 +25,7 @@ class Ruler; class FlipConsole; class TXshLevel; -class SceneViewerPanel final : public StyleShortcutSelectivePanel, +class SceneViewerPanel final : public StyleShortcutSwitchablePanel, public FlipConsoleOwner { Q_OBJECT diff --git a/toonz/sources/toonzlib/preferences.cpp b/toonz/sources/toonzlib/preferences.cpp index 588792ee..b325637d 100644 --- a/toonz/sources/toonzlib/preferences.cpp +++ b/toonz/sources/toonzlib/preferences.cpp @@ -296,7 +296,7 @@ Preferences::Preferences() , m_precompute(true) , m_ffmpegTimeout(30) , m_shortcutPreset("defopentoonz") - , m_useNumpadForSwitchingStyles(false) { + , m_useNumpadForSwitchingStyles(true) { TCamera camera; m_defLevelType = PLI_XSHLEVEL; m_defLevelWidth = camera.getSize().lx; From 8539fa0c2cf3e528284b20bcabf128ec181d055c Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 2 Nov 2016 21:41:40 +1100 Subject: [PATCH 46/56] Minor edits - Use $ prefix consistently - Include Clang as a working compiler. - Reference CentOS instead of Mageia (there are _many_ rpm based distros, no need to get too spesific). --- doc/how_to_build_linux.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/how_to_build_linux.md b/doc/how_to_build_linux.md index ffba401c..45785d8b 100644 --- a/doc/how_to_build_linux.md +++ b/doc/how_to_build_linux.md @@ -4,7 +4,7 @@ You will need to install some dependencies before you can build. Depending on your distribution you will be able to install the packages directly with the command lines below or will have to manually install: - Git -- GCC +- GCC or Clang - CMake - confirmed to work with 3.4.1. - Qt5 @@ -22,7 +22,7 @@ $ sudo apt-get install build-essential git cmake pkg-config libboost-all-dev qt5 Notes: * It's possible we also need libgsl2 (or maybe libopenbias-dev) -### Installing required packages on RedHat / Mageia +### Installing required packages on RedHat / CentOS TODO ``` @@ -53,7 +53,7 @@ Notes: ### Installing required packages on openSUSE ``` -zypper in boost-devel cmake freeglut-devel freetype2-devel gcc-c++ glew-devel libQt5OpenGL-devel libSDL2-devel libjpeg-devel liblz4-devel libpng16-compat-devel libqt5-linguist-devel libqt5-qtbase-devel libqt5-qtmultimedia-devel libqt5-qtscript-devel libqt5-qtsvg-devel libtiff-devel libusb-devel lzo-devel openblas-devel pkgconfig sed superlu-devel zlib-devel +$ zypper in boost-devel cmake freeglut-devel freetype2-devel gcc-c++ glew-devel libQt5OpenGL-devel libSDL2-devel libjpeg-devel liblz4-devel libpng16-compat-devel libqt5-linguist-devel libqt5-qtbase-devel libqt5-qtmultimedia-devel libqt5-qtscript-devel libqt5-qtsvg-devel libtiff-devel libusb-devel lzo-devel openblas-devel pkgconfig sed superlu-devel zlib-devel ``` ## Build instructions @@ -127,7 +127,7 @@ The build takes a lot of time, be patient. If something doesn't compile or link, please run `make` this way to help spot the problem: ``` -LANG=C make VERBOSE=1 +$ LANG=C make VERBOSE=1 ``` #### Debug build From bb209445ddd33a053a889d02574633f9ec18fc50 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 2 Nov 2016 21:44:24 +1100 Subject: [PATCH 47/56] Linux Readme: remove Unix from title. Currently BSD's and similar systems aren't supported. --- doc/how_to_build_linux.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/how_to_build_linux.md b/doc/how_to_build_linux.md index 45785d8b..bc1d69ba 100644 --- a/doc/how_to_build_linux.md +++ b/doc/how_to_build_linux.md @@ -1,4 +1,4 @@ -# Setting up the development environment for GNU/Linux and Unix +# Setting up the development environment for GNU/Linux ## Required software @@ -6,7 +6,7 @@ You will need to install some dependencies before you can build. Depending on yo - Git - GCC or Clang - CMake - - confirmed to work with 3.4.1. + - confirmed to work with 3.4.1 and newer. - Qt5 - http://download.qt.io/official_releases/qt/5.5/5.5.1/ - Boost @@ -33,7 +33,7 @@ $ rpm ... (it may include some useless packages) ``` -dnf install gcc gcc-c++ automake git cmake boost boost-devel SuperLU SuperLU-devel lz4-devel lzma libusb-devel lzo-devel libjpeg-turbo-devel libGLEW glew-devel freeglut-devel freeglut SDL2 SDL2-devel freetype-devel libpng-devel qt5-qtbase-devel qt5-qtsvg qt5-qtsvg-devel qt5-qtscript qt5-qtscript-devel qt5-qttools qt5-qttools-devel qt5-qtmultimedia-devel blas blas-devel +$ dnf install gcc gcc-c++ automake git cmake boost boost-devel SuperLU SuperLU-devel lz4-devel lzma libusb-devel lzo-devel libjpeg-turbo-devel libGLEW glew-devel freeglut-devel freeglut SDL2 SDL2-devel freetype-devel libpng-devel qt5-qtbase-devel qt5-qtsvg qt5-qtsvg-devel qt5-qtscript qt5-qtscript-devel qt5-qttools qt5-qttools-devel qt5-qtmultimedia-devel blas blas-devel ``` ### Installing required packages on ArchLinux From 27694d9edb09347aa13a9cc2f028bef8c2ac3774 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 3 Nov 2016 22:52:09 +1100 Subject: [PATCH 48/56] Simplify libtiff building Change proposed by @caryoscelus --- doc/how_to_build_linux.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/how_to_build_linux.md b/doc/how_to_build_linux.md index bc1d69ba..01c0bb88 100644 --- a/doc/how_to_build_linux.md +++ b/doc/how_to_build_linux.md @@ -107,7 +107,7 @@ Features from the modified libtiff and needed currently, so this isn't a simple ``` $ cd opentoonz/thirdparty/tiff-4.0.3 -$ CFLAGS="-fPIC" ./configure && make +$ ./configure --with-pic && make $ cd - ``` From c510a11f776b99f6e793a3fd135d2745313cb72c Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 3 Nov 2016 22:54:32 +1100 Subject: [PATCH 49/56] Correct typo --- doc/how_to_build_linux.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/how_to_build_linux.md b/doc/how_to_build_linux.md index 01c0bb88..a6d3efe6 100644 --- a/doc/how_to_build_linux.md +++ b/doc/how_to_build_linux.md @@ -20,7 +20,7 @@ $ sudo apt-get install build-essential git cmake pkg-config libboost-all-dev qt5 ``` Notes: -* It's possible we also need libgsl2 (or maybe libopenbias-dev) +* It's possible we also need libgsl2 (or maybe libopenblas-dev) ### Installing required packages on RedHat / CentOS @@ -48,7 +48,7 @@ $ yaourt -S superlu ``` Notes: -* ArchLinux had BLAS splitted in blas and cblas +* ArchLinux had BLAS split into blas and cblas ### Installing required packages on openSUSE From 8a1b1db2c38e82db5e3b11ef05c32749d6d01b15 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 3 Nov 2016 23:01:38 +1100 Subject: [PATCH 50/56] Add note about jbig error From PR #900, this should be properly resolved, include workaround until it is. --- doc/how_to_build_linux.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/doc/how_to_build_linux.md b/doc/how_to_build_linux.md index a6d3efe6..60b668ed 100644 --- a/doc/how_to_build_linux.md +++ b/doc/how_to_build_linux.md @@ -107,10 +107,17 @@ Features from the modified libtiff and needed currently, so this isn't a simple ``` $ cd opentoonz/thirdparty/tiff-4.0.3 -$ ./configure --with-pic && make +$ ./configure --with-pic +$ make $ cd - ``` +If you receive linking errors mentioning `jbg_` functions while building OpenToonz itself, +try appending `--disable-jbig` to the `./configure` command above and make clean build. +(see https://github.com/opentoonz/opentoonz/issues/851). +This workaround means you won't be able to load images using this compression method +(see https://github.com/opentoonz/opentoonz/issues/901) for updates on this issue. + ### Compiling the actual application ``` From c5b5d29ca2a587457543f6d3bc56c4e4c436a88b Mon Sep 17 00:00:00 2001 From: shun_iwasawa Date: Fri, 4 Nov 2016 18:07:43 +0900 Subject: [PATCH 51/56] enable numpad --- toonz/sources/toonz/sceneviewerevents.cpp | 3 ++- toonz/sources/toonz/styleshortcutswitchablepanel.cpp | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/toonz/sources/toonz/sceneviewerevents.cpp b/toonz/sources/toonz/sceneviewerevents.cpp index fbaea5ea..7a7a9248 100644 --- a/toonz/sources/toonz/sceneviewerevents.cpp +++ b/toonz/sources/toonz/sceneviewerevents.cpp @@ -777,7 +777,8 @@ void SceneViewer::keyPressEvent(QKeyEvent *event) { // then consider about shortcut for the current style selection. if (m_isStyleShortcutSwitchable && Preferences::instance()->isUseNumpadForSwitchingStylesEnabled() && - (!isTextToolActive) && event->modifiers() == Qt::NoModifier && + (!isTextToolActive) && (event->modifiers() == Qt::NoModifier || + event->modifiers() == Qt::KeypadModifier) && ((Qt::Key_0 <= key && key <= Qt::Key_9) || key == Qt::Key_Tab || key == Qt::Key_Backtab)) { event->ignore(); diff --git a/toonz/sources/toonz/styleshortcutswitchablepanel.cpp b/toonz/sources/toonz/styleshortcutswitchablepanel.cpp index 4b8ada43..d6805212 100644 --- a/toonz/sources/toonz/styleshortcutswitchablepanel.cpp +++ b/toonz/sources/toonz/styleshortcutswitchablepanel.cpp @@ -26,7 +26,9 @@ void StyleShortcutSwitchablePanel::keyPressEvent(QKeyEvent *event) { TTool *tool = TApp::instance()->getCurrentTool()->getTool(); if (!tool) return; if (tool->getName() == T_Type && tool->isActive()) return; - if (event->modifiers() != Qt::NoModifier) return; + if (event->modifiers() != Qt::NoModifier && + event->modifiers() != Qt::KeypadModifier) + return; int key = event->key(); if (Qt::Key_0 <= key && key <= Qt::Key_9) { TPaletteHandle *ph = From 84ad0f7c37390d63bcaa3f4cd5df7f70d8d8183f Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 5 Nov 2016 09:55:23 +1100 Subject: [PATCH 52/56] Update Linux install text Simplify text, use title-caps [ci skip] --- doc/how_to_build_linux.md | 55 +++++++++++++++++++++------------------ 1 file changed, 29 insertions(+), 26 deletions(-) diff --git a/doc/how_to_build_linux.md b/doc/how_to_build_linux.md index 60b668ed..11e03808 100644 --- a/doc/how_to_build_linux.md +++ b/doc/how_to_build_linux.md @@ -2,41 +2,42 @@ ## Required software -You will need to install some dependencies before you can build. Depending on your distribution you will be able to install the packages directly with the command lines below or will have to manually install: +Building OpenToonz from source requires the following dependencies: - Git - GCC or Clang -- CMake - - confirmed to work with 3.4.1 and newer. -- Qt5 - - http://download.qt.io/official_releases/qt/5.5/5.5.1/ -- Boost - - http://www.boost.org/users/history/version_1_55_0.html +- CMake (3.4.1 or newer). +- Qt5 (5.5 or newer) +- Boost (1.55 or newer) - SDL2 +- LibPNG +- SuperLU +- Lzo2 +- FreeType -### Installing required packages on Debian / Ubuntu +### Installing Dependencies on Debian / Ubuntu ``` $ sudo apt-get install build-essential git cmake pkg-config libboost-all-dev qt5-default qtbase5-dev libqt5svg5-dev qtscript5-dev qttools5-dev qttools5-dev-tools libqt5opengl5-dev qtmultimedia5-dev libsuperlu-dev liblz4-dev libusb-1.0-0-dev liblzo2-dev libpng-dev libjpeg-dev libglew-dev freeglut3-dev libsdl2-dev libfreetype6-dev ``` Notes: -* It's possible we also need libgsl2 (or maybe libopenblas-dev) +* It's possible we also need `libgsl2` (or maybe `libopenblas-dev`) -### Installing required packages on RedHat / CentOS +### Installing Dependencies on RedHat / CentOS TODO ``` $ rpm ... ``` -### Installing required packages on Fedora +### Installing Dependencies on Fedora (it may include some useless packages) ``` $ dnf install gcc gcc-c++ automake git cmake boost boost-devel SuperLU SuperLU-devel lz4-devel lzma libusb-devel lzo-devel libjpeg-turbo-devel libGLEW glew-devel freeglut-devel freeglut SDL2 SDL2-devel freetype-devel libpng-devel qt5-qtbase-devel qt5-qtsvg qt5-qtsvg-devel qt5-qtscript qt5-qtscript-devel qt5-qttools qt5-qttools-devel qt5-qtmultimedia-devel blas blas-devel ``` -### Installing required packages on ArchLinux +### Installing Dependencies on ArchLinux ``` $ sudo pacman -S base-devel git cmake boost boost-libs qt5-base qt5-svg qt5-script qt5-tools qt5-multimedia lz4 libusb lzo libjpeg-turbo glew freeglut sdl2 freetype2 @@ -48,9 +49,9 @@ $ yaourt -S superlu ``` Notes: -* ArchLinux had BLAS split into blas and cblas +* ArchLinux has `blas` split into `blas` and `cblas`. -### Installing required packages on openSUSE +### Installing Dependencies on openSUSE ``` $ zypper in boost-devel cmake freeglut-devel freetype2-devel gcc-c++ glew-devel libQt5OpenGL-devel libSDL2-devel libjpeg-devel liblz4-devel libpng16-compat-devel libqt5-linguist-devel libqt5-qtbase-devel libqt5-qtmultimedia-devel libqt5-qtscript-devel libqt5-qtsvg-devel libtiff-devel libusb-devel lzo-devel openblas-devel pkgconfig sed superlu-devel zlib-devel @@ -58,28 +59,30 @@ $ zypper in boost-devel cmake freeglut-devel freetype2-devel gcc-c++ glew-devel ## Build instructions -### cloning the git tree +### Cloning the GIT Tree ``` $ git clone https://github.com/opentoonz/opentoonz ``` -### Copying the stuff directory +### Copying the 'stuff' Directory TODO: some parts should really be installed in $prefix/ instead... and some other in various cache or user-local places. cf. https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html Until then we just follow the Win32/OSX layout. -It is supposedly optional but some files are actually required to run the executable properly. +The `~/.config/OpenToonz/` directory contains your settings, work and other files. -The .config/OpenToonz/ directory in your home folder will contain your settings, work and other files. We need to create it from the command-line: +Initialize this path with the folling commands: ``` $ mkdir -p $HOME/.config/OpenToonz $ cp -r opentoonz/stuff $HOME/.config/OpenToonz/ ``` -### Creating a default ini file for stuff folders +*Currently this is required to run OpenToonz.* + +### Creating SystemVar.ini TODO: fix the code to discover it automatically @@ -98,9 +101,9 @@ TOONZROOT="$HOME/.config/OpenToonz/stuff" TOONZSTUDIOPALETTE="$HOME/.config/OpenToonz/stuff/projects/studiopalette" EOF ``` -Note the generated file must not actually contain "$HOME", this shell command repaces it with /home/youraccount in the generated file. +Note the generated file must not actually contain `$HOME`, this expands to an absolute path in the generated file. -### Building the tiff library from thirdparty +### Building LibTIFF TODO: make sure we can use the system libtiff instead and remove this section. Features from the modified libtiff and needed currently, so this isn't a simple switch. @@ -118,7 +121,7 @@ try appending `--disable-jbig` to the `./configure` command above and make clean This workaround means you won't be able to load images using this compression method (see https://github.com/opentoonz/opentoonz/issues/901) for updates on this issue. -### Compiling the actual application +### Building OpenToonz ``` $ cd ../../toonz @@ -130,18 +133,18 @@ $ make The build takes a lot of time, be patient. -### Debugging the build +### Troubleshooting Build Errors If something doesn't compile or link, please run `make` this way to help spot the problem: ``` $ LANG=C make VERBOSE=1 ``` -#### Debug build +#### Debug Build If you need to debug the application, you should be able to use `cmake -DCMAKE_BUILD_TYPE=Debug`. -### Running the application +### Running OpenToonz You can now run the application: @@ -150,7 +153,7 @@ $ cd bin $ LD_LIBRARY_PATH=./lib/opentoonz:$LD_LIBRARY_PATH ./bin/OpenToonz_1.0 ``` -### Performing a system installation +### Performing a System Installation The steps above show how to run OpenToonz from the build directory, however you may wish to install OpenToonz onto your system. From 5033516fbc9953412f0418dcd18f35bd21302883 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 5 Nov 2016 15:39:52 +1100 Subject: [PATCH 53/56] Update how_to_build_linux.md Use disable jbig, this isn't used often - or even supported by default with libtiff on some linux distributions. resolves #851. [ci skip] --- doc/how_to_build_linux.md | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/doc/how_to_build_linux.md b/doc/how_to_build_linux.md index 11e03808..6212a2c3 100644 --- a/doc/how_to_build_linux.md +++ b/doc/how_to_build_linux.md @@ -110,17 +110,11 @@ Features from the modified libtiff and needed currently, so this isn't a simple ``` $ cd opentoonz/thirdparty/tiff-4.0.3 -$ ./configure --with-pic +$ ./configure --with-pic --disable-jbig $ make $ cd - ``` -If you receive linking errors mentioning `jbg_` functions while building OpenToonz itself, -try appending `--disable-jbig` to the `./configure` command above and make clean build. -(see https://github.com/opentoonz/opentoonz/issues/851). -This workaround means you won't be able to load images using this compression method -(see https://github.com/opentoonz/opentoonz/issues/901) for updates on this issue. - ### Building OpenToonz ``` From ffb2f05d630a5fd3113527a41532eccf977ee4d6 Mon Sep 17 00:00:00 2001 From: shun_iwasawa Date: Mon, 7 Nov 2016 16:45:43 +0900 Subject: [PATCH 54/56] changed scrollbar width to 16 --- stuff/config/qss/gray_048/gray_048.less | 27 +++--- stuff/config/qss/gray_048/gray_048.qss | 81 +++++++----------- stuff/config/qss/gray_048/gray_048_mac.qss | 81 +++++++----------- stuff/config/qss/gray_072/gray_072.less | 27 +++--- stuff/config/qss/gray_072/gray_072.qss | 81 +++++++----------- stuff/config/qss/gray_072/gray_072_mac.qss | 81 +++++++----------- .../qss/gray_072/imgs/sb_g_downarrow.png | Bin 546 -> 545 bytes .../gray_072/imgs/sb_g_downarrow_pressed.png | Bin 551 -> 543 bytes .../config/qss/gray_072/imgs/sb_g_larrow.png | Bin 554 -> 15462 bytes .../qss/gray_072/imgs/sb_g_larrow_pressed.png | Bin 555 -> 15460 bytes .../qss/gray_072/imgs/sb_g_ls_downarrow.png | Bin 545 -> 0 bytes .../imgs/sb_g_ls_downarrow_pressed.png | Bin 543 -> 0 bytes .../qss/gray_072/imgs/sb_g_ls_uparrow.png | Bin 549 -> 0 bytes .../gray_072/imgs/sb_g_ls_uparrow_pressed.png | Bin 534 -> 0 bytes .../config/qss/gray_072/imgs/sb_g_rarrow.png | Bin 554 -> 15462 bytes .../qss/gray_072/imgs/sb_g_rarrow_pressed.png | Bin 552 -> 15461 bytes .../config/qss/gray_072/imgs/sb_g_uparrow.png | Bin 562 -> 549 bytes .../gray_072/imgs/sb_g_uparrow_pressed.png | Bin 549 -> 534 bytes stuff/config/qss/gray_128/gray_128.less | 27 +++--- stuff/config/qss/gray_128/gray_128.qss | 81 +++++++----------- stuff/config/qss/gray_128/gray_128_mac.qss | 81 +++++++----------- .../qss/gray_128/imgs/sb_g_downarrow.png | Bin 628 -> 15052 bytes .../gray_128/imgs/sb_g_downarrow_pressed.png | Bin 631 -> 15499 bytes .../config/qss/gray_128/imgs/sb_g_larrow.png | Bin 630 -> 15053 bytes .../qss/gray_128/imgs/sb_g_larrow_pressed.png | Bin 631 -> 15050 bytes .../config/qss/gray_128/imgs/sb_g_rarrow.png | Bin 639 -> 15052 bytes .../qss/gray_128/imgs/sb_g_rarrow_pressed.png | Bin 641 -> 15061 bytes .../config/qss/gray_128/imgs/sb_g_uparrow.png | Bin 648 -> 15494 bytes .../gray_128/imgs/sb_g_uparrow_pressed.png | Bin 633 -> 15959 bytes toonz/sources/toonz/xsheetviewer.cpp | 14 +-- toonz/sources/toonzqt/spreadsheetviewer.cpp | 9 +- 31 files changed, 237 insertions(+), 353 deletions(-) delete mode 100644 stuff/config/qss/gray_072/imgs/sb_g_ls_downarrow.png delete mode 100644 stuff/config/qss/gray_072/imgs/sb_g_ls_downarrow_pressed.png delete mode 100644 stuff/config/qss/gray_072/imgs/sb_g_ls_uparrow.png delete mode 100644 stuff/config/qss/gray_072/imgs/sb_g_ls_uparrow_pressed.png diff --git a/stuff/config/qss/gray_048/gray_048.less b/stuff/config/qss/gray_048/gray_048.less index f1aee149..8f6a6443 100644 --- a/stuff/config/qss/gray_048/gray_048.less +++ b/stuff/config/qss/gray_048/gray_048.less @@ -821,30 +821,29 @@ ParamsPage { } } /* Customize QScrollBar vertical*/ -QScrollBar, #XsheetScrollBar { - .baseBG(light, 10%); +QScrollBar { border: 1px solid black; &:vertical { - width: 18px; - .set_margin( 0px, 20px ); + width: 16px; + .set_margin( 0px, 17px ); } &:horizontal { - height: 18px; - .set_margin( 20px, 0px ); + height: 16px; + .set_margin( 17px, 0px ); } &::handle { - border-width: 4; + border-width: 3; image-position: center center; &:vertical { - border-image: url("@{image_url}/sb_g_vhandle.png")4; + border-image: url("@{image_url}/sb_g_vhandle.png")3; image: url("@{image_url}/sb_g_vline.png"); min-height: 40px; } &:horizontal { - border-image: url("@{image_url}/sb_g_hhandle.png")4; + border-image: url("@{image_url}/sb_g_hhandle.png")3; image: url("@{image_url}/sb_g_hline.png"); min-width: 40px; } @@ -854,7 +853,7 @@ QScrollBar, #XsheetScrollBar { subcontrol-origin: margin; &:vertical { image: url("@{image_url}/sb_g_downarrow.png"); - height: 20px; + height: 16px; subcontrol-position: bottom; &:pressed { image: url("@{image_url}/sb_g_downarrow_pressed.png"); @@ -862,7 +861,7 @@ QScrollBar, #XsheetScrollBar { } &:horizontal { image: url("@{image_url}/sb_g_rarrow.png"); - width: 20px; + width: 16px; subcontrol-position: right; &:pressed{ image: url("@{image_url}/sb_g_rarrow_pressed.png"); @@ -874,7 +873,7 @@ QScrollBar, #XsheetScrollBar { subcontrol-origin: margin; &:vertical { image: url("@{image_url}/sb_g_uparrow.png"); - height: 20px; + height: 16px; subcontrol-position: top; &:pressed { image: url("@{image_url}/sb_g_uparrow_pressed.png"); @@ -882,7 +881,7 @@ QScrollBar, #XsheetScrollBar { } &:horizontal { image: url("@{image_url}/sb_g_larrow.png"); - width: 20px; + width: 16px; subcontrol-position: left; &:pressed{ image: url("@{image_url}/sb_g_larrow_pressed.png"); @@ -891,7 +890,7 @@ QScrollBar, #XsheetScrollBar { } &::add-page, &::sub-page { - background: none; + .baseBG(light, 10%); } } diff --git a/stuff/config/qss/gray_048/gray_048.qss b/stuff/config/qss/gray_048/gray_048.qss index c2938b5f..4caf6bbc 100644 --- a/stuff/config/qss/gray_048/gray_048.qss +++ b/stuff/config/qss/gray_048/gray_048.qss @@ -841,98 +841,79 @@ ParamsPage { background-color: #000080; } /* Customize QScrollBar vertical*/ -QScrollBar, -#XsheetScrollBar { - background-color: #4a4a4a; +QScrollBar { border: 1px solid black; /* buttons */ } -QScrollBar:vertical, -#XsheetScrollBar:vertical { - width: 18px; +QScrollBar:vertical { + width: 16px; margin-left: 0px; margin-right: 0px; - margin-top: 20px; - margin-bottom: 20px; + margin-top: 17px; + margin-bottom: 17px; } -QScrollBar:horizontal, -#XsheetScrollBar:horizontal { - height: 18px; - margin-left: 20px; - margin-right: 20px; +QScrollBar:horizontal { + height: 16px; + margin-left: 17px; + margin-right: 17px; margin-top: 0px; margin-bottom: 0px; } -QScrollBar::handle, -#XsheetScrollBar::handle { - border-width: 4; +QScrollBar::handle { + border-width: 3; image-position: center center; } -QScrollBar::handle:vertical, -#XsheetScrollBar::handle:vertical { - border-image: url("../gray_072/imgs/sb_g_vhandle.png") 4; +QScrollBar::handle:vertical { + border-image: url("../gray_072/imgs/sb_g_vhandle.png") 3; image: url("../gray_072/imgs/sb_g_vline.png"); min-height: 40px; } -QScrollBar::handle:horizontal, -#XsheetScrollBar::handle:horizontal { - border-image: url("../gray_072/imgs/sb_g_hhandle.png") 4; +QScrollBar::handle:horizontal { + border-image: url("../gray_072/imgs/sb_g_hhandle.png") 3; image: url("../gray_072/imgs/sb_g_hline.png"); min-width: 40px; } -QScrollBar::add-line, -#XsheetScrollBar::add-line { +QScrollBar::add-line { subcontrol-origin: margin; } -QScrollBar::add-line:vertical, -#XsheetScrollBar::add-line:vertical { +QScrollBar::add-line:vertical { image: url("../gray_072/imgs/sb_g_downarrow.png"); - height: 20px; + height: 16px; subcontrol-position: bottom; } -QScrollBar::add-line:vertical:pressed, -#XsheetScrollBar::add-line:vertical:pressed { +QScrollBar::add-line:vertical:pressed { image: url("../gray_072/imgs/sb_g_downarrow_pressed.png"); } -QScrollBar::add-line:horizontal, -#XsheetScrollBar::add-line:horizontal { +QScrollBar::add-line:horizontal { image: url("../gray_072/imgs/sb_g_rarrow.png"); - width: 20px; + width: 16px; subcontrol-position: right; } -QScrollBar::add-line:horizontal:pressed, -#XsheetScrollBar::add-line:horizontal:pressed { +QScrollBar::add-line:horizontal:pressed { image: url("../gray_072/imgs/sb_g_rarrow_pressed.png"); } -QScrollBar::sub-line, -#XsheetScrollBar::sub-line { +QScrollBar::sub-line { subcontrol-origin: margin; } -QScrollBar::sub-line:vertical, -#XsheetScrollBar::sub-line:vertical { +QScrollBar::sub-line:vertical { image: url("../gray_072/imgs/sb_g_uparrow.png"); - height: 20px; + height: 16px; subcontrol-position: top; } -QScrollBar::sub-line:vertical:pressed, -#XsheetScrollBar::sub-line:vertical:pressed { +QScrollBar::sub-line:vertical:pressed { image: url("../gray_072/imgs/sb_g_uparrow_pressed.png"); } -QScrollBar::sub-line:horizontal, -#XsheetScrollBar::sub-line:horizontal { +QScrollBar::sub-line:horizontal { image: url("../gray_072/imgs/sb_g_larrow.png"); - width: 20px; + width: 16px; subcontrol-position: left; } -QScrollBar::sub-line:horizontal:pressed, -#XsheetScrollBar::sub-line:horizontal:pressed { +QScrollBar::sub-line:horizontal:pressed { image: url("../gray_072/imgs/sb_g_larrow_pressed.png"); } QScrollBar::add-page, -#XsheetScrollBar::add-page, -QScrollBar::sub-page, -#XsheetScrollBar::sub-page { - background: none; +QScrollBar::sub-page { + background-color: #4a4a4a; } #noteTextEdit { color: black; diff --git a/stuff/config/qss/gray_048/gray_048_mac.qss b/stuff/config/qss/gray_048/gray_048_mac.qss index ed3fda06..a250351a 100644 --- a/stuff/config/qss/gray_048/gray_048_mac.qss +++ b/stuff/config/qss/gray_048/gray_048_mac.qss @@ -841,98 +841,79 @@ ParamsPage { background-color: #000080; } /* Customize QScrollBar vertical*/ -QScrollBar, -#XsheetScrollBar { - background-color: #4a4a4a; +QScrollBar { border: 1px solid black; /* buttons */ } -QScrollBar:vertical, -#XsheetScrollBar:vertical { - width: 18px; +QScrollBar:vertical { + width: 16px; margin-left: 0px; margin-right: 0px; - margin-top: 20px; - margin-bottom: 20px; + margin-top: 17px; + margin-bottom: 17px; } -QScrollBar:horizontal, -#XsheetScrollBar:horizontal { - height: 18px; - margin-left: 20px; - margin-right: 20px; +QScrollBar:horizontal { + height: 16px; + margin-left: 17px; + margin-right: 17px; margin-top: 0px; margin-bottom: 0px; } -QScrollBar::handle, -#XsheetScrollBar::handle { - border-width: 4; +QScrollBar::handle { + border-width: 3; image-position: center center; } -QScrollBar::handle:vertical, -#XsheetScrollBar::handle:vertical { - border-image: url("../gray_072/imgs/sb_g_vhandle.png") 4; +QScrollBar::handle:vertical { + border-image: url("../gray_072/imgs/sb_g_vhandle.png") 3; image: url("../gray_072/imgs/sb_g_vline.png"); min-height: 40px; } -QScrollBar::handle:horizontal, -#XsheetScrollBar::handle:horizontal { - border-image: url("../gray_072/imgs/sb_g_hhandle.png") 4; +QScrollBar::handle:horizontal { + border-image: url("../gray_072/imgs/sb_g_hhandle.png") 3; image: url("../gray_072/imgs/sb_g_hline.png"); min-width: 40px; } -QScrollBar::add-line, -#XsheetScrollBar::add-line { +QScrollBar::add-line { subcontrol-origin: margin; } -QScrollBar::add-line:vertical, -#XsheetScrollBar::add-line:vertical { +QScrollBar::add-line:vertical { image: url("../gray_072/imgs/sb_g_downarrow.png"); - height: 20px; + height: 16px; subcontrol-position: bottom; } -QScrollBar::add-line:vertical:pressed, -#XsheetScrollBar::add-line:vertical:pressed { +QScrollBar::add-line:vertical:pressed { image: url("../gray_072/imgs/sb_g_downarrow_pressed.png"); } -QScrollBar::add-line:horizontal, -#XsheetScrollBar::add-line:horizontal { +QScrollBar::add-line:horizontal { image: url("../gray_072/imgs/sb_g_rarrow.png"); - width: 20px; + width: 16px; subcontrol-position: right; } -QScrollBar::add-line:horizontal:pressed, -#XsheetScrollBar::add-line:horizontal:pressed { +QScrollBar::add-line:horizontal:pressed { image: url("../gray_072/imgs/sb_g_rarrow_pressed.png"); } -QScrollBar::sub-line, -#XsheetScrollBar::sub-line { +QScrollBar::sub-line { subcontrol-origin: margin; } -QScrollBar::sub-line:vertical, -#XsheetScrollBar::sub-line:vertical { +QScrollBar::sub-line:vertical { image: url("../gray_072/imgs/sb_g_uparrow.png"); - height: 20px; + height: 16px; subcontrol-position: top; } -QScrollBar::sub-line:vertical:pressed, -#XsheetScrollBar::sub-line:vertical:pressed { +QScrollBar::sub-line:vertical:pressed { image: url("../gray_072/imgs/sb_g_uparrow_pressed.png"); } -QScrollBar::sub-line:horizontal, -#XsheetScrollBar::sub-line:horizontal { +QScrollBar::sub-line:horizontal { image: url("../gray_072/imgs/sb_g_larrow.png"); - width: 20px; + width: 16px; subcontrol-position: left; } -QScrollBar::sub-line:horizontal:pressed, -#XsheetScrollBar::sub-line:horizontal:pressed { +QScrollBar::sub-line:horizontal:pressed { image: url("../gray_072/imgs/sb_g_larrow_pressed.png"); } QScrollBar::add-page, -#XsheetScrollBar::add-page, -QScrollBar::sub-page, -#XsheetScrollBar::sub-page { - background: none; +QScrollBar::sub-page { + background-color: #4a4a4a; } #noteTextEdit { color: black; diff --git a/stuff/config/qss/gray_072/gray_072.less b/stuff/config/qss/gray_072/gray_072.less index 3cc5e1b5..e187f4bd 100644 --- a/stuff/config/qss/gray_072/gray_072.less +++ b/stuff/config/qss/gray_072/gray_072.less @@ -821,30 +821,29 @@ ParamsPage { } } /* Customize QScrollBar vertical*/ -QScrollBar, #XsheetScrollBar { - .baseBG(light, 10%); +QScrollBar { border: 1px solid black; &:vertical { - width: 18px; - .set_margin( 0px, 20px ); + width: 16px; + .set_margin( 0px, 17px ); } &:horizontal { - height: 18px; - .set_margin( 20px, 0px ); + height: 16px; + .set_margin( 17px, 0px ); } &::handle { - border-width: 4; + border-width: 3; image-position: center center; &:vertical { - border-image: url("@{image_url}/sb_g_vhandle.png")4; + border-image: url("@{image_url}/sb_g_vhandle.png")3; image: url("@{image_url}/sb_g_vline.png"); min-height: 40px; } &:horizontal { - border-image: url("@{image_url}/sb_g_hhandle.png")4; + border-image: url("@{image_url}/sb_g_hhandle.png")3; image: url("@{image_url}/sb_g_hline.png"); min-width: 40px; } @@ -854,7 +853,7 @@ QScrollBar, #XsheetScrollBar { subcontrol-origin: margin; &:vertical { image: url("@{image_url}/sb_g_downarrow.png"); - height: 20px; + height: 16px; subcontrol-position: bottom; &:pressed { image: url("@{image_url}/sb_g_downarrow_pressed.png"); @@ -862,7 +861,7 @@ QScrollBar, #XsheetScrollBar { } &:horizontal { image: url("@{image_url}/sb_g_rarrow.png"); - width: 20px; + width: 16px; subcontrol-position: right; &:pressed{ image: url("@{image_url}/sb_g_rarrow_pressed.png"); @@ -874,7 +873,7 @@ QScrollBar, #XsheetScrollBar { subcontrol-origin: margin; &:vertical { image: url("@{image_url}/sb_g_uparrow.png"); - height: 20px; + height: 16px; subcontrol-position: top; &:pressed { image: url("@{image_url}/sb_g_uparrow_pressed.png"); @@ -882,7 +881,7 @@ QScrollBar, #XsheetScrollBar { } &:horizontal { image: url("@{image_url}/sb_g_larrow.png"); - width: 20px; + width: 16px; subcontrol-position: left; &:pressed{ image: url("@{image_url}/sb_g_larrow_pressed.png"); @@ -891,7 +890,7 @@ QScrollBar, #XsheetScrollBar { } &::add-page, &::sub-page { - background: none; + .baseBG(light, 10%); } } diff --git a/stuff/config/qss/gray_072/gray_072.qss b/stuff/config/qss/gray_072/gray_072.qss index 7fcce508..5ce1c350 100644 --- a/stuff/config/qss/gray_072/gray_072.qss +++ b/stuff/config/qss/gray_072/gray_072.qss @@ -841,98 +841,79 @@ ParamsPage { background-color: #000080; } /* Customize QScrollBar vertical*/ -QScrollBar, -#XsheetScrollBar { - background-color: #626262; +QScrollBar { border: 1px solid black; /* buttons */ } -QScrollBar:vertical, -#XsheetScrollBar:vertical { - width: 18px; +QScrollBar:vertical { + width: 16px; margin-left: 0px; margin-right: 0px; - margin-top: 20px; - margin-bottom: 20px; + margin-top: 17px; + margin-bottom: 17px; } -QScrollBar:horizontal, -#XsheetScrollBar:horizontal { - height: 18px; - margin-left: 20px; - margin-right: 20px; +QScrollBar:horizontal { + height: 16px; + margin-left: 17px; + margin-right: 17px; margin-top: 0px; margin-bottom: 0px; } -QScrollBar::handle, -#XsheetScrollBar::handle { - border-width: 4; +QScrollBar::handle { + border-width: 3; image-position: center center; } -QScrollBar::handle:vertical, -#XsheetScrollBar::handle:vertical { - border-image: url("imgs/sb_g_vhandle.png") 4; +QScrollBar::handle:vertical { + border-image: url("imgs/sb_g_vhandle.png") 3; image: url("imgs/sb_g_vline.png"); min-height: 40px; } -QScrollBar::handle:horizontal, -#XsheetScrollBar::handle:horizontal { - border-image: url("imgs/sb_g_hhandle.png") 4; +QScrollBar::handle:horizontal { + border-image: url("imgs/sb_g_hhandle.png") 3; image: url("imgs/sb_g_hline.png"); min-width: 40px; } -QScrollBar::add-line, -#XsheetScrollBar::add-line { +QScrollBar::add-line { subcontrol-origin: margin; } -QScrollBar::add-line:vertical, -#XsheetScrollBar::add-line:vertical { +QScrollBar::add-line:vertical { image: url("imgs/sb_g_downarrow.png"); - height: 20px; + height: 16px; subcontrol-position: bottom; } -QScrollBar::add-line:vertical:pressed, -#XsheetScrollBar::add-line:vertical:pressed { +QScrollBar::add-line:vertical:pressed { image: url("imgs/sb_g_downarrow_pressed.png"); } -QScrollBar::add-line:horizontal, -#XsheetScrollBar::add-line:horizontal { +QScrollBar::add-line:horizontal { image: url("imgs/sb_g_rarrow.png"); - width: 20px; + width: 16px; subcontrol-position: right; } -QScrollBar::add-line:horizontal:pressed, -#XsheetScrollBar::add-line:horizontal:pressed { +QScrollBar::add-line:horizontal:pressed { image: url("imgs/sb_g_rarrow_pressed.png"); } -QScrollBar::sub-line, -#XsheetScrollBar::sub-line { +QScrollBar::sub-line { subcontrol-origin: margin; } -QScrollBar::sub-line:vertical, -#XsheetScrollBar::sub-line:vertical { +QScrollBar::sub-line:vertical { image: url("imgs/sb_g_uparrow.png"); - height: 20px; + height: 16px; subcontrol-position: top; } -QScrollBar::sub-line:vertical:pressed, -#XsheetScrollBar::sub-line:vertical:pressed { +QScrollBar::sub-line:vertical:pressed { image: url("imgs/sb_g_uparrow_pressed.png"); } -QScrollBar::sub-line:horizontal, -#XsheetScrollBar::sub-line:horizontal { +QScrollBar::sub-line:horizontal { image: url("imgs/sb_g_larrow.png"); - width: 20px; + width: 16px; subcontrol-position: left; } -QScrollBar::sub-line:horizontal:pressed, -#XsheetScrollBar::sub-line:horizontal:pressed { +QScrollBar::sub-line:horizontal:pressed { image: url("imgs/sb_g_larrow_pressed.png"); } QScrollBar::add-page, -#XsheetScrollBar::add-page, -QScrollBar::sub-page, -#XsheetScrollBar::sub-page { - background: none; +QScrollBar::sub-page { + background-color: #626262; } #noteTextEdit { color: black; diff --git a/stuff/config/qss/gray_072/gray_072_mac.qss b/stuff/config/qss/gray_072/gray_072_mac.qss index 80997ec2..65fcee03 100644 --- a/stuff/config/qss/gray_072/gray_072_mac.qss +++ b/stuff/config/qss/gray_072/gray_072_mac.qss @@ -841,98 +841,79 @@ ParamsPage { background-color: #000080; } /* Customize QScrollBar vertical*/ -QScrollBar, -#XsheetScrollBar { - background-color: #626262; +QScrollBar { border: 1px solid black; /* buttons */ } -QScrollBar:vertical, -#XsheetScrollBar:vertical { - width: 18px; +QScrollBar:vertical { + width: 16px; margin-left: 0px; margin-right: 0px; - margin-top: 20px; - margin-bottom: 20px; + margin-top: 17px; + margin-bottom: 17px; } -QScrollBar:horizontal, -#XsheetScrollBar:horizontal { - height: 18px; - margin-left: 20px; - margin-right: 20px; +QScrollBar:horizontal { + height: 16px; + margin-left: 17px; + margin-right: 17px; margin-top: 0px; margin-bottom: 0px; } -QScrollBar::handle, -#XsheetScrollBar::handle { - border-width: 4; +QScrollBar::handle { + border-width: 3; image-position: center center; } -QScrollBar::handle:vertical, -#XsheetScrollBar::handle:vertical { - border-image: url("imgs/sb_g_vhandle.png") 4; +QScrollBar::handle:vertical { + border-image: url("imgs/sb_g_vhandle.png") 3; image: url("imgs/sb_g_vline.png"); min-height: 40px; } -QScrollBar::handle:horizontal, -#XsheetScrollBar::handle:horizontal { - border-image: url("imgs/sb_g_hhandle.png") 4; +QScrollBar::handle:horizontal { + border-image: url("imgs/sb_g_hhandle.png") 3; image: url("imgs/sb_g_hline.png"); min-width: 40px; } -QScrollBar::add-line, -#XsheetScrollBar::add-line { +QScrollBar::add-line { subcontrol-origin: margin; } -QScrollBar::add-line:vertical, -#XsheetScrollBar::add-line:vertical { +QScrollBar::add-line:vertical { image: url("imgs/sb_g_downarrow.png"); - height: 20px; + height: 16px; subcontrol-position: bottom; } -QScrollBar::add-line:vertical:pressed, -#XsheetScrollBar::add-line:vertical:pressed { +QScrollBar::add-line:vertical:pressed { image: url("imgs/sb_g_downarrow_pressed.png"); } -QScrollBar::add-line:horizontal, -#XsheetScrollBar::add-line:horizontal { +QScrollBar::add-line:horizontal { image: url("imgs/sb_g_rarrow.png"); - width: 20px; + width: 16px; subcontrol-position: right; } -QScrollBar::add-line:horizontal:pressed, -#XsheetScrollBar::add-line:horizontal:pressed { +QScrollBar::add-line:horizontal:pressed { image: url("imgs/sb_g_rarrow_pressed.png"); } -QScrollBar::sub-line, -#XsheetScrollBar::sub-line { +QScrollBar::sub-line { subcontrol-origin: margin; } -QScrollBar::sub-line:vertical, -#XsheetScrollBar::sub-line:vertical { +QScrollBar::sub-line:vertical { image: url("imgs/sb_g_uparrow.png"); - height: 20px; + height: 16px; subcontrol-position: top; } -QScrollBar::sub-line:vertical:pressed, -#XsheetScrollBar::sub-line:vertical:pressed { +QScrollBar::sub-line:vertical:pressed { image: url("imgs/sb_g_uparrow_pressed.png"); } -QScrollBar::sub-line:horizontal, -#XsheetScrollBar::sub-line:horizontal { +QScrollBar::sub-line:horizontal { image: url("imgs/sb_g_larrow.png"); - width: 20px; + width: 16px; subcontrol-position: left; } -QScrollBar::sub-line:horizontal:pressed, -#XsheetScrollBar::sub-line:horizontal:pressed { +QScrollBar::sub-line:horizontal:pressed { image: url("imgs/sb_g_larrow_pressed.png"); } QScrollBar::add-page, -#XsheetScrollBar::add-page, -QScrollBar::sub-page, -#XsheetScrollBar::sub-page { - background: none; +QScrollBar::sub-page { + background-color: #626262; } #noteTextEdit { color: black; diff --git a/stuff/config/qss/gray_072/imgs/sb_g_downarrow.png b/stuff/config/qss/gray_072/imgs/sb_g_downarrow.png index cb7c0de3df74335271ab74bb7d6f7ede1c282356..406effb38cc69b5981b4fba216528479b21ca558 100644 GIT binary patch delta 153 zcmZ3)vXDiwGr-TCmrII^fq{Y7)59eQNDF{42NRH-Ffqeyqv9mSyhu+M$B>F!NjVuA z2?|msCMFvU3=D4EzAe0X*T#(#8yg#04_Q`xP?$K)z;FUb#`;FqnZfb#{ioO8$aR=} zSnE)WJL|HnH+2mw4zH40zPxay+@6mO$B%|EG%zx-of139E>wL4Xd8p4tDnm{r-UW| Dl|DBZ delta 154 zcmZ3;vWP{oGr-TCmrII^fq{Y7)59eQNQ;0l2NRHFdfgSZQE?Juew3$+V@SoVq=W?w z24*HEH*VjaylU;njUNv*GV2JOJJ`&Aa>L9{q4a*2vpN}ne*LPlx#)Z#%}2E2$jpww z_R}tEP2V0|>eN4=Q1#)3iomTOrF{=X+zb*jm>8HD=7vjkpO4Bd0b0l4>FVdQ&MBb@ E0Olz=UjP6A diff --git a/stuff/config/qss/gray_072/imgs/sb_g_downarrow_pressed.png b/stuff/config/qss/gray_072/imgs/sb_g_downarrow_pressed.png index 04fe4497449e3fe0b8719b1a8668807c1713e85e..70df3a605b1ef47b417f78c0429e7fd79c75ad5a 100644 GIT binary patch delta 151 zcmZ3^GM`1UGr-TCmrII^fq{Y7)59eQNDF{42NRH-Ffqeyqv9mSoN!MU$B>F!NeK#~ z78Vu)D>p4%nE3zSU!4NJiMM8WlnTBz-JnqX>h){GP!lt=M_U+u`BrlX%ZbidwedIO zBEHpGbLJgeT2*k2S=f`av$3(U5U5w>CW8b+wZ3@%(U>RefOau>y85}Sb4q9e03OaY A`~Uy| delta 159 zcmbQwvYbV+Gr-TCmrII^fq{Y7)59eQNQ;0l2NRHFdfgSZQE?JuNxY|vV@SoVq=W@5 z78Vv07Oq~nF!BGtzd8kcl5Pfpk6s0yRbdkIS@`Q$Rm>`BX=%l!*L9=C_Dab#`X<)!oVNLc5E!#Vu=sZ7{7}?{6fkNKF`A%J6vaqPY?LCtqEXbSL=8U!(ZC-P1fu~>)I0l}-fnN|EBF>z5x80q_-?HDQfbC z_J0kvZTobJs%chYv1GDOvoy0$)9Kb&jMfb;rKABx<-Xjzc~9Gc<~z4cibuBQrY$`C!F;}T)6%CJ_?-vtx_S4ZUDT#y zpPy-{Ik~uY?K|~vANub4p;_ya!vjYfCr<5J`&sMR^Ip8MVIKAQGxybR>>X~Kv19Vl zbKlK&{7RjE{+?s&w%42%w@)8@f4E~C`^rmemVI#gTk#>be)-PBRB}`M8yD{Fy6Txb z5C7-*?q`qB{ba>k>yN&A=cU(v-9AJ5@nU!)J1;u8|EF`lxz&4c*8UTbYj(>!UYq#C zkp8sihEt}7akyzs@#2QL`jYrMDPrX`WpeY<*|NS?V@eSFFqN!M<8 z9r6|grL)`WPFyEQTE;EPS`TpNGCE{WQQ>(xU6fV;i|zrviW+g99NOoi6*=PS@+Y{2 z9s_+!%PIpbS=HVtty&?4WY@fCT{tJe02yG3bS{%tO(7R?<>LzQ*dAtGbbgApBI0VY z6Vly@BpuTXK>OVRM&i95x-sPD{UJ}#cMa{~_yEiKSU$w?UIG63IJ)?8MeE>E*pO2~ zNBr7iI%q{)eU_yQESt?{-C3_&GkT#s6k<6K>+vvf24fDWmY8Eyb9Ny}DNY=ilA-99 zqN%hUSM1UHt%%EICn|r6*Ok%BiBz-54pL-uqR#Sej;$t=rLsovH`4i2lO-0UK?bOn z33Yr`onG4SW%-DdW%rng;hH28)y1Xr&19;kHmwCKA%Y^(5ot?GvvWWPYzHv4enSEa zR>Dh}UG3^EB~@9R5s_@qnCA|1$`~@+Q;_AiLSco%@LGkK0YpnPIyEgFE$p&N%YYpN z?kd0APtWaAR9VZK4Ph1)RaU$b55z?aMC~2Pa6yLick)4j3kiJiYWU4@jv$4ZNQ{Ig zE2)7>44!AW#!lWZ_=AEkTuY{PE)(m)BAnFaX)rPC8U~^6udULc{G$f6V`~7r6RQts=y->_##JQf^JPmF| z$~c2MRF0_m9W1n}rX{KpXpKkVfLl>y!5a*C8bbk@@$-_zq<{}FVvnzp3GsZ$!v%wW z-WSX-O(Nlxj|v^vq<*^!i=ky0+7k+KJ~0$vQobH96Abu*jK~K7)9B^+pv;A&ATO0d zJLIE6FE$j|LB+IVj(zrjG)0v#qf)gfCfxS}j(UJqk?)a9z#St;OOCXX?{&Ipn82>& zh^th}<>pxKeYPgw5d=}PyJS?d3k}F&cEo7qw93k&Oc}j^mh}>BZX*!Fl*me(#k)u6sEZHuPwy*D(O!xMDz+6&|;TiV2>f$^ZmGQHkQ!gC<+Tp<#@=;S7BikK0?B$SGN54I;ud+o$T*C zs9e$C85M~|k|03vCc%a0gLnxp1PI4T@Fu~9=Yx0& zE(8ePB)IT=5HG=n0KuCC7oHE|CAbhEc$475^Fh1>7Xk!t5?pvbh?n3(fZ$Dn3(p7f z5?lxnyh(83`5<0`3ju;R2`)Sz#7l4?K=3BPh3A8K2`&T(-Xys2d=M|eg#f{u1Q(tU z;w88cAb1mttFH1wC{W>Bpjr63XXl<@;_y{bT59P?P}C}TymkXcoqYuUHc?dOCW`ug z5kJHtWRg&u{BS6+Er`5J~U*%yV|;-J-)kn`MTc$_&D`0 delta 166 zcmaD>v5G~pGr-TCmrII^fq{Y7)59eQNQ;0l2NRHFdfgSZQ8ATq@)>L0@+40e$B>F! zS1xblJz&7Wa)3Wc-;LQVd9z5KY)@g(6YH+Ys-I)h+QQECFm{|+S5nSk)7Ft;<7aVV zdPL}Ki|LYar`%&E7RO8}w&A+)|LvmXdm8@Q>f46$Jt)6>?r?N>t?_q;=I;_l+%?k= Q0Ig>5boFyt=akR{0LQ&OjQ{`u diff --git a/stuff/config/qss/gray_072/imgs/sb_g_larrow_pressed.png b/stuff/config/qss/gray_072/imgs/sb_g_larrow_pressed.png index 1450404d846399cad05c3b643d04c5cb15d4985b..0f83f2adc449617c0fac365d98f90ab16368d76a 100644 GIT binary patch literal 15460 zcmeI3Yiu0V700g$M2>^g2#BC5kkJNE4D8O#ddIsv>~7-hCh>->v$aiP^Jp`kx$7Ne zcV?IwXV>Nx1reT#%tJgv2!blDAZ?mf4Im2y}Nbt|hIOfnv43{%gjIS4@UqdgD*YUP3SMVt5C zwzK*9^R8@u;P_?pu6S%^=dEK`Eq!9;^~c9D?;q)Z;JrVN{bkKpv&7J8@cPE5?+%5} z&h(s~E6(bkGpF+HJ+KRLGe(y@h?y?M*5MD)?(ycK8OS;8l`-0;&je#e13 zZ{GFcPO#E+b$Vb@$nCi?|Sk0qC@L{d-u^-@3?gNU%Tha-&~9iWXDAZ_y6YaKZi) z(Q9`p+h3dU^W@4=XTl9*SwB+i=x`sZ}+EGiL##eNs2xQeZ{} zJdCPDJ!^#&monlot9Ff=uy?e(Paa(_hZWD_SWBcRq5yelOH47J(=4$V^_1d@=)W_} zdYIA_dwtZ?=_F+OQ)woyn~)KF9bTDl_cOt;j~BxJP~cj|&+#2B7hw6Ymv0x*JHRoO zmnYVO{zXhBBlaYgSJELX>dD%+A+l_tQ1BJneY!b>uq z4pNPifR=2khOO!vWUugZDljankjs<1;8*`j2yypLlWi4?h}F^0`t z>ChCJg*ljqnr$H+-%w{%_j^q~A!W@yWn#1@sZ?We^?397hN&%k*#?B5f^XT1*3CX$ z&&A5StllzE$3VME@CnSKwW_A*1*;-dPB*W3cNdpYbG88Rgfat(zK$u=epu3vY64$yky7J zyfg$^LmP^)^+DIn+P)IwdQLadVZm5?gl#n3P=%Uvy4;&%OC?j*nS>xPDM=faa?A=T zpO+T-f9!AbsdC;O)TMGoE$v`2sadw9$uOCSp#h(&Dx#3_cffEs;LY&ipf@N4WUnOn z2fe(|p5Y}W$O{3bv^1%dTRtgtLYIe~Dy)Q7Q0Q8NR0#1)|IlfCi zb&f(7YNRqPhbqmQI*6rb?1E&%&LOlXrq@HtaVHA#1QFJ`uH@AJ!BSY#hW~CMrdLV- z(Lyxtb^p(WsPAMsD``VeiLup9TpgI++Lc#yVs%xU!sKd%4 zp1C}~->JylaA|(f&!HE~JKq(l+l@;H$Wpf(m)4axXsR9aSF&NlE|qgVE?+8o(XAtl zbqGSc5Ml9QT#;6bFxQ_@QTMf+p2DN1TGHT-hQfiVgf2%#SY9gEOJkWGq<%m?#QTo@3tNpX?+U|xy~ z141?_E;1j?OL1X9$R@=_=7V`DE({3Sq`1g@FfYZ00U?_d7nu*{rMNI4WRv0|^TE6n z7Y2lEQe0#{n3v+hfRIg!i_8b}Qd}4ivPp4~`Cwj(3j;znDK0V}%u8`$K*%P=MdpKf zDJ~2M*`&D0d@wJ?g#jU(6c?Ef=B2nWAY_x`BJ;t#6c+}BY*JigKA4x{!hn!Xii^w# z^HN+G5VA>ek@;X=iVFimHi@`e>JNlM4Lt=~K#zOw&R+KrdQ_B=yLwUpj3xlscn<() zoL0ieyh0$B>F! zXD;vNJz&7Wa-sOi!5eQ9jEtjhnXpNVpDPvd_o$iGu|Q;!Y{TyNUZJcP_8-lYlX-G} zMv5T2(ZP*91zO81T>UoAl=ZDX>dx$4yJ^*p=k7v3c5jcZPGiXJ34Hg5k3svlRBF%Z SCyqe789ZJ6T-G@yGywpzEI&d3 diff --git a/stuff/config/qss/gray_072/imgs/sb_g_ls_downarrow.png b/stuff/config/qss/gray_072/imgs/sb_g_ls_downarrow.png deleted file mode 100644 index 406effb38cc69b5981b4fba216528479b21ca558..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 545 zcmV++0^a?JP)KLZ*U+9Tg;$N`}WPf>6MD;x_{jSAf+?`3A6BDL(+#sfi7UXTVAto(tjy$ahly0P?Md z=YpI8@?o49kjubQnlHDqd|A!%_5|c!GtVEv?L926WS+eP^Sf}TGVkpI0f>dmaF7hYekM2J zui3QE48XN=%AQ+OJ$q=YVxds@hi;z^d}DBLR=yAb001CkNK#Dz0D43K0Dy%60Qr~z z0DwUN0Bu_U0Psry07Jt702#0)+WIXkZ{3G&D4@FfcIK+uIYP zy0Nj5fq{Vq!Z~>GAd!|ZF^~vouYm=bQ(s??%dgmNK$F8N!h}Z!rfTedfT+W&8mFgm jsUE!XfXBsD0Du7i2Fez}2NHY400000NkvXXu0mjfTGif( diff --git a/stuff/config/qss/gray_072/imgs/sb_g_ls_downarrow_pressed.png b/stuff/config/qss/gray_072/imgs/sb_g_ls_downarrow_pressed.png deleted file mode 100644 index 70df3a605b1ef47b417f78c0429e7fd79c75ad5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 543 zcmV+)0^t3LP)KLZ*U+9Tg;$N`}WPf>6MD;x_{jSAf+?`3A6BDL(+#sfi7UXTVAto(tjy$ahly0P?Md z=YpI8@?o49kjubQnlHDqd|A!%_5|c!GtVEv?L926WS+eP^Sf}TGVkpI0f>dmaF7hYekM2J zui3QE48XN=%AQ+OJ$q=YVxds@hi;z^d}DBLR=yAb001CkNK#Dz0D43K0Dy%60Qr~z z0DwUN0Bu_U0Psry07Jt702#0)+WL_t(|+G1cJ6*xFJ5UH}Ep<)02{VZ?} zk=mF@brJ0~upo2l>+3O9G&VNkv;j>Hs|XVw6_~2A`vIa3t7@E{#-)02#sd>c35kJ$ hfpP!-{Uq4{7yx@O7jMN}KLZ*U+9Tg;$N`}WPf>6MD;x_{jSAf+?`3A6BDL(+#sfi7UXTVAto(tjy$ahly0P?Md z=YpI8@?o49kjubQnlHDqd|A!%_5|c!GtVEv?L926WS+eP^Sf}TGVkpI0f>dmaF7hYekM2J zui3QE48XN=%AQ+OJ$q=YVxds@hi;z^d}DBLR=yAb001CkNK#Dz0D43K0Dy%60Qr~z z0DwUN0Bu_U0Psry07Jt702#0)+W z3cYCUdMPx=g-o)LB&idWBr<@zzc$xe0ZsrwYc15m*wn`XrIa|}GCx6VC3yz1)!L(b n9u4G2JIIm0?@B=5X>bexIN%o<+iYQc00000NkvXXu0mjf*{|XC diff --git a/stuff/config/qss/gray_072/imgs/sb_g_ls_uparrow_pressed.png b/stuff/config/qss/gray_072/imgs/sb_g_ls_uparrow_pressed.png deleted file mode 100644 index eb841762d212f18e3aea5303eac9346ce4d10166..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 534 zcmV+x0_pvUP)KLZ*U+9Tg;$N`}WPf>6MD;x_{jSAf+?`3A6BDL(+#sfi7UXTVAto(tjy$ahly0P?Md z=YpI8@?o49kjubQnlHDqd|A!%_5|c!GtVEv?L926WS+eP^Sf}TGVkpI0f>dmaF7hYekM2J zui3QE48XN=%AQ+OJ$q=YVxds@hi;z^d}DBLR=yAb001CkNK#Dz0D43K0Dy%60Qr~z z0DwUN0Bu_U0Psry07Jt702#0)+WoD Y0G0O@$W27CxBvhE07*qoM6N<$f{IkwK>z>% diff --git a/stuff/config/qss/gray_072/imgs/sb_g_rarrow.png b/stuff/config/qss/gray_072/imgs/sb_g_rarrow.png index 29f65186cbf86bc7e25baebf2a0e1ee9368411e1..4c997fcb49aa881617ced89e41867c07a292fdc5 100644 GIT binary patch literal 15462 zcmeI3e{2)y8OPt0wF)UgNQI8EqTWoYNLTyr?3`ntY-hoy#B@%*5K36Lu5a#MCnxN? zKXbVFhjV`FVq)OLsxhPGC#I%w6kTB~d;+XRz_*w{Kj|5*2) ze_q}=ud=Pv{&}s$_VYgP_j%s?yzle){<+=RzV+>GE7|}6?djfBKmJ_e{x&yFHb!6 zP$c@{b-pW0VXpr{&w8_e(=)8Yg%?a{F*tr=;VX9cD?`OUq63l(bO^P7YFXy7{7ny z$k2DQSH7k{y?BRW8h5{pdCRgkFz5_sJ})aqAplil2n9+76SD^()?G58vK2Yp5E|C> zxbM>OlRi#UgQb6L?Y}RzuDB2w{o)k59yb%wjpo0?biS!E*zaR~W5m|`J zV&t>@~8AH`_#tCD;+rl!7;?N9BoHKEZNYw;iY}D4j~+fqqN*Og5ii?LY+hY zp=fT%4*%+Z=7 zua$e92`wABl^plgO1a(~>%Gs_lske96}L+!6t~cj8sle-HkMUaR%P1k4V)k4N_>xe z?i|Gtq|?f@5~@6F?jW|2bBfSHJ;V4+%&&)3;?5M331YnayOP)b2U}sovHxx(=2uDo z(MB}yb^p(eXq;qa1nR>`P4KltTpO6*-c@#VW_8t?!t82{xj%I>u4H_wV7Y?C7(Z*Q zk-0K|(5=Y)XnB5DP{1!yNxT23UDiMn%A%M_LhKtUJ@G@Kk5W2~5(fJTwhKm3~HyJKEAHvIU z5kTlB!$s#qco{AN2;F43=zIt-!$kn0n+zA758-9F2q1Km;iB^)ybKosgl;libUuWa z;Ua+0O@@okhww671Q5E(aMAe?UWSVRLN^&MIv>Kza1lW0Cc{PNLwFf30tnq?xafQc zFT+Iup_>dBoe$wVr4< zB?sT?zUArs?>@8p+1@s=>Dw<(ubkMCOf5>@xcHkOH@5$*fDY~X(^&5l$4>lyY47yv p>`V4{wte*X7w>)UqIskUBCjsH?d+cPNA9z$>2-anqigTm`7Z{C{>uOW delta 166 zcmaD>v5G~pGr-TCmrII^fq{Y7)59eQNQ;0l2NRHFdfgSZQ8ATq@)>L0@+40e$B>F! zXD;pLJz&7Wa-sWZT+cB>so6_Cau1X#J+7VBBzuReYz1sdegKD{i(eHme Rmw;9?c)I$ztaD0e0swt1KurJu diff --git a/stuff/config/qss/gray_072/imgs/sb_g_rarrow_pressed.png b/stuff/config/qss/gray_072/imgs/sb_g_rarrow_pressed.png index 2fa0aefa54f561ab51be8cba1822e5698b8169e3..579f8f9fc12d55cc372dc5c16c0cb4af66d009de 100644 GIT binary patch literal 15461 zcmeI3e{36P8OPr&Th(SuSLiB6*|fu@Qv*HUo$ZV5lkJe&UE>aCCQX-=4e0Cho8+i{ zce}gPPWOYVV`CelN;Q5|qbhV#nc8Y$t*DTwSW_w(Fpa`AR@P}uE1*`0sjLW;4z2K> ze_q}=uL2D5&ujVD^FHtQdG0>%`#g95+~e8)4V@h;I{*Nk>Aute{$1vN7GHzEC-;nX zzBKqHt^KGn*nHBrzMlw?3m#g_LyOE>12{KEn`G0AOOnej_*0T@pSg4 zM^D~=WbxD2tzP`Z#amZ=>}wl)@0+}R-8VPhd2w>&*RKyh@vB!Re|PsgOO(hAcz)-% z9*#ucUF4ftrYz}Sy0rJ{ue^Nfi|_vO%v%?FZkb$l>kFSAygJj>cImFgJ74Jh>DfPj`owL!veOgi!|lt4cK#-PWzln=>FNQm z9(ugylO zH$ZlG|Bsg+ANu&A2jBR}#i_#=*Sx&#Cl8!pUnwUKRv7WLC)osY(a%fc3 zGrC@*yNBxo<4Maj~xqv8j3t~u+qP!GT z@H-@OwU;l^f&ay<{D?A;x}%m3TXEl*Q7n%}1u-B50z96<+Y`D2 z%e-!{ss^dYNg-RcG}F-xopa;DoH6dieLgo)<5fGaqS;8K+ckEWqELpWAo)e1l_;+^ zH0HQfs2o~e6;J^ck?z=7C$-d>_5I$E&q~>F&zl&pNhZ@;TtD7ov1Mx8S-%}4s3Dz| zwyv}XCrl&^Aln$XRJ49OK9yCi&fd{Rnu{|llIxlG*il)VN9KB}vdUJdu22l0tCF-3 zbPQ|IFbaw4E^D?7+%fR3lKnEbW=PZXM#=7q38bjG;>~y{1s#-dcO)-Hcu^jdB8nJQ zq{t`mw;O0ptH6glXP;h9Osz!j8-4qQ+a?_5uuysC^C zRuMW0tq4bvVCthWp*iT8+1OV~(kK`fJ}i_7#)MYGEmgQVXREzAu?||Q!KGxG%Rqe` z7Pt+tScGc=pAU5THMQss>QQ;3R(7zG)@=vsDoUpkc)+h|c_pZdxc7tud{`a{^C}EQ z`DiF7^8rcBtKA_vjMRK(X)+nFd`{?;p^m#%SPPxUp+yvl1fz0<4~3z`ha#aIpX(0i z_)q}K5C)-)a*=vyk9dJ zx}%^~dYuU^8@ZJn_ti_e(HtAS&(%~qf&x{yOD0se&=3YZYqWV-4P{NH&0WBSQLe`K z$mh>d8bdm*Osk%=kZRo7LNY;2aIY%`?SHToHr)Q-EyThq z=|5VC*1hikxe(2rtd2o_6y*~_eG}IQ7PfZP6`fsO^`n5d5lv=nZcPv~*fgw>_;+~ifNusVuwA@SX- z(71h_Q=pAb_J00pp3(amm59ZX5J2cA!$s#qco{AN2;F43=zIt-!$kn0n+zA758-9F z2q1Km;iB^)ybKosgl;libUuWa;Ua+0O@@okhww671Q5E(aMAe?UWSVRLN^&MIv>Kz za1lW0Cc{PNLwFf30tnq?xafQcFT+Iup_>dBoe$wSMWVq;j z2rt7$0HK=<7o88`Ww;0+bd!p!qxnE6((zNECH%PO>b1}E_)$?#?HkAdupa zvKRmM0#LjMfWO=cK=L#IAAWB2>tH>eJCsiK4wld5wsI>Xk;t+`#||8T|GfI%T65{1 zb9?*7Kk)U?D`(F>S!nmiXZC$*^NnpiTmSUY?;JRKbkDV&dk?>(O&?zQ%%Xb_|NN_w q^UFWj-roNEtMC0IeXLCc@f%nCcIwS9yyiZ-nqJ?Znp(GY*S`Rrkoi0S delta 164 zcmaD_v4TahGr-TCmrII^fq{Y7)59eQNQ;0l2NRHFdfgSZQ8ATq@)>L0(gaTz$B>F! zXD%BG9Z=w4IWYNS{0HL)&tC?)s=7~%N#AJ2cbp+1twO$Beu0qSDy#R*g{=!F)+d$c z@7?n~XlDBB^V<4f?LJxQZ~xwG`xyo`hR~-UOd0aM#FO&>Z#4i~ O%;4$j=d#Wzp$P!6;XCC3 diff --git a/stuff/config/qss/gray_072/imgs/sb_g_uparrow.png b/stuff/config/qss/gray_072/imgs/sb_g_uparrow.png index 16c81369691ed3fdcc202be817bcc04ac00eda9a..5979c72240b311a0336f6d199ea1b56a08f0133e 100644 GIT binary patch delta 157 zcmdnQvXn)!Gr-TCmrII^fq{Y7)59eQNDF{42OE%-|NK93qv9mSqF7HC$B>F!PbN8X z9Z(QpK7O?R?d2Z-&#B)6xb|kettqSOOrvJBOseMQF!NeK#~ z78Vu)D>p4%nE3zSU!4NJiMM8WlwNemT(N$=x+AlTsh+J*#hGKP+Bx@o8@NVHu1;pzGP{k{50wgU`Pzl)ymb=kNBXa$3(tDnm{r-UW|?prXu delta 157 zcmbQnvXn)!Gr-TCmrII^fq{Y7)59eQNQ;0l2NRHFdfgSZQE?JuQLLwnV@SoVH(!qSRIaZDjCt^>bP0 Hl+XkKlL|Q# diff --git a/stuff/config/qss/gray_128/gray_128.less b/stuff/config/qss/gray_128/gray_128.less index 8c8e4606..9103aa11 100644 --- a/stuff/config/qss/gray_128/gray_128.less +++ b/stuff/config/qss/gray_128/gray_128.less @@ -662,30 +662,29 @@ ParamsPage { } } /* Customize QScrollBar vertical*/ -QScrollBar, #XsheetScrollBar { - background-color: rgb(160,160,160); +QScrollBar { border: 1px solid black; &:vertical { - width: 18px; - .set_margin( 0px, 20px ); + width: 16px; + .set_margin( 0px, 17px ); } &:horizontal { - height: 18px; - .set_margin( 20px, 0px ); + height: 16px; + .set_margin( 17px, 0px ); } &::handle { - border-width: 4; + border-width: 3; image-position: center center; &:vertical { - border-image: url("@{image_url}/sb_g_vhandle.png")4; + border-image: url("@{image_url}/sb_g_vhandle.png")3; image: url("@{image_url}/sb_g_vline.png"); min-height: 40px; } &:horizontal { - border-image: url("@{image_url}/sb_g_hhandle.png")4; + border-image: url("@{image_url}/sb_g_hhandle.png")3; image: url("@{image_url}/sb_g_hline.png"); min-width: 40px; } @@ -695,7 +694,7 @@ QScrollBar, #XsheetScrollBar { subcontrol-origin: margin; &:vertical { image: url("@{image_url}/sb_g_downarrow.png"); - height: 20px; + height: 16px; subcontrol-position: bottom; &:pressed { image: url("@{image_url}/sb_g_downarrow_pressed.png"); @@ -703,7 +702,7 @@ QScrollBar, #XsheetScrollBar { } &:horizontal { image: url("@{image_url}/sb_g_rarrow.png"); - width: 20px; + width: 16px; subcontrol-position: right; &:pressed{ image: url("@{image_url}/sb_g_rarrow_pressed.png"); @@ -715,7 +714,7 @@ QScrollBar, #XsheetScrollBar { subcontrol-origin: margin; &:vertical { image: url("@{image_url}/sb_g_uparrow.png"); - height: 20px; + height: 16px; subcontrol-position: top; &:pressed { image: url("@{image_url}/sb_g_uparrow_pressed.png"); @@ -723,7 +722,7 @@ QScrollBar, #XsheetScrollBar { } &:horizontal { image: url("@{image_url}/sb_g_larrow.png"); - width: 20px; + width: 16px; subcontrol-position: left; &:pressed{ image: url("@{image_url}/sb_g_larrow_pressed.png"); @@ -732,7 +731,7 @@ QScrollBar, #XsheetScrollBar { } &::add-page, &::sub-page { - background: none; + background-color: rgb(160,160,160); } } diff --git a/stuff/config/qss/gray_128/gray_128.qss b/stuff/config/qss/gray_128/gray_128.qss index 34b1a6cf..f907ec20 100644 --- a/stuff/config/qss/gray_128/gray_128.qss +++ b/stuff/config/qss/gray_128/gray_128.qss @@ -591,98 +591,79 @@ ParamsPage { background-color: #000080; } /* Customize QScrollBar vertical*/ -QScrollBar, -#XsheetScrollBar { - background-color: #a0a0a0; +QScrollBar { border: 1px solid black; /* buttons */ } -QScrollBar:vertical, -#XsheetScrollBar:vertical { - width: 18px; +QScrollBar:vertical { + width: 16px; margin-left: 0px; margin-right: 0px; - margin-top: 20px; - margin-bottom: 20px; + margin-top: 17px; + margin-bottom: 17px; } -QScrollBar:horizontal, -#XsheetScrollBar:horizontal { - height: 18px; - margin-left: 20px; - margin-right: 20px; +QScrollBar:horizontal { + height: 16px; + margin-left: 17px; + margin-right: 17px; margin-top: 0px; margin-bottom: 0px; } -QScrollBar::handle, -#XsheetScrollBar::handle { - border-width: 4; +QScrollBar::handle { + border-width: 3; image-position: center center; } -QScrollBar::handle:vertical, -#XsheetScrollBar::handle:vertical { - border-image: url("imgs/sb_g_vhandle.png") 4; +QScrollBar::handle:vertical { + border-image: url("imgs/sb_g_vhandle.png") 3; image: url("imgs/sb_g_vline.png"); min-height: 40px; } -QScrollBar::handle:horizontal, -#XsheetScrollBar::handle:horizontal { - border-image: url("imgs/sb_g_hhandle.png") 4; +QScrollBar::handle:horizontal { + border-image: url("imgs/sb_g_hhandle.png") 3; image: url("imgs/sb_g_hline.png"); min-width: 40px; } -QScrollBar::add-line, -#XsheetScrollBar::add-line { +QScrollBar::add-line { subcontrol-origin: margin; } -QScrollBar::add-line:vertical, -#XsheetScrollBar::add-line:vertical { +QScrollBar::add-line:vertical { image: url("imgs/sb_g_downarrow.png"); - height: 20px; + height: 16px; subcontrol-position: bottom; } -QScrollBar::add-line:vertical:pressed, -#XsheetScrollBar::add-line:vertical:pressed { +QScrollBar::add-line:vertical:pressed { image: url("imgs/sb_g_downarrow_pressed.png"); } -QScrollBar::add-line:horizontal, -#XsheetScrollBar::add-line:horizontal { +QScrollBar::add-line:horizontal { image: url("imgs/sb_g_rarrow.png"); - width: 20px; + width: 16px; subcontrol-position: right; } -QScrollBar::add-line:horizontal:pressed, -#XsheetScrollBar::add-line:horizontal:pressed { +QScrollBar::add-line:horizontal:pressed { image: url("imgs/sb_g_rarrow_pressed.png"); } -QScrollBar::sub-line, -#XsheetScrollBar::sub-line { +QScrollBar::sub-line { subcontrol-origin: margin; } -QScrollBar::sub-line:vertical, -#XsheetScrollBar::sub-line:vertical { +QScrollBar::sub-line:vertical { image: url("imgs/sb_g_uparrow.png"); - height: 20px; + height: 16px; subcontrol-position: top; } -QScrollBar::sub-line:vertical:pressed, -#XsheetScrollBar::sub-line:vertical:pressed { +QScrollBar::sub-line:vertical:pressed { image: url("imgs/sb_g_uparrow_pressed.png"); } -QScrollBar::sub-line:horizontal, -#XsheetScrollBar::sub-line:horizontal { +QScrollBar::sub-line:horizontal { image: url("imgs/sb_g_larrow.png"); - width: 20px; + width: 16px; subcontrol-position: left; } -QScrollBar::sub-line:horizontal:pressed, -#XsheetScrollBar::sub-line:horizontal:pressed { +QScrollBar::sub-line:horizontal:pressed { image: url("imgs/sb_g_larrow_pressed.png"); } QScrollBar::add-page, -#XsheetScrollBar::add-page, -QScrollBar::sub-page, -#XsheetScrollBar::sub-page { - background: none; +QScrollBar::sub-page { + background-color: #a0a0a0; } XsheetViewer { qproperty-TextColor: black; diff --git a/stuff/config/qss/gray_128/gray_128_mac.qss b/stuff/config/qss/gray_128/gray_128_mac.qss index eed5003d..c75ba8ce 100644 --- a/stuff/config/qss/gray_128/gray_128_mac.qss +++ b/stuff/config/qss/gray_128/gray_128_mac.qss @@ -591,98 +591,79 @@ ParamsPage { background-color: #000080; } /* Customize QScrollBar vertical*/ -QScrollBar, -#XsheetScrollBar { - background-color: #a0a0a0; +QScrollBar { border: 1px solid black; /* buttons */ } -QScrollBar:vertical, -#XsheetScrollBar:vertical { - width: 18px; +QScrollBar:vertical { + width: 16px; margin-left: 0px; margin-right: 0px; - margin-top: 20px; - margin-bottom: 20px; + margin-top: 17px; + margin-bottom: 17px; } -QScrollBar:horizontal, -#XsheetScrollBar:horizontal { - height: 18px; - margin-left: 20px; - margin-right: 20px; +QScrollBar:horizontal { + height: 16px; + margin-left: 17px; + margin-right: 17px; margin-top: 0px; margin-bottom: 0px; } -QScrollBar::handle, -#XsheetScrollBar::handle { - border-width: 4; +QScrollBar::handle { + border-width: 3; image-position: center center; } -QScrollBar::handle:vertical, -#XsheetScrollBar::handle:vertical { - border-image: url("imgs/sb_g_vhandle.png") 4; +QScrollBar::handle:vertical { + border-image: url("imgs/sb_g_vhandle.png") 3; image: url("imgs/sb_g_vline.png"); min-height: 40px; } -QScrollBar::handle:horizontal, -#XsheetScrollBar::handle:horizontal { - border-image: url("imgs/sb_g_hhandle.png") 4; +QScrollBar::handle:horizontal { + border-image: url("imgs/sb_g_hhandle.png") 3; image: url("imgs/sb_g_hline.png"); min-width: 40px; } -QScrollBar::add-line, -#XsheetScrollBar::add-line { +QScrollBar::add-line { subcontrol-origin: margin; } -QScrollBar::add-line:vertical, -#XsheetScrollBar::add-line:vertical { +QScrollBar::add-line:vertical { image: url("imgs/sb_g_downarrow.png"); - height: 20px; + height: 16px; subcontrol-position: bottom; } -QScrollBar::add-line:vertical:pressed, -#XsheetScrollBar::add-line:vertical:pressed { +QScrollBar::add-line:vertical:pressed { image: url("imgs/sb_g_downarrow_pressed.png"); } -QScrollBar::add-line:horizontal, -#XsheetScrollBar::add-line:horizontal { +QScrollBar::add-line:horizontal { image: url("imgs/sb_g_rarrow.png"); - width: 20px; + width: 16px; subcontrol-position: right; } -QScrollBar::add-line:horizontal:pressed, -#XsheetScrollBar::add-line:horizontal:pressed { +QScrollBar::add-line:horizontal:pressed { image: url("imgs/sb_g_rarrow_pressed.png"); } -QScrollBar::sub-line, -#XsheetScrollBar::sub-line { +QScrollBar::sub-line { subcontrol-origin: margin; } -QScrollBar::sub-line:vertical, -#XsheetScrollBar::sub-line:vertical { +QScrollBar::sub-line:vertical { image: url("imgs/sb_g_uparrow.png"); - height: 20px; + height: 16px; subcontrol-position: top; } -QScrollBar::sub-line:vertical:pressed, -#XsheetScrollBar::sub-line:vertical:pressed { +QScrollBar::sub-line:vertical:pressed { image: url("imgs/sb_g_uparrow_pressed.png"); } -QScrollBar::sub-line:horizontal, -#XsheetScrollBar::sub-line:horizontal { +QScrollBar::sub-line:horizontal { image: url("imgs/sb_g_larrow.png"); - width: 20px; + width: 16px; subcontrol-position: left; } -QScrollBar::sub-line:horizontal:pressed, -#XsheetScrollBar::sub-line:horizontal:pressed { +QScrollBar::sub-line:horizontal:pressed { image: url("imgs/sb_g_larrow_pressed.png"); } QScrollBar::add-page, -#XsheetScrollBar::add-page, -QScrollBar::sub-page, -#XsheetScrollBar::sub-page { - background: none; +QScrollBar::sub-page { + background-color: #a0a0a0; } XsheetViewer { qproperty-TextColor: black; diff --git a/stuff/config/qss/gray_128/imgs/sb_g_downarrow.png b/stuff/config/qss/gray_128/imgs/sb_g_downarrow.png index f5e678c9e57f66d4a25a9dfa30bb11ffa5406fff..474767430736632b0aebb51711dc5b38a9936519 100644 GIT binary patch literal 15052 zcmeI3eQXnD9LJxDm@(W$!3ZevEQm~Luh*{KdTBdHJJ_ZjbqpBd+wJb@cA@PZcQ@J% zMTGbQ5;9*R1`(BjMu=0C#YCbE@r6hLMa8I5BWfT9gJRTy@#VR;YoB%3Qh0_n}TV`WmA)EYblOJKlVk zfQ_3b0#Gtb4g|vCPQ_64PDN!J0|7?Wl!zRK03<)_e`sgZzVL+m_AK8~x@Gj$rE5=2 zxpdm2O?69qr_b8Zbi;|>$OoUdt$qKa-Y*yYG={Gk1aGW-Vs(w@>;;y=ar~I(ii)}| z4<6Zj_t`^-zdl}jMeo!p@7_8l=zAo2>6|kMujd-q&wsX(+qQ4TEq$Nt0PBw*9jq)l zHMex-yXEhEa`L9#SFQ>VbRVl8HE!X`j~mZi@Y2ndwczOUYsw$!7-*WjdF-*#`x7mH zg3~YDcYM{RlGDPbiMHeE-60pTFyi%TM%e zKQZITlDAhMd+n|(W`ET@S^VWPG?8r+4)6W-{BLh_9=>w#55Adw(&pDk{k&U!&T;C8 z^GY7L_kh}a;hq)KtG|Bn(_M!z9O&2H+q`(5Z+YjA_GiL__s5^AxKmV>1#ckUH7n%S zHlr9eHr@+dZ&Sqqbr7)yMXI&(m#Efi(~ ziUt{%&21Gqr-P~X*f^KRQByUOao9OGYp-HCkCk)s=&#DoWL_438H&7`6yaNfvoph? z|9qBC!%%saO(YVwgwv*I9mwwSuyzOQa9EMTs&~f?A!&{4Q`1R?@&utSYO-p`N}MtC z3hhdl;j>uGfwHg6b;Z=|Kyf|84pC&2g359>J6p^oiCK@@rA1RylSCFqVGPC%9r?JT zK6PlnXYF}IX1hlm7_CVtRNOo?-&m~Z(7I8-3?axM%^P;eske5kkZpmw(xr*8ei^!y zsl~3|kR!Rp$;)K+j5v3glt-|cJ!xBNE2LM*i>{RqXizW|tyNK?{`4-(l?+rd(5`aX zT+EDxa$HgpdZm{wH04%2mk$O71NzM!X|>l_?XFg?hPQiouI4)QX}4oZ(#nDyAw`lS z-MJhbXSG+ia&F$i@h&%>15*~}Kqp8N4B;PT!L?W(N#rAn784A=91}VqtHwLLY_1Vg zX7?2zP@;;4rUm^@FI%j+s0$V6aJn}8X9=39FhQ4#2?_BoAU5F|HdzT!f85KWebavc$V0kaJeKs;y3!;Iw+Gt0LC+NJO$at3;1jBca9! zOf5|)gxiOu4k}`oc?vVBrGJ?kvkyx>SCdf%6{48Noc+HYqDY!yLp8`c+V|bqc|fNk zRU_xYrTMKx9Z@+|>r_G0p?Q*hmZ77ZEsojRXL?c7Na=N^1VRNA)EGJ>KEhwWCteg9ib7wq- z9Yu|cMlxa@8Dn~>up5QcN~T-UZ3wypVzakE`HP%A3jcGEyQ2R&F`kYNg3}C6c zL`1lN;=*YVV~UH22p3RXI1OS#a0nif!VCB64oOv95*8vb)48V^!01(&*z@(S1{v6aJZBJvc zt~L4Du7~R?z*VKA?ipnN*jW4FhOUdIz16zmmzOt9cy`UM?stj~ANA5X6SYx|z>CxNvN_o->iRfqY6WMh4Euy58KtNsS$ij!ji delta 240 zcmV^y#2^ebRtlpus0^rV^00&=Us<$L{30+1 zW*nk_YR-xCYON8`B@%0`EeD{K;yM8!qJ7F1@ni}*I^_hXp!SoK=WykGvh6eK+;@Jp zQgtb-T5A%j@4P)N!tQS{+x9G9?dY7hm@J;?=q`@4EC2{6VTL)2GQ=3;*QoMIJaAS* qQU3fo(#cQ8>Zy(=toKge*F6A`w}HY7oS%CD0000_&PFt;5WaprjXzzCSE_b=xxjUNN0lCx*XGlqqTG`uuldQSh z-R^F<3oRwmfzpahXc=26gChzRQLKziJ2I9aqi8#Agt0~2sSZ>J{;)-Hz)*jT@7~YN zo69><>-3*@=YH(-KJWK=-~GJr^X&e!kEJ?SG&am{001;5+T&g5f1drVzYhJ5?i>i9 zzd3sQ8WVsUZnnR5VE3Ne0H|wIVzE?eK(jP+K+~B-EXL@D)~9430QonL?)+iL$*e&6+X)IWZ4!L5sTb+kS(dS}~H9rs)u?K}Nu@8iGv_2}FuM77M%LRoOtBP{H-gly>d67*m3WHCVv0P zhwnRl_7K={;q{58x=SnTM@}{V{Oq4TcWmM2)Y$O(mRa+9MqW!?oBiD9o0fvt4?fno zt$(az{@xqTU;m3-*T2B!?{B@Zc~9MCanEg|FOPNYW}iRu(3)2+|55xJ+qiE3TOhTg z^QSi-?fLY2Ibc z9#y|F_aRBwR={rx?>(a5~ zE=G|ft{#7qOX@K=ptNr=;HnLs-O`3ZDI~j=MjOI;0R_lHOJwrdjA{z`h^r7+K<9Qd z>tYIBtigz@)gF-PO{SQbWJsmPnQ=8hyyf z6s9IiEX=?xR4o(f_?kMsyx%MGNkdlL(+-T*B$=!&F3&fctvR%5EnANel#osuwyZR} zhjqwyK~oztB)Dunx|Bt=uHI7ms*5uzlI@vx?l7-RBeOk4Sz#*_S163GRfri-v^1kz z(=yTGE~}OdR58%5@_YQuk{(5swVc@$W^qw<#jEjPT(n@+-jQxD=;r+0d{E#*0w4Sg z`sFxBkYZ0PMpBcNzTs*No_BLC-F!gs@`B&zjN#~s$3Ph*iI<{Anro_1aZVL$bF@t~B#nvt{Y+9+hr|rC zLd<5xCEhQ3n>>n?bp~~)98n89SV*X*C8`ok#G|OeqbRb#d0U!!A56PBPWHLe!RCNF zp%j!j8GQm0Us#%C(kY)3I<84Wb{3XG%P4f(C-KdY3%JvM(d(A%&>| zW8?;)N=nmWs6wylgP2;Ml@krv+K=|c%xXw6?qnf8K$x}fD;eeguoR}a{(oDDnPt*{ zwGg#y-3Pf4)txL2h-yESqilH-mm6lbcEuH)oL%LjFf|*)_N`7pnT&RoSjZq$oTju@ zM=tj7wKFm^ROsL0<fszJy)D*6nPUvuygvF(DJmeL!u-J+oA<@$- zTX}q)lAx7J_I{pJuju`Zip8RXU_i(w#YN_Wc_}Uo2-&2#$b2v_#f1SOn-mwB59Xz~ zFd$@;;v)0Gyc8D(gltk=WImXe;=+KCO^S=m2lG-~7!a~aagq68UWy9?LN+NbG9S!K zabZBnCdEbOgLx?~3<%kzxX64kFU5rcA)6EznGfcrxG*4Olj0)t!Mqd~283)JkWGq<%m?#QTo@3tNpX?+U|xy~141?_E;1j?OL1X9$R@=_=7V`DE({3Sq`1g@ zFfYZ00U?_d7nu*{rMNI4WRr-iq5487RMA_YIrO^crbqv7zro8$?OjO#HpBrK*#f|| zr_p~a0NJ$w{P`XLVkZIk_;Yu>36`P08x!%??))3ucb;w>W9s88-(II4c;=UVXK&iQ zwSM(K&b<9eW>@G_XZp9F28+Lb^rIsOZu&^w-A8uqdnxz4YvfDjZ^jbedvD^-&MWg)W|k@_07AilX-@%V3J)pqyo6tm#o(Bx!ge1*VoFSD#kHtEN=}0IGw{fe8GbV7)8Pf}i~xx?S*Vtk%5P0N}id*1G~c zzG(^o74u}jKOF8>P1WdDH7e-$Q<|>E<%9%4`ingqcC{P`Pg=8Y*|y53&zV`d?#LyR zFMqhD@%H{%^B!$kaHK!};g_B3KKQu*>qS40&@)!_c)T-&J${Mgp<;~Ss8 z@1y;9{qg?bw?lKM_s_WG;LT$L-iOkY=bwJ>YBsoj;no^<%Yo%L?f7gPSU>dXshW!8 z*Hx}KSpC*#N3Y*|*~;)h-{JZ(6FOFW5JMq2n2wi>Kmajl~ed`+&_jFwG?44g-d}POS zM`nN2^X96bd-QiU-`M6|*1awIRQS|A%9G>o5H)qt>yUTDa=E?J z>l1W9SE?M!~j_=)PqvV*^*5M2>A)X}Wl&ernqua2Q|FPpClMjkyD=Ock@a>K#@ zytZ!B)OeasrBaSmtwYtjpxy1J8II;SJ5<<>KE)K$cEy;HO){J(AQ_@AYo@F!l$BSA zs=cPyX0ry$zjD`=)bax@F*m3|KMXu5vn@ z)a(vfiK!{0#zU8y3M*d7Cj|sk@>x65&NSE=XFJ=#Gj5)3xDtLc43Z?PEXfg4V{*K& zkb`CIOnp1+;<;L$E6RZ=OLM>z6cbG0A7w$cNS>I;$5lNkm_9ivbV;PBv zO(=xgN2Cs@Vy|@ybE#whGBsi!k@`Aah80vuAR24-|8|HnX+{jyEE{m&_aWy2o{CJ3 zY?E#;ZXNDO$eCKF3A!O!C)sNoKFayxn6G`7CsPr4LA0u*PqYr26!XwUt%YgjojIHQ zUl%Z&AF+=5vwTux`L(?gdwmpa07T1s>VWO#xNYhSXioTs#- zta0&ZMx-NW%q|sjqmWt2Y%9DCfp#tXp(<9hhNRzGukDt+kEcg<^e9Tk?%2yUG8@eSX<5@~4+MDMRZ8dtCKYHjCz_KiPC};cxK;4@_;V ye`(B%Z&m&^fM8Q=V8^`MR{jl`0g^QU delta 242 zcmV=i8ZQG;I%GFY!#iYtJ74 sdf9~6_UmVM*}fx;pZ$dYVt(N>0NrU$IH>hkl>h($07*qoM6N<$f?efeFHVMk4L1sT%F7Ml}S3l%}guIVJ&+JiKk?tBrdiBbMx1u&I3Ah1ZoY>%Ds9 zxK)jH^HSrdJl%LxZz}r9k=A7&f1djKwqJ&Do-<%)_wx^Vyyq^mof*arX&O4TZr$=v zcRz6Mql3pzOdgXOd-cA%hJ^f2CPz*`d*DWi(kP>_uB|ubK=FZFscuk+z=3(Q7U_e&PFx=D)z{ z%}Y)!UR`#YUwuVte^2vs^!C^8pMBu;cl=Xy<(&0LL1abKJHxllnz&)%(W`p5Z0w!z zX~%mH9e-=#m}%cMjTU|z1t+q8#KGOaU-0eSu7lU?KIy+j&^J9tr@D>;&J4YCKoH#w>CLWg8hbEP&}@!L-A*kz++(QljO4m-nIP->U!=j+mp z`Asdt{0_k@+9n4od`S)_h)X63X z)AZYH)6GAWgjwUdq@~ zS8vME{Nfa3vU&!byOfj%uvtABTY4*GR>%jhl?&<;Z>oBWs>TADU6wByuwuYn<#xEK z3A1EHR1-#(k1jUlS3I9j3h|~Cuy&-~>9ITAEsTeAdO5~334S`ANRo`QC`VWoJsc8w>xT&^3}C=-o^5EH!FE-oL;8J%evD` z6Aq*HeyKyM&}p5*Y-;gerbg`jQs1J>u!8b2L}ShV-wshCO~0Y)WdrW}F62DGQ<1Kb zGo*Qit$iIaIbG{CUNQcBM>$si)3s#j32-ZQ9L?2zynx9tAnYGFP zbpbQ^5&OVnB-$nAe8)7CDy1onDKf2v zE7Z4V`>&|aDwiDG4RB_BdKDNS-LEY_az@{3t!k_@t*>RB@I^D$XV!{#7h7ka-->n@ zTl3DDifjhh>}W;Jh|8+!nQ}7&-hN1d8n@d8&u?*au_GcUrC4i7h9}st_9au3^%QrM zG|nE#h;(F)nWaK*6w)i1X@$2T@D7O1-2xRZa_%Vn&q4l*{^!JKIx+}K0~-@uSVX9R z;6iC&V}c8d2o(@qC=F~(aA6Ul0)h*rfsF|+EFx4uaG^A?F~NmJgbD~Qlm<2?xUh&& z0l|gRz{Ug@77;2SxKJ9{nBc-9LIngDN&_1cTv$Y?fZ#%DU}J&{iwG4ETqq4}OmJZl zp#p*nrGbqJE-WHcKyaZnura}fMT80nE|dl~Cb+POPyxY((!j<97ZwpJAh=K(*qGqL zB0>cO7fJ&g6I@tCsDR)?X<%c53yTO95L_q?Y)o)r5upNt3#EaL&x@-f|4^Z%z$Xb4 z@R32~`|ZczhXFYI4E(MGAbtk`Ki>pEa1Q`iZoTdZmIf469?6I>^(f}@+YRf(Oo6{d2wUasO}$zKKTC0!B=g+?6HyefN`}qd(3xVeD>U3 vyY`R!W7?!sVB@`GetP_yL*qZ(+y;7gvUB#H{_c9~`N)Q;O`$DQ<}Cgj+f9&0 delta 243 zcmV8eGpB^jn&l1|#!0+sj2k#Wg?;WNgSS;?~YcFkaYk>{ytYfgvS8ms*>xH&=-rZ<7 zUPKfHOvuD{MU2L2gg9R!F-mYle2WC9M8TJ+0bk$`35pRJiN@#Ju6^2dJYf9uY1a0) z=lOnr&vT#Wd49crZeyrPoA60#L=+~Qf&0H56>N!$(!KAjeUp9?QeC?K+x!~Z-8>=>S4K19u?cyUBeVlCh z2b_H6{-f)*mYo#0PVL(_)bbSj)*Guj_MiM&e2lGH*8d#{ZEk*V^3JwvUtay)6~_j) zADew(`3LtNd1v+X`9CyIlm5I6O{9Oy@Sal_{&a_9c;=qt-s=a#+jd{@$1e3H`-$Td z$~LUur}kYkxaOL=!>@k*=I|v$JGD=?-MZMjGP$g-pz4QFxv^J+ zi+h_}rQYR|J8YTjtMsG?jdlH72vL^IdnIxlm0#KJUSv6!O!I*i) zPNm!MS}f*3xmWhO;%aW7gq~%GD6%P0WqBLNmNJE;*&Sy2l+Dtw}Ig+B`bnc)aA$x-oABLXbsTFzl#PZ|zYb+X8i^Ta)0t73flC zmAZOEj^r1oAd}fM?%ZKY9>-?(WNhiJkXa!Qx>mujLD5jORz->VGP^8aGEl`pyUJ;E zGPB#{L|94cH6FIulwa|DJ{S-U=rebum2+7+XDja#IJdyNu0x+3hb74LZFi{%MRLPXKxqT!R{Vi#o9M3;xnH)6`% zz7qUOOwrJ^pwHo9OEs5tq2e6M)Mj6Us7VSFa5|ZwnCKQ`%mOhU7iZh=wAa{VDUK(_ zTv*oh4i=gcx*;Yc*c9-g2AeF01(yU}T&=`ep~D%r+9Pu!R`X)>yyVhq!mvp?SKSnYN6K6Z7nN(@j_(^mnVkAWk)_0*jac(svlef@VJb;Hae^+91;ZkH;3s-1# z&yHPDk6A7Sv>VXO#Pllg9(GJye&me4-CWgJcUoU(=g^Dg&CjeA?=H4>oZX6d7hChr zB?;N^*|Vb+HDfNbrf15{Vs!ffeYH-f!|7p*n~NPGIR#_w0U4cO-Q1UaZPruVQPS8k zo)PQF8Z%3U-6*72GSiA~L(m-%o4W-nT;$wQ_@9IP75&eN@pN<$oCYzbxQK{w0mX&W zAjT9I5fLt+xNsW8nBpQL!UYr;PJa zr$LM9?9MMQ)P zC@!1^F{ZePh;RYLh0`F$6c-T@E}*z@8pN35A|k>C6c@J0q6|?uy#EFBTu03dH~|L0`S`+0Q`Faxcs%NzXkJc<FZ8e87u~X8-FDkA4{|f=d{e*|x7>N3_dxF->vv0kZETq`_}Rp(>b{R|nd}^T t`|viaWzo{!sUvT_KL63$LU%(WRIm7F?IZ&PK0D$UHLof=zCz$WbQSh_ti8dGf8lyHW)d3hg$$VFU z=ej2YP%&2y1R{|(#ZdG%MWsT40Htb5iyW5#NFVBZ;_U^yBUe4#zqY6HrORhlZaOvX z>KmR~P=8<7jdPz_u<%q@%U6e+Htqkq>)4%V$8hdJu(R{|jc(6{D=dQ(xG|06$Jf8K z`M|CRE_}J~_{rH*yJk$=bI+Kd@5%Jl^Ur@VhY4+2{7Mb8efRpid%x`gTTUJvtf@G2 zdu8XI>QBEteaDXJ8zKW8C+bE|Skn1T==>FLEvuOg4!-tS^`or=3#M!vd*brFsp#L} z+#3&{+|XTdj_;n__4z>bIr@Wl)-CnV&~h zJo?b*YS*~_^*7cXfAjnI_Kh3p(>~jF*COBAww~q}BZH45Ul_kmP?bA(Lf-E6a;(W{ z3g5;FO2WpAO0#53CsfED0PpOy$_uL`gKCyq<)qJYW=Fq;l0~0oi8E{us{yG^Zdjv9 zi`F#8gf*)Kk7$|gukxljm>?k;Je5wwlRB67Su%M!7@N(sg~~{bRX$6-IUv;(j!*$b zlPIUnWfd3)OVxR7jMKxqYj2@gJL975wKU_gG7b*@)!M1t%i^zskyjI2xM=X!+;H$e zpQX((RF0-osgy0{uqj$Aw0k_XouygU3KdqpBWdtyYf_()O)``xDCvSGtA?y3DKjtM zth5_Gi^Uu$|H@rgLd_49)N|}0MLNx^G-I>VpryE!kdlTDeN0)O zI<(*O_M##4-6IYR*CZS+ZyuU&B2ji|-I%u;BFG^v8g|I3$2wGrj!L@Ht_jk-)$meg zl)HLEZYeBIQ6{rz#JNjpc?6r;leJ~GLUx6`@LIWmCh>-%#S|s(&+f89$$%9D?kcCv zNzGa!Cq*Tt*LdktQ(?sm`J^CkNPcriTJ3JD-5F!toZZ7Q?wjGK-Hs&5Dob*N6;W>K zDCA%mtGzD9xHz_!a}?!3l%+Y~2@-jOzoaav7Re(DT#KS5c*8Fz_*RKlldWF5(1S zxR9)w9n6K2y1^#}DHQa>2AeF4oakX0$;paVk!KxNrna`(>S3MD)@I)2Vg$C<;Su@F z(uBjPeOT(CBD9;QFqc~Vm#Go^u++C}GOVC{9MPDw|F=VwNi%Gy23d#uz5_WA@Kj`K zRaKSxU?FQ&0B0N9l%SQzbkRMcqy{2 z#Va(lXNRw-*DRMD+zoJMd}b9GFFmZSFmhJkWUgwwJ)^H-)3fDf5xo77{4S@{;q=m_&83croR;EEK^dN4-Q1UqE9WWg zC~I6gk`d|18M8};+$dyLGTRDoL*N|{oxcStUgZ2y_@9Hq75&eN(R5@Glm<2?xUh&& z0l|gRz{Ug@77;2SxKJ9{nBc-9LIngDN&_1cTv$Y?fZ#%DU}J&{iwG4ETqq4}OmJZl zp#p*nrGbqJE-WHcKyaZnura}fMT80nE|dl~Cb+POPyxY((!j<97ZwpJAh=K(*qGqL zB0>cO7fJ&g6I@tCsDR)?X<%c53yTO95L_q?Y)o)r5upNt3#EaL2`(%mR6uZ{G_Wzj zg++u42riTcHYT{Rh)@B+h0?&r1Q!+&Dj>K}8rYcN!XiQi1Q$vJ8($PxRpFsRDG8q> zOu~_ zc;xS@QTrDQ)u-oJ?^XY#w@zx<)NtX&Ut*zGmMx2QYwuk@Gn88Kyxjlp1MSg?&7N0h zZvXzu{bmXc-xX zK>!$Iz;CE3B0?Fxcla;noT}RFAR;&2LXc+xsj45qE9}U^pYx>c;EcTAdqM?IW_BXq zW_COxuD{lYC=HS7~Z~F z&v&&Ac@)wvt36xAu9NepY{RRuDu)&HYV+VdY>#IEINxd6SDJOH00000NkvXXu0mjf DE+1y0 diff --git a/stuff/config/qss/gray_128/imgs/sb_g_uparrow.png b/stuff/config/qss/gray_128/imgs/sb_g_uparrow.png index 3fd43dbe320f14cbb49fd55839a2e8b6e362c2b2..e0c71f92e436ab0558e0ab9a52a8c8dfbf0d8d77 100644 GIT binary patch literal 15494 zcmeI3Yiu0V700g$1joT?%0tiqV%U^44(!fjU*6H~8fQ1eYqDnRn8b!cGCMPCkFq;6 z%#6Kj^JtnB8mN?-LK{S*R7DDiL`?`HfQWDsQl1fnP#RijiiiqvrABF8Q8}qp_0B%W z*Xt{{rRtZvvUlg)bN}be{O&zx=F2>s>RQ>{w5SOH(46Rqcf;R>_J89A@O$*pfdKrO zr+4(30L;J4{%-(JZodkEhUH2umP!q1mSzrUI+cjUDBaL9N>&D-@bUgf_jMjgUH;I) zdv`ZJbhHn)b( z&vi{Mc7v^_PfWHnoV~4ad^41;GBhPH~uDZZtin;w6uW}&pzC| zrT!&(l0%KU*EeEp9?>wo7e9=2~u0T zUb}4n+GWq)fAZ?_J-f!2ez4*7&8J?u|C(Dq?OG&$c_loNotGaw{Pzq0c(?c1b%)PH zZrUU5cy-R-4(QKtXU|;Fu;sy{`sgJGA6OFnZ13-0ICjaQ{l+^x?pz(YcVKt=7pch~ zs6StDpQvkV#vpH=S9*G_-sCD?)N&p{($cc0kkcW10K#nrT@W|O7L}I!6*b~Id*Gmp zQlyA$tv|^m^_V=Mbc`7C>XEJP=#DpHTgosRgBBSV|$o( zQN=0NhKQ@(PDu48Q&dbdWXkUexJA~>QNfUh^@q4t-%S+9umPI!(QL@gdU^QgW2o}S z6>Wk?VMEIB-SJz>>7W&H4Oo`W({w(c_vF1E&FF{nP>5zYn&aGXhT9xgEur96&Bdi4 zl{j(P6b(hU6iubF z8!hd!TFZbP1MVun$4@O?tEiHeH(SCqDypq`EuI_~EIDfLNH^2!X8b*DE6;>@w)IB% z%`lE2rI|>Kq$Vku;aUuqbu+;pHo$w~#%7!`95c}vu!1DP5@r>}IoA0G9wYY=%glbxXD$0p?6b^V4MdCA(kO}&{qC3sWoSWf%oI4#1 zita!t;FCpPh+)#{;?g9OPWiOZaZMbwtFRnef}z=fKO+R;T8AVd%lAwjtvIqu zvDfK>Vaj$TM_iRst~SSN@3S?4P^=&}OivrD zWiHL{wJS0^Sezf^82F)C`@1Z4x>0E#Ug~tC(wg#iRk5O6IU6$UP}%q6(yd}Od~}qf z0l(kt57X!{sz@mXIolgoVD~lcp27yo8q`r&*f*2V;V27BOXYaTD^_7?6h1=2r&qfA z_&TjXtDWqtJg8mKR~Z$FMUo&u@Fu~9=Yx0&E(8ePB)IT=5HG=n0KuCC7oHE|CAbhE zc$475^Fh1>7Xk!t5?pvbh?n3(fZ$Dn3(p7f5?lxnyh(83`5<0`3ju;R2`)Sz#7l4? zK=3BPh3A8K2`&T(-Xys2d=M|eg#f{u1Q(tU;w88cAb6AD!t+7A1Q!AXZxUR1K8Tm# zLV(~+f(y?F@e*7J5WGon;rSq5f(rqHHwi90AH+*=AwcjZ!G-68cnK~92;L;P@O%(2 z!G!?9n*s;jLa405w?Omob3ZVc1 delta 260 zcmV+f0sH=jd58reiBL{Q4GJ0x0000DNk~Le0000K0000K2nGNE0F8+q4Y46*0S*8J zXF*Lt006O`VN5~ylgc|Uf3QhJK~#9!tdv;}!ypVqpDpec=V;svPDVc}B9xlOw9FUV zj8`nBl*WM88Y039I>*dN0LO9gFLKTRZ$W@sYsiZyXe1l}5xLf3L60zcb@$MFuQReo zxbM9b=n7#uhckkieHfhO^RXyh%*-x>--@FVv2owqXBLe{#X8ROMqKa1nONjLd55Kx zpTD545}tmGvKhMSl~>*IJ|sA6k#TTr3E4B0#^JaF0<@h)c?|&4YDzY)xLq3n0000< KMNUMnLSTYa2x;&D diff --git a/stuff/config/qss/gray_128/imgs/sb_g_uparrow_pressed.png b/stuff/config/qss/gray_128/imgs/sb_g_uparrow_pressed.png index 37b4e7320f3f7033d1181435ec0ce758833ae2bb..74d514b7fa052aa677c2f5e3681e33b709c539cd 100644 GIT binary patch literal 15959 zcmeI3eQX=$9mgM2=-RaDI`J~-V7<8oB^&4SonP;;-6nQu9B?p6N|Lb`&UfeJh<#`5 zOYMZhqN0YEi7aerLo6z4q;6tW!^>8fR*kmnMkgxTQEgO(!Dzdw{e!k!*{T+4W6$~Z z^2B-64W?<+W7%i_p5OER{q8=`^ZcIkANOdyb6sP@iUt5cW3)Ze1;3Y@pG6Ddapeae ziSTQ2roBH0z>+J?j}1IMbu9q4Ry7=s#|L#o&kgDsDjE(`nXH~vQwjiuw{|}9LdU-N zRpYzw-@a)2iW?U_cIt+!S3lX&a^K`lt>5do?bKxQjko(A`^|4B-@WTEiv|A$@XFZt zAM*1bF0@}*E-da`wyb6Pn}_#)0`e)$1<4zLt$ntp7nX zyKUctUzs_w9ZZ~j^Fp)j>>Z27_BXzI!> zA8mYOU{A-2ElZAH@#}ooKft*i<0m&w+0Kbm*G?YT)Acm-@{1e$UqAOJ@w-gpJ=@*^ z@rlk~T)DINi_bpr&gV|e{ODBE;h|qWbo^%zTz~5yI#)=4`z$<>ZC4%Id;ao2e$91g z<=)f5n`h)LKVR^{uFMa)v!^e!J+k>gW^(E72XFEnd+z8@4lUiYGyB?>ySsz;4{lFv zjbC_JduG{2DWl)@3gmsud9|m{=!@MhNP5~K%6dX^6w(>U9)Q4_LPnH^6oX1A1F9CZ zpWU_FPN{Ox-s_1uW0|lrsJ4%0mG05b9%*z);${1qP(z>~zyN8*5UD~srR9V|&|Zuy zz~5#wW2cH;jG>^t#Y{-`#o|<0&nlG1;iVn40l9RG(#!z*QGUJK~eb@-v?Pj9tt9)JQOf`{~E3<!7^({)qljJ6FBK^f_+ zv=wEpXC$LAT}nRr8|CToK;E0XD%_uQ3&I*-islw`%JP#U2CyjCHc zRYXJ2_UL*lRGMYAk^w6QoK+r&hid9oHCfN+nga|fs*QLpo)QraC1lP>+UcjAo*vdO zIC+8fe+eF)PD_wdPb5Z6m(}D*Ee6ZdPG1k}6bw%ddP>j2(^5jN08_8It_l|Cc&RprTE(oSQxT7c ziiz5=n4;E+>9p9yeVuD|s8ZS*)S|LPEzV#es^tt(lay#A1RETxDhpm-n9V8XN)Fm9OSxJctF_P66f1%tN@kS|N#;URD5WeP%UH4Hx_SI468Dta&U;t!`A>kC$5AsI;bBuc=0eD`!KREh_U~s%ME(5f|gq0 z?LYkI!Bqcx%qgzbUFehiQM;l~GAa^_Btd}SO@a&02k{bI2oStUaN+qNUV;k&f;R~+ zJRihMa3MhOCc%a0gLnxp1PI4T@Fu~9=Yx0&E(8eP zB)IT=5HG=n0KuCC7oHE|CAbhEc$475^Fh1>7Xk!t5?pvbh?n3(fZ$Dn3(p7f5?lxn zyh(83`5<0`3ju;R2`)Sz#7l4?K=39OS3~V#UPXgX@aEy8y6#WC`W$@Bmy+7MVgQUr z02td0z{RKFcMAaNy8-y~Z2*M#0dU>(H@*$pVBg21k(QpqTT|cO+xSar>E#bMZEjJ1 z>iYfBcTY?-o!bhIe!BJi#5E`69YjLfv&v+18Y{*0CY delta 245 zcmVsetWidget(m_cellArea); m_cellScrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn); m_cellScrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); - m_cellScrollArea->horizontalScrollBar()->setObjectName("XsheetScrollBar"); - m_cellScrollArea->verticalScrollBar()->setObjectName("XsheetScrollBar"); + // m_cellScrollArea->horizontalScrollBar()->setObjectName("XsheetScrollBar"); + // m_cellScrollArea->verticalScrollBar()->setObjectName("XsheetScrollBar"); m_columnArea = new XsheetGUI::ColumnArea(this); m_columnScrollArea = new XsheetScrollArea(this); @@ -694,13 +694,13 @@ void XsheetViewer::paintEvent(QPaintEvent*) //----------------------------------------------------------------------------- void XsheetViewer::resizeEvent(QResizeEvent *event) { - int w = width(); - int h = height(); - + int w = width(); + int h = height(); + int scrollBarWidth = 16; m_noteScrollArea->setGeometry(3, 1, m_x0 - 4, m_y0 - 3); m_cellScrollArea->setGeometry(m_x0, m_y0, w - m_x0, h - m_y0); - m_columnScrollArea->setGeometry(m_x0, 1, w - m_x0 - 20, m_y0 - 3); - m_rowScrollArea->setGeometry(1, m_y0, m_x0 - 1, h - m_y0 - 20); + m_columnScrollArea->setGeometry(m_x0, 1, w - m_x0 - scrollBarWidth, m_y0 - 3); + m_rowScrollArea->setGeometry(1, m_y0, m_x0 - 1, h - m_y0 - scrollBarWidth); //(Nuovo Layout Manager) Reintrodotto per il refresh automatico refreshContentSize( diff --git a/toonz/sources/toonzqt/spreadsheetviewer.cpp b/toonz/sources/toonzqt/spreadsheetviewer.cpp index 353a0b52..8c375e95 100644 --- a/toonz/sources/toonzqt/spreadsheetviewer.cpp +++ b/toonz/sources/toonzqt/spreadsheetviewer.cpp @@ -413,8 +413,8 @@ SpreadsheetViewer::SpreadsheetViewer(QWidget *parent) m_cellScrollArea->setObjectName("ScrollArea"); m_cellScrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn); m_cellScrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); - m_cellScrollArea->horizontalScrollBar()->setObjectName("XsheetScrollBar"); - m_cellScrollArea->verticalScrollBar()->setObjectName("XsheetScrollBar"); + // m_cellScrollArea->horizontalScrollBar()->setObjectName("XsheetScrollBar"); + // m_cellScrollArea->verticalScrollBar()->setObjectName("XsheetScrollBar"); m_cellScrollArea->setFocusPolicy(Qt::NoFocus); m_columnScrollArea->setSizePolicy( @@ -435,14 +435,15 @@ SpreadsheetViewer::SpreadsheetViewer(QWidget *parent) layout->addWidget(m_rowScrollArea, 1, 0); layout->addWidget(m_cellScrollArea, 1, 1, 2, 2); + int scrollBarWidth = 16; // upper-right QWidget *w = new QWidget(this); - w->setFixedSize(QSize(20, m_rowHeight * 3 + 60 - 63)); + w->setFixedSize(QSize(scrollBarWidth, m_rowHeight * 3 + 60 - 63)); layout->addWidget(w, 0, 2); // lower-left w = new QWidget(this); - w->setFixedSize(QSize(30, 20)); + w->setFixedSize(QSize(30, scrollBarWidth)); layout->addWidget(w, 2, 0); layout->setColumnStretch(0, 0); From c729378ddfdb66a5c0cd8c1943faf03e64199511 Mon Sep 17 00:00:00 2001 From: shun_iwasawa Date: Tue, 8 Nov 2016 13:16:13 +0900 Subject: [PATCH 55/56] change margin for button to 16 --- stuff/config/qss/gray_048/gray_048.less | 4 ++-- stuff/config/qss/gray_048/gray_048.qss | 8 ++++---- stuff/config/qss/gray_048/gray_048_mac.qss | 8 ++++---- stuff/config/qss/gray_072/gray_072.less | 4 ++-- stuff/config/qss/gray_072/gray_072.qss | 8 ++++---- stuff/config/qss/gray_072/gray_072_mac.qss | 8 ++++---- stuff/config/qss/gray_128/gray_128.less | 4 ++-- stuff/config/qss/gray_128/gray_128.qss | 8 ++++---- stuff/config/qss/gray_128/gray_128_mac.qss | 8 ++++---- 9 files changed, 30 insertions(+), 30 deletions(-) diff --git a/stuff/config/qss/gray_048/gray_048.less b/stuff/config/qss/gray_048/gray_048.less index 8f6a6443..84eee181 100644 --- a/stuff/config/qss/gray_048/gray_048.less +++ b/stuff/config/qss/gray_048/gray_048.less @@ -826,11 +826,11 @@ QScrollBar { &:vertical { width: 16px; - .set_margin( 0px, 17px ); + .set_margin( 0px, 16px ); } &:horizontal { height: 16px; - .set_margin( 17px, 0px ); + .set_margin( 16px, 0px ); } &::handle { diff --git a/stuff/config/qss/gray_048/gray_048.qss b/stuff/config/qss/gray_048/gray_048.qss index 4caf6bbc..b1a22395 100644 --- a/stuff/config/qss/gray_048/gray_048.qss +++ b/stuff/config/qss/gray_048/gray_048.qss @@ -849,13 +849,13 @@ QScrollBar:vertical { width: 16px; margin-left: 0px; margin-right: 0px; - margin-top: 17px; - margin-bottom: 17px; + margin-top: 16px; + margin-bottom: 16px; } QScrollBar:horizontal { height: 16px; - margin-left: 17px; - margin-right: 17px; + margin-left: 16px; + margin-right: 16px; margin-top: 0px; margin-bottom: 0px; } diff --git a/stuff/config/qss/gray_048/gray_048_mac.qss b/stuff/config/qss/gray_048/gray_048_mac.qss index a250351a..23babcde 100644 --- a/stuff/config/qss/gray_048/gray_048_mac.qss +++ b/stuff/config/qss/gray_048/gray_048_mac.qss @@ -849,13 +849,13 @@ QScrollBar:vertical { width: 16px; margin-left: 0px; margin-right: 0px; - margin-top: 17px; - margin-bottom: 17px; + margin-top: 16px; + margin-bottom: 16px; } QScrollBar:horizontal { height: 16px; - margin-left: 17px; - margin-right: 17px; + margin-left: 16px; + margin-right: 16px; margin-top: 0px; margin-bottom: 0px; } diff --git a/stuff/config/qss/gray_072/gray_072.less b/stuff/config/qss/gray_072/gray_072.less index e187f4bd..7cb9432a 100644 --- a/stuff/config/qss/gray_072/gray_072.less +++ b/stuff/config/qss/gray_072/gray_072.less @@ -826,11 +826,11 @@ QScrollBar { &:vertical { width: 16px; - .set_margin( 0px, 17px ); + .set_margin( 0px, 16px ); } &:horizontal { height: 16px; - .set_margin( 17px, 0px ); + .set_margin( 16px, 0px ); } &::handle { diff --git a/stuff/config/qss/gray_072/gray_072.qss b/stuff/config/qss/gray_072/gray_072.qss index 5ce1c350..84bb341d 100644 --- a/stuff/config/qss/gray_072/gray_072.qss +++ b/stuff/config/qss/gray_072/gray_072.qss @@ -849,13 +849,13 @@ QScrollBar:vertical { width: 16px; margin-left: 0px; margin-right: 0px; - margin-top: 17px; - margin-bottom: 17px; + margin-top: 16px; + margin-bottom: 16px; } QScrollBar:horizontal { height: 16px; - margin-left: 17px; - margin-right: 17px; + margin-left: 16px; + margin-right: 16px; margin-top: 0px; margin-bottom: 0px; } diff --git a/stuff/config/qss/gray_072/gray_072_mac.qss b/stuff/config/qss/gray_072/gray_072_mac.qss index 65fcee03..ec739076 100644 --- a/stuff/config/qss/gray_072/gray_072_mac.qss +++ b/stuff/config/qss/gray_072/gray_072_mac.qss @@ -849,13 +849,13 @@ QScrollBar:vertical { width: 16px; margin-left: 0px; margin-right: 0px; - margin-top: 17px; - margin-bottom: 17px; + margin-top: 16px; + margin-bottom: 16px; } QScrollBar:horizontal { height: 16px; - margin-left: 17px; - margin-right: 17px; + margin-left: 16px; + margin-right: 16px; margin-top: 0px; margin-bottom: 0px; } diff --git a/stuff/config/qss/gray_128/gray_128.less b/stuff/config/qss/gray_128/gray_128.less index 9103aa11..31fa3db1 100644 --- a/stuff/config/qss/gray_128/gray_128.less +++ b/stuff/config/qss/gray_128/gray_128.less @@ -667,11 +667,11 @@ QScrollBar { &:vertical { width: 16px; - .set_margin( 0px, 17px ); + .set_margin( 0px, 16px ); } &:horizontal { height: 16px; - .set_margin( 17px, 0px ); + .set_margin( 16px, 0px ); } &::handle { diff --git a/stuff/config/qss/gray_128/gray_128.qss b/stuff/config/qss/gray_128/gray_128.qss index f907ec20..c8f42cd8 100644 --- a/stuff/config/qss/gray_128/gray_128.qss +++ b/stuff/config/qss/gray_128/gray_128.qss @@ -599,13 +599,13 @@ QScrollBar:vertical { width: 16px; margin-left: 0px; margin-right: 0px; - margin-top: 17px; - margin-bottom: 17px; + margin-top: 16px; + margin-bottom: 16px; } QScrollBar:horizontal { height: 16px; - margin-left: 17px; - margin-right: 17px; + margin-left: 16px; + margin-right: 16px; margin-top: 0px; margin-bottom: 0px; } diff --git a/stuff/config/qss/gray_128/gray_128_mac.qss b/stuff/config/qss/gray_128/gray_128_mac.qss index c75ba8ce..8f539040 100644 --- a/stuff/config/qss/gray_128/gray_128_mac.qss +++ b/stuff/config/qss/gray_128/gray_128_mac.qss @@ -599,13 +599,13 @@ QScrollBar:vertical { width: 16px; margin-left: 0px; margin-right: 0px; - margin-top: 17px; - margin-bottom: 17px; + margin-top: 16px; + margin-bottom: 16px; } QScrollBar:horizontal { height: 16px; - margin-left: 17px; - margin-right: 17px; + margin-left: 16px; + margin-right: 16px; margin-top: 0px; margin-bottom: 0px; } From 3bb5efc4ee447663c8110fd6cbaa944a116245ff Mon Sep 17 00:00:00 2001 From: Jeremy Bullock Date: Tue, 8 Nov 2016 19:46:03 -0700 Subject: [PATCH 56/56] Quick Export Feature (#725) * Added Fast Render to MP4 command which does not need to set anything in output settings. --- .../rooms/Default/menubar_template.xml | 1 + toonz/sources/image/ffmpeg/tiio_mp4.cpp | 15 +++++--- toonz/sources/include/toonz/preferences.h | 4 ++- toonz/sources/toonz/mainwindow.cpp | 1 + toonz/sources/toonz/menubar.cpp | 1 + toonz/sources/toonz/menubarcommandids.h | 1 + toonz/sources/toonz/preferencespopup.cpp | 23 ++++++++++++- toonz/sources/toonz/preferencespopup.h | 3 +- toonz/sources/toonz/rendercommand.cpp | 34 +++++++++++++++++++ toonz/sources/toonzlib/preferences.cpp | 12 +++++++ 10 files changed, 87 insertions(+), 8 deletions(-) diff --git a/stuff/profiles/layouts/rooms/Default/menubar_template.xml b/stuff/profiles/layouts/rooms/Default/menubar_template.xml index 6c9f3b87..92a3b146 100644 --- a/stuff/profiles/layouts/rooms/Default/menubar_template.xml +++ b/stuff/profiles/layouts/rooms/Default/menubar_template.xml @@ -34,6 +34,7 @@ MI_OutputSettings MI_Render + MI_FastRender MI_PrintXsheet MI_Print diff --git a/toonz/sources/image/ffmpeg/tiio_mp4.cpp b/toonz/sources/image/ffmpeg/tiio_mp4.cpp index 173d6275..1e83e1a3 100644 --- a/toonz/sources/image/ffmpeg/tiio_mp4.cpp +++ b/toonz/sources/image/ffmpeg/tiio_mp4.cpp @@ -39,11 +39,16 @@ private: TLevelWriterMp4::TLevelWriterMp4(const TFilePath &path, TPropertyGroup *winfo) : TLevelWriter(path, winfo) { if (!m_properties) m_properties = new Tiio::Mp4WriterProperties(); - std::string scale = m_properties->getProperty("Scale")->getValueAsString(); - m_scale = QString::fromStdString(scale).toInt(); - std::string quality = - m_properties->getProperty("Quality")->getValueAsString(); - m_vidQuality = QString::fromStdString(quality).toInt(); + if (m_properties->getPropertyCount() == 0) { + m_scale = 100; + m_vidQuality = 100; + } else { + std::string scale = m_properties->getProperty("Scale")->getValueAsString(); + m_scale = QString::fromStdString(scale).toInt(); + std::string quality = + m_properties->getProperty("Quality")->getValueAsString(); + m_vidQuality = QString::fromStdString(quality).toInt(); + } ffmpegWriter = new Ffmpeg(); ffmpegWriter->setPath(m_path); if (TSystem::doesExistFileOrLevel(m_path)) TSystem::deleteFile(m_path); diff --git a/toonz/sources/include/toonz/preferences.h b/toonz/sources/include/toonz/preferences.h index 56f7e3ef..4e3e30dd 100644 --- a/toonz/sources/include/toonz/preferences.h +++ b/toonz/sources/include/toonz/preferences.h @@ -411,7 +411,8 @@ public: bool getPrecompute() { return m_precompute; } void setFfmpegTimeout(int seconds); int getFfmpegTimeout() { return m_ffmpegTimeout; } - + void setFastRenderPath(std::string path); + QString getFastRenderPath() const { return m_fastRenderPath; } // Uncategorized - internals void setAskForOverrideRender(bool on); @@ -455,6 +456,7 @@ private: QString m_units, m_cameraUnits, m_scanLevelType, m_currentRoomChoice, m_oldUnits, m_oldCameraUnits, m_ffmpegPath, m_shortcutPreset, m_customProjectRoot; + QString m_fastRenderPath; double m_defLevelWidth, m_defLevelHeight, m_defLevelDpi; diff --git a/toonz/sources/toonz/mainwindow.cpp b/toonz/sources/toonz/mainwindow.cpp index 23c7403a..1a070a6a 100644 --- a/toonz/sources/toonz/mainwindow.cpp +++ b/toonz/sources/toonz/mainwindow.cpp @@ -1601,6 +1601,7 @@ void MainWindow::defineActions() { createMenuFileAction(MI_OutputSettings, tr("&Output Settings..."), "Ctrl+O"); createMenuFileAction(MI_PreviewSettings, tr("&Preview Settings..."), ""); createMenuFileAction(MI_Render, tr("&Render"), "Ctrl+Shift+R"); + createMenuFileAction(MI_FastRender, tr("&Fast Render to MP4"), "Alt+R"); createMenuFileAction(MI_Preview, tr("&Preview"), "Ctrl+R"); createRightClickMenuAction(MI_SavePreviewedFrames, tr("&Save Previewed Frames"), ""); diff --git a/toonz/sources/toonz/menubar.cpp b/toonz/sources/toonz/menubar.cpp index c5782452..97b43987 100644 --- a/toonz/sources/toonz/menubar.cpp +++ b/toonz/sources/toonz/menubar.cpp @@ -1099,6 +1099,7 @@ QMenuBar *StackedMenuBar::createFullMenuBar() { fileMenu->addSeparator(); addMenuItem(fileMenu, MI_OutputSettings); addMenuItem(fileMenu, MI_Render); + addMenuItem(fileMenu, MI_FastRender); // addMenuItem(fileMenu, MI_SavePreviewedFrames); fileMenu->addSeparator(); addMenuItem(fileMenu, MI_PrintXsheet); diff --git a/toonz/sources/toonz/menubarcommandids.h b/toonz/sources/toonz/menubarcommandids.h index 6c79b5e4..0b7f96bb 100644 --- a/toonz/sources/toonz/menubarcommandids.h +++ b/toonz/sources/toonz/menubarcommandids.h @@ -41,6 +41,7 @@ #define MI_OutputSettings "MI_OutputSettings" #define MI_PreviewSettings "MI_PreviewSettings" #define MI_Render "MI_Render" +#define MI_FastRender "MI_FastRender" #define MI_Preview "MI_Preview" #define MI_RegeneratePreview "MI_RegeneratePreview" #define MI_RegenerateFramePr "MI_RegenerateFramePr" diff --git a/toonz/sources/toonz/preferencespopup.cpp b/toonz/sources/toonz/preferencespopup.cpp index d9d06f1d..2b518ae5 100644 --- a/toonz/sources/toonz/preferencespopup.cpp +++ b/toonz/sources/toonz/preferencespopup.cpp @@ -923,6 +923,13 @@ void PreferencesPopup::onFfmpegPathChanged() { //----------------------------------------------------------------------------- +void PreferencesPopup::onFastRenderPathChanged() { + QString text = m_fastRenderPathFileField->getPath(); + m_pref->setFastRenderPath(text.toStdString()); +} + +//----------------------------------------------------------------------------- + void PreferencesPopup::onFfmpegTimeoutChanged() { m_pref->setFfmpegTimeout(m_ffmpegTimeout->getValue()); } @@ -1118,7 +1125,9 @@ PreferencesPopup::PreferencesPopup() //--- Import/Export ------------------------------ categoryList->addItem(tr("Import/Export")); m_ffmpegPathFileFld = new DVGui::FileField(this, QString("")); - m_ffmpegTimeout = new DVGui::IntLineEdit(this, 30, 1); + m_fastRenderPathFileField = + new DVGui::FileField(this, QString("desktop"), false, true); + m_ffmpegTimeout = new DVGui::IntLineEdit(this, 30, 1); //--- Drawing ------------------------------ categoryList->addItem(tr("Drawing")); @@ -1342,6 +1351,8 @@ PreferencesPopup::PreferencesPopup() //--- Import/Export ------------------------------ QString path = m_pref->getFfmpegPath(); m_ffmpegPathFileFld->setPath(path); + path = m_pref->getFastRenderPath(); + m_fastRenderPathFileField->setPath(path); m_ffmpegTimeout->setValue(m_pref->getFfmpegTimeout()); //--- Drawing ------------------------------ @@ -1755,6 +1766,14 @@ PreferencesPopup::PreferencesPopup() ioGridLay->addWidget(new QLabel(tr("FFmpeg Timeout:")), 4, 0, Qt::AlignRight); ioGridLay->addWidget(m_ffmpegTimeout, 4, 1, 1, 3); + ioGridLay->addWidget(new QLabel(" "), 5, 0); + ioGridLay->addWidget( + new QLabel(tr("Please indicate where you would like " + "exports from Fast Render(MP4) to go.")), + 6, 0, 1, 4); + ioGridLay->addWidget(new QLabel(tr("Fast Render Path: ")), 7, 0, + Qt::AlignRight); + ioGridLay->addWidget(m_fastRenderPathFileField, 7, 1, 1, 3); } ioLay->addLayout(ioGridLay); ioLay->addStretch(1); @@ -2128,6 +2147,8 @@ PreferencesPopup::PreferencesPopup() //--- Import/Export ---------------------- ret = ret && connect(m_ffmpegPathFileFld, SIGNAL(pathChanged()), this, SLOT(onFfmpegPathChanged())); + ret = ret && connect(m_fastRenderPathFileField, SIGNAL(pathChanged()), this, + SLOT(onFastRenderPathChanged())); ret = ret && connect(m_ffmpegTimeout, SIGNAL(editingFinished()), this, SLOT(onFfmpegTimeoutChanged())); diff --git a/toonz/sources/toonz/preferencespopup.h b/toonz/sources/toonz/preferencespopup.h index ba790d7e..ddc1be1b 100644 --- a/toonz/sources/toonz/preferencespopup.h +++ b/toonz/sources/toonz/preferencespopup.h @@ -76,7 +76,7 @@ private: DVGui::FileField *m_customProjectRootFileField; - DVGui::FileField *m_ffmpegPathFileFld; + DVGui::FileField *m_ffmpegPathFileFld, *m_fastRenderPathFileField; QGroupBox *m_autoSaveGroup; @@ -168,6 +168,7 @@ private slots: void onShowKeyframesOnCellAreaChanged(int); void onFfmpegPathChanged(); void onFfmpegTimeoutChanged(); + void onFastRenderPathChanged(); void onUseNumpadForSwitchingStylesClicked(bool); }; diff --git a/toonz/sources/toonz/rendercommand.cpp b/toonz/sources/toonz/rendercommand.cpp index adaf9f8f..5af6af17 100644 --- a/toonz/sources/toonz/rendercommand.cpp +++ b/toonz/sources/toonz/rendercommand.cpp @@ -214,6 +214,7 @@ public: , m_timeStretchFactor(1) , m_multimediaRender(0) { setCommandHandler("MI_Render", this, &RenderCommand::onRender); + setCommandHandler("MI_FastRender", this, &RenderCommand::onFastRender); setCommandHandler("MI_Preview", this, &RenderCommand::onPreview); } @@ -222,6 +223,7 @@ public: void rasterRender(bool isPreview); void multimediaRender(); void onRender(); + void onFastRender(); void onPreview(); static void resetBgColor(); void doRender(bool isPreview); @@ -788,6 +790,38 @@ void RenderCommand::multimediaRender() { void RenderCommand::onRender() { doRender(false); } +void RenderCommand::onFastRender() { + TOutputProperties *prop = TApp::instance() + ->getCurrentScene() + ->getScene() + ->getProperties() + ->getOutputProperties(); + QString sceneName = QString::fromStdWString( + TApp::instance()->getCurrentScene()->getScene()->getSceneName()); + QString location = Preferences::instance()->getFastRenderPath(); + if (location == "desktop" || location == "Desktop") { + location = + QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); + } + TFilePath path = TFilePath(location) + TFilePath(sceneName + ".mp4"); + TFilePath currPath = prop->getPath(); + + QStringList formats; + TImageWriter::getSupportedFormats(formats, true); + TLevelWriter::getSupportedFormats(formats, true); + Tiio::Writer::getSupportedFormats(formats, true); + if (!formats.contains("mp4")) { + QString msg = QObject::tr( + "FFmpeg not found, please set the location in the Preferences and " + "restart."); + DVGui::warning(msg); + return; + } + prop->setPath(path); + doRender(false); + prop->setPath(currPath); +} + void RenderCommand::onPreview() { doRender(true); } //--------------------------------------------------------- diff --git a/toonz/sources/toonzlib/preferences.cpp b/toonz/sources/toonzlib/preferences.cpp index b325637d..3d636181 100644 --- a/toonz/sources/toonzlib/preferences.cpp +++ b/toonz/sources/toonzlib/preferences.cpp @@ -294,6 +294,7 @@ Preferences::Preferences() , m_projectRoot(0x08) , m_customProjectRoot("") , m_precompute(true) + , m_fastRenderPath("desktop") , m_ffmpegTimeout(30) , m_shortcutPreset("defopentoonz") , m_useNumpadForSwitchingStyles(true) { @@ -561,6 +562,9 @@ Preferences::Preferences() QString ffmpegPath = m_settings->value("ffmpegPath").toString(); if (ffmpegPath != "") m_ffmpegPath = ffmpegPath; setFfmpegPath(m_ffmpegPath.toStdString()); + QString fastRenderPath = m_settings->value("fastRenderPath").toString(); + if (fastRenderPath != "") m_fastRenderPath = fastRenderPath; + setFastRenderPath(m_fastRenderPath.toStdString()); getValue(*m_settings, "ffmpegTimeout", m_ffmpegTimeout); QString shortcutPreset = m_settings->value("shortcutPreset").toString(); if (shortcutPreset != "") m_shortcutPreset = shortcutPreset; @@ -1259,6 +1263,14 @@ void Preferences::setFfmpegPath(std::string path) { //----------------------------------------------------------------- +void Preferences::setFastRenderPath(std::string path) { + m_fastRenderPath = QString::fromStdString(path); + std::string strPath = m_ffmpegPath.toStdString(); + m_settings->setValue("fastRenderPath", m_fastRenderPath); +} + +//----------------------------------------------------------------- + void Preferences::setShortcutPreset(std::string preset) { m_shortcutPreset = QString::fromStdString(preset); m_settings->setValue("shortcutPreset", m_shortcutPreset);