diff --git a/OpenBoard.pro b/OpenBoard.pro index 673e51d7..67d38467 100644 --- a/OpenBoard.pro +++ b/OpenBoard.pro @@ -9,8 +9,8 @@ CONFIG += debug_and_release \ VERSION_MAJ = 1 -VERSION_MIN = 3 -VERSION_PATCH = 6 +VERSION_MIN = 4 +VERSION_PATCH = 0 VERSION_TYPE = r # a = alpha, b = beta, rc = release candidate, r = release, other => error VERSION_BUILD = 0 @@ -454,3 +454,7 @@ INSTALLS = UB_ETC \ UB_LIBRARY \ UB_THIRDPARTY_INTERACTIVE +DISTFILES += \ + resources/images/moveDown.svg \ + resources/images/moveDownDisabled.svg + diff --git a/release_scripts/linux/package.sh b/release_scripts/linux/package.sh index f64ddec3..e600a5e6 100755 --- a/release_scripts/linux/package.sh +++ b/release_scripts/linux/package.sh @@ -348,7 +348,7 @@ for ((i=0;i<${#tab[@]};i++)); do echo -n ", " >> "$CONTROL_FILE" fi - echo -n "${tab[$i]} (>= "`dpkg -p ${tab[$i]} | grep "Version: " | awk '{ print $2 }' | sed -e 's/\([:. 0-9?]*\).*/\1/g' | sed -e 's/\.$//'`") " >> "$CONTROL_FILE" + echo -n "${tab[$i]} (>= "`apt-cache show ${tab[$i]} | grep "Version: " | head -1 | awk '{ print $2 }' | sed -e 's/\([:. 0-9?]*\).*/\1/g' | sed -e 's/\.$//'`") " >> "$CONTROL_FILE" done echo -n ", onboard" >> "$CONTROL_FILE" diff --git a/resources/OpenBoard.qrc b/resources/OpenBoard.qrc index 07f0d10a..18c33750 100644 --- a/resources/OpenBoard.qrc +++ b/resources/OpenBoard.qrc @@ -159,6 +159,10 @@ images/backgroundPalette/background3On.svg images/backgroundPalette/background4.svg images/backgroundPalette/background4On.svg + images/backgroundPalette/background5.svg + images/backgroundPalette/background5On.svg + images/backgroundPalette/background6.svg + images/backgroundPalette/background6On.svg images/toolPalette/podcast.svg images/toolPalette/podcastOn.svg images/toolPalette/rulerTool.png @@ -335,6 +339,8 @@ images/left_arrow.png images/right_arrow.png images/moveUp.svg + images/moveDown.svg + images/moveDownDisabled.svg images/closeDisabled.svg images/menuDisabled.svg images/moveUpDisabled.svg @@ -352,5 +358,7 @@ images/notAligned.svg images/groupItems.svg images/ungroupItems.svg + images/setAsBackground.svg + images/backgroundPalette/resetDefaultGridSize.svg diff --git a/resources/etc/OpenBoard.config b/resources/etc/OpenBoard.config index c332d35a..2ccc834e 100644 --- a/resources/etc/OpenBoard.config +++ b/resources/etc/OpenBoard.config @@ -1,6 +1,8 @@ [App] AngleTolerance=4 -EnableAutomaticSoftwareUpdates=false +HideCheckForSoftwareUpdate=false +EnableAutomaticSoftwareUpdates=true +EnableSoftwareUpdates=true EnableStartupHints=true FavoriteToolURIs=openboardtool://openboard/mask, openboardtool://ruler, openboardtool://compass, openboardtool://protractor, openboardtool://triangle, openboardtool://magnifier, openboardtool://cache IsInSoftwareUpdateProcess=false @@ -9,8 +11,9 @@ LastSessionPageIndex=0 LookForOpenSankoreInstall=true OnlineUserName= PageCacheSize=20 -PreferredLanguage= +PreferredLanguage=fr_CH ProductWebAddress=http://www.openboard.ch +SoftwareUpdateURL=http://www.openboard.ch/update.json StartMode= SwapControlAndDisplayScreens=false ToolBarDisplayText=true @@ -22,11 +25,16 @@ UseSystemOnScreenKeyboard=true [Board] AutoSaveIntervalInMinutes=3 -CrossedBackground=0 +CrossColorDarkBackground=#C8C0C0C0 +CrossColorLightBackground=#A5E1FF DarkBackground=0 DefaultPageSize=@Size(1280 960) EraserCircleWidthIndex=1 FeatureSliderPosition=40 +GridDarkBackgroundColors=#FFFFFF, #FF3400, #66C0FF, #81FF5C, #FFFF00, #B68360, #FF497E, #8D69FF, #C8C0C0C0 +GridLightBackgroundColors=#000000, #FF0000, #004080, #008000, #FFDD00, #C87400, #800040, #008080, #5F2D0A, #A5E1FF +InterpolateMarkerStrokes=true +InterpolatePenStrokes=true KeyboardPaletteKeyBtnSize=16x16 LeftLibPaletteBoardModeIsCollapsed=true LeftLibPaletteBoardModeWidth=270 @@ -59,7 +67,13 @@ RightLibPaletteDesktopModeIsCollapsed=true RightLibPaletteDesktopModeWidth=270 ShowEraserPreviewCircle=true ShowMarkerPreviewCircle=true +ShowPenPreviewCircle=true +PenPreviewFromSize=5 ShowToolsPalette=false +SimplifyMarkerStrokes=true +SimplifyPenStrokes=true +SimplifyPenStrokesThresholdAngle=3 +SimplifyPenStrokesThresholdWidthDifference=2 StartupKeyboardLocale=0 UseHighResTabletEvent=true ZoomFactor=1.4099999999999999 @@ -89,6 +103,7 @@ InteractivitiesDirectory=./library/interactivities LibIconSize=80 ShapeDirectory=./library/shape ShapeThumbnailWidth=50 +ShowDetailsForLocalItems=false SoundThumbnailWidth=50 VideoThumbnailWidth=80 VideosDirectory=./library/videos @@ -123,7 +138,7 @@ AddBookmarkURL="http://www.myuniboard.com/bookmarks/save/?url=" BookmarksPage=http://www.myuniboard.com HistoryLimit=15 Homepage=http://www.openboard.ch -ShowAddBookmarkButton=false +ShowAddBookmarkButton=true ShowPageImediatelyOnMirroredScreen=false UseExternalBrowser=false diff --git a/resources/forms/brushProperties.ui b/resources/forms/brushProperties.ui index 19883e90..5c4de12c 100644 --- a/resources/forms/brushProperties.ui +++ b/resources/forms/brushProperties.ui @@ -1,7 +1,8 @@ - + + brushProperties - - + + 0 0 @@ -9,79 +10,170 @@ 808 - + - + QFrame::NoFrame - + QFrame::Plain - - - - - Qt::Vertical - - - QSizePolicy::Fixed + + + + + QFrame::NoFrame - - - 20 - 40 - + + QFrame::Raised - + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + Pen is Pressure Sensitive + + + + + + + Qt::Horizontal + + + + 198 + 20 + + + + + + - - - - Qt::Horizontal + + + + QFrame::NoFrame - - - 0 - 0 - + + QFrame::Raised - + + + + + Qt::Horizontal + + + + 154 + 20 + + + + + + + + Opacity + + + + + + + 20 + + + 100 + + + 50 + + + Qt::Horizontal + + + QSlider::TicksAbove + + + 20 + + + + + + + Qt::Horizontal + + + + 156 + 20 + + + + + + - - - + + + + Qt::LeftToRight + + QFrame::NoFrame - + QFrame::Raised - - + + 0 - - + + QFrame::NoFrame - + QFrame::Raised - + - - + + On Light Background - - + + Qt::Horizontal - + 40 20 @@ -90,17 +182,17 @@ - - + + 32 32 - + QFrame::StyledPanel - + QFrame::Raised @@ -109,27 +201,40 @@ - - + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + QFrame::NoFrame - + QFrame::Raised - + - - + + On Dark Background - - + + Qt::Horizontal - + 40 20 @@ -138,17 +243,17 @@ - - + + 32 32 - + QFrame::StyledPanel - + QFrame::Raised @@ -159,120 +264,27 @@ - - - - Qt::Horizontal - - - - 0 - 0 - - - - - - - - QFrame::NoFrame - - - QFrame::Raised - - - - - - Qt::Horizontal - - - - 154 - 20 - - - - - - - - Opacity - - - - - - - 20 - - - 100 - - - 50 - - - Qt::Horizontal - - - QSlider::TicksAbove - - - 20 - - - - - - - Qt::Horizontal - - - - 156 - 20 - - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - + + + + 0 0 - + Line Width - - - - + + + + Qt::Horizontal - + QSizePolicy::Fixed - + 40 20 @@ -280,15 +292,15 @@ - - - + + + Qt::Horizontal - + QSizePolicy::Fixed - + 40 20 @@ -296,149 +308,149 @@ - - - + + + 5 - + 500 - + 5 - + Qt::Horizontal - + QSlider::TicksAbove - + 100 - - - + + + Medium - - - + + + 5 - + 500 - + Qt::Horizontal - + QSlider::TicksAbove - + 100 - - - + + + Strong - - - + + + 5 - + 500 - + Qt::Horizontal - + QSlider::TicksAbove - + 100 - - - - + + + + 60 60 - + 60 60 - + QFrame::StyledPanel - + QFrame::Raised - - - - + + + + 60 60 - + 60 60 - + QFrame::StyledPanel - + QFrame::Raised - - - - + + + + 60 60 - + 60 60 - + QFrame::StyledPanel - + QFrame::Raised - - - + + + Fine @@ -446,73 +458,92 @@ - - - + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + QFrame::NoFrame - + QFrame::Raised - - + + + 0 + + + 0 + + + 0 + + 0 - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - + + + 0 0 - - Pen is Pressure Sensitive + + Show preview circle from - - - Qt::Horizontal - - - - 198 - 20 - + + + + + + px - + + + + + Qt::Horizontal + + + + 198 + 20 + + + + - UBCircleFrame + UBColorPicker QFrame -
gui/UBCircleFrame.h
+
gui/UBColorPicker.h
1
- UBColorPicker + UBCircleFrame QFrame -
gui/UBColorPicker.h
+
gui/UBCircleFrame.h
1
diff --git a/resources/forms/mainWindow.ui b/resources/forms/mainWindow.ui index 287d4e0a..24c04b61 100644 --- a/resources/forms/mainWindow.ui +++ b/resources/forms/mainWindow.ui @@ -1004,6 +1004,25 @@ Grid Light Background
+ + + true + + + + :/images/backgroundPalette/background5.svg + :/images/backgroundPalette/background5On.svg:/images/backgroundPalette/background5.svg + + + Ruled Light Background + + + Light + + + Ruled Light Background + + true @@ -1042,6 +1061,25 @@ Grid Dark Background + + + true + + + + :/images/backgroundPalette/background6.svg + :/images/backgroundPalette/background6On.svg:/images/backgroundPalette/background6.svg + + + Ruled Dark Background + + + Dark + + + Ruled Dark Background + + true @@ -1609,6 +1647,18 @@ Open the tutorial web page + + + + :/images/backgroundPalette/resetDefaultGridSize.svg:/images/backgroundPalette/resetDefaultGridSize.svg + + + Reset grid size + + + Reset grid size + +
diff --git a/resources/forms/preferences.ui b/resources/forms/preferences.ui index 0ddcafe3..bf5e8b64 100644 --- a/resources/forms/preferences.ui +++ b/resources/forms/preferences.ui @@ -6,7 +6,7 @@ 0 0 - 759 + 820 718
@@ -14,6 +14,64 @@ Preferences
+ + + + QFrame::NoFrame + + + QFrame::Raised + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Default Settings + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Close + + + true + + + + + + + + @@ -24,7 +82,7 @@ - 6 + 1 @@ -477,6 +535,271 @@
+ + + Grid + + + + + + true + + + QFrame::NoFrame + + + QFrame::Raised + + + + + + QFrame::NoFrame + + + QFrame::Raised + + + + + + On Light Background + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 32 + 32 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + + + QFrame::NoFrame + + + QFrame::Raised + + + + + + Qt::Horizontal + + + + 154 + 20 + + + + + + + + Opacity + + + + + + + 20 + + + 100 + + + 50 + + + Qt::Horizontal + + + QSlider::TicksAbove + + + 20 + + + + + + + Qt::Horizontal + + + + 156 + 20 + + + + + + + + + + + QFrame::NoFrame + + + QFrame::Raised + + + + + + On Dark Background + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 32 + 32 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + + + QFrame::NoFrame + + + QFrame::Raised + + + + + + Qt::Horizontal + + + + 154 + 20 + + + + + + + + Opacity + + + + + + + 20 + + + 100 + + + 50 + + + Qt::Horizontal + + + QSlider::TicksAbove + + + 20 + + + + + + + Qt::Horizontal + + + + 156 + 20 + + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 342 + + + + + + Pen @@ -656,7 +979,7 @@
- 4 + 1 @@ -2657,7 +2980,7 @@ Public License instead of this License. But first, please read <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Cantarell'; font-size:12pt; font-weight:600;">Translations</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Cantarell'; font-size:10pt;"><br /></span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Cantarell'; font-size:10pt;">A special thanks to:</span></p> @@ -2751,17 +3074,17 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> <table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> <tr> <td style="border: none;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Cantarell'; font-size:10pt;">OpenBoard 1.3.0</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Cantarell'; font-size:10pt;">OpenBoard 1.4.0</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Cantarell'; font-size:10pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Cantarell'; font-size:10pt;">OpenBoard is copyright © 2015. All rights reserved.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Cantarell'; font-size:10pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Cantarell'; font-size:10pt;">OpenBoard is derived from Open-Sankoré. Open-Sankoré is copyright © 2010-2015 Groupement d'Intérêt Public pour l'Education Numérique en Afrique (GIP ENA). All right reserved.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Cantarell'; font-size:10pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Cantarell'; font-size:10pt;">OpenBoard is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3 of the License, with a specific linking exception for the OpenSSL project's &quot;OpenSSL&quot; library (or with modified versions of it that use the same license as the &quot;OpenSSL&quot; library). You can find the source code of this software at </span><a href="https://github.com/DIP-SEM/OpenBoard"><span style=" font-family:'.Helvetica Neue DeskInterface'; font-size:10pt; text-decoration: underline; color:#0000ff;">github.com/DIP-SEM/OpenBoard</span></a><span style=" font-family:'Cantarell'; font-size:10pt;">, </span><a href="https://github.com/DIP-SEM/OpenBoard-ThirdParty"><span style=" font-family:'.Helvetica Neue DeskInterface'; font-size:10pt; text-decoration: underline; color:#0000ff;">github.com/DIP-SEM/OpenBoard-ThirdParty</span></a><span style=" font-family:'Cantarell'; font-size:10pt;">, and </span><a href="https://github.com/DIP-SEM/OpenBoard-Importer"><span style=" font-family:'.Helvetica Neue DeskInterface'; font-size:10pt; text-decoration: underline; color:#0000ff;">github.com/DIP-SEM/OpenBoard-Importer.</span></a><span style=" font-family:'Cantarell'; font-size:10pt;"> </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Cantarell'; font-size:10pt;">OpenBoard is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3 of the License, with a specific linking exception for the OpenSSL project's &quot;OpenSSL&quot; library (or with modified versions of it that use the same license as the &quot;OpenSSL&quot; library). You can find the source code of this software at </span><a href="https://github.com/DIP-SEM/OpenBoard"><span style=" font-family:'.Helvetica Neue DeskInterface'; font-size:10pt; text-decoration: underline; color:#0000ff;">github.com/OpenBoard-org</span></a><span style=" font-family:'Cantarell'; font-size:10pt;">. </span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Cantarell'; font-size:10pt;">OpenBoard is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License below for more details.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Cantarell'; font-size:10pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Cantarell'; font-size:10pt;">Contact :</span></p> @@ -2770,9 +3093,9 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Cantarell'; font-size:10pt;">Case Postale 241</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Cantarell'; font-size:10pt;">1211 Genève 8</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Cantarell'; font-size:10pt;">Switzerland</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.openboard.ch"><span style=" font-family:'.Helvetica Neue DeskInterface'; font-size:11pt; text-decoration: underline; color:#0000ff;">openboard.ch</span></a></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'.Helvetica Neue DeskInterface'; font-size:11pt; text-decoration: underline; color:#0000ff;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Cantarell'; font-size:10pt;">email: </span><a href="mailto:sem.logistique@edu.ge.ch"><span style=" font-family:'Cantarell'; font-size:10pt; text-decoration: underline; color:#0000ff;">sem.logistique@edu.ge.ch</span></a></p></td></tr></table></body></html> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.openboard.ch"><span style=" font-family:'.Helvetica Neue DeskInterface'; text-decoration: underline; color:#0000ff;">openboard.ch</span></a></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'.Helvetica Neue DeskInterface'; text-decoration: underline; color:#0000ff;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Cantarell'; font-size:10pt;">emails: </span><a href="mailto:sem.logistique@edu.ge.ch"><span style=" font-family:'Cantarell'; font-size:10pt; text-decoration: underline; color:#0000ff;">sem.logistique@edu.ge.ch</span></a>, <a href="mailto:sem.logistique@edu.ge.ch"><span style=" font-family:'Cantarell'; font-size:10pt; text-decoration: underline; color:#0000ff;">support@openboard.ch</span></a></p></td></tr></table></body></html> true @@ -2859,66 +3182,16 @@ p, li { white-space: pre-wrap; }
- - - - QFrame::NoFrame - - - QFrame::Raised - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Default Settings - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - Close - - - true - - - - - - - - + + + UBColorPicker + QFrame +
gui/UBColorPicker.h
+ 1 +
+
mainTabWidget useExternalBrowserCheckBox diff --git a/resources/i18n/OpenBoard_ar.ts b/resources/i18n/OpenBoard_ar.ts index 5e8d5520..799c03ed 100644 --- a/resources/i18n/OpenBoard_ar.ts +++ b/resources/i18n/OpenBoard_ar.ts @@ -799,6 +799,18 @@ Open the tutorial web page + + Ruled Light Background + + + + Ruled Dark Background + + + + Reset grid size + + PasswordDialog @@ -890,6 +902,17 @@ Update التحيين + + Board drawing... + + + + + UBBackgroundPalette + + Grid size + + UBBoardController @@ -919,7 +942,7 @@ Delete page %1 from document - إزالة صفحة%1 من الوثيقة + إزالة صفحة%1 من الوثيقة Page %1 deleted @@ -945,6 +968,10 @@ Document has just been saved... + + Deleting page %1 + + UBBoardPaletteManager @@ -957,6 +984,13 @@ صورة ملتقطة + + UBBoardThumbnailsView + + Loading page (%1/%2) + + + UBCachePropertiesWidget @@ -1201,7 +1235,7 @@ UBDocumentNavigator Page %0 - صفحة %0 + صفحة %0 @@ -1237,12 +1271,39 @@ إلغاء + + UBDraggableThumbnailView + + Page %0 + صفحة %0 + + UBExportAdaptor Warnings during export was appeared ظهر تحذير أثناء التصدير + + Exporting document... + تصدير الوثيقة... + + + Export failed + + + + Unable to export to the selected location. You do not have the permissions necessary to save the file. + + + + Export failed: location not writable + + + + Export successful. + تصدير ناجح. + UBExportCFF @@ -1279,11 +1340,11 @@ Exporting document... - تصدير الوثيقة... + تصدير الوثيقة... Export successful. - تصدير ناجح. + تصدير ناجح. Exporting %1 %2 of %3 @@ -1293,18 +1354,6 @@ Export to OpenBoard Format - - Export failed: location not writable - - - - Export failed - - - - Unable to export to the selected location. You do not have the permissions necessary to save the file. - - UBExportFullPDF @@ -1314,28 +1363,16 @@ Exporting document... - تصدير الوثيقة... + تصدير الوثيقة... Export successful. - تصدير ناجح. + تصدير ناجح. Export to PDF التصدير للـPDF - - Export failed: location not writable - - - - Export failed - - - - Unable to export to the selected location. You do not have the permissions necessary to save the file. - - UBExportPDF @@ -1345,11 +1382,11 @@ Exporting document... - تصدير الوثيقة... + تصدير الوثيقة... Export successful. - تصدير ناجح. + تصدير ناجح. Exporting page %1 of %2 @@ -1395,7 +1432,7 @@ Set as background - تعيين كخلفية + تعيين كخلفية Add to library @@ -1535,6 +1572,10 @@ Go to Content Source الذهاب الى مصدر المحتوى + + Set as background + تعيين كخلفية + UBGraphicsMediaItem @@ -1779,6 +1820,10 @@ Do you want to ignore these errors for this host? has lost access to the document repository '%1'. Unfortunately the application must shut down to avoid data corruption. Latest changes may be lost as well. + + Moving page to trash folder... + + UBPlatformUtils @@ -1942,6 +1987,17 @@ Do you want to ignore these errors for this host? %1 thumbnails generated ... 1 % صور مصغرة مولّدة + + loading thumbnail of page %1 + + + + + UBThumbnailTextItem + + Page %0 + صفحة %0 + UBToolsManager @@ -2419,6 +2475,14 @@ p, li { white-space: pre-wrap; } Pen is Pressure Sensitive القلم حساس للضغط + + Show preview circle from + + + + px + + capturePublishingDialog @@ -2604,6 +2668,22 @@ p, li { white-space: pre-wrap; } Built-in virtual keyboard button size: + + Grid + + + + On Dark Background + في خلفية داكنة + + + Opacity + معدل الشفافية + + + On Light Background + في خلفية مضيئة + trapFlashDialog diff --git a/resources/i18n/OpenBoard_bg.ts b/resources/i18n/OpenBoard_bg.ts index 9a9988a9..7bde5b29 100644 --- a/resources/i18n/OpenBoard_bg.ts +++ b/resources/i18n/OpenBoard_bg.ts @@ -799,6 +799,18 @@ Open the tutorial web page + + Ruled Light Background + + + + Ruled Dark Background + + + + Reset grid size + + PasswordDialog @@ -890,6 +902,17 @@ Update Обновления + + Board drawing... + + + + + UBBackgroundPalette + + Grid size + + UBBoardController @@ -919,7 +942,7 @@ Delete page %1 from document - Изтрий страница %1 от документа + Изтрий страница %1 от документа Page %1 deleted @@ -945,6 +968,10 @@ Document has just been saved... + + Deleting page %1 + + UBBoardPaletteManager @@ -957,6 +984,13 @@ Уловени изображения + + UBBoardThumbnailsView + + Loading page (%1/%2) + + + UBCachePropertiesWidget @@ -1197,7 +1231,7 @@ UBDocumentNavigator Page %0 - Страница %0 + Страница %0 @@ -1229,12 +1263,39 @@ Отмени + + UBDraggableThumbnailView + + Page %0 + Страница %0 + + UBExportAdaptor Warnings during export was appeared Появиха се предупреждения по време на експортирането на страницата + + Exporting document... + + + + Export failed + + + + Unable to export to the selected location. You do not have the permissions necessary to save the file. + + + + Export failed: location not writable + + + + Export successful. + + UBExportCFF @@ -1271,11 +1332,11 @@ Exporting document... - Експортиране на документ... + Експортиране на документ... Export successful. - Експортирането е успешно. + Експортирането е успешно. Exporting %1 %2 of %3 @@ -1285,18 +1346,6 @@ Export to OpenBoard Format - - Export failed: location not writable - - - - Export failed - - - - Unable to export to the selected location. You do not have the permissions necessary to save the file. - - UBExportFullPDF @@ -1306,28 +1355,16 @@ Exporting document... - Експортиране на документа... + Експортиране на документа... Export successful. - Експортирането е успешно. + Експортирането е успешно. Export to PDF Експортиране към PDF - - Export failed: location not writable - - - - Export failed - - - - Unable to export to the selected location. You do not have the permissions necessary to save the file. - - UBExportPDF @@ -1337,11 +1374,11 @@ Exporting document... - Експортиране на документ... + Експортиране на документ... Export successful. - Експортирането успешно. + Експортирането успешно. Exporting page %1 of %2 @@ -1387,7 +1424,7 @@ Set as background - Задай като фон + Задай като фон Add to library @@ -1527,6 +1564,10 @@ Go to Content Source Отиди към източника на съдържанието + + Set as background + Задай като фон + UBGraphicsMediaItem @@ -1777,6 +1818,10 @@ Do you want to ignore these errors for this host? has lost access to the document repository '%1'. Unfortunately the application must shut down to avoid data corruption. Latest changes may be lost as well. + + Moving page to trash folder... + + UBPlatformUtils @@ -1940,6 +1985,17 @@ Do you want to ignore these errors for this host? %1 thumbnails generated ... %1 икони са създадени ... + + loading thumbnail of page %1 + + + + + UBThumbnailTextItem + + Page %0 + Страница %0 + UBToolsManager @@ -2414,6 +2470,14 @@ p, li { white-space: pre-wrap; } Pen is Pressure Sensitive Химикалката е чувствителна на натиск + + Show preview circle from + + + + px + + capturePublishingDialog @@ -2599,6 +2663,22 @@ p, li { white-space: pre-wrap; } Built-in virtual keyboard button size: + + Grid + + + + On Dark Background + На тъмен фон + + + Opacity + Непрозрачност + + + On Light Background + На светъл фон + trapFlashDialog diff --git a/resources/i18n/OpenBoard_ca.ts b/resources/i18n/OpenBoard_ca.ts index ef3c4db3..b5751001 100644 --- a/resources/i18n/OpenBoard_ca.ts +++ b/resources/i18n/OpenBoard_ca.ts @@ -799,6 +799,18 @@ Open the tutorial web page + + Ruled Light Background + + + + Ruled Dark Background + + + + Reset grid size + + PasswordDialog @@ -890,6 +902,17 @@ Update Actualitza + + Board drawing... + + + + + UBBackgroundPalette + + Grid size + + UBBoardController @@ -919,7 +942,7 @@ Delete page %1 from document - Elimina la pàgina %1 del document + Elimina la pàgina %1 del document Page %1 deleted @@ -945,6 +968,10 @@ Document has just been saved... + + Deleting page %1 + + UBBoardPaletteManager @@ -957,6 +984,13 @@ CapturedImage + + UBBoardThumbnailsView + + Loading page (%1/%2) + + + UBCachePropertiesWidget @@ -1196,7 +1230,7 @@ UBDocumentNavigator Page %0 - Pàgina %0 + Pàgina %0 @@ -1228,12 +1262,39 @@ Cancel·la + + UBDraggableThumbnailView + + Page %0 + Pàgina %0 + + UBExportAdaptor Warnings during export was appeared Advertiments: durant l'exportació han aparegut + + Exporting document... + S'està exportant el document... + + + Export failed + + + + Unable to export to the selected location. You do not have the permissions necessary to save the file. + + + + Export failed: location not writable + + + + Export successful. + L'exportació ha estat correcta. + UBExportCFF @@ -1270,11 +1331,11 @@ Exporting document... - S'està exportant el document... + S'està exportant el document... Export successful. - L'exportació ha estat correcta. + L'exportació ha estat correcta. Exporting %1 %2 of %3 @@ -1284,18 +1345,6 @@ Export to OpenBoard Format - - Export failed: location not writable - - - - Export failed - - - - Unable to export to the selected location. You do not have the permissions necessary to save the file. - - UBExportFullPDF @@ -1305,7 +1354,7 @@ Exporting document... - S'està exportant el document... + S'està exportant el document... Export to PDF @@ -1313,19 +1362,7 @@ Export successful. - L'exportació ha estat correcta. - - - Export failed: location not writable - - - - Export failed - - - - Unable to export to the selected location. You do not have the permissions necessary to save the file. - + L'exportació ha estat correcta. @@ -1336,11 +1373,11 @@ Exporting document... - S'està exportant el document... + S'està exportant el document... Export successful. - L'exportació ha estat correcta. + L'exportació ha estat correcta. Exporting page %1 of %2 @@ -1386,7 +1423,7 @@ Set as background - Estableix com a fons + Estableix com a fons Add to library @@ -1526,6 +1563,10 @@ Go to Content Source Ves a la font de contingut + + Set as background + Estableix com a fons + UBGraphicsMediaItem @@ -1776,6 +1817,10 @@ Voleu ignorar aquests errors per a aquest amfitrió? has lost access to the document repository '%1'. Unfortunately the application must shut down to avoid data corruption. Latest changes may be lost as well. + + Moving page to trash folder... + + UBPlatformUtils @@ -1932,6 +1977,17 @@ Voleu ignorar aquests errors per a aquest amfitrió? %1 thumbnails generated ... S'han generat %1 miniatures... + + loading thumbnail of page %1 + + + + + UBThumbnailTextItem + + Page %0 + Pàgina %0 + UBToolsManager @@ -2407,6 +2463,14 @@ p, li { white-space: pre-wrap; } Pen is Pressure Sensitive El llapis és sensible a la pressió + + Show preview circle from + + + + px + + capturePublishingDialog @@ -2592,6 +2656,22 @@ p, li { white-space: pre-wrap; } Built-in virtual keyboard button size: + + Grid + + + + On Dark Background + Sobre fons fosc + + + Opacity + Opacitat + + + On Light Background + Sobre fons clar + trapFlashDialog diff --git a/resources/i18n/OpenBoard_cs.ts b/resources/i18n/OpenBoard_cs.ts index f9ea57bb..dca8766a 100644 --- a/resources/i18n/OpenBoard_cs.ts +++ b/resources/i18n/OpenBoard_cs.ts @@ -800,6 +800,18 @@ Open the tutorial web page + + Ruled Light Background + + + + Ruled Dark Background + + + + Reset grid size + + PasswordDialog @@ -891,6 +903,17 @@ Update available K dispozici je aktualizace + + Board drawing... + + + + + UBBackgroundPalette + + Grid size + + UBBoardController @@ -920,7 +943,7 @@ Delete page %1 from document - Odstranit stránku %1 z dokumentu + Odstranit stránku %1 z dokumentu Page %1 deleted @@ -946,6 +969,10 @@ Document has just been saved... + + Deleting page %1 + + UBBoardPaletteManager @@ -958,6 +985,13 @@ Zachycenýobrázek + + UBBoardThumbnailsView + + Loading page (%1/%2) + + + UBCachePropertiesWidget @@ -1198,7 +1232,7 @@ UBDocumentNavigator Page %0 - Stránka %0 + Stránka %0 @@ -1231,12 +1265,39 @@ Zrušit + + UBDraggableThumbnailView + + Page %0 + Stránka %0 + + UBExportAdaptor Warnings during export was appeared Během exportu se objevila varování + + Exporting document... + Exportuje se dokument... + + + Export failed + + + + Unable to export to the selected location. You do not have the permissions necessary to save the file. + + + + Export failed: location not writable + + + + Export successful. + Export byl úspěšně dokončen. + UBExportCFF @@ -1277,28 +1338,16 @@ Exporting document... - Exportuje se dokument... + Exportuje se dokument... Export successful. - Export byl úspěšně dokončen. + Export byl úspěšně dokončen. Export to OpenBoard Format - - Export failed: location not writable - - - - Export failed - - - - Unable to export to the selected location. You do not have the permissions necessary to save the file. - - UBExportFullPDF @@ -1312,23 +1361,11 @@ Exporting document... - Exportuje se dokument... + Exportuje se dokument... Export successful. - Export byl úspěšně dokončen. - - - Export failed: location not writable - - - - Export failed - - - - Unable to export to the selected location. You do not have the permissions necessary to save the file. - + Export byl úspěšně dokončen. @@ -1347,11 +1384,11 @@ Exporting document... - Exportuje se dokument... + Exportuje se dokument... Export successful. - Export byl úspěšně dokončen. + Export byl úspěšně dokončen. @@ -1389,7 +1426,7 @@ Set as background - Nastavit jako pozadí + Nastavit jako pozadí Add to library @@ -1529,6 +1566,10 @@ Visible on Extended Screen Viditelné na rozšířené obrazovce + + Set as background + Nastavit jako pozadí + UBGraphicsMediaItem @@ -1779,6 +1820,10 @@ Chcete ignorovat tyto chyby na tomto serveru? has lost access to the document repository '%1'. Unfortunately the application must shut down to avoid data corruption. Latest changes may be lost as well. + + Moving page to trash folder... + + UBPlatformUtils @@ -1942,6 +1987,17 @@ Chcete ignorovat tyto chyby na tomto serveru? Generating preview thumbnails ... Vytváří se miniatury obrázků ... + + loading thumbnail of page %1 + + + + + UBThumbnailTextItem + + Page %0 + Stránka %0 + UBToolsManager @@ -2417,6 +2473,14 @@ p, li { white-space: pre-wrap; } On Dark Background Na tmavém pozadí + + Show preview circle from + + + + px + + capturePublishingDialog @@ -2602,6 +2666,22 @@ p, li { white-space: pre-wrap; } Built-in virtual keyboard button size: + + Grid + + + + On Dark Background + Na tmavém pozadí + + + Opacity + Průhlednost + + + On Light Background + Na světlém pozadí + trapFlashDialog diff --git a/resources/i18n/OpenBoard_da.ts b/resources/i18n/OpenBoard_da.ts index ddddbbd3..f043b446 100644 --- a/resources/i18n/OpenBoard_da.ts +++ b/resources/i18n/OpenBoard_da.ts @@ -799,6 +799,18 @@ Open the tutorial web page + + Ruled Light Background + + + + Ruled Dark Background + + + + Reset grid size + + PasswordDialog @@ -890,6 +902,17 @@ Update Opdatering + + Board drawing... + + + + + UBBackgroundPalette + + Grid size + + UBBoardController @@ -919,7 +942,7 @@ Delete page %1 from document - Slet side %1 fra dokumentet + Slet side %1 fra dokumentet Page %1 deleted @@ -945,6 +968,10 @@ Document has just been saved... + + Deleting page %1 + + UBBoardPaletteManager @@ -957,6 +984,13 @@ HentetBillede + + UBBoardThumbnailsView + + Loading page (%1/%2) + + + UBCachePropertiesWidget @@ -1196,7 +1230,7 @@ UBDocumentNavigator Page %0 - Side %0 + Side %0 @@ -1228,12 +1262,39 @@ Annuller + + UBDraggableThumbnailView + + Page %0 + Side %0 + + UBExportAdaptor Warnings during export was appeared Advarsler under eksportering blev vist + + Exporting document... + Eksporterer dokument... + + + Export failed + + + + Unable to export to the selected location. You do not have the permissions necessary to save the file. + + + + Export failed: location not writable + + + + Export successful. + Eksport gennemført. + UBExportCFF @@ -1270,11 +1331,11 @@ Exporting document... - Eksporterer dokument... + Eksporterer dokument... Export successful. - Eksport gennemført. + Eksport gennemført. Exporting %1 %2 of %3 @@ -1284,18 +1345,6 @@ Export to OpenBoard Format - - Export failed: location not writable - - - - Export failed - - - - Unable to export to the selected location. You do not have the permissions necessary to save the file. - - UBExportFullPDF @@ -1305,28 +1354,16 @@ Exporting document... - Eksporterer dokument... + Eksporterer dokument... Export successful. - Eksport gennemført. + Eksport gennemført. Export to PDF Eksport til PDF - - Export failed: location not writable - - - - Export failed - - - - Unable to export to the selected location. You do not have the permissions necessary to save the file. - - UBExportPDF @@ -1336,11 +1373,11 @@ Exporting document... - Eksporterer dokument... + Eksporterer dokument... Export successful. - Eksport gennemført. + Eksport gennemført. Exporting page %1 of %2 @@ -1386,7 +1423,7 @@ Set as background - Brug som baggrund + Brug som baggrund Add to library @@ -1526,6 +1563,10 @@ Go to Content Source Gå til indholdskilde + + Set as background + Brug som baggrund + UBGraphicsMediaItem @@ -1776,6 +1817,10 @@ Do you want to ignore these errors for this host? has lost access to the document repository '%1'. Unfortunately the application must shut down to avoid data corruption. Latest changes may be lost as well. + + Moving page to trash folder... + + UBPlatformUtils @@ -1939,6 +1984,17 @@ Do you want to ignore these errors for this host? %1 thumbnails generated ... %1 miniaturebilleder genereret... + + loading thumbnail of page %1 + + + + + UBThumbnailTextItem + + Page %0 + Side %0 + UBToolsManager @@ -2410,6 +2466,14 @@ p, li { white-space: pre-wrap; } Pen is Pressure Sensitive Pen er tryksensitiv + + Show preview circle from + + + + px + + capturePublishingDialog @@ -2595,6 +2659,22 @@ p, li { white-space: pre-wrap; } Built-in virtual keyboard button size: + + Grid + + + + On Dark Background + På mørk baggrund + + + Opacity + Gennemsigtighed + + + On Light Background + På lys baggrund + trapFlashDialog diff --git a/resources/i18n/OpenBoard_de.ts b/resources/i18n/OpenBoard_de.ts index d7ca233e..ac5702cc 100644 --- a/resources/i18n/OpenBoard_de.ts +++ b/resources/i18n/OpenBoard_de.ts @@ -481,7 +481,7 @@ Grid Light Background - Heller Hintergrund, kariert + Hell karierten Hintergrund Plain Dark Background @@ -493,7 +493,7 @@ Grid Dark Background - Dunkler Hintergrund, kariert + Dunkel karierten Hintergrund Podcast @@ -799,6 +799,18 @@ Open the tutorial web page Öffnen der Anleitung im Internet + + Ruled Light Background + Hell linierter Hintergrund + + + Ruled Dark Background + Dunkel linierter Hintergrund + + + Reset grid size + Rastergröße zurücksetzen + PasswordDialog @@ -850,7 +862,7 @@ Remove Page - Seite entfernen + Seite entfernen Are you sure you want to remove 1 page from the selected document '%0'? @@ -890,6 +902,17 @@ Update Aktualisierung + + Board drawing... + Brettzeichnung... + + + + UBBackgroundPalette + + Grid size + Gittergrösse + UBBoardController @@ -919,7 +942,7 @@ Delete page %1 from document - Seite %1 des Dokuments löschen + Seite %1 des Dokuments löschen Page %1 deleted @@ -927,15 +950,15 @@ Add file operation failed: file copying error - Dokument hinzufügen fehlgeschlagen: Fehler beim Kopieren + Dokument hinzufügen fehlgeschlagen: Fehler beim Kopieren Group - Gruppieren + Gruppieren Ungroup - Gruppierung auflösen + Gruppierung auflösen Saving document... @@ -945,6 +968,10 @@ Document has just been saved... Dokument wurde gespeichert... + + Deleting page %1 + Seite %1 löschen + UBBoardPaletteManager @@ -957,6 +984,13 @@ erfasstes Bild + + UBBoardThumbnailsView + + Loading page (%1/%2) + Ladeseite (%1/%2) + + UBCachePropertiesWidget @@ -1130,11 +1164,11 @@ Folder does not contain any image files - Das Verzeichnis enthält keine Bilder + Das Verzeichnis enthält keine Bilder Untitled Documents - Unbenanntes Dokument + Unbenanntes Dokument The document '%1' has been generated with a newer version of OpenBoard (%2). By opening it, you may lose some information. Do you want to proceed? @@ -1177,11 +1211,11 @@ Inserting page %1 of %2 - Hinzufügen der Seite %1 von %2 + Hinzufügen der Seite %1 von %2 Import successful. - Import erfolgreich. + Import erfolgreich. Import of file %1 successful. @@ -1196,7 +1230,7 @@ UBDocumentNavigator Page %0 - Seite %0 + Seite %0 @@ -1228,11 +1262,38 @@ Abbrechen + + UBDraggableThumbnailView + + Page %0 + Seite %0 + + UBExportAdaptor Warnings during export was appeared - Warnungen beim Exportieren aufgetreten + Warnungen beim Exportieren aufgetreten + + + Exporting document... + Dokument wird exportiert... + + + Export failed + Export fehlgeschlagen + + + Unable to export to the selected location. You do not have the permissions necessary to save the file. + Export im ausgewählten Zielpfad nicht möglich. Sie haben nicht die erforderliche Berechtigung um die Datei zu speichern. + + + Export failed: location not writable + + + + Export successful. + Export erfolgreich. @@ -1270,11 +1331,11 @@ Exporting document... - Dokument wird exportiert... + Dokument wird exportiert... Export successful. - Export erfolgreich. + Export erfolgreich. Exporting %1 %2 of %3 @@ -1286,15 +1347,15 @@ Export failed: location not writable - Export fehlgeschlagen: Zielpfad nicht beschreibbar + Export fehlgeschlagen: Zielpfad nicht beschreibbar Export failed - Export fehlgeschlagen + Export fehlgeschlagen Unable to export to the selected location. You do not have the permissions necessary to save the file. - Export im ausgewählten Zielpfad nicht möglich. Sie haben nicht die erforderliche Berechtigung um die Datei zu speichern. + Export im ausgewählten Zielpfad nicht möglich. Sie haben nicht die erforderliche Berechtigung um die Datei zu speichern. @@ -1305,11 +1366,11 @@ Exporting document... - Dokument wird exportiert... + Dokument wird exportiert... Export successful. - Export erfolgreich. + Export erfolgreich. Export to PDF @@ -1317,15 +1378,15 @@ Export failed: location not writable - Export fehlgeschlagen: Zielpfad nicht beschreibbar. + Export fehlgeschlagen: Zielpfad nicht beschreibbar. Export failed - Export fehlgeschlagen + Export fehlgeschlagen Unable to export to the selected location. You do not have the permissions necessary to save the file. - Export im ausgewählten Zielpfad nicht möglich. Sie haben nicht die erforderliche Berechtigung um die Datei zu speichern. + Export im ausgewählten Zielpfad nicht möglich. Sie haben nicht die erforderliche Berechtigung um die Datei zu speichern. @@ -1336,11 +1397,11 @@ Exporting document... - Dokument wird exportiert... + Dokument wird exportiert... Export successful. - Export erfolgreich. + Export erfolgreich. Exporting page %1 of %2 @@ -1386,7 +1447,7 @@ Set as background - Als Hintergrund festlegen + Als Hintergrund festlegen Add to library @@ -1505,11 +1566,11 @@ UBGraphicsGroupContainerItemDelegate Locked - Gesperrt + Gesperrt Visible on Extended Screen - Auf erweitertem Bildschirm sichtbar + Auf erweitertem Bildschirm sichtbar @@ -1526,6 +1587,10 @@ Go to Content Source Gehen Sie zum ursprünglichen Inhalt + + Set as background + Als Hintergrund einfügen + UBGraphicsMediaItem @@ -1568,14 +1633,14 @@ UBGraphicsW3CWidgetItem Web - Web + Web UBGraphicsWidgetItem Loading ... - Lädt... + Lädt... @@ -1697,7 +1762,7 @@ UBMessagesDialog Close - Schließen + Schließen @@ -1747,11 +1812,11 @@ Möchten Sie diese Fehler für diesen Computer ignorieren? You can always access the OpenBoard Document Importer through the Preferences panel in the About tab. Warning, if you have already imported your Open-Sankore datas, you might loose your current OpenBoard documents. - Sie können jederzeit im Einstellungsdialog im Menü "Über" auf den OpenBoard Document Importer zugreifen. Warnung, falls sie bereits Ihre Open-Sankore Daten importiert haben, können Sie Ihre aktuellen OpenBoard Dokumente verlieren. + Sie können jederzeit im Einstellungsdialog im Menü "Über" auf den OpenBoard Document Importer zugreifen. Warnung, falls sie bereits Ihre Open-Sankore Daten importiert haben, können Sie Ihre aktuellen OpenBoard Dokumente verlieren. Cancel - Abbrechen + Abbrechen Proceed @@ -1759,7 +1824,7 @@ Möchten Sie diese Fehler für diesen Computer ignorieren? Open-Sankoré documents are present on your computer. It is possible to import them to OpenBoard by pressing the “Proceed” button to launch the importer application. - Auf Ihrem Computer befinden sich Open-Sankoré Dokumente. Um diese in OpenBoard zu importieren drücken Sie den "Fortfahren" Knopf um die Importanwendung zu starten. + Auf Ihrem Computer befinden sich Open-Sankoré Dokumente. Um diese in OpenBoard zu importieren drücken Sie den "Fortfahren" Knopf um die Importanwendung zu starten. @@ -1776,6 +1841,18 @@ Möchten Sie diese Fehler für diesen Computer ignorieren? has lost access to the document repository '%1'. Unfortunately the application must shut down to avoid data corruption. Latest changes may be lost as well. Verbindung zum Dokumentenarchiv verloren. Um fehlerhafte Daten zu vermeiden muss die Anwendung leider geschlossen werden. Letzte Änderungen können auch verloren gehen. + + saving document thumbnail for the page %1 + Backup Übersichtsseite %1 + + + Saving thumbnail of page %1 + Miniaturansicht der Seite %1 speichern + + + Moving page to trash folder... + Die Seite in den Papierkorb verschieben... + UBPlatformUtils @@ -1860,7 +1937,7 @@ Möchten Sie diese Fehler für diesen Computer ignorieren? OpenBoard Cast - + OpenBoard Cast @@ -1919,7 +1996,7 @@ Möchten Sie diese Fehler für diesen Computer ignorieren? UBStartupHintsPalette Visible next time - + Sichtbar beim nächsten Mal @@ -1939,6 +2016,18 @@ Möchten Sie diese Fehler für diesen Computer ignorieren? %1 thumbnails generated ... Miniaturansicht %1 wird erstellt... + + loading thumbnail of page %1 + +Miniaturansicht der Seite %1 wird geladen + + + + UBThumbnailTextItem + + Page %0 + Seite %0 + UBToolsManager @@ -2377,7 +2466,7 @@ p, li { white-space: pre-wrap; } OpenBoard - OpenBoard + OpenBoard @@ -2414,6 +2503,14 @@ p, li { white-space: pre-wrap; } Pen is Pressure Sensitive Der Stift ist druckempfindlich + + Show preview circle from + Ansichtsgrösse von + + + px + px + capturePublishingDialog @@ -2600,6 +2697,22 @@ p, li { white-space: pre-wrap; } Built-in virtual keyboard button size: Tastengröße der integrierten virtuellen Tastatur + + Grid + Gitter + + + On Dark Background + Auf dunklem Hintergrund + + + Opacity + Deckkraft + + + On Light Background + Auf hellem Hintergrund + trapFlashDialog diff --git a/resources/i18n/OpenBoard_el.ts b/resources/i18n/OpenBoard_el.ts index 4260bfbf..d5592f3d 100644 --- a/resources/i18n/OpenBoard_el.ts +++ b/resources/i18n/OpenBoard_el.ts @@ -799,6 +799,18 @@ Open the tutorial web page + + Ruled Light Background + + + + Ruled Dark Background + + + + Reset grid size + + PasswordDialog @@ -890,6 +902,17 @@ Update Ενημέρωση + + Board drawing... + + + + + UBBackgroundPalette + + Grid size + + UBBoardController @@ -919,7 +942,7 @@ Delete page %1 from document - Διαγραφή της σελιδας %1 από το έγγραφο + Διαγραφή της σελιδας %1 από το έγγραφο Page %1 deleted @@ -945,6 +968,10 @@ Document has just been saved... + + Deleting page %1 + + UBBoardPaletteManager @@ -957,6 +984,13 @@ Εικόνα από σύλληψη στιγμιότυπου + + UBBoardThumbnailsView + + Loading page (%1/%2) + + + UBCachePropertiesWidget @@ -1196,7 +1230,7 @@ UBDocumentNavigator Page %0 - Σελίδα %0 + Σελίδα %0 @@ -1228,12 +1262,39 @@ Άκυρο + + UBDraggableThumbnailView + + Page %0 + Σελίδα %0 + + UBExportAdaptor Warnings during export was appeared Εμφανίστηκαν προειδοποιήσεις κατά τη διάρκεια της εξαγωγής + + Exporting document... + Εξαγωγή εγγράφου... + + + Export failed + + + + Unable to export to the selected location. You do not have the permissions necessary to save the file. + + + + Export failed: location not writable + + + + Export successful. + Επιτυχημένη εξαγωγή + UBExportCFF @@ -1270,11 +1331,11 @@ Exporting document... - Εξαγωγή εγγράφου... + Εξαγωγή εγγράφου... Export successful. - Επιτυχημένη εξαγωγή + Επιτυχημένη εξαγωγή Exporting %1 %2 of %3 @@ -1284,18 +1345,6 @@ Export to OpenBoard Format - - Export failed: location not writable - - - - Export failed - - - - Unable to export to the selected location. You do not have the permissions necessary to save the file. - - UBExportFullPDF @@ -1305,28 +1354,16 @@ Exporting document... - Εξαγωγή εγγράφου... + Εξαγωγή εγγράφου... Export successful. - Επιτυχημένη εξαγωγή + Επιτυχημένη εξαγωγή Export to PDF Εξαγωγή σε PDF - - Export failed: location not writable - - - - Export failed - - - - Unable to export to the selected location. You do not have the permissions necessary to save the file. - - UBExportPDF @@ -1336,11 +1373,11 @@ Exporting document... - Εξαγωγή εγγράφου... + Εξαγωγή εγγράφου... Export successful. - Επιτυχημένη εξαγωγή + Επιτυχημένη εξαγωγή Exporting page %1 of %2 @@ -1386,7 +1423,7 @@ Set as background - Ορισμός ως παρασκήνιο + Ορισμός ως παρασκήνιο Add to library @@ -1526,6 +1563,10 @@ Go to Content Source Μετάβαση στην Πηγή Περιεχομένου + + Set as background + Ορισμός ως παρασκήνιο + UBGraphicsMediaItem @@ -1776,6 +1817,10 @@ Do you want to ignore these errors for this host? has lost access to the document repository '%1'. Unfortunately the application must shut down to avoid data corruption. Latest changes may be lost as well. + + Moving page to trash folder... + + UBPlatformUtils @@ -1939,6 +1984,17 @@ Do you want to ignore these errors for this host? %1 thumbnails generated ... %1 μικρογραφίες δημιουργήθηκαν... + + loading thumbnail of page %1 + + + + + UBThumbnailTextItem + + Page %0 + Σελίδα %0 + UBToolsManager @@ -2414,6 +2470,14 @@ p, li { white-space: pre-wrap; } Pen is Pressure Sensitive Η πένα είναι ευαίσθητη στην πίεση + + Show preview circle from + + + + px + + capturePublishingDialog @@ -2599,6 +2663,22 @@ p, li { white-space: pre-wrap; } Built-in virtual keyboard button size: + + Grid + + + + On Dark Background + Σε σκοτεινό παρασκήνιο + + + Opacity + Διαφάνεια + + + On Light Background + Σε φωτεινό παρασκήνιο + trapFlashDialog diff --git a/resources/i18n/OpenBoard_en.ts b/resources/i18n/OpenBoard_en.ts index bf59ddce..da2fb299 100644 --- a/resources/i18n/OpenBoard_en.ts +++ b/resources/i18n/OpenBoard_en.ts @@ -799,6 +799,18 @@ Open the tutorial web page + + Ruled Light Background + + + + Ruled Dark Background + + + + Reset grid size + + PasswordDialog @@ -882,6 +894,17 @@ Update + + Board drawing... + + + + + UBBackgroundPalette + + Grid size + + UBBoardController @@ -909,10 +932,6 @@ Unknown content type %1 - - Delete page %1 from document - - Page %1 deleted @@ -937,6 +956,10 @@ Document has just been saved... + + Deleting page %1 + + UBBoardPaletteManager @@ -949,6 +972,13 @@ + + UBBoardThumbnailsView + + Loading page (%1/%2) + + + UBCachePropertiesWidget @@ -1183,13 +1213,6 @@ - - UBDocumentNavigator - - Page %0 - - - UBDocumentTreeWidget @@ -1219,20 +1242,16 @@ - UBExportAdaptor + UBDraggableThumbnailView - Warnings during export was appeared + Page %0 - UBExportDocument - - Page - - + UBExportAdaptor - Export as UBZ File + Warnings during export was appeared @@ -1240,15 +1259,11 @@ - Export successful. - - - - Exporting %1 %2 of %3 + Export failed - Export to OpenBoard Format + Unable to export to the selected location. You do not have the permissions necessary to save the file. @@ -1256,42 +1271,37 @@ - Export failed - - - - Unable to export to the selected location. You do not have the permissions necessary to save the file. + Export successful. - UBExportFullPDF - - Export as PDF File - - + UBExportDocument - Exporting document... + Page - Export to PDF + Export as UBZ File - Export successful. + Exporting %1 %2 of %3 - Export failed: location not writable + Export to OpenBoard Format + + + UBExportFullPDF - Export failed + Export as PDF File - Unable to export to the selected location. You do not have the permissions necessary to save the file. + Export to PDF @@ -1305,14 +1315,6 @@ Exporting page %1 of %2 - - Export successful. - - - - Exporting document... - - Export to PDF @@ -1351,10 +1353,6 @@ Add to page - - Set as background - - Add to library @@ -1493,6 +1491,10 @@ Go to Content Source + + Set as background + + UBGraphicsMediaItem @@ -1714,6 +1716,10 @@ Do you want to ignore these errors for this host? has lost access to the document repository '%1'. Unfortunately the application must shut down to avoid data corruption. Latest changes may be lost as well. + + Moving page to trash folder... + + UBPlatformUtils @@ -1877,6 +1883,17 @@ Do you want to ignore these errors for this host? %1 thumbnails generated ... + + loading thumbnail of page %1 + + + + + UBThumbnailTextItem + + Page %0 + + UBToolsManager @@ -2347,6 +2364,14 @@ p, li { white-space: pre-wrap; } Pen is Pressure Sensitive + + Show preview circle from + + + + px + + capturePublishingDialog @@ -2528,6 +2553,22 @@ p, li { white-space: pre-wrap; } Built-in virtual keyboard button size: + + Grid + + + + On Dark Background + + + + Opacity + + + + On Light Background + + trapFlashDialog diff --git a/resources/i18n/OpenBoard_en_UK.ts b/resources/i18n/OpenBoard_en_UK.ts index 7080b3b6..77024a0e 100644 --- a/resources/i18n/OpenBoard_en_UK.ts +++ b/resources/i18n/OpenBoard_en_UK.ts @@ -799,6 +799,18 @@ Open the tutorial web page + + Ruled Light Background + + + + Ruled Dark Background + + + + Reset grid size + + PasswordDialog @@ -882,6 +894,17 @@ Update + + Board drawing... + + + + + UBBackgroundPalette + + Grid size + + UBBoardController @@ -909,10 +932,6 @@ All Supported (%1) - - Delete page %1 from document - - Page %1 deleted @@ -937,6 +956,10 @@ Document has just been saved... + + Deleting page %1 + + UBBoardPaletteManager @@ -949,6 +972,13 @@ + + UBBoardThumbnailsView + + Loading page (%1/%2) + + + UBCachePropertiesWidget @@ -1183,13 +1213,6 @@ - - UBDocumentNavigator - - Page %0 - - - UBDocumentTreeWidget @@ -1219,20 +1242,16 @@ - UBExportAdaptor + UBDraggableThumbnailView - Warnings during export was appeared + Page %0 - UBExportDocument - - Page - - + UBExportAdaptor - Export as UBZ File + Warnings during export was appeared @@ -1240,15 +1259,11 @@ - Export successful. - - - - Exporting %1 %2 of %3 + Export failed - Export to OpenBoard Format + Unable to export to the selected location. You do not have the permissions necessary to save the file. @@ -1256,42 +1271,37 @@ - Export failed - - - - Unable to export to the selected location. You do not have the permissions necessary to save the file. + Export successful. - UBExportFullPDF - - Export as PDF File - - + UBExportDocument - Exporting document... + Page - Export successful. + Export as UBZ File - Export to PDF + Exporting %1 %2 of %3 - Export failed: location not writable + Export to OpenBoard Format + + + UBExportFullPDF - Export failed + Export as PDF File - Unable to export to the selected location. You do not have the permissions necessary to save the file. + Export to PDF @@ -1301,14 +1311,6 @@ Export as PDF File - - Exporting document... - - - - Export successful. - - Exporting page %1 of %2 @@ -1351,10 +1353,6 @@ Add to page - - Set as background - - Add to library @@ -1493,6 +1491,10 @@ Go to Content Source + + Set as background + + UBGraphicsMediaItem @@ -1714,6 +1716,10 @@ Do you want to ignore these errors for this host? has lost access to the document repository '%1'. Unfortunately the application must shut down to avoid data corruption. Latest changes may be lost as well. + + Moving page to trash folder... + + UBPlatformUtils @@ -1877,6 +1883,17 @@ Do you want to ignore these errors for this host? %1 thumbnails generated ... + + loading thumbnail of page %1 + + + + + UBThumbnailTextItem + + Page %0 + + UBToolsManager @@ -2347,6 +2364,14 @@ p, li { white-space: pre-wrap; } Pen is Pressure Sensitive + + Show preview circle from + + + + px + + capturePublishingDialog @@ -2528,6 +2553,22 @@ p, li { white-space: pre-wrap; } Built-in virtual keyboard button size: + + Grid + + + + On Dark Background + + + + Opacity + + + + On Light Background + + trapFlashDialog diff --git a/resources/i18n/OpenBoard_es.ts b/resources/i18n/OpenBoard_es.ts index 26d94b66..dc4a675c 100644 --- a/resources/i18n/OpenBoard_es.ts +++ b/resources/i18n/OpenBoard_es.ts @@ -799,6 +799,18 @@ Open the tutorial web page + + Ruled Light Background + + + + Ruled Dark Background + + + + Reset grid size + + PasswordDialog @@ -890,6 +902,17 @@ Update Actualizar + + Board drawing... + + + + + UBBackgroundPalette + + Grid size + + UBBoardController @@ -919,7 +942,7 @@ Delete page %1 from document - Borrar la página %1 del documento + Borrar la página %1 del documento Page %1 deleted @@ -945,6 +968,10 @@ Document has just been saved... + + Deleting page %1 + + UBBoardPaletteManager @@ -957,6 +984,13 @@ Imagen capturada + + UBBoardThumbnailsView + + Loading page (%1/%2) + + + UBCachePropertiesWidget @@ -1196,7 +1230,7 @@ UBDocumentNavigator Page %0 - Página %0 + Página %0 @@ -1228,12 +1262,39 @@ Cancelar + + UBDraggableThumbnailView + + Page %0 + Página %0 + + UBExportAdaptor Warnings during export was appeared Han aparecido advertencias durante la exportación + + Exporting document... + Exportando documento... + + + Export failed + + + + Unable to export to the selected location. You do not have the permissions necessary to save the file. + + + + Export failed: location not writable + + + + Export successful. + Exportación satisfactoria. + UBExportCFF @@ -1270,11 +1331,11 @@ Exporting document... - Exportando documento... + Exportando documento... Export successful. - Exportación satisfactoria. + Exportación satisfactoria. Exporting %1 %2 of %3 @@ -1284,18 +1345,6 @@ Export to OpenBoard Format - - Export failed: location not writable - - - - Export failed - - - - Unable to export to the selected location. You do not have the permissions necessary to save the file. - - UBExportFullPDF @@ -1305,28 +1354,16 @@ Exporting document... - Exportando documento... + Exportando documento... Export successful. - Exportación satisfactoria. + Exportación satisfactoria. Export to PDF Exportar a PDF - - Export failed: location not writable - - - - Export failed - - - - Unable to export to the selected location. You do not have the permissions necessary to save the file. - - UBExportPDF @@ -1336,11 +1373,11 @@ Exporting document... - Exportando documento... + Exportando documento... Export successful. - Exportación satisfactoria. + Exportación satisfactoria. Exporting page %1 of %2 @@ -1386,7 +1423,7 @@ Set as background - Definir como fondo + Definir como fondo Add to library @@ -1526,6 +1563,10 @@ Go to Content Source Ir a fuente de contenido + + Set as background + Definir como fondo + UBGraphicsMediaItem @@ -1770,6 +1811,10 @@ Do you want to ignore these errors for this host? has lost access to the document repository '%1'. Unfortunately the application must shut down to avoid data corruption. Latest changes may be lost as well. + + Moving page to trash folder... + + UBPlatformUtils @@ -1933,6 +1978,17 @@ Do you want to ignore these errors for this host? %1 thumbnails generated ... %1 miniaturas generadas... + + loading thumbnail of page %1 + + + + + UBThumbnailTextItem + + Page %0 + Página %0 + UBToolsManager @@ -2408,6 +2464,14 @@ p, li { white-space: pre-wrap; } Pen is Pressure Sensitive El bolígrafo es sensible a la presión + + Show preview circle from + + + + px + + capturePublishingDialog @@ -2593,6 +2657,22 @@ p, li { white-space: pre-wrap; } Built-in virtual keyboard button size: + + Grid + + + + On Dark Background + Sobre fondo oscuro + + + Opacity + Opacidad + + + On Light Background + Sobre fondo claro + trapFlashDialog diff --git a/resources/i18n/OpenBoard_fr.ts b/resources/i18n/OpenBoard_fr.ts index d0e08a3b..15a12773 100644 --- a/resources/i18n/OpenBoard_fr.ts +++ b/resources/i18n/OpenBoard_fr.ts @@ -117,11 +117,11 @@ Grid Light Background - Grille sur fond clair + Fond quadrillé clair Grid Dark Background - Grille sur fond foncé + Fond quadrillé foncé Start Screen Recording @@ -800,6 +800,18 @@ Open the tutorial web page Ouvrir la page Web des tutoriels + + Ruled Light Background + Fond ligné clair + + + Ruled Dark Background + Fond ligné foncé + + + Reset grid size + Réinitialiser la taille du quadrillage + PasswordDialog @@ -891,6 +903,21 @@ Update Mettre à jour + + Drawing active scene and thumbnail previews + Dessin de la page active et des aperçus + + + Board drawing... + Dessin du tableau... + + + + UBBackgroundPalette + + Grid size + Taille du quadrillage + UBBoardController @@ -920,7 +947,7 @@ Delete page %1 from document - Supprimer la page %1 du document + Supprimer la page %1 du document Page %1 deleted @@ -946,6 +973,10 @@ Document has just been saved... Le document vient d'être sauvegardé... + + Deleting page %1 + Supression de la page %1 + UBBoardPaletteManager @@ -958,6 +989,13 @@ Image capturée + + UBBoardThumbnailsView + + Loading page (%1/%2) + Chargement page (%1/%2) + + UBCachePropertiesWidget @@ -1202,7 +1240,7 @@ UBDocumentNavigator Page %0 - Page %0 + Page %0 @@ -1234,12 +1272,39 @@ Annuler + + UBDraggableThumbnailView + + Page %0 + Page %0 + + UBExportAdaptor Warnings during export was appeared Avertissements lors de l'exportation + + Exporting document... + Export du document... + + + Export failed + Echec de l'export + + + Unable to export to the selected location. You do not have the permissions necessary to save the file. + Impossible d'exporter dans le dossier sélectionné. Vous n'avez pas les permissions nécessaires pour sauvegarder le fichier. + + + Export failed: location not writable + Impossible d'exporter: pas de droits d'écriture dans le répertoire + + + Export successful. + Export réussi. + UBExportCFF @@ -1272,7 +1337,7 @@ Export successful. - Export réussi. + Export réussi. Page @@ -1280,7 +1345,7 @@ Exporting document... - Exportation du document... + Exportation du document... Exporting %1 %2 of %3 @@ -1292,15 +1357,15 @@ Export failed: location not writable - Impossible d'exporter: pas de droits d'écriture dans le répertoire + Impossible d'exporter: pas de droits d'écriture dans le répertoire Export failed - Echec de l'export + Echec de l'export Unable to export to the selected location. You do not have the permissions necessary to save the file. - Impossible d'exporter dans le dossier sélectionné. Vous n'avez pas les permissions nécessaires pour sauvegarder le fichier. + Impossible d'exporter dans le dossier sélectionné. Vous n'avez pas les permissions nécessaires pour sauvegarder le fichier. @@ -1311,7 +1376,7 @@ Exporting document... - Exportation du document... + Exportation du document... Export to PDF @@ -1319,19 +1384,19 @@ Export successful. - Export terminé. + Export terminé. Export failed: location not writable - Impossible d'exporter: pas de droits d'écriture dans le répertoire + Impossible d'exporter: pas de droits d'écriture dans le répertoire Export failed - Echec de l'export + Echec de l'export Unable to export to the selected location. You do not have the permissions necessary to save the file. - Impossible d'exporter dans le dossier sélectionné. Vous n'avez pas les permissions nécessaires pour sauvegarder le fichier. + Impossible d'exporter dans le dossier sélectionné. Vous n'avez pas les permissions nécessaires pour sauvegarder le fichier. @@ -1346,11 +1411,11 @@ Export successful. - Export terminé. + Export terminé. Exporting document... - Exportation du document... + Exportation du document... Export to PDF @@ -1394,7 +1459,7 @@ Set as background j'ai choisi de rendre le bouton plus compact (mais info moins complète) - Ajout en fond + Ajout en fond Add to library @@ -1535,6 +1600,10 @@ Go to Content Source Aller à la source du contenu + + Set as background + Mettre en fond de page + UBGraphicsMediaItem @@ -1785,6 +1854,18 @@ Voulez-vous ignorer les erreurs pour ce serveur ? has lost access to the document repository '%1'. Unfortunately the application must shut down to avoid data corruption. Latest changes may be lost as well. a perdu l'accès au répertoire des documents '%1'. Malheureusement, l'application sera fermée afin d'éviter la corruption des données. Les dernières modifications pourraient être également perdues. + + saving document thumbnail for the page %1 + Sauvegarde aperçu page %1 + + + Saving thumbnail of page %1 + Sauvegarde aperçu page %1 + + + Moving page to trash folder... + Déplacement de la page dans la corbeille... + UBPlatformUtils @@ -1948,6 +2029,17 @@ Voulez-vous ignorer les erreurs pour ce serveur ? %1 thumbnails generated ... %1 vignettes créées ... + + loading thumbnail of page %1 + Chargement aperçu page %1 + + + + UBThumbnailTextItem + + Page %0 + Page %0 + UBToolsManager @@ -2420,10 +2512,26 @@ p, li { white-space: pre-wrap; } Fine Fine + + Show preview circle from + Visualiser la taille dès + Pen is Pressure Sensitive Stylet sensible à la pression + + Smooth strokes (experimental) + Lissage des traits (expérimental) + + + Simplify strokes after drawing (experimental) + Simplification des traits post-dessin (expérimental) + + + px + px + capturePublishingDialog @@ -2609,6 +2717,22 @@ p, li { white-space: pre-wrap; } Built-in virtual keyboard button size: Taille des touches du clavier virtuel integré : + + Grid + Quadrillage + + + On Dark Background + Sur fond foncé + + + Opacity + Opacité + + + On Light Background + Sur fond clair + trapFlashDialog diff --git a/resources/i18n/OpenBoard_fr_CH.ts b/resources/i18n/OpenBoard_fr_CH.ts index 6bd567b4..e69ec1d0 100644 --- a/resources/i18n/OpenBoard_fr_CH.ts +++ b/resources/i18n/OpenBoard_fr_CH.ts @@ -117,11 +117,11 @@ Grid Light Background - Grille sur fond clair + Fond quadrillé clair Grid Dark Background - Grille sur fond foncé + Fond quadrillé foncé Start Screen Recording @@ -800,6 +800,18 @@ Open the tutorial web page Ouvrir la page Web des tutoriels + + Ruled Light Background + Fond ligné clair + + + Ruled Dark Background + Fond ligné foncé + + + Reset grid size + Réinitialiser la taille du quadrillage + PasswordDialog @@ -891,6 +903,21 @@ Update Mettre à jour + + Drawing active scene and thumbnail previews + Dessin de la page active et des aperçus + + + Board drawing... + Dessin du tableau... + + + + UBBackgroundPalette + + Grid size + Taille du quadrillage + UBBoardController @@ -920,7 +947,7 @@ Delete page %1 from document - Supprimer la page %1 du document + Supprimer la page %1 du document Page %1 deleted @@ -946,6 +973,10 @@ Document has just been saved... Le document vient d'être sauvegardé... + + Deleting page %1 + Supression de la page %1 + UBBoardPaletteManager @@ -958,6 +989,13 @@ Image capturée + + UBBoardThumbnailsView + + Loading page (%1/%2) + Chargement page (%1/%2) + + UBCachePropertiesWidget @@ -1202,7 +1240,7 @@ UBDocumentNavigator Page %0 - Page %0 + Page %0 @@ -1234,12 +1272,39 @@ Annuler + + UBDraggableThumbnailView + + Page %0 + Page %0 + + UBExportAdaptor Warnings during export was appeared Avertissements lors de l'exportation + + Exporting document... + Export du document... + + + Export failed + Echec de l'export + + + Unable to export to the selected location. You do not have the permissions necessary to save the file. + Impossible d'exporter dans le dossier sélectionné. Vous n'avez pas les permissions nécessaires pour sauvegarder le fichier. + + + Export failed: location not writable + Impossible d'exporter: pas de droits d'écriture dans le répertoire + + + Export successful. + Export réussi. + UBExportCFF @@ -1272,7 +1337,7 @@ Export successful. - Export réussi. + Export réussi. Page @@ -1280,7 +1345,7 @@ Exporting document... - Exportation du document... + Exportation du document... Exporting %1 %2 of %3 @@ -1292,15 +1357,15 @@ Export failed: location not writable - Impossible d'exporter: pas de droits d'écriture dans le répertoire + Impossible d'exporter: pas de droits d'écriture dans le répertoire Export failed - Echec de l'export + Echec de l'export Unable to export to the selected location. You do not have the permissions necessary to save the file. - Impossible d'exporter dans le dossier sélectionné. Vous n'avez pas les permissions nécessaires pour sauvegarder le fichier. + Impossible d'exporter dans le dossier sélectionné. Vous n'avez pas les permissions nécessaires pour sauvegarder le fichier. @@ -1311,7 +1376,7 @@ Exporting document... - Exportation du document... + Exportation du document... Export to PDF @@ -1319,19 +1384,19 @@ Export successful. - Export terminé. + Export terminé. Export failed: location not writable - Impossible d'exporter: pas de droits d'écriture dans le répertoire + Impossible d'exporter: pas de droits d'écriture dans le répertoire Export failed - Echec de l'export + Echec de l'export Unable to export to the selected location. You do not have the permissions necessary to save the file. - Impossible d'exporter dans le dossier sélectionné. Vous n'avez pas les permissions nécessaires pour sauvegarder le fichier. + Impossible d'exporter dans le dossier sélectionné. Vous n'avez pas les permissions nécessaires pour sauvegarder le fichier. @@ -1346,11 +1411,11 @@ Export successful. - Export terminé. + Export terminé. Exporting document... - Exportation du document... + Exportation du document... Export to PDF @@ -1394,7 +1459,7 @@ Set as background j'ai choisi de rendre le bouton plus compact (mais info moins complète) - Ajout en fond + mettre en fond de page Add to library @@ -1535,6 +1600,10 @@ Go to Content Source Aller à la source du contenu + + Set as background + mettre en fond de page + UBGraphicsMediaItem @@ -1785,6 +1854,18 @@ Voulez-vous ignorer les erreurs pour ce serveur ? has lost access to the document repository '%1'. Unfortunately the application must shut down to avoid data corruption. Latest changes may be lost as well. a perdu l'accès au répertoire des documents '%1'. Malheureusement, l'application sera fermée afin d'éviter la corruption des données. Les dernières modifications pourraient être également perdues. + + saving document thumbnail for the page %1 + Sauvegarde aperçu page %1 + + + Saving thumbnail of page %1 + Sauvegarde aperçu page %1 + + + Moving page to trash folder... + Déplacement de la page dans la corbeille... + UBPlatformUtils @@ -1948,6 +2029,17 @@ Voulez-vous ignorer les erreurs pour ce serveur ? %1 thumbnails generated ... %1 vignettes créées ... + + loading thumbnail of page %1 + Chargement aperçu page %1 + + + + UBThumbnailTextItem + + Page %0 + Page %0 + UBToolsManager @@ -2420,10 +2512,26 @@ p, li { white-space: pre-wrap; } Fine Fine + + Show preview circle from + Visualiser la taille dès + Pen is Pressure Sensitive Stylet sensible à la pression + + Smooth strokes (experimental) + Lissage des traits (expérimental) + + + Simplify strokes after drawing (experimental) + Simplification des traits post-dessin (expérimental) + + + px + px + capturePublishingDialog @@ -2609,6 +2717,22 @@ p, li { white-space: pre-wrap; } Built-in virtual keyboard button size: Taille des touches du clavier virtuel integré : + + Grid + Quadrillage + + + On Dark Background + Sur fond foncé + + + Opacity + Opacité + + + On Light Background + Sur fond clair + trapFlashDialog diff --git a/resources/i18n/OpenBoard_it.ts b/resources/i18n/OpenBoard_it.ts index a65aef29..98dde0df 100644 --- a/resources/i18n/OpenBoard_it.ts +++ b/resources/i18n/OpenBoard_it.ts @@ -1,6 +1,6 @@ - + BlackoutWidget @@ -799,6 +799,18 @@ Open the tutorial web page Apri la pagina web del tutorial + + Ruled Light Background + Sfondo chiaro lineato + + + Ruled Dark Background + Sfundo scuro lineato + + + Reset grid size + Ripristina la dimensione della griglia + PasswordDialog @@ -842,11 +854,11 @@ QObject Element ID = - Elemento ID = + Elemento ID = Content is not supported in destination format. - Il contenuto non è supportato nel formato di destinazione. + Il contenuto non è supportato nel formato di destinazione. Remove Page @@ -890,6 +902,17 @@ Update Aggiornamento + + Board drawing... + Disegno della lavagna... + + + + UBBackgroundPalette + + Grid size + Dimensione della griglia + UBBoardController @@ -919,7 +942,7 @@ Delete page %1 from document - Rimuovi pagina %1 dal documento + Rimuovi pagina %1 dal documento Page %1 deleted @@ -945,6 +968,10 @@ Document has just been saved... Il documento è stato appena salvato... + + Deleting page %1 + eliminazione della pagina %1 + UBBoardPaletteManager @@ -957,6 +984,13 @@ ImmagineCatturata + + UBBoardThumbnailsView + + Loading page (%1/%2) + Caricamento pagina (%1/%2) + + UBCachePropertiesWidget @@ -1196,7 +1230,7 @@ UBDocumentNavigator Page %0 - Pagina %0 + Pagina %0 @@ -1211,7 +1245,7 @@ %1 pages copied - + %1 pagina copiata %1 pagine copiate @@ -1228,34 +1262,61 @@ Annulla + + UBDraggableThumbnailView + + Page %0 + Pagina %0 + + UBExportAdaptor Warnings during export was appeared È apparso un avviso durante l'esportazione + + Exporting document... + Esportazione documento in corso... + + + Export failed + Esportazione fallita + + + Unable to export to the selected location. You do not have the permissions necessary to save the file. + + + + Export failed: location not writable + + + + Export successful. + + UBExportCFF Export to IWB - Esporta in IWB + Esporta in IWB Export as IWB File - Esporta come file IWB + Esporta come file IWB Exporting document... - Esportazione documento in corso... + Esportazione documento in corso... Export successful. - Esportazione conclusa con successo. + Esportazione conclusa con successo. Export failed. - Esportazione fallita. + Esportazione fallita. @@ -1270,11 +1331,11 @@ Exporting document... - Esportazione documento in corso... + Esportazione documento in corso... Export successful. - Esportazione completata con successo. + Esportazione completata con successo. Exporting %1 %2 of %3 @@ -1286,15 +1347,15 @@ Export failed: location not writable - Exportazione fallita: posizione non scrivibile + Exportazione fallita: posizione non scrivibile Export failed - Esportazione fallita + Esportazione fallita Unable to export to the selected location. You do not have the permissions necessary to save the file. - Impossibile esportare nella posizione selezionata. Non possiedi i permessi necessari a salvare il file. + Impossibile esportare nella posizione selezionata. Non possiedi i permessi necessari a salvare il file. @@ -1305,11 +1366,11 @@ Exporting document... - Esportazione documento in corso... + Esportazione documento in corso... Export successful. - Esportazione completata con successo. + Esportazione completata con successo. Export to PDF @@ -1317,15 +1378,15 @@ Export failed: location not writable - Esportazione fallita: posizione non scrivibile + Esportazione fallita: posizione non scrivibile Export failed - Esportazione fallita + Esportazione fallita Unable to export to the selected location. You do not have the permissions necessary to save the file. - Impossibile esportare alla posizione selezionata. Non possiedi i permessi necessari a salvare il file. + Impossibile esportare alla posizione selezionata. Non possiedi i permessi necessari a salvare il file. @@ -1336,11 +1397,11 @@ Exporting document... - Esportazione documento in corso... + Esportazione documento in corso... Export successful. - Esportazione riuscita. + Esportazione riuscita. Exporting page %1 of %2 @@ -1386,7 +1447,7 @@ Set as background - Imposta come sfondo + Imposta come sfondo Add to library @@ -1526,6 +1587,10 @@ Go to Content Source Vai alla sorgente del contenuto + + Set as background + Imposta come sfondo + UBGraphicsMediaItem @@ -1593,23 +1658,23 @@ UBImportCFF Common File Format ( - Common File Format ( + Common File Format ( Importing file %1... - Importazione del file %1 in corso... + Importazione del file %1 in corso... Import of file %1 failed. - L'importazione del file %1 è fallita. + L'importazione del file %1 è fallita. Import successful. - Importazione completata con successo. + Importazione completata con successo. Import failed. - Importazione fallita. + Importazione fallita. @@ -1776,6 +1841,14 @@ Vuoi ignorare gli errori per questo host? has lost access to the document repository '%1'. Unfortunately the application must shut down to avoid data corruption. Latest changes may be lost as well. ha perso l'accesso al repository documenti "%1". Sfortunatamente l'applicazione deve essere chiusa per evitare di rivinare i dati. Gli ultimi cambiamenti potrebbero andare persi. + + Saving thumbnail of page %1 + Salvataggio della miniatura della pagina %1 + + + Moving page to trash folder... + Spostamento della pagina nella cartella del cestino... + UBPlatformUtils @@ -1939,6 +2012,17 @@ Vuoi ignorare gli errori per questo host? %1 thumbnails generated ... %1 miniature generate... + + loading thumbnail of page %1 + Caricamento miniatura della pagina %1 + + + + UBThumbnailTextItem + + Page %0 + Pagina %0 + UBToolsManager @@ -2414,6 +2498,14 @@ p, li { white-space: pre-wrap; } Pen is Pressure Sensitive La penna è sensibile alla pressione + + Show preview circle from + Mostra l'anteprima del cerchio a partire da + + + px + px + capturePublishingDialog @@ -2485,7 +2577,7 @@ p, li { white-space: pre-wrap; } Keyboard button size: - Dimensione pulsanti tastiera: + Dimensione pulsanti tastiera: Toolbar @@ -2599,6 +2691,22 @@ p, li { white-space: pre-wrap; } Built-in virtual keyboard button size: Dimensione pulsanti tastiera virtuale incorporata: + + Grid + Griglia + + + On Light Background + Su sfondo chiaro + + + Opacity + Opacità + + + On Dark Background + Su sfondo scuro + trapFlashDialog diff --git a/resources/i18n/OpenBoard_iw.ts b/resources/i18n/OpenBoard_iw.ts index 0d98c054..7b1f382c 100644 --- a/resources/i18n/OpenBoard_iw.ts +++ b/resources/i18n/OpenBoard_iw.ts @@ -800,6 +800,18 @@ Open the tutorial web page + + Ruled Light Background + + + + Ruled Dark Background + + + + Reset grid size + + PasswordDialog @@ -891,6 +903,17 @@ Update עדכון + + Board drawing... + + + + + UBBackgroundPalette + + Grid size + + UBBoardController @@ -920,7 +943,7 @@ Delete page %1 from document - מחק עמוד %1 מהמסמך + מחק עמוד %1 מהמסמך Page %1 deleted @@ -946,6 +969,10 @@ Document has just been saved... + + Deleting page %1 + + UBBoardPaletteManager @@ -958,6 +985,13 @@ תמונה שנלכדה + + UBBoardThumbnailsView + + Loading page (%1/%2) + + + UBCachePropertiesWidget @@ -1197,7 +1231,7 @@ UBDocumentNavigator Page %0 - עמוד %0 + עמוד %0 @@ -1229,6 +1263,13 @@ בטל + + UBDraggableThumbnailView + + Page %0 + עמוד %0 + + UBExportAdaptor @@ -1236,6 +1277,26 @@ I don't understand this sentence + + Exporting document... + מייצא מסמך... + + + Export failed + + + + Unable to export to the selected location. You do not have the permissions necessary to save the file. + + + + Export failed: location not writable + + + + Export successful. + הייצוא בוצע בהצלחה. + UBExportCFF @@ -1272,11 +1333,11 @@ Exporting document... - מייצא מסמך... + מייצא מסמך... Export successful. - הייצוא בוצע בהצלחה. + הייצוא בוצע בהצלחה. Exporting %1 %2 of %3 @@ -1286,18 +1347,6 @@ Export to OpenBoard Format - - Export failed: location not writable - - - - Export failed - - - - Unable to export to the selected location. You do not have the permissions necessary to save the file. - - UBExportFullPDF @@ -1307,28 +1356,16 @@ Exporting document... - מייצא מסמך... + מייצא מסמך... Export successful. - הייצוא בוצע בהצלחה. + הייצוא בוצע בהצלחה. Export to PDF ייצא ל- PDF - - Export failed: location not writable - - - - Export failed - - - - Unable to export to the selected location. You do not have the permissions necessary to save the file. - - UBExportPDF @@ -1338,11 +1375,11 @@ Exporting document... - מייצא מסמך... + מייצא מסמך... Export successful. - הייצוא בוצע בהצלחה. + הייצוא בוצע בהצלחה. Exporting page %1 of %2 @@ -1388,7 +1425,7 @@ Set as background - קבע כרקע + קבע כרקע Add to library @@ -1528,6 +1565,10 @@ Go to Content Source עבור למקור התוכן + + Set as background + קבע כרקע + UBGraphicsMediaItem @@ -1773,6 +1814,10 @@ Do you want to ignore these errors for this host? has lost access to the document repository '%1'. Unfortunately the application must shut down to avoid data corruption. Latest changes may be lost as well. + + Moving page to trash folder... + + UBPlatformUtils @@ -1936,6 +1981,17 @@ Do you want to ignore these errors for this host? %1 thumbnails generated ... נוצרה תמונה מוקטנת של %1... + + loading thumbnail of page %1 + + + + + UBThumbnailTextItem + + Page %0 + עמוד %0 + UBToolsManager @@ -2407,6 +2463,14 @@ p, li { white-space: pre-wrap; } Pen is Pressure Sensitive העט רגיש ללחץ + + Show preview circle from + + + + px + + capturePublishingDialog @@ -2592,6 +2656,22 @@ p, li { white-space: pre-wrap; } Built-in virtual keyboard button size: + + Grid + + + + On Dark Background + על רקע כהה + + + Opacity + אטימות + + + On Light Background + על רקע בהיר + trapFlashDialog diff --git a/resources/i18n/OpenBoard_ja.ts b/resources/i18n/OpenBoard_ja.ts index 05290e17..fa5d596f 100644 --- a/resources/i18n/OpenBoard_ja.ts +++ b/resources/i18n/OpenBoard_ja.ts @@ -799,6 +799,18 @@ Open the tutorial web page + + Ruled Light Background + + + + Ruled Dark Background + + + + Reset grid size + + PasswordDialog @@ -882,6 +894,17 @@ Update 更新 + + Board drawing... + + + + + UBBackgroundPalette + + Grid size + + UBBoardController @@ -917,10 +940,6 @@ Ungroup - - Delete page %1 from document - - Page %1 deleted @@ -937,6 +956,10 @@ Document has just been saved... + + Deleting page %1 + + UBBoardPaletteManager @@ -949,6 +972,13 @@ キャプチャされた画像 + + UBBoardThumbnailsView + + Loading page (%1/%2) + + + UBCachePropertiesWidget @@ -1187,7 +1217,7 @@ UBDocumentNavigator Page %0 - %0ページ + %0ページ @@ -1218,12 +1248,39 @@ キャンセル + + UBDraggableThumbnailView + + Page %0 + %0ページ + + UBExportAdaptor Warnings during export was appeared + + Exporting document... + ドキュメントのエクスポート中... + + + Export failed + + + + Unable to export to the selected location. You do not have the permissions necessary to save the file. + + + + Export failed: location not writable + + + + Export successful. + + UBExportCFF @@ -1260,11 +1317,11 @@ Exporting document... - ドキュメントのエクスポート中... + ドキュメントのエクスポート中... Export successful. - エクスポートに成功 + エクスポートに成功 Exporting %1 %2 of %3 @@ -1274,18 +1331,6 @@ Export to OpenBoard Format - - Export failed: location not writable - - - - Export failed - - - - Unable to export to the selected location. You do not have the permissions necessary to save the file. - - UBExportFullPDF @@ -1295,28 +1340,16 @@ Exporting document... - ドキュメントのエクスポート中... + ドキュメントのエクスポート中... Export successful. - エクスポートに成功 + エクスポートに成功 Export to PDF PDFへエクスポート - - Export failed: location not writable - - - - Export failed - - - - Unable to export to the selected location. You do not have the permissions necessary to save the file. - - UBExportPDF @@ -1326,11 +1359,11 @@ Exporting document... - ドキュメントのエクスポート中... + ドキュメントのエクスポート中... Export successful. - エクスポートに成功。 + エクスポートに成功。 Exporting page %1 of %2 @@ -1376,7 +1409,7 @@ Set as background - 背景として設定 + 背景として設定 Add to library @@ -1516,6 +1549,10 @@ Go to Content Source コンテンツのソースへ移動 + + Set as background + 背景として設定 + UBGraphicsMediaItem @@ -1767,6 +1804,10 @@ Do you want to ignore these errors for this host? has lost access to the document repository '%1'. Unfortunately the application must shut down to avoid data corruption. Latest changes may be lost as well. + + Moving page to trash folder... + + UBPlatformUtils @@ -1930,6 +1971,17 @@ Do you want to ignore these errors for this host? %1 thumbnails generated ... %1 サムネイル作成済み ... + + loading thumbnail of page %1 + + + + + UBThumbnailTextItem + + Page %0 + %0ページ + UBToolsManager @@ -2401,6 +2453,14 @@ p, li { white-space: pre-wrap; } Pen is Pressure Sensitive ペンは感圧性です。 + + Show preview circle from + + + + px + + capturePublishingDialog @@ -2586,6 +2646,22 @@ p, li { white-space: pre-wrap; } Built-in virtual keyboard button size: + + Grid + + + + On Dark Background + 暗い背景で + + + Opacity + 不透明性 + + + On Light Background + 明るい背景で + trapFlashDialog diff --git a/resources/i18n/OpenBoard_ko.ts b/resources/i18n/OpenBoard_ko.ts index 0f51affd..6e7e8575 100644 --- a/resources/i18n/OpenBoard_ko.ts +++ b/resources/i18n/OpenBoard_ko.ts @@ -799,6 +799,18 @@ Open the tutorial web page + + Ruled Light Background + + + + Ruled Dark Background + + + + Reset grid size + + PasswordDialog @@ -890,6 +902,17 @@ Update 업데이트 + + Board drawing... + + + + + UBBackgroundPalette + + Grid size + + UBBoardController @@ -919,7 +942,7 @@ Delete page %1 from document - 문서에서 %1페이지 삭제 + 문서에서 %1페이지 삭제 Page %1 deleted @@ -945,6 +968,10 @@ Document has just been saved... + + Deleting page %1 + + UBBoardPaletteManager @@ -957,6 +984,13 @@ 캡처한 이미지 + + UBBoardThumbnailsView + + Loading page (%1/%2) + + + UBCachePropertiesWidget @@ -1195,7 +1229,7 @@ UBDocumentNavigator Page %0 - %0 페이지 + %0 페이지 @@ -1229,12 +1263,39 @@ 취소 + + UBDraggableThumbnailView + + Page %0 + %0 페이지 + + UBExportAdaptor Warnings during export was appeared 내보내는 도중 경고가 나타났습니다 + + Exporting document... + 문서를 내보내는 중... + + + Export failed + + + + Unable to export to the selected location. You do not have the permissions necessary to save the file. + + + + Export failed: location not writable + + + + Export successful. + 내보내기 완료. + UBExportCFF @@ -1271,11 +1332,11 @@ Exporting document... - 문서를 내보내는 중... + 문서를 내보내는 중... Export successful. - 내보내기 완료. + 내보내기 완료. Exporting %1 %2 of %3 @@ -1285,18 +1346,6 @@ Export to OpenBoard Format - - Export failed: location not writable - - - - Export failed - - - - Unable to export to the selected location. You do not have the permissions necessary to save the file. - - UBExportFullPDF @@ -1306,28 +1355,16 @@ Exporting document... - 문서를 내보내는 중... + 문서를 내보내는 중... Export successful. - 내보내기 완료. + 내보내기 완료. Export to PDF PDF로 내보내기 - - Export failed: location not writable - - - - Export failed - - - - Unable to export to the selected location. You do not have the permissions necessary to save the file. - - UBExportPDF @@ -1337,11 +1374,11 @@ Exporting document... - 문서를 내보내는 중... + 문서를 내보내는 중... Export successful. - 내보내기 완료. + 내보내기 완료. Exporting page %1 of %2 @@ -1387,7 +1424,7 @@ Set as background - 배경으로 지정 + 배경으로 지정 Add to library @@ -1527,6 +1564,10 @@ Go to Content Source 콘텐츠 소스로 이동 + + Set as background + 배경으로 지정 + UBGraphicsMediaItem @@ -1777,6 +1818,10 @@ Do you want to ignore these errors for this host? has lost access to the document repository '%1'. Unfortunately the application must shut down to avoid data corruption. Latest changes may be lost as well. + + Moving page to trash folder... + + UBPlatformUtils @@ -1940,6 +1985,17 @@ Do you want to ignore these errors for this host? %1 thumbnails generated ... %1 썸네일 생성됨 ... + + loading thumbnail of page %1 + + + + + UBThumbnailTextItem + + Page %0 + %0 페이지 + UBToolsManager @@ -2415,6 +2471,14 @@ p, li { white-space: pre-wrap; } Pen is Pressure Sensitive 펜은 압력 감지식입니다 + + Show preview circle from + + + + px + + capturePublishingDialog @@ -2600,6 +2664,22 @@ p, li { white-space: pre-wrap; } Built-in virtual keyboard button size: + + Grid + + + + On Dark Background + 어두운 배경 + + + Opacity + 불투명도 + + + On Light Background + 밝은 배경 + trapFlashDialog diff --git a/resources/i18n/OpenBoard_mg.ts b/resources/i18n/OpenBoard_mg.ts index 8041ef07..eec1f0ed 100644 --- a/resources/i18n/OpenBoard_mg.ts +++ b/resources/i18n/OpenBoard_mg.ts @@ -799,6 +799,18 @@ Open the tutorial web page + + Ruled Light Background + + + + Ruled Dark Background + + + + Reset grid size + + PasswordDialog @@ -890,6 +902,17 @@ Update Avaozy + + Board drawing... + + + + + UBBackgroundPalette + + Grid size + + UBBoardController @@ -919,7 +942,7 @@ Delete page %1 from document - Fafao ny pejy %1 amin'ilay rakitra + Fafao ny pejy %1 amin'ilay rakitra Page %1 deleted @@ -945,6 +968,10 @@ Document has just been saved... + + Deleting page %1 + + UBBoardPaletteManager @@ -957,6 +984,13 @@ Sary nalaina + + UBBoardThumbnailsView + + Loading page (%1/%2) + + + UBCachePropertiesWidget @@ -1196,7 +1230,7 @@ UBDocumentNavigator Page %0 - Pejy %0 + Pejy %0 @@ -1228,12 +1262,39 @@ Ajanony + + UBDraggableThumbnailView + + Page %0 + Pejy %0 + + UBExportAdaptor Warnings during export was appeared Nisy fitandremana niseho tamin'ny fandefasana ny rakitra + + Exporting document... + + + + Export failed + + + + Unable to export to the selected location. You do not have the permissions necessary to save the file. + + + + Export failed: location not writable + + + + Export successful. + Fandefasana nety. + UBExportCFF @@ -1270,11 +1331,11 @@ Exporting document... - Mandefa rakitra ... + Mandefa rakitra ... Export successful. - Fandefasana nety. + Fandefasana nety. Exporting %1 %2 of %3 @@ -1284,18 +1345,6 @@ Export to OpenBoard Format - - Export failed: location not writable - - - - Export failed - - - - Unable to export to the selected location. You do not have the permissions necessary to save the file. - - UBExportFullPDF @@ -1305,7 +1354,7 @@ Exporting document... - Mandefa ny rakitra ... + Mandefa ny rakitra ... Export to PDF @@ -1313,19 +1362,7 @@ Export successful. - Fandefasana nety. - - - Export failed: location not writable - - - - Export failed - - - - Unable to export to the selected location. You do not have the permissions necessary to save the file. - + Fandefasana nety. @@ -1340,11 +1377,11 @@ Export successful. - Fandefasana nety. + Fandefasana nety. Exporting document... - Mandefa rakitra ... + Mandefa rakitra ... Export to PDF @@ -1386,7 +1423,7 @@ Set as background - Apetraka ambadika + Apetraka ambadika Add to library @@ -1526,6 +1563,10 @@ Go to Content Source Hande any amin'ny fototr'ilay mpiatiny + + Set as background + Apetraka ambadika + UBGraphicsMediaItem @@ -1776,6 +1817,10 @@ Tena tsy te hiraharaha an'ireo tsy mety ho an'ilay milina ve ianao?has lost access to the document repository '%1'. Unfortunately the application must shut down to avoid data corruption. Latest changes may be lost as well. + + Moving page to trash folder... + + UBPlatformUtils @@ -1939,6 +1984,17 @@ Tena tsy te hiraharaha an'ireo tsy mety ho an'ilay milina ve ianao?%1 thumbnails generated ... %1 ny kisarisary no voaforona ... + + loading thumbnail of page %1 + + + + + UBThumbnailTextItem + + Page %0 + Pejy %0 + UBToolsManager @@ -2414,6 +2470,14 @@ p, li { white-space: pre-wrap; } Pen is Pressure Sensitive Ny penina dia sarotiny amin'ny fitsindrina + + Show preview circle from + + + + px + + capturePublishingDialog @@ -2599,6 +2663,22 @@ p, li { white-space: pre-wrap; } Built-in virtual keyboard button size: + + Grid + + + + On Dark Background + Amin'ny ambadika maizina + + + Opacity + Hateviny + + + On Light Background + Amin'ny ambadika mazava + trapFlashDialog diff --git a/resources/i18n/OpenBoard_nb.ts b/resources/i18n/OpenBoard_nb.ts index b9e12e8c..1a883288 100644 --- a/resources/i18n/OpenBoard_nb.ts +++ b/resources/i18n/OpenBoard_nb.ts @@ -799,6 +799,18 @@ Open the tutorial web page + + Ruled Light Background + + + + Ruled Dark Background + + + + Reset grid size + + PasswordDialog @@ -890,6 +902,17 @@ Update Oppdatering + + Board drawing... + + + + + UBBackgroundPalette + + Grid size + + UBBoardController @@ -919,7 +942,7 @@ Delete page %1 from document - Slett side %1 fra dokument + Slett side %1 fra dokument Page %1 deleted @@ -945,6 +968,10 @@ Document has just been saved... + + Deleting page %1 + + UBBoardPaletteManager @@ -957,6 +984,13 @@ Tatt bilde + + UBBoardThumbnailsView + + Loading page (%1/%2) + + + UBCachePropertiesWidget @@ -1197,7 +1231,7 @@ UBDocumentNavigator Page %0 - Side %0 + Side %0 @@ -1229,12 +1263,39 @@ Avbryt + + UBDraggableThumbnailView + + Page %0 + Side %0 + + UBExportAdaptor Warnings during export was appeared Advarsler under eksport ble vist + + Exporting document... + Eksporterer dokument ... + + + Export failed + + + + Unable to export to the selected location. You do not have the permissions necessary to save the file. + + + + Export failed: location not writable + + + + Export successful. + Eksport gjennomført. + UBExportCFF @@ -1271,11 +1332,11 @@ Exporting document... - Eksporterer dokument ... + Eksporterer dokument ... Export successful. - Eksport gjennomført. + Eksport gjennomført. Exporting %1 %2 of %3 @@ -1285,18 +1346,6 @@ Export to OpenBoard Format - - Export failed: location not writable - - - - Export failed - - - - Unable to export to the selected location. You do not have the permissions necessary to save the file. - - UBExportFullPDF @@ -1306,28 +1355,16 @@ Exporting document... - Eksporterer dokument ... + Eksporterer dokument ... Export successful. - Eksport gjennomført. + Eksport gjennomført. Export to PDF Eksporter til PDF - - Export failed: location not writable - - - - Export failed - - - - Unable to export to the selected location. You do not have the permissions necessary to save the file. - - UBExportPDF @@ -1337,11 +1374,11 @@ Exporting document... - Eksporterer dokument ... + Eksporterer dokument ... Export successful. - Eksport gjennomført. + Eksport gjennomført. Exporting page %1 of %2 @@ -1387,7 +1424,7 @@ Set as background - Bruk som bakgrunn + Bruk som bakgrunn Add to library @@ -1527,6 +1564,10 @@ Go to Content Source Gå til kildeinnhold + + Set as background + Bruk som bakgrunn + UBGraphicsMediaItem @@ -1772,6 +1813,10 @@ Do you want to ignore these errors for this host? has lost access to the document repository '%1'. Unfortunately the application must shut down to avoid data corruption. Latest changes may be lost as well. + + Moving page to trash folder... + + UBPlatformUtils @@ -1935,6 +1980,17 @@ Do you want to ignore these errors for this host? %1 thumbnails generated ... %1 miniatyrbilder generert ... + + loading thumbnail of page %1 + + + + + UBThumbnailTextItem + + Page %0 + Side %0 + UBToolsManager @@ -2409,6 +2465,14 @@ p, li { white-space: pre-wrap; } Pen is Pressure Sensitive Pennen er trykksensitiv + + Show preview circle from + + + + px + + capturePublishingDialog @@ -2596,6 +2660,22 @@ p, li { white-space: pre-wrap; } Built-in virtual keyboard button size: + + Grid + + + + On Dark Background + Med mørk bakgrunn + + + Opacity + Ugjennomsiktig + + + On Light Background + Med lys bakgrunn + trapFlashDialog diff --git a/resources/i18n/OpenBoard_nl.ts b/resources/i18n/OpenBoard_nl.ts index b4ba1bff..ccbd4741 100644 --- a/resources/i18n/OpenBoard_nl.ts +++ b/resources/i18n/OpenBoard_nl.ts @@ -761,7 +761,7 @@ OpenBoard - Sankoré openen + OpenBoard Quit OpenBoard @@ -799,6 +799,18 @@ Open the tutorial web page + + Ruled Light Background + + + + Ruled Dark Background + + + + Reset grid size + + PasswordDialog @@ -882,6 +894,17 @@ Update Update + + Board drawing... + + + + + UBBackgroundPalette + + Grid size + + UBBoardController @@ -909,10 +932,6 @@ All Supported (%1) Alle ondersteunden (%1) - - Delete page %1 from document - - Page %1 deleted @@ -937,6 +956,10 @@ Document has just been saved... + + Deleting page %1 + + UBBoardPaletteManager @@ -949,6 +972,13 @@ Gegrepen afbeelding + + UBBoardThumbnailsView + + Loading page (%1/%2) + + + UBCachePropertiesWidget @@ -1188,7 +1218,7 @@ UBDocumentNavigator Page %0 - Pagina %0 + Pagina %0 @@ -1220,12 +1250,39 @@ Annuleren + + UBDraggableThumbnailView + + Page %0 + Pagina %0 + + UBExportAdaptor Warnings during export was appeared + + Exporting document... + Document wordt geëxporteerd... + + + Export failed + + + + Unable to export to the selected location. You do not have the permissions necessary to save the file. + + + + Export failed: location not writable + + + + Export successful. + Export gelukt. + UBExportCFF @@ -1262,11 +1319,11 @@ Exporting document... - Document wordt geëxporteerd... + Document wordt geëxporteerd... Export successful. - Export gelukt. + Export gelukt. Exporting %1 %2 of %3 @@ -1276,18 +1333,6 @@ Export to OpenBoard Format - - Export failed: location not writable - - - - Export failed - - - - Unable to export to the selected location. You do not have the permissions necessary to save the file. - - UBExportFullPDF @@ -1297,28 +1342,16 @@ Exporting document... - Document wordt geëxporteerd... + Document wordt geëxporteerd... Export successful. - Export gelukt. + Export gelukt. Export to PDF Exporteren naar PDF bestand - - Export failed: location not writable - - - - Export failed - - - - Unable to export to the selected location. You do not have the permissions necessary to save the file. - - UBExportPDF @@ -1328,11 +1361,11 @@ Exporting document... - Document wordt geëxporteerd... + Document wordt geëxporteerd... Export successful. - Export gelukt. + Export gelukt. Exporting page %1 of %2 @@ -1378,7 +1411,7 @@ Set as background - Als achtergrond gebruiken + Als achtergrond gebruiken Add to library @@ -1518,6 +1551,10 @@ Go to Content Source Naar inhoudsbron + + Set as background + Als achtergrond gebruiken + UBGraphicsMediaItem @@ -1762,6 +1799,10 @@ Do you want to ignore these errors for this host? has lost access to the document repository '%1'. Unfortunately the application must shut down to avoid data corruption. Latest changes may be lost as well. + + Moving page to trash folder... + + UBPlatformUtils @@ -1925,6 +1966,17 @@ Do you want to ignore these errors for this host? %1 thumbnails generated ... %1 miniaturen opgeladen... + + loading thumbnail of page %1 + + + + + UBThumbnailTextItem + + Page %0 + Pagina %0 + UBToolsManager @@ -2399,6 +2451,14 @@ p, li { white-space: pre-wrap; } Pen is Pressure Sensitive Pen is drukgevoelig + + Show preview circle from + + + + px + + capturePublishingDialog @@ -2584,6 +2644,22 @@ p, li { white-space: pre-wrap; } Built-in virtual keyboard button size: + + Grid + + + + On Dark Background + Op een Donkere Achtergrond + + + Opacity + lichtondoorlatendheid + + + On Light Background + Op een Lichte Achtergrond + trapFlashDialog diff --git a/resources/i18n/OpenBoard_pl.ts b/resources/i18n/OpenBoard_pl.ts index 4b13cca1..c059c784 100644 --- a/resources/i18n/OpenBoard_pl.ts +++ b/resources/i18n/OpenBoard_pl.ts @@ -803,6 +803,18 @@ Open the tutorial web page + + Ruled Light Background + + + + Ruled Dark Background + + + + Reset grid size + + PasswordDialog @@ -894,6 +906,17 @@ Update Aktualizacja + + Board drawing... + + + + + UBBackgroundPalette + + Grid size + + UBBoardController @@ -923,7 +946,7 @@ Delete page %1 from document - Usuń stronę %1 z dokumentu + Usuń stronę %1 z dokumentu Page %1 deleted @@ -949,6 +972,10 @@ Document has just been saved... + + Deleting page %1 + + UBBoardPaletteManager @@ -961,6 +988,13 @@ PrzechwyconyObraz + + UBBoardThumbnailsView + + Loading page (%1/%2) + + + UBCachePropertiesWidget @@ -1201,7 +1235,7 @@ UBDocumentNavigator Page %0 - Strona %0 + Strona %0 @@ -1235,12 +1269,39 @@ Anuluj + + UBDraggableThumbnailView + + Page %0 + Strona %0 + + UBExportAdaptor Warnings during export was appeared Podczas eksportowania pojawiły się ostrzeżenia + + Exporting document... + Eksportowanie dokumentu... + + + Export failed + + + + Unable to export to the selected location. You do not have the permissions necessary to save the file. + + + + Export failed: location not writable + + + + Export successful. + Eksportowanie zakończone powodzeniem. + UBExportCFF @@ -1277,11 +1338,11 @@ Exporting document... - Eksportowanie dokumentu... + Eksportowanie dokumentu... Export successful. - Eksportowanie zakończone powodzeniem. + Eksportowanie zakończone powodzeniem. Exporting %1 %2 of %3 @@ -1291,18 +1352,6 @@ Export to OpenBoard Format - - Export failed: location not writable - - - - Export failed - - - - Unable to export to the selected location. You do not have the permissions necessary to save the file. - - UBExportFullPDF @@ -1312,28 +1361,16 @@ Exporting document... - Eksportowanie dokumentu... + Eksportowanie dokumentu... Export successful. - Eksportowanie zakończone powodzeniem. + Eksportowanie zakończone powodzeniem. Export to PDF Eksportowanie do PDF - - Export failed: location not writable - - - - Export failed - - - - Unable to export to the selected location. You do not have the permissions necessary to save the file. - - UBExportPDF @@ -1343,11 +1380,11 @@ Exporting document... - Eksportowanie dokumentu... + Eksportowanie dokumentu... Export successful. - Eksportowanie zakończone powodzeniem. + Eksportowanie zakończone powodzeniem. Exporting page %1 of %2 @@ -1393,7 +1430,7 @@ Set as background - Ustaw jako tło + Ustaw jako tło Add to library @@ -1533,6 +1570,10 @@ Go to Content Source Przejdź do źródła zawartości + + Set as background + Ustaw jako tło + UBGraphicsMediaItem @@ -1783,6 +1824,10 @@ Czy chcesz ignorować te błędy dla tego hosta? has lost access to the document repository '%1'. Unfortunately the application must shut down to avoid data corruption. Latest changes may be lost as well. + + Moving page to trash folder... + + UBPlatformUtils @@ -1946,6 +1991,17 @@ Czy chcesz ignorować te błędy dla tego hosta? %1 thumbnails generated ... Wygenerowano %1 miniatur... + + loading thumbnail of page %1 + + + + + UBThumbnailTextItem + + Page %0 + Strona %0 + UBToolsManager @@ -2425,6 +2481,14 @@ p, li { white-space: pre-wrap; } Pen is Pressure Sensitive Pióro jest czułe na nacisk + + Show preview circle from + + + + px + + capturePublishingDialog @@ -2610,6 +2674,22 @@ p, li { white-space: pre-wrap; } Built-in virtual keyboard button size: + + Grid + + + + On Dark Background + Na ciemnym tle + + + Opacity + Nieprzezroczystość + + + On Light Background + Na jasnym tle + trapFlashDialog diff --git a/resources/i18n/OpenBoard_pt.ts b/resources/i18n/OpenBoard_pt.ts index e1a02ee9..46439908 100644 --- a/resources/i18n/OpenBoard_pt.ts +++ b/resources/i18n/OpenBoard_pt.ts @@ -801,6 +801,18 @@ Open the tutorial web page Abrir a página web de tutorial + + Ruled Light Background + + + + Ruled Dark Background + + + + Reset grid size + + PasswordDialog @@ -892,6 +904,17 @@ Update Atualizar + + Board drawing... + + + + + UBBackgroundPalette + + Grid size + + UBBoardController @@ -921,7 +944,7 @@ Delete page %1 from document - Apagar a página %1 do documento + Apagar a página %1 do documento Page %1 deleted @@ -947,6 +970,10 @@ Document has just been saved... Documento acaba de ser gravado... + + Deleting page %1 + + UBBoardPaletteManager @@ -959,6 +986,13 @@ Imagem capturada + + UBBoardThumbnailsView + + Loading page (%1/%2) + + + UBCachePropertiesWidget @@ -1198,7 +1232,7 @@ UBDocumentNavigator Page %0 - Página %0 + Página %0 @@ -1230,12 +1264,39 @@ Cancelar + + UBDraggableThumbnailView + + Page %0 + Página %0 + + UBExportAdaptor Warnings during export was appeared Surgiram alertas durante a exportação + + Exporting document... + A exportar documento... + + + Export failed + Exportação falhou + + + Unable to export to the selected location. You do not have the permissions necessary to save the file. + + + + Export failed: location not writable + Exportação falhou: localização não gravável + + + Export successful. + Exportação bem sucedida. + UBExportCFF @@ -1272,11 +1333,11 @@ Exporting document... - A exportar documento... + A exportar documento... Export successful. - Exportação bem sucedida. + Exportação bem sucedida. Exporting %1 %2 of %3 @@ -1288,15 +1349,15 @@ Export failed: location not writable - Exportação falhou: localização não gravável + Exportação falhou: localização não gravável Export failed - Exportação falhou + Exportação falhou Unable to export to the selected location. You do not have the permissions necessary to save the file. - Impossível exportar para a localização selcionada. Você não possui as permissões necessárias para gravar o arquivo. + Impossível exportar para a localização selcionada. Você não possui as permissões necessárias para gravar o arquivo. @@ -1307,11 +1368,11 @@ Exporting document... - A exportar documento... + A exportar documento... Export successful. - Exportação bem sucedida. + Exportação bem sucedida. Export to PDF @@ -1319,15 +1380,15 @@ Export failed: location not writable - Exportação falhou: localização não gravável + Exportação falhou: localização não gravável Export failed - Exportação falhou + Exportação falhou Unable to export to the selected location. You do not have the permissions necessary to save the file. - Impossível exportar para a localização selecionada. Você não possui as permissões necessárias para gravar o arquivo. + Impossível exportar para a localização selecionada. Você não possui as permissões necessárias para gravar o arquivo. @@ -1338,11 +1399,11 @@ Exporting document... - A exportar documento... + A exportar documento... Export successful. - Exportação bem sucedida. + Exportação bem sucedida. Exporting page %1 of %2 @@ -1388,7 +1449,7 @@ Set as background - Definir como fundo + Definir como fundo Add to library @@ -1529,6 +1590,10 @@ Go to Content Source Ir para a Fonte do Conteúdo + + Set as background + Definir como fundo + UBGraphicsMediaItem @@ -1779,6 +1844,10 @@ Quer ignorar estes erros, deste servidor? has lost access to the document repository '%1'. Unfortunately the application must shut down to avoid data corruption. Latest changes may be lost as well. Acesso ao repositório '%1' foi perdido. Infelizmente a aplicação deverá desligar para avitar a corrupção de dados. As últimas alterações também serão perdidas. + + Moving page to trash folder... + + UBPlatformUtils @@ -1935,6 +2004,17 @@ Quer ignorar estes erros, deste servidor? %1 thumbnails generated ... %1 de miniaturas geradas ... + + loading thumbnail of page %1 + + + + + UBThumbnailTextItem + + Page %0 + Página %0 + UBToolsManager @@ -2412,6 +2492,14 @@ p, li { white-space: pre-wrap; } Pen is Pressure Sensitive Caneta sensível à pressão + + Show preview circle from + + + + px + + capturePublishingDialog @@ -2599,6 +2687,22 @@ p, li { white-space: pre-wrap; } Built-in virtual keyboard button size: Tamanho da tecla do teclado virtual embarcado: + + Grid + + + + On Dark Background + Num fundo preto + + + Opacity + Opacidade + + + On Light Background + Num fundo branco + trapFlashDialog diff --git a/resources/i18n/OpenBoard_ro.ts b/resources/i18n/OpenBoard_ro.ts index ee3ce709..f7039047 100644 --- a/resources/i18n/OpenBoard_ro.ts +++ b/resources/i18n/OpenBoard_ro.ts @@ -799,6 +799,18 @@ Open the tutorial web page + + Ruled Light Background + + + + Ruled Dark Background + + + + Reset grid size + + PasswordDialog @@ -890,6 +902,17 @@ Update Actualizare + + Board drawing... + + + + + UBBackgroundPalette + + Grid size + + UBBoardController @@ -919,7 +942,7 @@ Delete page %1 from document - Ștergere pagina %1 din document + Ștergere pagina %1 din document Page %1 deleted @@ -945,6 +968,10 @@ Document has just been saved... + + Deleting page %1 + + UBBoardPaletteManager @@ -957,6 +984,13 @@ ImagineCapturată + + UBBoardThumbnailsView + + Loading page (%1/%2) + + + UBCachePropertiesWidget @@ -1196,7 +1230,7 @@ UBDocumentNavigator Page %0 - Pagina %0 + Pagina %0 @@ -1228,12 +1262,39 @@ Anulare + + UBDraggableThumbnailView + + Page %0 + Pagina %0 + + UBExportAdaptor Warnings during export was appeared Au apărut atenționări în timpul exportului + + Exporting document... + + + + Export failed + + + + Unable to export to the selected location. You do not have the permissions necessary to save the file. + + + + Export failed: location not writable + + + + Export successful. + Exportare reuşită. + UBExportCFF @@ -1270,11 +1331,11 @@ Exporting document... - Exportare document ... + Exportare document ... Export successful. - Exportare reuşită. + Exportare reuşită. Exporting %1 %2 of %3 @@ -1284,18 +1345,6 @@ Export to OpenBoard Format - - Export failed: location not writable - - - - Export failed - - - - Unable to export to the selected location. You do not have the permissions necessary to save the file. - - UBExportFullPDF @@ -1305,28 +1354,16 @@ Exporting document... - Exoprtare document ... + Exoprtare document ... Export successful. - Exportare reuşită. + Exportare reuşită. Export to PDF Exportare în PDF - - Export failed: location not writable - - - - Export failed - - - - Unable to export to the selected location. You do not have the permissions necessary to save the file. - - UBExportPDF @@ -1336,11 +1373,11 @@ Exporting document... - Exportare document... + Exportare document... Export successful. - Exportare reuşită. + Exportare reuşită. Exporting page %1 of %2 @@ -1386,7 +1423,7 @@ Set as background - Setare ca fundal + Setare ca fundal Add to library @@ -1526,6 +1563,10 @@ Go to Content Source Accesare sursă conţinut + + Set as background + Setare ca fundal + UBGraphicsMediaItem @@ -1776,6 +1817,10 @@ Doriţi să ignoraţi aceste erori pentru acest host? has lost access to the document repository '%1'. Unfortunately the application must shut down to avoid data corruption. Latest changes may be lost as well. + + Moving page to trash folder... + + UBPlatformUtils @@ -1939,6 +1984,17 @@ Doriţi să ignoraţi aceste erori pentru acest host? %1 thumbnails generated ... %1 miniaturi generate ... + + loading thumbnail of page %1 + + + + + UBThumbnailTextItem + + Page %0 + Pagina %0 + UBToolsManager @@ -2414,6 +2470,14 @@ p, li { white-space: pre-wrap; } Pen is Pressure Sensitive Stiloul este sensibil la apăsare + + Show preview circle from + + + + px + + capturePublishingDialog @@ -2599,6 +2663,22 @@ p, li { white-space: pre-wrap; } Built-in virtual keyboard button size: + + Grid + + + + On Dark Background + Pe fundal închis + + + Opacity + Opacitate + + + On Light Background + Pe fundal deschis + trapFlashDialog diff --git a/resources/i18n/OpenBoard_ru.ts b/resources/i18n/OpenBoard_ru.ts index 95b9741c..1e023a35 100644 --- a/resources/i18n/OpenBoard_ru.ts +++ b/resources/i18n/OpenBoard_ru.ts @@ -799,6 +799,18 @@ Open the tutorial web page + + Ruled Light Background + + + + Ruled Dark Background + + + + Reset grid size + + PasswordDialog @@ -890,6 +902,17 @@ Update Обновить + + Board drawing... + + + + + UBBackgroundPalette + + Grid size + + UBBoardController @@ -919,7 +942,7 @@ Delete page %1 from document - Удалить страницу %1 из документа + Удалить страницу %1 из документа Page %1 deleted @@ -945,6 +968,10 @@ Document has just been saved... + + Deleting page %1 + + UBBoardPaletteManager @@ -957,6 +984,13 @@ Захватить изображение + + UBBoardThumbnailsView + + Loading page (%1/%2) + + + UBCachePropertiesWidget @@ -1196,7 +1230,7 @@ UBDocumentNavigator Page %0 - Страница %0 + Страница %0 @@ -1228,12 +1262,39 @@ Отмена + + UBDraggableThumbnailView + + Page %0 + Страница %0 + + UBExportAdaptor Warnings during export was appeared Обнаружены предупреждения во время экспорта + + Exporting document... + Экспорт документа... + + + Export failed + + + + Unable to export to the selected location. You do not have the permissions necessary to save the file. + + + + Export failed: location not writable + + + + Export successful. + Экспорт успешно завершен. + UBExportCFF @@ -1270,11 +1331,11 @@ Exporting document... - Экспорт документа... + Экспорт документа... Export successful. - Экспорт успешно завершен. + Экспорт успешно завершен. Exporting %1 %2 of %3 @@ -1284,18 +1345,6 @@ Export to OpenBoard Format - - Export failed: location not writable - - - - Export failed - - - - Unable to export to the selected location. You do not have the permissions necessary to save the file. - - UBExportFullPDF @@ -1305,28 +1354,16 @@ Exporting document... - Экспорт документа... + Экспорт документа... Export successful. - Экспорт успешно завершен. + Экспорт успешно завершен. Export to PDF Экспорт в PDF - - Export failed: location not writable - - - - Export failed - - - - Unable to export to the selected location. You do not have the permissions necessary to save the file. - - UBExportPDF @@ -1336,11 +1373,11 @@ Exporting document... - Экспорт документа... + Экспорт документа... Export successful. - Экспорт успешно завершен. + Экспорт успешно завершен. Exporting page %1 of %2 @@ -1386,7 +1423,7 @@ Set as background - Сделать фоновым изображением + Сделать фоновым изображением Add to library @@ -1526,6 +1563,10 @@ Go to Content Source Перейти к источнику содержимого + + Set as background + Сделать фоновым изображением + UBGraphicsMediaItem @@ -1776,6 +1817,10 @@ Do you want to ignore these errors for this host? has lost access to the document repository '%1'. Unfortunately the application must shut down to avoid data corruption. Latest changes may be lost as well. + + Moving page to trash folder... + + UBPlatformUtils @@ -1939,6 +1984,17 @@ Do you want to ignore these errors for this host? %1 thumbnails generated ... сгенерированы эскизы %1... + + loading thumbnail of page %1 + + + + + UBThumbnailTextItem + + Page %0 + Страница %0 + UBToolsManager @@ -2414,6 +2470,14 @@ p, li { white-space: pre-wrap; } Pen is Pressure Sensitive Перо чувствительно к нажиму + + Show preview circle from + + + + px + + capturePublishingDialog @@ -2599,6 +2663,22 @@ p, li { white-space: pre-wrap; } Built-in virtual keyboard button size: + + Grid + + + + On Dark Background + На темном фоне + + + Opacity + Непрозрачность + + + On Light Background + На светлом фоне + trapFlashDialog diff --git a/resources/i18n/OpenBoard_sk.ts b/resources/i18n/OpenBoard_sk.ts index 6dc3136d..3b1597f7 100644 --- a/resources/i18n/OpenBoard_sk.ts +++ b/resources/i18n/OpenBoard_sk.ts @@ -1,2635 +1,2739 @@ - - - - - BlackoutWidget - - Click to Return to Application - Ak sa chcete vrátiť do aplikácie, kliknite sem - - - - DownloadDialog - - 0 Items - 0 položiek - - - Clean Up - Vymazať všetko - - - Downloads - Stiahnuté súbory - - - - DownloadItem - - Form - Formulár - - - Open - Otvoriť - - - Stop - Zastaviť - - - Filename - Názov súboru - - - Try Again - Skúsiť znova - - - - IntranetPodcastPublishingDialog - - Title - Názov - - - Author - Autor - - - Description - Popis - - - Publish Podcast to YouTube - Publikovať podcast na YouTube - - - - MainWindow - - Add - Pridať - - - Del - Vymazať - - - Cut - Vystrihnúť - - - Pen - Pero - - - Web - Web - - - Back - oproti reťazcu ďalšia strana - Predošlá - - - Copy - Kopírovať - - - Dark - Tmavá - - - Hand - Ruka - - - Home - Úvodná stránka - - - Left - Doľava - - - Line - Čiara - - - Next - strana - Ďalšia - - - PgUp - PgUp - - - Redo - Opakovať zmenu - - - Quit - Skončiť - - - Text - Text - - - Undo - Odvolať zmenu - - - Display Board - Zobraziť tabuľu - - - Board - Tabuľa - - - Color - Farba - - - Erase - Vygumovať - - - Display Tools - Zobraziť nástroje - - - Light - Svetlá - - - Embed Web Content - Vložiť obsah z webu - - - Pages - Stránky - - - Paste - Prilepiť - - - Pause - Pozastaviť - - - Right - Doprava - - - Sleep - Uspať - - - Tools - Nástroje - - - Multi Screen - Viac obrazoviek - - - Put Presentation to Sleep - Uspať prezentáciu - - - New Document - Nový dokument - - - Plain Dark Background - Úplne tmavé pozadie - - - Podcast Config - Nastavenia podcastu - - - Check Update - Vyhľadať aktualizáciu - - - Use Custom Document Size - Použiť vlastnú veľkosť dokumentu - - - Zoom In - Zväčšiť - - - Record Presentation to Video - Nahrať prezentáciu na video - - - Grid Dark Background - Mriežka s tmavým pozadím - - - Large Eraser - Veľká guma - - - Grid Light Background - Mriežka so svetlým pozadím - - - Hide OpenBoard Application - Schovať aplikáciu OpenBoard - - - Import an External Page - Nahrať externú stránku - - - Add Bookmark - Pridať záložku - - - OpenBoard - OpenBoard - - - Clear All Elements - Vyčistiť všetky objekty - - - Scroll Page - Posunúť sa po stránke - - - Small Line - Tenká čiara - - - Library - Knižnica - - - Configure Podcast Recording - Nastaviť nahrávanie podcastu - - - Open Page in Board - Otvoriť stránku na tabuli - - - Bigger - Zväčšiť - - - Ctrl++ - Ctrl++ - - - Ctrl+- - Ctrl+- - - - Ctrl+B - Ctrl+B - - - Ctrl+D - Ctrl+D - - - Ctrl+E - Ctrl+E - - - Ctrl+F - - - - Ctrl+G - - - - Ctrl+H - - - - Ctrl+I - Ctrl+I - - - Ctrl+J - - - - Ctrl+K - - - - Ctrl+L - Ctrl+L - - - Ctrl+M - - - - Ctrl+O - Ctrl+O - - - Ctrl+T - Ctrl+T - - - Ctrl+W - Ctrl+W - - - Ctrl+Y - Ctrl+Y - - - Ctrl+Z - Ctrl+Z - - - Delete - Vymazať - - - Eraser - Guma - - - Export - Exportovať - - - New Folder - Nový priečinok - - - Trap Flash Content - Označiť obsah vo Flashi - - - Import - Nahrať - - - Custom Capture - Vlastný spôsob označenia - - - Marker - Zvýrazňovač - - - PgDown - PgDown - - - Create a New Document - Vytvoriť nový dokument - - - Record - Nahrávať - - - Reload - Obnoviť - - - Rename - Premenovať - - - Stylus - Interaktívne pero - - - Quit OpenBoard - Skončiť OpenBoard - - - Custom Size - Vlastná veľkosť - - - Laser Pointer - Laserové ukazovadlo - - - Wide Size (16/9) - Na šírku (16/9) - - - Load Home Page - Nahrať úvodnú stránku - - - Duplicate Page - Duplikovať stránku - - - Duplicate Selected Content - Duplikovať vybraný obsah - - - Bookmarks - Záložky - - - Open in Board - Otvoriť na tabuli - - - Rename Content - Premenovať obsah - - - Zoom Out - Zmenšiť - - - Bookmark - Záložka - - - Add To Current Page - Pridať na aktuálnu stránku - - - Create a New Page - Vytvoriť novú stránku - - - Hide OpenBoard - Schovať OpenBoard - - - Erase All Items - Vygumovať všetky položky - - - Erase Content - Vygumovať obsah - - - Erase Items - Vygumovať položky - - - Duplicate - Duplikovať - - - Add Selected Content to Open Document - Pridať vybraný obsah do otvoreného dokumentu - - - Virtual Keyboard - Virtuálna klávesnica - - - Podcast - Podcast - - - Show Library - Zobraziť knižnicu - - - Medium Eraser - Stredne veľká guma - - - Stop Loading Web Page - Zastaviť nahrávanie webovej stránky - - - Duplicate the Current Page - Duplikovať aktuálnu stránku - - - Pause Podcast Recording - Pozastaviť nahrávanie podcastu - - - Create a New Folder - Vytvoriť nový priečinok - - - Clear Page - Vyčistiť stránku - - - Add To Library - Pridať do knižnice - - - Previous - Predošlá - - - Stop Loading - Zastaviť nahrávanie - - - Reload Current Page - Obnoviť aktuálnu stránku - - - Import Page - Nahrať stránku - - - Draw Lines - Kresliť čiary - - - Capture - Označiť - - - Show Main Screen on Display Screen - V zobrazenej časti obrazovky zobraziť hlavnú obrazovku - - - Flash Trap - Označiť Flash - - - Window Capture - Označiť okno - - - Delete Selected Content - Vymazať vybraný obsah - - - Add Item To New Page - Pridať položku na novú stránku - - - Add Content to Document - Pridať obsah do dokumentu - - - Smaller - Zmenšiť - - - Capture Embeddable Web Content - Označiť obsah z internetu, ktorý sa dá vložiť - - - Write Text - Písať text - - - Documents - Dokumenty - - - Add To New Page - Pridať na novú stránku - - - Regular Size (4/3) - Bežná veľkosť (4/3) - - - Web Trap - Označiť web - - - Display Virtual Keyboard - Zobraziť virtuálnu klávesnicu - - - Show Bookmarks - Zobraziť záložky - - - Use Document Wide Size (16/9) - Zobraziť na šírku dokumentu (16/9) - - - Show Computer Desktop - Zobraziť pracovnú plochu - - - eduMedia - eduMedia - - - Medium Line - Stredne hrubá čiara - - - Previous Page - Predchádzajúca stránka - - - Trap Web Content - Označiť obsah z webu - - - Selector - Oddeľovač - - - Erase all Annotations - Vygumovať všetky poznámky - - - Erase All Annotations - Vygumovať všetky poznámky - - - Export a Document - Exportovať dokument - - - Start Screen Recording - Spustiť nahrávanie obrazovky - - - New Page - Nová stránka - - - Import a Document - Nahrať dokument - - - Import eduMedia simulation - Nahrať simuláciu zo stránky eduMedia - - - Use Document Regular Size (4/3) - Používať bežnú veľkosť dokumentu (4/3) - - - Change Background - Zmeniť pozadie - - - Display Preferences - Zobraziť predvoľby - - - Preferences - Predvoľby - - - Capture Part of the Screen - Označiť časť obrazovky - - - Ctrl+Shift+H - Ctrl+Shift+H - - - Forward - Ďalšia - - - Manage Documents - Riadiť dokumenty - - - Large Line - Hrubá čiara - - - Erase Annotations - Vygumovať poznámky - - - Show on Display - Zobraziť pri projekcii - - - Select And Modify Objects - Vybrať a upraviť objekty - - - Capture a Window - Označiť okno - - - Virtual Laser Pointer - Virtuálne laserové ukazovadlo - - - Plain Light Background - Úplne svetlé pozadie - - - Add Item To Library - Pridať položku do knižnice - - - Web Browsing - Prehliadanie webu - - - Backgrounds - Pozadia - - - Smalle Eraser -spelling mistake in source: should be small - Malá guma - - - Add Item To Current Page - Pridať položku na aktuálnu stránku - - - Add to Working Document - Pridať do aktuálneho dokumentu - - - Highlight - Zvýrazniť - - - Show Desktop - Zobraziť pracovnú plochu - - - Next Page - Ďalšia stránka - - - Annotate Document - Pridať poznámku do dokumentu - - - Erase Annotation - Vygumovať poznámku - - - Play - Prehrať - - - Interact with items - Manipulovať s položkami - - - Erase Background - Vygumovať pozadie - - - Remove the backgound - spelling mistake: should be background - Odstrániť pozadie - - - Open Tutorial - Otvoriť príručku - - - Open the tutorial web page - Otvoriť webovú stránku príručky - - - - PasswordDialog - - Authentication Required - Vyžaduje sa prihlásenie - - - Password: - Heslo: - - - Username: - Používateľské meno: - - - - ProxyDialog - - Save username and password for future use - Používateľské meno a heslo uložiť na použitie v budúcnosti - - - Connect to Proxy - Pripojiť sa k proxy - - - Proxy Authentication - Prihlásenie na proxy - - - Password: - Heslo: - - - Username: - Používateľské meno: - - - - QObject - - Element ID = - ID prvku = - - - Content is not supported in destination format. - Obsah nie je podporovaný v cieľovom formáte. - - - Remove Page - Odstrániť stránku - - - Are you sure you want to remove 1 page from the selected document '%0'? - Určite chcete odstrániť 1 stránku z vybraného dokumentu '%0'? - - - - UBApplication - - Podcast - Podcast - - - Page Size - Veľkosť stránky - - - - UBApplicationController - - Web - Web - - - Update - Aktualizovať - - - No update available - Žiadna aktualizácia nie je k dispozícii - - - New update available, would you go to the web page ? - K dispozícii je nová aktualizácia. Chcete prejsť na webovú stránku? - - - Update available - K dispozícii je aktualizácia - - - - UBBoardController - - All Supported (%1) - Všetky podporované (%1) - - - Downloading content %1 failed - Nepodarilo sa stiahnuť %1 - - - Unknown content type %1 - Neznámy typ obsahu (%1) - - - Add Item - Pridať položku - - - Unknown tool type %1 - Neznámy typ nástroja %1 - - - Download finished - Sťahovanie bolo dokončené - - - Delete page %1 from document - Vymazať stránku %1 z dokumentu - - - Page %1 deleted - Stránka %1 bola vymazaná - - - Add file operation failed: file copying error - Nepodarilo sa pridať súbor: chyba pri kopírovaní súboru - - - Group - Zoskupiť - - - Ungroup - Oddeliť - - - Saving document... - Dokument sa ukladá... - - - Document has just been saved... - Dokument bol uložený. - - - - UBBoardPaletteManager - - Error Adding Image to Library - Chyba pri pridávaní obrázka do knižnice - - - CapturedImage - Označený obrázok - - - - UBCachePropertiesWidget - - Close - Zatvoriť - - - Size: - Veľkosť: - - - Color: - Farba: - - - Shape: - Tvar: - - - Cache Properties - Vlastnosti baterky - - - - UBDesktopPalette - - Show Desktop on Secondary Screen - Zobraziť pracovnú plochu na druhej obrazovke - - - Capture the Screen - Označiť obrazovku - - - Show the stylus palette - Zobraziť paletu pre interaktívne pero - - - Capture Part of the Screen - Označiť časť obrazovky - - - Show Board on Secondary Screen - Zobraziť tabuľu na druhej obrazovke - - - Show OpenBoard - Zobraziť OpenBoard - - - - UBDocumentController - - Empty - Vyprázdniť - - - Trash - Kôš - - - Are you sure you want to empty trash? - Určite chcete vyprázdniť kôš? - - - Are you sure you want to remove the folder '%1' and all its content? - Určite chcete odstrániť priečinok "%1" a celý jeho obsah? - - - Open Supported File - Otvoriť podporovaný súbor - - - Remove Document - Odstrániť dokument - - - All Images (%1) - Všetky obrázky (%1) - - - Selection does not contain any image files! - Vo výbere nie je žiaden súbor obrázka! - - - Open Document - Otvoriť dokument - - - Add Folder of Images - Pridať priečinok s obrázkami - - - Delete - Vymazať - - - New Folder - Nový priečinok - - - Add Images - Pridať obrázky - - - Duplicating Document %1 - Duplikuje sa dokument %1 - - - Page %1 - Stránka %1 - - - Document %1 copied - Dokument %1 bol skopírovaný - - - Importing file %1... - Nahráva sa súbor %1... - - - Failed to import file ... - Súbor sa nepodarilo nahrať... - - - Are you sure you want to remove the document '%1'? - Určite chcete odstrániť dokument "%1"? - - - Emptied trash - Kôš bol vyprázdnený - - - Empty Trash - Vyprázdniť kôš - - - Remove Folder - Odstrániť priečinok - - - Remove Page - Odstrániť stránku - - - No document selected! - Nevybrali ste žiaden dokument! - - - Import all Images from Folder - Nahrať všetky obrázky z priečinka - - - Emptying trash - Vyprázdňuje sa kôš - - - Are you sure you want to remove %n page(s) from the selected document '%1'? - - Určite chcete odstrániť %n stránku z vybraného dokumentu %1? - Určite chcete odstrániť %n stránky z vybraného dokumentu %1? - Určite chcete odstrániť %n stránok z vybraného dokumentu %1? - - - - Add all Images to Document - Pridať všetky obrázky do dokumentu - - - Add Pages from File - Pridať stránky zo súboru - - - Folder does not contain any image files - V priečinku nie sú žiadne súbory obrázkov - - - Untitled Documents - Dokumenty bez názvu - - - The document '%1' has been generated with a newer version of OpenBoard (%2). By opening it, you may lose some information. Do you want to proceed? - Dokument '%1' bol vytvorený v novšej verzii OpenBoardu (%2). Ak ho otvoríte v tejto, aktuálnej verzii, môže dôjsť k strate údajov. Chcete napriek tomu pokračovať? - - - Are you sure you want to remove all selected documents? - Určite chcete odstrániť všetky vybrané dokumenty? - - - Remove multiple documents - Odstránenie viacerých dokumentov - - - - UBDocumentManager - - All supported files (*.%1) - Všetky podporované súbory (*.%1) - - - objects - objekty - - - images - obrázky - - - videos - videá - - - widgets - widgety - - - File %1 saved - Súbor %1 bol uložený - - - Inserting page %1 of %2 - Vkladá sa stránka %1 z(o) %2 - - - Import successful. - Nahrávanie bolo úspešné. - - - Import of file %1 successful. - Nahrávanie súboru %1 bolo úspešné. - - - Importing file %1 - Nahráva sa súbor %1 - - - - UBDocumentNavigator - - Page %0 - Stránka %0 - - - - UBDocumentTreeWidget - - %1 pages copied - - %1 skopírovaná stránka - %1 skopírované stránky - %1 skopírovaných stránok - - - - %1 (copy) - %1 (kópia) - - - Copying page %1/%2 - Kopíruje sa stránka %1/%2 - - - - UBDownloadWidget - - Downloading files - Sťahujú sa súbory - - - Cancel - Zrušiť - - - - UBExportAdaptor - - Warnings during export was appeared - Počas exportu sa objavili varovania - - - - UBExportCFF - - Export to IWB - Exportovať do IWB - - - Export as IWB File - Exportovať ako súbor IWB - - - Exporting document... - Exportuje sa dokument... - - - Export successful. - Export bol úspešný. - - - Export failed. - Export sa nepodaril. - - - - UBExportDocument - - Page - Stránka - - - Export as UBZ File - Exportovať ako súbor UBZ - - - Exporting %1 %2 of %3 - Exportuje sa %1 %2 z(o) %3 - - - Exporting document... - Exportuje sa dokument... - - - Export successful. - Export bol úspešný. - - - Export to OpenBoard Format - Exportovať do formátu OpenBoard - - - Export failed: location not writable - Export sa nepodaril: do umiestnenia sa nedá zapisovať - - - Export failed - Export zlyhal - - - Unable to export to the selected location. You do not have the permissions necessary to save the file. - Do vybraného umiestnenia sa nedá exportovať. Na uloženie súboru nemáte dostatočné oprávnenia. - - - - UBExportFullPDF - - Export as PDF File - Exportovať ako súbor PDF - - - Export to PDF - Exportovať do PDF - - - Exporting document... - Exportuje sa dokument... - - - Export successful. - Export bol úspešný. - - - Export failed: location not writable - Export sa nepodaril: do umiestnenia sa nedá zapisovať - - - Export failed - Export zlyhal - - - Unable to export to the selected location. You do not have the permissions necessary to save the file. - Do vybraného umiestnenia sa nedá exportovať. Na uloženie súboru nemáte dostatočné oprávnenia. - - - - UBExportPDF - - Export as PDF File - Exportovať ako súbor PDF - - - Export to PDF - Exportovať do PDF - - - Exporting page %1 of %2 - Exportuje sa stránka %1 z(o) %2 - - - Exporting document... - Exportuje sa dokument... - - - Export successful. - Export bol úspešný. - - - - UBExportWeb - - Page - Stránka - - - Export failed. - Export zlyhal. - - - Export as Web data - Exportovať ako webové dáta - - - Exporting document... - Exportuje sa dokument... - - - Export successful. - Export bol úspešný. - - - Export to Web Browser - Exportovať do webového prehliadača - - - - UBFeatureProperties - - Add to page - Pridať na stránku - - - Set as background - Nastaviť ako pozadie - - - Add to library - Pridať do knižnice - - - Object informations - Informácie o objekte - - - - UBFeaturesActionBar - - Add to favorites - Pridať do obľúbených položiek - - - Share - Zdieľať* - - - Search - Vyhľadať - - - Delete - Vymazať - - - Back to folder - Späť do priečinka - - - Remove from favorites - Odstrániť z obľúbených položiek - - - Create new folder - Vytvoriť nový priečinok - - - Rescan file system - Znova prejsť systém súborov - - - - UBFeaturesController - - ImportedImage - NahranýObrázok - - - Audios - Zvukové nahrávky - - - Movies - Filmy - - - Pictures - Obrázky - - - Animations - Animácie - - - Interactivities - Interaktívne aktivity - - - Applications - Aplikácie - - - Shapes - Geometrické útvary - - - Favorites - Obľúbené - - - Web search - Vyhľadávanie na webe - - - Trash - Kôš - - - - UBFeaturesNewFolderDialog - - Accept - Prijať - - - Cancel - Zrušiť - - - Enter a new folder name - Zadajte názov nového priečinka - - - - UBFeaturesProgressInfo - - Loading - Nahrávanie - - - - UBGraphicsGroupContainerItemDelegate - - Locked - Zamknuté - - - Visible on Extended Screen - Zobraziť na rozšírenej obrazovke - - - - UBGraphicsItemDelegate - - Go to Content Source - Prejsť na zdroj - - - Locked - Zamknuté - - - Visible on Extended Screen - Zobraziť na rozšírenej obrazovke - - - - UBGraphicsMediaItem - - Media resource couldn't be resolved - Nepodarilo sa identifikovať nástroj na prácu s médiom - - - Unsupported media format - Nepodporovaný typ média - - - Media playback service not found - Služba na prehratie média sa nenašla - - - Media error: - Chyba média: - - - - UBGraphicsTextItem - - <Type Text Here> - <Text napíšte sem> - - - - UBGraphicsTextItemDelegate - - Text Color - Farba textu - - - Editable - Dá sa upravovať - - - - UBGraphicsW3CWidgetItem - - Web - Web - - - - UBGraphicsWidgetItem - - Loading ... - Nahráva sa... - - - - UBGraphicsWidgetItemDelegate - - Frozen - Zamrznuté - - - Transform as Tool - Zmeniť ako nástroj - - - - UBImportCFF - - Importing file %1... - Nahráva sa súbor %1... - - - Import failed. - Nahrávanie zlyhalo. - - - Import of file %1 failed. - Nepodarilo sa nahrať súbor %1. - - - Common File Format ( - Bežný formát súboru ( - - - Import successful. - Nahrávanie bolo úspešné. - - - - UBImportDocument - - Importing file %1... - Nahráva sa súbor %1... - - - Import of file %1 failed. - Nepodarilo sa nahrať súbor %1. - - - Import successful. - Nahrávanie bolo úspešné. - - - OpenBoard (*.ubz) - OpenBoard (*.ubz) - - - - UBImportImage - - Image Format ( - Súbor obrázka ( - - - - UBImportPDF - - PDF import failed. - Nahrávanie do PDF zlyhalo. - - - Importing page %1 of %2 - Nahráva sa stránka %1 z(o) %2 - - - Portable Document Format (*.pdf) - Portable Document Format (*.pdf) - - - - UBIntranetPodcastPublisher - - Publishing to Intranet in progress %1 % - Prebieha publikovanie na intranet %1 % - - - Error while publishing video to intranet (%1) - Chyba pri publikovaní videa na intranet (%1) - - - - UBIntranetPodcastPublishingDialog - - Publish - Publikovať - - - - UBKeyboardPalette - - Enter - Enter - - - - UBMainWindow - - No - Nie - - - Ok - Ok - - - Yes - Áno - - - - UBMessagesDialog - - Close - Zatvoriť - - - - UBNetworkAccessManager - - No - Nie - - - Yes - Áno - - - <qt>Enter username and password for "%1" at %2</qt> - <qt>Zadajte používateľské meno a heslo pre "%1" na %2</qt> - - - Failed to log to Proxy - Nepodarilo sa prihlásiť na proxy - - - SSL Errors: - -%1 - -%2 - -Do you want to ignore these errors for this host? - Chyby SSL: - -%1 - -%2 - -Chcete ignorovať tieto chyby na tomto serveri? - - - - UBOpenSankoreImporterWidget - - Open-Sankore Documents Detected - Našli sa dokumenty Open-Sankoré - - - Show this panel next time - Tento panel zobraziť aj nabudúce - - - You can always access the OpenBoard Document Importer through the Preferences panel in the About tab. Warning, if you have already imported your Open-Sankore datas, you might loose your current OpenBoard documents. - Nahrávanie dokumentov môžete kedykoľvek spustiť z karty O programe na paneli Predvoľby. Pozor, ak ste už nahrali dáta z Open-Sankoré, môžete ich spúšťať ako dokumenty vytvorené v OpenBoarde. - - - Cancel - Zrušiť - - - Proceed - Pokračovať - - - Open-Sankoré documents are present on your computer. It is possible to import them to OpenBoard by pressing the “Proceed” button to launch the importer application. - Vo vašom počítači sa nachádzajú dokumenty Open-Sankoré. Do OpenBoardu ich môžete nahrať stlačením tlačidla Pokračovať, ktorým sa spustí aplikácia na nahrávanie. - - - - UBPersistenceManager - - (copy) - (kópia) - - - Document Repository Loss - Strata úložiska dokumentov - - - has lost access to the document repository '%1'. Unfortunately the application must shut down to avoid data corruption. Latest changes may be lost as well. - stratil prístup k úložisku dokumentov '%1'. Aplikácia sa musí zatvoriť, aby sa predišlo poškodeniu dát. Možno nebudú uložené ani najnovšie zmeny. - - - - UBPlatformUtils - - English - Angličtina - - - Russian - Ruština - - - German - Nemčina - - - French - Francúzština - - - Swiss French - Švajčiarska francúzština - - - - UBPodcastController - - Full - Vysoké rozlíšenie - - - Small - Nízke rozlíšenie - - - Podcast recording error (%1) - Chyba pri nahrávaní podcastu (%1) - - - No Podcast encoder available ... - Žiaden kódovač podcastu nie je k dispozícii. - - - Publish to Youtube - inconsistent: elswhere written as YouTube - Publikovať na Youtube - - - Medium - Stredne vysoké rozlíšenie - - - in folder %1 - v priečinku %1 - - - Part %1 - Časť %1 - - - Podcast created %1 - Podcast vytvorený %1 - - - No Audio Recording - Žiadna zvuková nahrávka - - - Publish to Intranet - Publikovať na intranet - - - on your desktop ... - na vašu pracovnú plochu... - - - Default Audio Input - Predvolený vstup pre zvuk - - - Failed to start encoder ... - Nepodarilo sa spustiť kódovač... - - -OpenBoard Cast -Názov súboru podcastu -Film OpenBoardu - - - - UBPreferencesController - - version: - verzia: - - - Marker is pressure sensitive - Zvýrazňovač je citlivý na tlak - - - - UBProxyLoginDlg - - Password: - Heslo: - - - Proxy Login - Prihlásenie na proxy - - - Username: - Používateľské meno: - - - - UBPublicationDlg - - Description: - Popis: - - - Title: - Názov: - - - Publish - Publikovať - - - Publish document on the web - Publikovať dokument na internet - - - - UBSettings - - My Movies - Moje filmy - - - - UBStartupHintsPalette - - Visible next time - Zobraziť aj nabudúce - - - - UBTeacherBarWidget - - - - - - - UBThumbnailAdaptor - - %1 thumbnails generated ... - %1 vytvorených miniatúr... - - - Generating preview thumbnails ... - Vytvárajú sa ukážky miniatúr... - - - - UBToolsManager - - Mask - Clona - - - Cache - Baterka - - - Ruler - Pravítko - - - Triangle - Trojuholník - - - Compass - Kružidlo - - - Protractor - Uhlomer - - - Magnifier - Lupa - - - - UBTrapFlashController - - Web - Web - - - Whole page - Celá stránka - - - - UBUpdateDlg - - Document updater - Aktualizácia dokumentu - - - Please wait the import process will start soon... - Prosím, počkajte, proces nahrávania sa čoskoro začne... - - - Files update successful! -Please reboot the application to access the updated documents. - Aktualizácia bola úspešne dokončená! -Reštartujte aplikáciu, aby ste mohli pracovať s aktualizovanými dokumentmi. - - - Browse - Prehľadávať - - - Select a backup folder - Vyberte priečinok zálohy - - - files require an update. - súbory si vyžadujú aktualizáciu. - - - Update - Aktualizovať - - - An error occured during the update. The files have not been affected. - Počas aktualizácie sa vyskytla chyba. Súbory to neovplyvnilo. - - - Files update results - Výsledky aktualizácie súborov - - - Backup path: - Umiestnenie zálohy: - - - Updating file - Prebieha aktualizácia súboru - - - Remind me later - Pripomenúť mi neskôr - - - - UBWebPluginWidget - - Loading... - Nahráva sa... - - - - UBWidgetUniboardAPI - - %0 called (method=%1, status=%2) - %0 vyvolané (metóda = %1, stav = %2) - - - - UBYouTubePublisher - - YouTube authentication failed. - Nepodarilo sa prihlásiť na YouTube. - - - Error while uploading video to YouTube (%1) - Chyba pri nahrávaní videa na YouTube (%1) - - - Upload to YouTube in progress %1 % - Prebieha nahrávanie na YouTube %1 % - - - - UBYouTubePublishingDialog - - Music - Hudba - - - People & Blogs - Ľudia a blogy - - - Nonprofits & Activism - Neziskovky a aktivisti - - - Comedy - Komédia - - - Gaming - Hry - - - Sports - Šport - - - Upload - Nahrať - - - Science & Technology - Veda a technika - - - Howto & Style - Návody a štýl - - - Education - Vzdelávanie - - - Entertainment - Zábava - - - Travel & Events - Cestovanie a udalosti - - - News & Politics - Správy a politika - - - Pets & Animals - Zvieratá - - - Autos & Vehicles - Autá a dopravné prostriedky - - - - UBZoomPalette - - %1 x - %1 x - - - - WBClearButton - - Clear - Vyčistiť - - - - WBDownloadItem - - KB - kB - - - MB - MB - - - bytes - bytov - - - - %4 %5 remaining - – zostáva %4 %5 - - - minutes - minút(y) - - - Error opening saved file: %1 - Chyba pri otváraní uloženého súboru: %1 - - - seconds - sekúnd - - - Error saving: %1 - Chyba pri ukladaní súboru: %1 - - - Download canceled: %1 - Sťahovanie súboru bolo zrušené: %1 - - - %1 of %2 - Stopped - %1 z(o) %2 – zastavené - - - Save File - Uložiť súbor - - - %1 of %2 (%3/sec) %4 - %1 z(o) %2 (%3/sek) %4 - - - Network Error: %1 - Chyba siete: %1 - - - ? - unknown file size - ? - - - - WBDownloadManager - - 1 Download - 1 stiahnutý súbor - - - %1 Downloads - always >= 2 - %1 stiahnuté súbory - - - - WBHistoryModel - - Title - Názov - - - Address - Adresa - - - - WBHistoryTreeModel - - %1 items - 2,3,4 položky, 0, >=5 položiek - %1 položiek - - - Earlier Today - Dnes - - - - WBSearchLineEdit - - Search - Hľadať - - - - WBTabBar - - Reload All Tabs - Obnoviť všetky karty - - - Reload Tab - Obnoviť kartu - - - Clone Tab - Duplikovať kartu - - - &Close Tab - &Zatvoriť kartu - - - Close &Other Tabs - Zatvoriť &ostané karty - - - New &Tab - Nová &karta - - - - WBTabWidget - - (Untitled) - (Bez názvu) - - - Recently Closed Tabs - Nedávno zatvorené karty - - - - WBToolbarSearch - - Recent Searches - Nedávne vyhľadávania - - - Search - Vyhľadať - - - No Recent Searches - Žiadne nedávne vyhľadávania - - - Clear Recent Searches - Vymazať nedávne vyhľadávania - - - - WBWebPage - - PDF - PDF - - - Add to Current Document - Pridať do aktuálneho dokumentu - - - Download - Stiahnuť - - - Error loading page: %1 - Chyba pri nahrávaní stránky: %1 - - - Download PDF Document: would you prefer to download the PDF file or add it to the current OpenBoard document? - Sťahovanie dokumentu PDF: chcete súbor PDF radšej stiahnuť alebo pridať do aktuálneho dokumentu? - - - - WBWebView - - Open in New Tab - Otvoriť na novej karte - - - - YouTubePublishingDialog - - Title - Názov - - - YouTube Username - Používateľské meno na YouTube - - - YouTube Password - Heslo na YouTube - - - Category - Kategória - - - Description - Popis - - - Publish Podcast to YouTube - Publikovať podcast na YouTube - - - Keywords - Kľúčové slová - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Lucida Grande'; font-size:10pt;">By clicking 'Upload,' you certify that you own all rights to the content or that you are authorized by the owner to make the content publicly available on YouTube, and that it otherwise complies with the YouTube Terms of Service located at </span><a href="http://www.youtube.com/t/terms"><span style=" font-family:'Lucida Grande'; font-size:10pt; text-decoration: underline; color:#0000ff;">http://www.youtube.com/t/terms</span></a></p></body></html> - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Lucida Grande'; font-size:10pt;">Kliknutím na "Upload" (Nahrať) potvrdzujete, že máte všetky práva k materiálu alebo že máte písomný súhlas vlastníka týchto práv na zverejnenie materiálu na sieti YouTube a že materiál je v súlade s podmienkami využívania služieb siete YouTube, ktorých aktuálne znenie sa nachádza na adrese </span><a href="http://www.youtube.com/t/terms"><span style=" font-family:'Lucida Grande'; font-size:10pt; text-decoration: underline; color:#0000ff;">http://www.youtube.com/t/terms</span></a></p></body></html> - - - OpenBoard - OpenBoard - - - Restore credentials on reboot - Po reštarte obnoviť prihlasovacie údaje - - - - brushProperties - - Fine - Tenká - - - Medium - Stredne hrubá - - - Strong - Hrubá - - - Opacity - Priehľadnosť - - - Line Width - Šírka čiary - - - On Light Background - Na svetlom pozadí - - - Pen is Pressure Sensitive - Pero je citlivé na tlak - - - On Dark Background - Na tmavom pozadí - - - - capturePublishingDialog - - Title - Názov - - - E-mail - E-mail - - - Author - Autor - - - Dialog - Dialóg - - - Description - Popis - - - - documents - - OpenBoard Documents - Dokumenty OpenBoardu - - - - preferencesDialog - - Pen - Pero - - - About - O programe - - - Close - Zatvoriť - - - Horizontal - Vodorovná - - - Display Text Under Button - Pod tlačidlom zobraziť text - - - Show Page with External Browser - Stránku zobraziť v externom prehliadači - - - Default Settings - Predvolené nastavenia - - - Network - Sieť - - - Positioned at the Bottom (recommended for white boards) - Je umiestnený dole (odporúča sa pre tabule) - - - Marker - Zvýrazňovač - - - Internet - Internet - - - Positioned at the Top (recommended for tablets) - Je umiestnený navrchu (odporúča sa pre tablety) - - - Virtual Keyboard - Virtuálna klávesnica - - - Home Page: - Úvodná stránka: - - - Check software update at launch - Pri spustení programu vyhľadať aktualizáciu - - - Software Update - Aktualizácia programu - - - Keyboard button size: - Veľkosť tlačidla klávesnice: - - - Stylus Palette - Paleta pre interaktívne pero - - - Display - Zobraziť - - - Toolbar - Panel s nástrojmi - - - Vertical - Zvislá - - - Preferences - Predvoľby - - - version : … - Verzia:... - - - Licences - Licencie - - - Multi display - Viac obrazoviek - - - Show internal web page content on secondary screen or projector - Na druhej obrazovke alebo projektore zobraziť obsah internej webovej stránky - - - Swap control display and view display - Prehodiť ovládaciu obrazovku a zobrazovaciu obrazovku - - - Mode - Režim - - - Mode to start in: - Režim pri štarte: - - - Board - Tabuľa - - - Desktop - Pracovná plocha - - - Proxy User: - Použ. m. na proxy: - - - Pass: - Heslo: - - - Credits - Poďakovanie - - - Open-Sankoré Importer - Nahrávanie z Open-Sankoré - - - Check if Open-Sankoré data could be imported at launch - Zistiť, či sa pri spustení majú nahrať dáta z Open-Sankoré - - - Use system keyboard (recommended) - Používať systémovú klávesnicu (odporúča sa) - - - Built-in virtual keyboard button size: - Veľkosť tlačidla zabudovanej virtuálnej klávesnice: - - - - trapFlashDialog - - Trap flash - Označiť flash - - - Select a flash to trap - Vyberte flash, ktorý chcete označiť - - - about:blank - about:blank - - - Application name - Názov aplikácie - - - Create Application - Vytvoriť aplikáciu - - - + + + + + BlackoutWidget + + Click to Return to Application + Ak sa chcete vrátiť do aplikácie, kliknite sem + + + + DownloadDialog + + 0 Items + 0 položiek + + + Clean Up + Vymazať všetko + + + Downloads + Stiahnuté súbory + + + + DownloadItem + + Form + Formulár + + + Open + Otvoriť + + + Stop + Zastaviť + + + Filename + Názov súboru + + + Try Again + Skúsiť znova + + + + IntranetPodcastPublishingDialog + + Title + Názov + + + Author + Autor + + + Description + Popis + + + Publish Podcast to YouTube + Publikovať podcast na YouTube + + + + MainWindow + + Add + Pridať + + + Del + Vymazať + + + Cut + Vystrihnúť + + + Pen + Pero + + + Web + Web + + + Back + oproti reťazcu ďalšia strana + Predošlá + + + Copy + Kopírovať + + + Dark + Tmavá + + + Hand + Ruka + + + Home + Úvodná stránka + + + Left + Doľava + + + Line + Čiara + + + Next + strana + Ďalšia + + + PgUp + PgUp + + + Redo + Opakovať zmenu + + + Quit + Skončiť + + + Text + Text + + + Undo + Odvolať zmenu + + + Display Board + Zobraziť tabuľu + + + Board + Tabuľa + + + Color + Farba + + + Erase + Vygumovať + + + Display Tools + Zobraziť nástroje + + + Light + Svetlá + + + Embed Web Content + Vložiť obsah z webu + + + Pages + Stránky + + + Paste + Prilepiť + + + Pause + Pozastaviť + + + Right + Doprava + + + Sleep + Uspať + + + Tools + Nástroje + + + Multi Screen + Viac obrazoviek + + + Put Presentation to Sleep + Uspať prezentáciu + + + New Document + Nový dokument + + + Plain Dark Background + Úplne tmavé pozadie + + + Podcast Config + Nastavenia podcastu + + + Check Update + Vyhľadať aktualizáciu + + + Use Custom Document Size + Použiť vlastnú veľkosť dokumentu + + + Zoom In + Zväčšiť + + + Record Presentation to Video + Nahrať prezentáciu na video + + + Grid Dark Background + Mriežka s tmavým pozadím + + + Large Eraser + Veľká guma + + + Grid Light Background + Mriežka so svetlým pozadím + + + Hide OpenBoard Application + Schovať aplikáciu OpenBoard + + + Import an External Page + Nahrať externú stránku + + + Add Bookmark + Pridať záložku + + + OpenBoard + OpenBoard + + + Clear All Elements + Vyčistiť všetky objekty + + + Scroll Page + Posunúť sa po stránke + + + Small Line + Tenká čiara + + + Library + Knižnica + + + Configure Podcast Recording + Nastaviť nahrávanie podcastu + + + Open Page in Board + Otvoriť stránku na tabuli + + + Bigger + Zväčšiť + + + Ctrl++ + Ctrl++ + + + Ctrl+- + Ctrl+- + + + Ctrl+B + Ctrl+B + + + Ctrl+D + Ctrl+D + + + Ctrl+E + Ctrl+E + + + Ctrl+F + + + + Ctrl+G + + + + Ctrl+H + + + + Ctrl+I + Ctrl+I + + + Ctrl+J + + + + Ctrl+K + + + + Ctrl+L + Ctrl+L + + + Ctrl+M + + + + Ctrl+O + Ctrl+O + + + Ctrl+T + Ctrl+T + + + Ctrl+W + Ctrl+W + + + Ctrl+Y + Ctrl+Y + + + Ctrl+Z + Ctrl+Z + + + Delete + Vymazať + + + Eraser + Guma + + + Export + Exportovať + + + New Folder + Nový priečinok + + + Trap Flash Content + Označiť obsah vo Flashi + + + Import + Nahrať + + + Custom Capture + Vlastný spôsob označenia + + + Marker + Zvýrazňovač + + + PgDown + PgDown + + + Create a New Document + Vytvoriť nový dokument + + + Record + Nahrávať + + + Reload + Obnoviť + + + Rename + Premenovať + + + Stylus + Interaktívne pero + + + Quit OpenBoard + Skončiť OpenBoard + + + Custom Size + Vlastná veľkosť + + + Laser Pointer + Laserové ukazovadlo + + + Wide Size (16/9) + Na šírku (16/9) + + + Load Home Page + Nahrať úvodnú stránku + + + Duplicate Page + Duplikovať stránku + + + Duplicate Selected Content + Duplikovať vybraný obsah + + + Bookmarks + Záložky + + + Open in Board + Otvoriť na tabuli + + + Rename Content + Premenovať obsah + + + Zoom Out + Zmenšiť + + + Bookmark + Záložka + + + Add To Current Page + Pridať na aktuálnu stránku + + + Create a New Page + Vytvoriť novú stránku + + + Hide OpenBoard + Schovať OpenBoard + + + Erase All Items + Vygumovať všetky položky + + + Erase Content + Vygumovať obsah + + + Erase Items + Vygumovať položky + + + Duplicate + Duplikovať + + + Add Selected Content to Open Document + Pridať vybraný obsah do otvoreného dokumentu + + + Virtual Keyboard + Virtuálna klávesnica + + + Podcast + Podcast + + + Show Library + Zobraziť knižnicu + + + Medium Eraser + Stredne veľká guma + + + Stop Loading Web Page + Zastaviť nahrávanie webovej stránky + + + Duplicate the Current Page + Duplikovať aktuálnu stránku + + + Pause Podcast Recording + Pozastaviť nahrávanie podcastu + + + Create a New Folder + Vytvoriť nový priečinok + + + Clear Page + Vyčistiť stránku + + + Add To Library + Pridať do knižnice + + + Previous + Predošlá + + + Stop Loading + Zastaviť nahrávanie + + + Reload Current Page + Obnoviť aktuálnu stránku + + + Import Page + Nahrať stránku + + + Draw Lines + Kresliť čiary + + + Capture + Označiť + + + Show Main Screen on Display Screen + V zobrazenej časti obrazovky zobraziť hlavnú obrazovku + + + Flash Trap + Označiť Flash + + + Window Capture + Označiť okno + + + Delete Selected Content + Vymazať vybraný obsah + + + Add Item To New Page + Pridať položku na novú stránku + + + Add Content to Document + Pridať obsah do dokumentu + + + Smaller + Zmenšiť + + + Capture Embeddable Web Content + Označiť obsah z internetu, ktorý sa dá vložiť + + + Write Text + Písať text + + + Documents + Dokumenty + + + Add To New Page + Pridať na novú stránku + + + Regular Size (4/3) + Bežná veľkosť (4/3) + + + Web Trap + Označiť web + + + Display Virtual Keyboard + Zobraziť virtuálnu klávesnicu + + + Show Bookmarks + Zobraziť záložky + + + Use Document Wide Size (16/9) + Zobraziť na šírku dokumentu (16/9) + + + Show Computer Desktop + Zobraziť pracovnú plochu + + + eduMedia + eduMedia + + + Medium Line + Stredne hrubá čiara + + + Previous Page + Predchádzajúca stránka + + + Trap Web Content + Označiť obsah z webu + + + Selector + Oddeľovač + + + Erase all Annotations + Vygumovať všetky poznámky + + + Erase All Annotations + Vygumovať všetky poznámky + + + Export a Document + Exportovať dokument + + + Start Screen Recording + Spustiť nahrávanie obrazovky + + + New Page + Nová stránka + + + Import a Document + Nahrať dokument + + + Import eduMedia simulation + Nahrať simuláciu zo stránky eduMedia + + + Use Document Regular Size (4/3) + Používať bežnú veľkosť dokumentu (4/3) + + + Change Background + Zmeniť pozadie + + + Display Preferences + Zobraziť predvoľby + + + Preferences + Predvoľby + + + Capture Part of the Screen + Označiť časť obrazovky + + + Ctrl+Shift+H + Ctrl+Shift+H + + + Forward + Ďalšia + + + Manage Documents + Riadiť dokumenty + + + Large Line + Hrubá čiara + + + Erase Annotations + Vygumovať poznámky + + + Show on Display + Zobraziť pri projekcii + + + Select And Modify Objects + Vybrať a upraviť objekty + + + Capture a Window + Označiť okno + + + Virtual Laser Pointer + Virtuálne laserové ukazovadlo + + + Plain Light Background + Úplne svetlé pozadie + + + Add Item To Library + Pridať položku do knižnice + + + Web Browsing + Prehliadanie webu + + + Backgrounds + Pozadia + + + Smalle Eraser + spelling mistake in source: should be small + Malá guma + + + Add Item To Current Page + Pridať položku na aktuálnu stránku + + + Add to Working Document + Pridať do aktuálneho dokumentu + + + Highlight + Zvýrazniť + + + Show Desktop + Zobraziť pracovnú plochu + + + Next Page + Ďalšia stránka + + + Annotate Document + Pridať poznámku do dokumentu + + + Erase Annotation + Vygumovať poznámku + + + Play + Prehrať + + + Interact with items + Manipulovať s položkami + + + Erase Background + Vygumovať pozadie + + + Remove the backgound + spelling mistake: should be background + Odstrániť pozadie + + + Open Tutorial + Otvoriť príručku + + + Open the tutorial web page + Otvoriť webovú stránku príručky + + + Ruled Light Background + + + + Ruled Dark Background + + + + Reset grid size + + + + + PasswordDialog + + Authentication Required + Vyžaduje sa prihlásenie + + + Password: + Heslo: + + + Username: + Používateľské meno: + + + + ProxyDialog + + Save username and password for future use + Používateľské meno a heslo uložiť na použitie v budúcnosti + + + Connect to Proxy + Pripojiť sa k proxy + + + Proxy Authentication + Prihlásenie na proxy + + + Password: + Heslo: + + + Username: + Používateľské meno: + + + + QObject + + Element ID = + ID prvku = + + + Content is not supported in destination format. + Obsah nie je podporovaný v cieľovom formáte. + + + Remove Page + Odstrániť stránku + + + Are you sure you want to remove 1 page from the selected document '%0'? + Určite chcete odstrániť 1 stránku z vybraného dokumentu '%0'? + + + + UBApplication + + Podcast + Podcast + + + Page Size + Veľkosť stránky + + + + UBApplicationController + + Web + Web + + + Update + Aktualizovať + + + No update available + Žiadna aktualizácia nie je k dispozícii + + + New update available, would you go to the web page ? + K dispozícii je nová aktualizácia. Chcete prejsť na webovú stránku? + + + Update available + K dispozícii je aktualizácia + + + Board drawing... + + + + + UBBackgroundPalette + + Grid size + + + + + UBBoardController + + All Supported (%1) + Všetky podporované (%1) + + + Downloading content %1 failed + Nepodarilo sa stiahnuť %1 + + + Unknown content type %1 + Neznámy typ obsahu (%1) + + + Add Item + Pridať položku + + + Unknown tool type %1 + Neznámy typ nástroja %1 + + + Download finished + Sťahovanie bolo dokončené + + + Delete page %1 from document + Vymazať stránku %1 z dokumentu + + + Page %1 deleted + Stránka %1 bola vymazaná + + + Add file operation failed: file copying error + Nepodarilo sa pridať súbor: chyba pri kopírovaní súboru + + + Group + Zoskupiť + + + Ungroup + Oddeliť + + + Saving document... + Dokument sa ukladá... + + + Document has just been saved... + Dokument bol uložený. + + + Deleting page %1 + + + + + UBBoardPaletteManager + + Error Adding Image to Library + Chyba pri pridávaní obrázka do knižnice + + + CapturedImage + Označený obrázok + + + + UBBoardThumbnailsView + + Loading page (%1/%2) + + + + + UBCachePropertiesWidget + + Close + Zatvoriť + + + Size: + Veľkosť: + + + Color: + Farba: + + + Shape: + Tvar: + + + Cache Properties + Vlastnosti baterky + + + + UBDesktopPalette + + Show Desktop on Secondary Screen + Zobraziť pracovnú plochu na druhej obrazovke + + + Capture the Screen + Označiť obrazovku + + + Show the stylus palette + Zobraziť paletu pre interaktívne pero + + + Capture Part of the Screen + Označiť časť obrazovky + + + Show Board on Secondary Screen + Zobraziť tabuľu na druhej obrazovke + + + Show OpenBoard + Zobraziť OpenBoard + + + + UBDocumentController + + Empty + Vyprázdniť + + + Trash + Kôš + + + Are you sure you want to empty trash? + Určite chcete vyprázdniť kôš? + + + Are you sure you want to remove the folder '%1' and all its content? + Určite chcete odstrániť priečinok "%1" a celý jeho obsah? + + + Open Supported File + Otvoriť podporovaný súbor + + + Remove Document + Odstrániť dokument + + + All Images (%1) + Všetky obrázky (%1) + + + Selection does not contain any image files! + Vo výbere nie je žiaden súbor obrázka! + + + Open Document + Otvoriť dokument + + + Add Folder of Images + Pridať priečinok s obrázkami + + + Delete + Vymazať + + + New Folder + Nový priečinok + + + Add Images + Pridať obrázky + + + Duplicating Document %1 + Duplikuje sa dokument %1 + + + Page %1 + Stránka %1 + + + Document %1 copied + Dokument %1 bol skopírovaný + + + Importing file %1... + Nahráva sa súbor %1... + + + Failed to import file ... + Súbor sa nepodarilo nahrať... + + + Are you sure you want to remove the document '%1'? + Určite chcete odstrániť dokument "%1"? + + + Emptied trash + Kôš bol vyprázdnený + + + Empty Trash + Vyprázdniť kôš + + + Remove Folder + Odstrániť priečinok + + + Remove Page + Odstrániť stránku + + + No document selected! + Nevybrali ste žiaden dokument! + + + Import all Images from Folder + Nahrať všetky obrázky z priečinka + + + Emptying trash + Vyprázdňuje sa kôš + + + Are you sure you want to remove %n page(s) from the selected document '%1'? + + Určite chcete odstrániť %n stránku z vybraného dokumentu %1? + Určite chcete odstrániť %n stránky z vybraného dokumentu %1? + Určite chcete odstrániť %n stránok z vybraného dokumentu %1? + + + + Add all Images to Document + Pridať všetky obrázky do dokumentu + + + Add Pages from File + Pridať stránky zo súboru + + + Folder does not contain any image files + V priečinku nie sú žiadne súbory obrázkov + + + Untitled Documents + Dokumenty bez názvu + + + The document '%1' has been generated with a newer version of OpenBoard (%2). By opening it, you may lose some information. Do you want to proceed? + Dokument '%1' bol vytvorený v novšej verzii OpenBoardu (%2). Ak ho otvoríte v tejto, aktuálnej verzii, môže dôjsť k strate údajov. Chcete napriek tomu pokračovať? + + + Are you sure you want to remove all selected documents? + Určite chcete odstrániť všetky vybrané dokumenty? + + + Remove multiple documents + Odstránenie viacerých dokumentov + + + + UBDocumentManager + + All supported files (*.%1) + Všetky podporované súbory (*.%1) + + + objects + objekty + + + images + obrázky + + + videos + videá + + + widgets + widgety + + + File %1 saved + Súbor %1 bol uložený + + + Inserting page %1 of %2 + Vkladá sa stránka %1 z(o) %2 + + + Import successful. + Nahrávanie bolo úspešné. + + + Import of file %1 successful. + Nahrávanie súboru %1 bolo úspešné. + + + Importing file %1 + Nahráva sa súbor %1 + + + + UBDocumentNavigator + + Page %0 + Stránka %0 + + + + UBDocumentTreeWidget + + %1 pages copied + + %1 skopírovaná stránka + %1 skopírované stránky + %1 skopírovaných stránok + + + + %1 (copy) + %1 (kópia) + + + Copying page %1/%2 + Kopíruje sa stránka %1/%2 + + + + UBDownloadWidget + + Downloading files + Sťahujú sa súbory + + + Cancel + Zrušiť + + + + UBDraggableThumbnailView + + Page %0 + Stránka %0 + + + + UBExportAdaptor + + Warnings during export was appeared + Počas exportu sa objavili varovania + + + Exporting document... + Exportuje sa dokument... + + + Export failed + Export zlyhal + + + Unable to export to the selected location. You do not have the permissions necessary to save the file. + Do vybraného umiestnenia sa nedá exportovať. Na uloženie súboru nemáte dostatočné oprávnenia. + + + Export failed: location not writable + Export sa nepodaril: do umiestnenia sa nedá zapisovať + + + Export successful. + Export bol úspešný. + + + + UBExportCFF + + Export to IWB + Exportovať do IWB + + + Export as IWB File + Exportovať ako súbor IWB + + + Exporting document... + Exportuje sa dokument... + + + Export successful. + Export bol úspešný. + + + Export failed. + Export sa nepodaril. + + + + UBExportDocument + + Page + Stránka + + + Export as UBZ File + Exportovať ako súbor UBZ + + + Exporting %1 %2 of %3 + Exportuje sa %1 %2 z(o) %3 + + + Exporting document... + Exportuje sa dokument... + + + Export successful. + Export bol úspešný. + + + Export to OpenBoard Format + Exportovať do formátu OpenBoard + + + Export failed: location not writable + Export sa nepodaril: do umiestnenia sa nedá zapisovať + + + Export failed + Export zlyhal + + + Unable to export to the selected location. You do not have the permissions necessary to save the file. + Do vybraného umiestnenia sa nedá exportovať. Na uloženie súboru nemáte dostatočné oprávnenia. + + + + UBExportFullPDF + + Export as PDF File + Exportovať ako súbor PDF + + + Export to PDF + Exportovať do PDF + + + Exporting document... + Exportuje sa dokument... + + + Export successful. + Export bol úspešný. + + + Export failed: location not writable + Export sa nepodaril: do umiestnenia sa nedá zapisovať + + + Export failed + Export zlyhal + + + Unable to export to the selected location. You do not have the permissions necessary to save the file. + Do vybraného umiestnenia sa nedá exportovať. Na uloženie súboru nemáte dostatočné oprávnenia. + + + + UBExportPDF + + Export as PDF File + Exportovať ako súbor PDF + + + Export to PDF + Exportovať do PDF + + + Exporting page %1 of %2 + Exportuje sa stránka %1 z(o) %2 + + + Exporting document... + Exportuje sa dokument... + + + Export successful. + Export bol úspešný. + + + + UBExportWeb + + Page + Stránka + + + Export failed. + Export zlyhal. + + + Export as Web data + Exportovať ako webové dáta + + + Exporting document... + Exportuje sa dokument... + + + Export successful. + Export bol úspešný. + + + Export to Web Browser + Exportovať do webového prehliadača + + + + UBFeatureProperties + + Add to page + Pridať na stránku + + + Set as background + Nastaviť ako pozadie + + + Add to library + Pridať do knižnice + + + Object informations + Informácie o objekte + + + + UBFeaturesActionBar + + Add to favorites + Pridať do obľúbených položiek + + + Share + Zdieľať* + + + Search + Vyhľadať + + + Delete + Vymazať + + + Back to folder + Späť do priečinka + + + Remove from favorites + Odstrániť z obľúbených položiek + + + Create new folder + Vytvoriť nový priečinok + + + Rescan file system + Znova prejsť systém súborov + + + + UBFeaturesController + + ImportedImage + NahranýObrázok + + + Audios + Zvukové nahrávky + + + Movies + Filmy + + + Pictures + Obrázky + + + Animations + Animácie + + + Interactivities + Interaktívne aktivity + + + Applications + Aplikácie + + + Shapes + Geometrické útvary + + + Favorites + Obľúbené + + + Web search + Vyhľadávanie na webe + + + Trash + Kôš + + + + UBFeaturesNewFolderDialog + + Accept + Prijať + + + Cancel + Zrušiť + + + Enter a new folder name + Zadajte názov nového priečinka + + + + UBFeaturesProgressInfo + + Loading + Nahrávanie + + + + UBGraphicsGroupContainerItemDelegate + + Locked + Zamknuté + + + Visible on Extended Screen + Zobraziť na rozšírenej obrazovke + + + + UBGraphicsItemDelegate + + Go to Content Source + Prejsť na zdroj + + + Locked + Zamknuté + + + Visible on Extended Screen + Zobraziť na rozšírenej obrazovke + + + Set as background + Nastaviť ako pozadie + + + + UBGraphicsMediaItem + + Media resource couldn't be resolved + Nepodarilo sa identifikovať nástroj na prácu s médiom + + + Unsupported media format + Nepodporovaný typ média + + + Media playback service not found + Služba na prehratie média sa nenašla + + + Media error: + Chyba média: + + + + UBGraphicsTextItem + + <Type Text Here> + <Text napíšte sem> + + + + UBGraphicsTextItemDelegate + + Text Color + Farba textu + + + Editable + Dá sa upravovať + + + + UBGraphicsW3CWidgetItem + + Web + Web + + + + UBGraphicsWidgetItem + + Loading ... + Nahráva sa... + + + + UBGraphicsWidgetItemDelegate + + Frozen + Zamrznuté + + + Transform as Tool + Zmeniť ako nástroj + + + + UBImportCFF + + Importing file %1... + Nahráva sa súbor %1... + + + Import failed. + Nahrávanie zlyhalo. + + + Import of file %1 failed. + Nepodarilo sa nahrať súbor %1. + + + Common File Format ( + Bežný formát súboru ( + + + Import successful. + Nahrávanie bolo úspešné. + + + + UBImportDocument + + Importing file %1... + Nahráva sa súbor %1... + + + Import of file %1 failed. + Nepodarilo sa nahrať súbor %1. + + + Import successful. + Nahrávanie bolo úspešné. + + + OpenBoard (*.ubz) + OpenBoard (*.ubz) + + + + UBImportImage + + Image Format ( + Súbor obrázka ( + + + + UBImportPDF + + PDF import failed. + Nahrávanie do PDF zlyhalo. + + + Importing page %1 of %2 + Nahráva sa stránka %1 z(o) %2 + + + Portable Document Format (*.pdf) + Portable Document Format (*.pdf) + + + + UBIntranetPodcastPublisher + + Publishing to Intranet in progress %1 % + Prebieha publikovanie na intranet %1 % + + + Error while publishing video to intranet (%1) + Chyba pri publikovaní videa na intranet (%1) + + + + UBIntranetPodcastPublishingDialog + + Publish + Publikovať + + + + UBKeyboardPalette + + Enter + Enter + + + + UBMainWindow + + No + Nie + + + Ok + Ok + + + Yes + Áno + + + + UBMessagesDialog + + Close + Zatvoriť + + + + UBNetworkAccessManager + + No + Nie + + + Yes + Áno + + + <qt>Enter username and password for "%1" at %2</qt> + <qt>Zadajte používateľské meno a heslo pre "%1" na %2</qt> + + + Failed to log to Proxy + Nepodarilo sa prihlásiť na proxy + + + SSL Errors: + +%1 + +%2 + +Do you want to ignore these errors for this host? + Chyby SSL: + +%1 + +%2 + +Chcete ignorovať tieto chyby na tomto serveri? + + + + UBOpenSankoreImporterWidget + + Open-Sankore Documents Detected + Našli sa dokumenty Open-Sankoré + + + Show this panel next time + Tento panel zobraziť aj nabudúce + + + You can always access the OpenBoard Document Importer through the Preferences panel in the About tab. Warning, if you have already imported your Open-Sankore datas, you might loose your current OpenBoard documents. + Nahrávanie dokumentov môžete kedykoľvek spustiť z karty O programe na paneli Predvoľby. Pozor, ak ste už nahrali dáta z Open-Sankoré, môžete ich spúšťať ako dokumenty vytvorené v OpenBoarde. + + + Cancel + Zrušiť + + + Proceed + Pokračovať + + + Open-Sankoré documents are present on your computer. It is possible to import them to OpenBoard by pressing the “Proceed” button to launch the importer application. + Vo vašom počítači sa nachádzajú dokumenty Open-Sankoré. Do OpenBoardu ich môžete nahrať stlačením tlačidla Pokračovať, ktorým sa spustí aplikácia na nahrávanie. + + + + UBPersistenceManager + + (copy) + (kópia) + + + Document Repository Loss + Strata úložiska dokumentov + + + has lost access to the document repository '%1'. Unfortunately the application must shut down to avoid data corruption. Latest changes may be lost as well. + stratil prístup k úložisku dokumentov '%1'. Aplikácia sa musí zatvoriť, aby sa predišlo poškodeniu dát. Možno nebudú uložené ani najnovšie zmeny. + + + Moving page to trash folder... + + + + + UBPlatformUtils + + English + Angličtina + + + Russian + Ruština + + + German + Nemčina + + + French + Francúzština + + + Swiss French + Švajčiarska francúzština + + + + UBPodcastController + + Full + Vysoké rozlíšenie + + + Small + Nízke rozlíšenie + + + Podcast recording error (%1) + Chyba pri nahrávaní podcastu (%1) + + + No Podcast encoder available ... + Žiaden kódovač podcastu nie je k dispozícii. + + + Publish to Youtube + inconsistent: elswhere written as YouTube + Publikovať na Youtube + + + Medium + Stredne vysoké rozlíšenie + + + in folder %1 + v priečinku %1 + + + Part %1 + Časť %1 + + + Podcast created %1 + Podcast vytvorený %1 + + + No Audio Recording + Žiadna zvuková nahrávka + + + Publish to Intranet + Publikovať na intranet + + + on your desktop ... + na vašu pracovnú plochu... + + + Default Audio Input + Predvolený vstup pre zvuk + + + Failed to start encoder ... + Nepodarilo sa spustiť kódovač... + + + OpenBoard Cast + Názov súboru podcastu + Film OpenBoardu + + + + UBPreferencesController + + version: + verzia: + + + Marker is pressure sensitive + Zvýrazňovač je citlivý na tlak + + + + UBProxyLoginDlg + + Password: + Heslo: + + + Proxy Login + Prihlásenie na proxy + + + Username: + Používateľské meno: + + + + UBPublicationDlg + + Description: + Popis: + + + Title: + Názov: + + + Publish + Publikovať + + + Publish document on the web + Publikovať dokument na internet + + + + UBSettings + + My Movies + Moje filmy + + + + UBStartupHintsPalette + + Visible next time + Zobraziť aj nabudúce + + + + UBTeacherBarWidget + + + + + + + UBThumbnailAdaptor + + %1 thumbnails generated ... + %1 vytvorených miniatúr... + + + Generating preview thumbnails ... + Vytvárajú sa ukážky miniatúr... + + + loading thumbnail of page %1 + + + + + UBThumbnailTextItem + + Page %0 + Stránka %0 + + + + UBToolsManager + + Mask + Clona + + + Cache + Baterka + + + Ruler + Pravítko + + + Triangle + Trojuholník + + + Compass + Kružidlo + + + Protractor + Uhlomer + + + Magnifier + Lupa + + + + UBTrapFlashController + + Web + Web + + + Whole page + Celá stránka + + + + UBUpdateDlg + + Document updater + Aktualizácia dokumentu + + + Please wait the import process will start soon... + Prosím, počkajte, proces nahrávania sa čoskoro začne... + + + Files update successful! +Please reboot the application to access the updated documents. + Aktualizácia bola úspešne dokončená! +Reštartujte aplikáciu, aby ste mohli pracovať s aktualizovanými dokumentmi. + + + Browse + Prehľadávať + + + Select a backup folder + Vyberte priečinok zálohy + + + files require an update. + súbory si vyžadujú aktualizáciu. + + + Update + Aktualizovať + + + An error occured during the update. The files have not been affected. + Počas aktualizácie sa vyskytla chyba. Súbory to neovplyvnilo. + + + Files update results + Výsledky aktualizácie súborov + + + Backup path: + Umiestnenie zálohy: + + + Updating file + Prebieha aktualizácia súboru + + + Remind me later + Pripomenúť mi neskôr + + + + UBWebPluginWidget + + Loading... + Nahráva sa... + + + + UBWidgetUniboardAPI + + %0 called (method=%1, status=%2) + %0 vyvolané (metóda = %1, stav = %2) + + + + UBYouTubePublisher + + YouTube authentication failed. + Nepodarilo sa prihlásiť na YouTube. + + + Error while uploading video to YouTube (%1) + Chyba pri nahrávaní videa na YouTube (%1) + + + Upload to YouTube in progress %1 % + Prebieha nahrávanie na YouTube %1 % + + + + UBYouTubePublishingDialog + + Music + Hudba + + + People & Blogs + Ľudia a blogy + + + Nonprofits & Activism + Neziskovky a aktivisti + + + Comedy + Komédia + + + Gaming + Hry + + + Sports + Šport + + + Upload + Nahrať + + + Science & Technology + Veda a technika + + + Howto & Style + Návody a štýl + + + Education + Vzdelávanie + + + Entertainment + Zábava + + + Travel & Events + Cestovanie a udalosti + + + News & Politics + Správy a politika + + + Pets & Animals + Zvieratá + + + Autos & Vehicles + Autá a dopravné prostriedky + + + + UBZoomPalette + + %1 x + %1 x + + + + WBClearButton + + Clear + Vyčistiť + + + + WBDownloadItem + + KB + kB + + + MB + MB + + + bytes + bytov + + + - %4 %5 remaining + – zostáva %4 %5 + + + minutes + minút(y) + + + Error opening saved file: %1 + Chyba pri otváraní uloženého súboru: %1 + + + seconds + sekúnd + + + Error saving: %1 + Chyba pri ukladaní súboru: %1 + + + Download canceled: %1 + Sťahovanie súboru bolo zrušené: %1 + + + %1 of %2 - Stopped + %1 z(o) %2 – zastavené + + + Save File + Uložiť súbor + + + %1 of %2 (%3/sec) %4 + %1 z(o) %2 (%3/sek) %4 + + + Network Error: %1 + Chyba siete: %1 + + + ? + unknown file size + ? + + + + WBDownloadManager + + 1 Download + 1 stiahnutý súbor + + + %1 Downloads + always >= 2 + %1 stiahnuté súbory + + + + WBHistoryModel + + Title + Názov + + + Address + Adresa + + + + WBHistoryTreeModel + + %1 items + 2,3,4 položky, 0, >=5 položiek + %1 položiek + + + Earlier Today + Dnes + + + + WBSearchLineEdit + + Search + Hľadať + + + + WBTabBar + + Reload All Tabs + Obnoviť všetky karty + + + Reload Tab + Obnoviť kartu + + + Clone Tab + Duplikovať kartu + + + &Close Tab + &Zatvoriť kartu + + + Close &Other Tabs + Zatvoriť &ostané karty + + + New &Tab + Nová &karta + + + + WBTabWidget + + (Untitled) + (Bez názvu) + + + Recently Closed Tabs + Nedávno zatvorené karty + + + + WBToolbarSearch + + Recent Searches + Nedávne vyhľadávania + + + Search + Vyhľadať + + + No Recent Searches + Žiadne nedávne vyhľadávania + + + Clear Recent Searches + Vymazať nedávne vyhľadávania + + + + WBWebPage + + PDF + PDF + + + Add to Current Document + Pridať do aktuálneho dokumentu + + + Download + Stiahnuť + + + Error loading page: %1 + Chyba pri nahrávaní stránky: %1 + + + Download PDF Document: would you prefer to download the PDF file or add it to the current OpenBoard document? + Sťahovanie dokumentu PDF: chcete súbor PDF radšej stiahnuť alebo pridať do aktuálneho dokumentu? + + + + WBWebView + + Open in New Tab + Otvoriť na novej karte + + + + YouTubePublishingDialog + + Title + Názov + + + YouTube Username + Používateľské meno na YouTube + + + YouTube Password + Heslo na YouTube + + + Category + Kategória + + + Description + Popis + + + Publish Podcast to YouTube + Publikovať podcast na YouTube + + + Keywords + Kľúčové slová + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Lucida Grande'; font-size:10pt;">By clicking 'Upload,' you certify that you own all rights to the content or that you are authorized by the owner to make the content publicly available on YouTube, and that it otherwise complies with the YouTube Terms of Service located at </span><a href="http://www.youtube.com/t/terms"><span style=" font-family:'Lucida Grande'; font-size:10pt; text-decoration: underline; color:#0000ff;">http://www.youtube.com/t/terms</span></a></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Lucida Grande'; font-size:10pt;">Kliknutím na "Upload" (Nahrať) potvrdzujete, že máte všetky práva k materiálu alebo že máte písomný súhlas vlastníka týchto práv na zverejnenie materiálu na sieti YouTube a že materiál je v súlade s podmienkami využívania služieb siete YouTube, ktorých aktuálne znenie sa nachádza na adrese </span><a href="http://www.youtube.com/t/terms"><span style=" font-family:'Lucida Grande'; font-size:10pt; text-decoration: underline; color:#0000ff;">http://www.youtube.com/t/terms</span></a></p></body></html> + + + OpenBoard + OpenBoard + + + Restore credentials on reboot + Po reštarte obnoviť prihlasovacie údaje + + + + brushProperties + + Fine + Tenká + + + Medium + Stredne hrubá + + + Strong + Hrubá + + + Opacity + Priehľadnosť + + + Line Width + Šírka čiary + + + On Light Background + Na svetlom pozadí + + + Pen is Pressure Sensitive + Pero je citlivé na tlak + + + On Dark Background + Na tmavom pozadí + + + Show preview circle from + + + + px + + + + + capturePublishingDialog + + Title + Názov + + + E-mail + E-mail + + + Author + Autor + + + Dialog + Dialóg + + + Description + Popis + + + + documents + + OpenBoard Documents + Dokumenty OpenBoardu + + + + preferencesDialog + + Pen + Pero + + + About + O programe + + + Close + Zatvoriť + + + Horizontal + Vodorovná + + + Display Text Under Button + Pod tlačidlom zobraziť text + + + Show Page with External Browser + Stránku zobraziť v externom prehliadači + + + Default Settings + Predvolené nastavenia + + + Network + Sieť + + + Positioned at the Bottom (recommended for white boards) + Je umiestnený dole (odporúča sa pre tabule) + + + Marker + Zvýrazňovač + + + Internet + Internet + + + Positioned at the Top (recommended for tablets) + Je umiestnený navrchu (odporúča sa pre tablety) + + + Virtual Keyboard + Virtuálna klávesnica + + + Home Page: + Úvodná stránka: + + + Check software update at launch + Pri spustení programu vyhľadať aktualizáciu + + + Software Update + Aktualizácia programu + + + Keyboard button size: + Veľkosť tlačidla klávesnice: + + + Stylus Palette + Paleta pre interaktívne pero + + + Display + Zobraziť + + + Toolbar + Panel s nástrojmi + + + Vertical + Zvislá + + + Preferences + Predvoľby + + + version : … + Verzia:... + + + Licences + Licencie + + + Multi display + Viac obrazoviek + + + Show internal web page content on secondary screen or projector + Na druhej obrazovke alebo projektore zobraziť obsah internej webovej stránky + + + Swap control display and view display + Prehodiť ovládaciu obrazovku a zobrazovaciu obrazovku + + + Mode + Režim + + + Mode to start in: + Režim pri štarte: + + + Board + Tabuľa + + + Desktop + Pracovná plocha + + + Proxy User: + Použ. m. na proxy: + + + Pass: + Heslo: + + + Credits + Poďakovanie + + + Open-Sankoré Importer + Nahrávanie z Open-Sankoré + + + Check if Open-Sankoré data could be imported at launch + Zistiť, či sa pri spustení majú nahrať dáta z Open-Sankoré + + + Use system keyboard (recommended) + Používať systémovú klávesnicu (odporúča sa) + + + Built-in virtual keyboard button size: + Veľkosť tlačidla zabudovanej virtuálnej klávesnice: + + + Grid + + + + On Dark Background + Na tmavom pozadí + + + Opacity + Priehľadnosť + + + On Light Background + Na svetlom pozadí + + + + trapFlashDialog + + Trap flash + Označiť flash + + + Select a flash to trap + Vyberte flash, ktorý chcete označiť + + + about:blank + about:blank + + + Application name + Názov aplikácie + + + Create Application + Vytvoriť aplikáciu + + + diff --git a/resources/i18n/OpenBoard_sv.ts b/resources/i18n/OpenBoard_sv.ts index 0a0395bc..b36e36b9 100644 --- a/resources/i18n/OpenBoard_sv.ts +++ b/resources/i18n/OpenBoard_sv.ts @@ -799,6 +799,18 @@ Open the tutorial web page + + Ruled Light Background + + + + Ruled Dark Background + + + + Reset grid size + + PasswordDialog @@ -890,6 +902,17 @@ Update Uppdatera + + Board drawing... + + + + + UBBackgroundPalette + + Grid size + + UBBoardController @@ -919,7 +942,7 @@ Delete page %1 from document - Radera sida %1 från dokument + Radera sida %1 från dokument Page %1 deleted @@ -946,6 +969,10 @@ Document has just been saved... + + Deleting page %1 + + UBBoardPaletteManager @@ -958,6 +985,13 @@ FångadBild + + UBBoardThumbnailsView + + Loading page (%1/%2) + + + UBCachePropertiesWidget @@ -1197,7 +1231,7 @@ UBDocumentNavigator Page %0 - Sida %0 + Sida %0 @@ -1229,12 +1263,39 @@ Avsluta + + UBDraggableThumbnailView + + Page %0 + Sida %0 + + UBExportAdaptor Warnings during export was appeared Varningar unde export dök upp + + Exporting document... + Exporterar dokument... + + + Export failed + + + + Unable to export to the selected location. You do not have the permissions necessary to save the file. + + + + Export failed: location not writable + + + + Export successful. + Export lyckades. + UBExportCFF @@ -1271,11 +1332,11 @@ Exporting document... - Exporterar dokument... + Exporterar dokument... Export successful. - Export lyckades. + Export lyckades. Exporting %1 %2 of %3 @@ -1285,18 +1346,6 @@ Export to OpenBoard Format - - Export failed: location not writable - - - - Export failed - - - - Unable to export to the selected location. You do not have the permissions necessary to save the file. - - UBExportFullPDF @@ -1306,28 +1355,16 @@ Exporting document... - Exporterar dokument... + Exporterar dokument... Export successful. - Export lyckades. + Export lyckades. Export to PDF Exportera till PDF - - Export failed: location not writable - - - - Export failed - - - - Unable to export to the selected location. You do not have the permissions necessary to save the file. - - UBExportPDF @@ -1337,11 +1374,11 @@ Exporting document... - Exporterar dokument... + Exporterar dokument... Export successful. - Export lyckades. + Export lyckades. Exporting page %1 of %2 @@ -1387,7 +1424,7 @@ Set as background - Infoga som bakgrund + Infoga som bakgrund Add to library @@ -1527,6 +1564,10 @@ Go to Content Source Gå till innehållskällan + + Set as background + Infoga som bakgrund + UBGraphicsMediaItem @@ -1777,6 +1818,10 @@ Vill du ignorera felen för den här värden? has lost access to the document repository '%1'. Unfortunately the application must shut down to avoid data corruption. Latest changes may be lost as well. + + Moving page to trash folder... + + UBPlatformUtils @@ -1940,6 +1985,17 @@ Vill du ignorera felen för den här värden? %1 thumbnails generated ... %1 miniatybil genererad ... + + loading thumbnail of page %1 + + + + + UBThumbnailTextItem + + Page %0 + Sida %0 + UBToolsManager @@ -2415,6 +2471,14 @@ p, li { white-space: pre-wrap; } Pen is Pressure Sensitive Pennan är tryckkänslig + + Show preview circle from + + + + px + + capturePublishingDialog @@ -2600,6 +2664,22 @@ p, li { white-space: pre-wrap; } Built-in virtual keyboard button size: + + Grid + + + + On Dark Background + På mörk bakgrund + + + Opacity + Genomskinlighet + + + On Light Background + På ljus bakgrund + trapFlashDialog diff --git a/resources/i18n/OpenBoard_tr.ts b/resources/i18n/OpenBoard_tr.ts index 9b9c9c84..963f341e 100644 --- a/resources/i18n/OpenBoard_tr.ts +++ b/resources/i18n/OpenBoard_tr.ts @@ -799,6 +799,18 @@ Open the tutorial web page + + Ruled Light Background + + + + Ruled Dark Background + + + + Reset grid size + + PasswordDialog @@ -890,6 +902,17 @@ Update Güncelle + + Board drawing... + + + + + UBBackgroundPalette + + Grid size + + UBBoardController @@ -919,7 +942,7 @@ Delete page %1 from document - %1 Sayfayı dökümandan sil + %1 Sayfayı dökümandan sil Page %1 deleted @@ -945,6 +968,10 @@ Document has just been saved... + + Deleting page %1 + + UBBoardPaletteManager @@ -957,6 +984,13 @@ YakalananResim + + UBBoardThumbnailsView + + Loading page (%1/%2) + + + UBCachePropertiesWidget @@ -1195,7 +1229,7 @@ UBDocumentNavigator Page %0 - Sayfa %0 + Sayfa %0 @@ -1227,12 +1261,39 @@ İptal + + UBDraggableThumbnailView + + Page %0 + Sayfa %0 + + UBExportAdaptor Warnings during export was appeared Dışa aktarma sırasında bir uyarı mesajı göründü + + Exporting document... + Döküman dışa aktarılıyor... + + + Export failed + + + + Unable to export to the selected location. You do not have the permissions necessary to save the file. + + + + Export failed: location not writable + + + + Export successful. + + UBExportCFF @@ -1269,11 +1330,11 @@ Exporting document... - Döküman dışa aktarılıyor... + Döküman dışa aktarılıyor... Export successful. - Dışa aktarım tamamlandı. + Dışa aktarım tamamlandı. Exporting %1 %2 of %3 @@ -1283,18 +1344,6 @@ Export to OpenBoard Format - - Export failed: location not writable - - - - Export failed - - - - Unable to export to the selected location. You do not have the permissions necessary to save the file. - - UBExportFullPDF @@ -1304,28 +1353,16 @@ Exporting document... - Döküman dışa aktarılıyor... + Döküman dışa aktarılıyor... Export successful. - Dışa aktarım tamamlandı. + Dışa aktarım tamamlandı. Export to PDF PDF Olarak Aktar - - Export failed: location not writable - - - - Export failed - - - - Unable to export to the selected location. You do not have the permissions necessary to save the file. - - UBExportPDF @@ -1335,11 +1372,11 @@ Exporting document... - Döküman dışa aktarılıyor... + Döküman dışa aktarılıyor... Export successful. - Dışa aktarım tamamlandı. + Dışa aktarım tamamlandı. Exporting page %1 of %2 @@ -1385,7 +1422,7 @@ Set as background - Arkaplan olarak tanımla + Arkaplan olarak tanımla Add to library @@ -1525,6 +1562,10 @@ Go to Content Source İçerik Kaynağına Git + + Set as background + Arkaplan olarak tanımla + UBGraphicsMediaItem @@ -1774,6 +1815,10 @@ Bu host için yukarıdaki hatalar yok sayılsın mı? has lost access to the document repository '%1'. Unfortunately the application must shut down to avoid data corruption. Latest changes may be lost as well. + + Moving page to trash folder... + + UBPlatformUtils @@ -1937,6 +1982,17 @@ Bu host için yukarıdaki hatalar yok sayılsın mı? %1 thumbnails generated ... %1 adet önizleme resmi oluşturuldu ... + + loading thumbnail of page %1 + + + + + UBThumbnailTextItem + + Page %0 + Sayfa %0 + UBToolsManager @@ -2412,6 +2468,14 @@ p, li { white-space: pre-wrap; } Pen is Pressure Sensitive Kalem Basınca Duyarlıdır + + Show preview circle from + + + + px + + capturePublishingDialog @@ -2597,6 +2661,22 @@ p, li { white-space: pre-wrap; } Built-in virtual keyboard button size: + + Grid + + + + On Dark Background + Kapalı Arkaplan Üzerine + + + Opacity + Saydamlık + + + On Light Background + Açık Arkaplan Üzerine + trapFlashDialog diff --git a/resources/i18n/OpenBoard_zh.ts b/resources/i18n/OpenBoard_zh.ts index 90dd8f2f..80444d6c 100644 --- a/resources/i18n/OpenBoard_zh.ts +++ b/resources/i18n/OpenBoard_zh.ts @@ -799,6 +799,18 @@ Open the tutorial web page + + Ruled Light Background + + + + Ruled Dark Background + + + + Reset grid size + + PasswordDialog @@ -890,6 +902,17 @@ Update 更新 + + Board drawing... + + + + + UBBackgroundPalette + + Grid size + + UBBoardController @@ -919,7 +942,7 @@ Delete page %1 from document - 删除文件的%1页 + 删除文件的%1页 Page %1 deleted @@ -945,6 +968,10 @@ Document has just been saved... + + Deleting page %1 + + UBBoardPaletteManager @@ -957,6 +984,13 @@ 图像截图 + + UBBoardThumbnailsView + + Loading page (%1/%2) + + + UBCachePropertiesWidget @@ -1195,7 +1229,7 @@ UBDocumentNavigator Page %0 - 页面 %0 + 页面 %0 @@ -1226,12 +1260,39 @@ 取消 + + UBDraggableThumbnailView + + Page %0 + 页面 %0 + + UBExportAdaptor Warnings during export was appeared 导出过程中出现警告 + + Exporting document... + 文档导出中…… + + + Export failed + + + + Unable to export to the selected location. You do not have the permissions necessary to save the file. + + + + Export failed: location not writable + + + + Export successful. + + UBExportCFF @@ -1268,11 +1329,11 @@ Exporting document... - 文档导出中…… + 文档导出中…… Export successful. - 导出成功 + 导出成功 Exporting %1 %2 of %3 @@ -1282,18 +1343,6 @@ Export to OpenBoard Format - - Export failed: location not writable - - - - Export failed - - - - Unable to export to the selected location. You do not have the permissions necessary to save the file. - - UBExportFullPDF @@ -1303,28 +1352,16 @@ Exporting document... - 文档导出中…… + 文档导出中…… Export successful. - 导出成功 + 导出成功 Export to PDF 以PDF文件格式导出 - - Export failed: location not writable - - - - Export failed - - - - Unable to export to the selected location. You do not have the permissions necessary to save the file. - - UBExportPDF @@ -1334,11 +1371,11 @@ Exporting document... - 文档导出中…… + 文档导出中…… Export successful. - 导出成功 + 导出成功 Exporting page %1 of %2 @@ -1384,7 +1421,7 @@ Set as background - 设置为背景 + 设置为背景 Add to library @@ -1524,6 +1561,10 @@ Go to Content Source 访问内容来源 + + Set as background + 设置为背景 + UBGraphicsMediaItem @@ -1774,6 +1815,10 @@ Do you want to ignore these errors for this host? has lost access to the document repository '%1'. Unfortunately the application must shut down to avoid data corruption. Latest changes may be lost as well. + + Moving page to trash folder... + + UBPlatformUtils @@ -1937,6 +1982,17 @@ Do you want to ignore these errors for this host? %1 thumbnails generated ... 已为%1生成缩略图…… + + loading thumbnail of page %1 + + + + + UBThumbnailTextItem + + Page %0 + 页面 %0 + UBToolsManager @@ -2412,6 +2468,14 @@ p, li { white-space: pre-wrap; } Pen is Pressure Sensitive 使用压感笔 + + Show preview circle from + + + + px + + capturePublishingDialog @@ -2597,6 +2661,22 @@ p, li { white-space: pre-wrap; } Built-in virtual keyboard button size: + + Grid + + + + On Dark Background + 黑色背景 + + + Opacity + 透明度 + + + On Light Background + 白色背景 + trapFlashDialog diff --git a/resources/i18n/OpenBoard_zh_CN.ts b/resources/i18n/OpenBoard_zh_CN.ts index 90dd8f2f..80444d6c 100644 --- a/resources/i18n/OpenBoard_zh_CN.ts +++ b/resources/i18n/OpenBoard_zh_CN.ts @@ -799,6 +799,18 @@ Open the tutorial web page + + Ruled Light Background + + + + Ruled Dark Background + + + + Reset grid size + + PasswordDialog @@ -890,6 +902,17 @@ Update 更新 + + Board drawing... + + + + + UBBackgroundPalette + + Grid size + + UBBoardController @@ -919,7 +942,7 @@ Delete page %1 from document - 删除文件的%1页 + 删除文件的%1页 Page %1 deleted @@ -945,6 +968,10 @@ Document has just been saved... + + Deleting page %1 + + UBBoardPaletteManager @@ -957,6 +984,13 @@ 图像截图 + + UBBoardThumbnailsView + + Loading page (%1/%2) + + + UBCachePropertiesWidget @@ -1195,7 +1229,7 @@ UBDocumentNavigator Page %0 - 页面 %0 + 页面 %0 @@ -1226,12 +1260,39 @@ 取消 + + UBDraggableThumbnailView + + Page %0 + 页面 %0 + + UBExportAdaptor Warnings during export was appeared 导出过程中出现警告 + + Exporting document... + 文档导出中…… + + + Export failed + + + + Unable to export to the selected location. You do not have the permissions necessary to save the file. + + + + Export failed: location not writable + + + + Export successful. + + UBExportCFF @@ -1268,11 +1329,11 @@ Exporting document... - 文档导出中…… + 文档导出中…… Export successful. - 导出成功 + 导出成功 Exporting %1 %2 of %3 @@ -1282,18 +1343,6 @@ Export to OpenBoard Format - - Export failed: location not writable - - - - Export failed - - - - Unable to export to the selected location. You do not have the permissions necessary to save the file. - - UBExportFullPDF @@ -1303,28 +1352,16 @@ Exporting document... - 文档导出中…… + 文档导出中…… Export successful. - 导出成功 + 导出成功 Export to PDF 以PDF文件格式导出 - - Export failed: location not writable - - - - Export failed - - - - Unable to export to the selected location. You do not have the permissions necessary to save the file. - - UBExportPDF @@ -1334,11 +1371,11 @@ Exporting document... - 文档导出中…… + 文档导出中…… Export successful. - 导出成功 + 导出成功 Exporting page %1 of %2 @@ -1384,7 +1421,7 @@ Set as background - 设置为背景 + 设置为背景 Add to library @@ -1524,6 +1561,10 @@ Go to Content Source 访问内容来源 + + Set as background + 设置为背景 + UBGraphicsMediaItem @@ -1774,6 +1815,10 @@ Do you want to ignore these errors for this host? has lost access to the document repository '%1'. Unfortunately the application must shut down to avoid data corruption. Latest changes may be lost as well. + + Moving page to trash folder... + + UBPlatformUtils @@ -1937,6 +1982,17 @@ Do you want to ignore these errors for this host? %1 thumbnails generated ... 已为%1生成缩略图…… + + loading thumbnail of page %1 + + + + + UBThumbnailTextItem + + Page %0 + 页面 %0 + UBToolsManager @@ -2412,6 +2468,14 @@ p, li { white-space: pre-wrap; } Pen is Pressure Sensitive 使用压感笔 + + Show preview circle from + + + + px + + capturePublishingDialog @@ -2597,6 +2661,22 @@ p, li { white-space: pre-wrap; } Built-in virtual keyboard button size: + + Grid + + + + On Dark Background + 黑色背景 + + + Opacity + 透明度 + + + On Light Background + 白色背景 + trapFlashDialog diff --git a/resources/i18n/OpenBoard_zh_TW.ts b/resources/i18n/OpenBoard_zh_TW.ts index dcd9da75..5f84109a 100644 --- a/resources/i18n/OpenBoard_zh_TW.ts +++ b/resources/i18n/OpenBoard_zh_TW.ts @@ -799,6 +799,18 @@ Open the tutorial web page + + Ruled Light Background + + + + Ruled Dark Background + + + + Reset grid size + + PasswordDialog @@ -890,6 +902,17 @@ Update 更新 + + Board drawing... + + + + + UBBackgroundPalette + + Grid size + + UBBoardController @@ -919,7 +942,7 @@ Delete page %1 from document - 刪除文件的第 %1 頁 + 刪除文件的第 %1 頁 Page %1 deleted @@ -945,6 +968,10 @@ Document has just been saved... + + Deleting page %1 + + UBBoardPaletteManager @@ -957,6 +984,13 @@ 圖像擷取 + + UBBoardThumbnailsView + + Loading page (%1/%2) + + + UBCachePropertiesWidget @@ -1195,7 +1229,7 @@ UBDocumentNavigator Page %0 - 第 %0 頁 + 第 %0 頁 @@ -1226,12 +1260,39 @@ 取消 + + UBDraggableThumbnailView + + Page %0 + 第 %0 頁 + + UBExportAdaptor Warnings during export was appeared 匯出過程出現警告 + + Exporting document... + + + + Export failed + + + + Unable to export to the selected location. You do not have the permissions necessary to save the file. + + + + Export failed: location not writable + + + + Export successful. + + UBExportCFF @@ -1268,11 +1329,11 @@ Exporting document... - 文件匯出中... + 文件匯出中... Export successful. - 匯出成功。 + 匯出成功。 Exporting %1 %2 of %3 @@ -1282,18 +1343,6 @@ Export to OpenBoard Format - - Export failed: location not writable - - - - Export failed - - - - Unable to export to the selected location. You do not have the permissions necessary to save the file. - - UBExportFullPDF @@ -1303,7 +1352,7 @@ Exporting document... - 匯出文件中... + 匯出文件中... Export to PDF @@ -1311,19 +1360,7 @@ Export successful. - 匯出成功。 - - - Export failed: location not writable - - - - Export failed - - - - Unable to export to the selected location. You do not have the permissions necessary to save the file. - + 匯出成功。 @@ -1338,11 +1375,11 @@ Export successful. - 匯出成功。 + 匯出成功。 Exporting document... - 匯出文件中... + 匯出文件中... Export to PDF @@ -1384,7 +1421,7 @@ Set as background - 設定成背景 + 設定成背景 Add to library @@ -1524,6 +1561,10 @@ Go to Content Source 至內容來源 + + Set as background + 設定成背景 + UBGraphicsMediaItem @@ -1768,6 +1809,10 @@ Do you want to ignore these errors for this host? has lost access to the document repository '%1'. Unfortunately the application must shut down to avoid data corruption. Latest changes may be lost as well. + + Moving page to trash folder... + + UBPlatformUtils @@ -1924,6 +1969,17 @@ Do you want to ignore these errors for this host? %1 thumbnails generated ... 已產生縮圖 %1... + + loading thumbnail of page %1 + + + + + UBThumbnailTextItem + + Page %0 + 第 %0 頁 + UBToolsManager @@ -2399,6 +2455,14 @@ p, li { white-space: pre-wrap; } Pen is Pressure Sensitive 感壓筆 + + Show preview circle from + + + + px + + capturePublishingDialog @@ -2584,6 +2648,22 @@ p, li { white-space: pre-wrap; } Built-in virtual keyboard button size: + + Grid + + + + On Dark Background + 深色背景 + + + Opacity + 透明度 + + + On Light Background + 淡色背景 + trapFlashDialog diff --git a/resources/images/backgroundPalette/background4.svg b/resources/images/backgroundPalette/background4.svg index 2513743c..053ebf05 100644 --- a/resources/images/backgroundPalette/background4.svg +++ b/resources/images/backgroundPalette/background4.svg @@ -1,73 +1,133 @@ - - - - - - - - - - - -]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + +image/svg+xml \ No newline at end of file diff --git a/resources/images/backgroundPalette/background5.svg b/resources/images/backgroundPalette/background5.svg new file mode 100644 index 00000000..ac6e870e --- /dev/null +++ b/resources/images/backgroundPalette/background5.svg @@ -0,0 +1,146 @@ + + + +image/svg+xml \ No newline at end of file diff --git a/resources/images/backgroundPalette/background5On.svg b/resources/images/backgroundPalette/background5On.svg new file mode 100644 index 00000000..25d0a1c3 --- /dev/null +++ b/resources/images/backgroundPalette/background5On.svg @@ -0,0 +1,149 @@ + + + +image/svg+xml \ No newline at end of file diff --git a/resources/images/backgroundPalette/background6.svg b/resources/images/backgroundPalette/background6.svg new file mode 100644 index 00000000..1c38545b --- /dev/null +++ b/resources/images/backgroundPalette/background6.svg @@ -0,0 +1,146 @@ + + + +image/svg+xml \ No newline at end of file diff --git a/resources/images/backgroundPalette/background6On.svg b/resources/images/backgroundPalette/background6On.svg new file mode 100644 index 00000000..1210a251 --- /dev/null +++ b/resources/images/backgroundPalette/background6On.svg @@ -0,0 +1,150 @@ + + + +image/svg+xml \ No newline at end of file diff --git a/resources/images/backgroundPalette/resetDefaultGridSize.svg b/resources/images/backgroundPalette/resetDefaultGridSize.svg new file mode 100644 index 00000000..5df55a0f --- /dev/null +++ b/resources/images/backgroundPalette/resetDefaultGridSize.svg @@ -0,0 +1,21 @@ + + + + + + + + + diff --git a/resources/images/moveDown.svg b/resources/images/moveDown.svg new file mode 100644 index 00000000..16b78e93 --- /dev/null +++ b/resources/images/moveDown.svg @@ -0,0 +1,8 @@ + + + + + + + diff --git a/resources/images/moveDownDisabled.svg b/resources/images/moveDownDisabled.svg new file mode 100644 index 00000000..4894f3ae --- /dev/null +++ b/resources/images/moveDownDisabled.svg @@ -0,0 +1,64 @@ + + + +image/svg+xml + + + + \ No newline at end of file diff --git a/resources/images/setAsBackground.svg b/resources/images/setAsBackground.svg new file mode 100644 index 00000000..8c83a086 --- /dev/null +++ b/resources/images/setAsBackground.svg @@ -0,0 +1,375 @@ + + + +image/svg+xml \ No newline at end of file diff --git a/resources/library/applications/Horloge.wgt/config.xml b/resources/library/applications/Horloge.wgt/config.xml new file mode 100644 index 00000000..5c055751 --- /dev/null +++ b/resources/library/applications/Horloge.wgt/config.xml @@ -0,0 +1,13 @@ + + + Horloge + fbocquet@laposte.net + + + diff --git a/resources/library/applications/Horloge.wgt/icon.png b/resources/library/applications/Horloge.wgt/icon.png new file mode 100644 index 00000000..1b069c30 Binary files /dev/null and b/resources/library/applications/Horloge.wgt/icon.png differ diff --git a/resources/library/applications/Horloge.wgt/index.html b/resources/library/applications/Horloge.wgt/index.html new file mode 100644 index 00000000..9e809d48 --- /dev/null +++ b/resources/library/applications/Horloge.wgt/index.html @@ -0,0 +1,60 @@ + + + + Horloge + + + + + + + + + + + +
+
+
+ + + Horloge + +
+ + + diff --git a/resources/library/applications/Horloge.wgt/station-clock.js b/resources/library/applications/Horloge.wgt/station-clock.js new file mode 100644 index 00000000..b5550059 --- /dev/null +++ b/resources/library/applications/Horloge.wgt/station-clock.js @@ -0,0 +1,488 @@ +/*! + * station-clock.js + * + * Copyright (c) 2010 Ruediger Appel + * ludi at mac dot com + * + * Date: 2016-02-16 + * Version: 1.0.1 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Known Issues: + * + * Shadows for some second hands is not on one layer + * + * Thanks to Paul Schröfl for the Wiener Würfeluhr + */ + +// clock body (Uhrgehäuse) +StationClock.NoBody = 0; +StationClock.SmallWhiteBody = 1; +StationClock.RoundBody = 2; +StationClock.RoundGreenBody = 3; +StationClock.SquareBody = 4; +StationClock.ViennaBody = 5; + +// stroke dial (Zifferblatt) +StationClock.NoDial = 0; +StationClock.GermanHourStrokeDial = 1; +StationClock.GermanStrokeDial = 2; +StationClock.AustriaStrokeDial = 3; +StationClock.SwissStrokeDial = 4; +StationClock.ViennaStrokeDial = 5; + +//clock hour hand (Stundenzeiger) +StationClock.PointedHourHand = 1; +StationClock.BarHourHand = 2; +StationClock.SwissHourHand = 3; +StationClock.ViennaHourHand = 4; + +//clock minute hand (Minutenzeiger) +StationClock.PointedMinuteHand = 1; +StationClock.BarMinuteHand = 2; +StationClock.SwissMinuteHand = 3; +StationClock.ViennaMinuteHand = 4; + +//clock second hand (Sekundenzeiger) +StationClock.NoSecondHand = 0; +StationClock.BarSecondHand = 1; +StationClock.HoleShapedSecondHand = 2; +StationClock.NewHoleShapedSecondHand = 3; +StationClock.SwissSecondHand = 4; + +// clock boss (Zeigerabdeckung) +StationClock.NoBoss = 0; +StationClock.BlackBoss = 1; +StationClock.RedBoss = 2; +StationClock.ViennaBoss = 3; + +// minute hand behavoir +StationClock.CreepingMinuteHand = 0; +StationClock.BouncingMinuteHand = 1; +StationClock.ElasticBouncingMinuteHand = 2; + +// second hand behavoir +StationClock.CreepingSecondHand = 0; +StationClock.BouncingSecondHand = 1; +StationClock.ElasticBouncingSecondHand = 2; +StationClock.OverhastySecondHand = 3; + + +function StationClock(clockId) { + this.clockId = clockId; + this.radius = 0; + + // hour offset + this.hourOffset = 0; + + // clock body + this.body = StationClock.RoundBody; + this.bodyShadowColor = "rgba(0,0,0,0.5)"; + this.bodyShadowOffsetX = 0.03; + this.bodyShadowOffsetY = 0.03; + this.bodyShadowBlur = 0.06; + + // body dial + this.dial = StationClock.GermanStrokeDial; + this.dialColor = 'rgb(60,60,60)'; + + // clock hands + this.hourHand = StationClock.PointedHourHand; + this.minuteHand = StationClock.PointedMinuteHand; + this.secondHand = StationClock.HoleShapedSecondHand; + this.handShadowColor = 'rgba(0,0,0,0.3)'; + this.handShadowOffsetX = 0.03; + this.handShadowOffsetY = 0.03; + this.handShadowBlur = 0.04; + + // clock colors + this.hourHandColor = 'rgb(0,0,0)'; + this.minuteHandColor = 'rgb(0,0,0)'; + this.secondHandColor = 'rgb(200,0,0)'; + + // clock boss + this.boss = StationClock.NoBoss; + this.bossShadowColor = "rgba(0,0,0,0.2)"; + this.bossShadowOffsetX = 0.02; + this.bossShadowOffsetY = 0.02; + this.bossShadowBlur = 0.03; + + // hand behavoir + this.minuteHandBehavoir = StationClock.CreepingMinuteHand; + this.secondHandBehavoir = StationClock.OverhastySecondHand; + + // hand animation + this.minuteHandAnimationStep = 0; + this.secondHandAnimationStep = 0; + this.lastMinute = 0; + this.lastSecond = 0; +}; + +StationClock.prototype.draw = function() { + var clock = document.getElementById(this.clockId); + if (clock) { + var context = clock.getContext('2d'); + if (context) { + this.radius = 0.75 * (Math.min(clock.width, clock.height) / 2); + + // clear canvas and set new origin + context.clearRect(0, 0, clock.width, clock.height); + context.save(); + context.translate(clock.width / 2, clock.height / 2); + + // draw body + if (this.body != StationClock.NoStrokeBody) { + context.save(); + switch (this.body) { + case StationClock.SmallWhiteBody: + this.fillCircle(context, "rgb(255,255,255)", 0, 0, 1); + break; + case StationClock.RoundBody: + this.fillCircle(context, "rgb(255,255,255)", 0, 0, 1.1); + context.save(); + this.setShadow(context, this.bodyShadowColor, this.bodyShadowOffsetX, this.bodyShadowOffsetY, this.bodyShadowBlur); + this.strokeCircle(context, "rgb(0,0,0)", 0, 0, 1.1, 0.07); + context.restore(); + break; + case StationClock.RoundGreenBody: + this.fillCircle(context, "rgb(235,236,212)", 0, 0, 1.1); + context.save(); + this.setShadow(context, this.bodyShadowColor, this.bodyShadowOffsetX, this.bodyShadowOffsetY, this.bodyShadowBlur); + this.strokeCircle(context, "rgb(180,180,180)", 0, 0, 1.1, 0.2); + context.restore(); + this.strokeCircle(context, "rgb(29,84,31)", 0, 0, 1.15, 0.1); + context.save(); + this.setShadow(context, "rgba(235,236,212,100)", -0.02, -0.02, 0.09); + this.strokeCircle(context, 'rgb(76,128,110)', 0, 0, 1.1, 0.08); + context.restore(); + break; + case StationClock.SquareBody: + context.save(); + this.setShadow(context, this.bodyShadowColor, this.bodyShadowOffsetX, this.bodyShadowOffsetY, this.bodyShadowBlur); + this.fillSquare(context, 'rgb(237,235,226)', 0, 0, 2.4); + this.strokeSquare(context, 'rgb(38,106,186)', 0, 0, 2.32, 0.16); + context.restore(); + context.save(); + this.setShadow(context, this.bodyShadowColor, this.bodyShadowOffsetX, this.bodyShadowOffsetY, this.bodyShadowBlur); + this.strokeSquare(context, 'rgb(42,119,208)', 0, 0, 2.24, 0.08); + context.restore(); + break; + case StationClock.ViennaBody: + context.save(); + this.fillSymmetricPolygon(context, 'rgb(156,156,156)', [[-1.2,1.2],[-1.2,-1.2]],0.1); + this.fillPolygon(context, 'rgb(156,156,156)', 0,1.2 , 1.2,1.2 , 1.2,0); + this.fillCircle(context, 'rgb(255,255,255)', 0, 0, 1.05, 0.08); + this.strokeCircle(context, 'rgb(0,0,0)', 0, 0, 1.05, 0.01); + this.strokeCircle(context, 'rgb(100,100,100)', 0, 0, 1.1, 0.01); + this.fillPolygon(context, 'rgb(100,100,100)', 0.45,1.2 , 1.2,1.2 , 1.2,0.45); + this.fillPolygon(context, 'rgb(170,170,170)', 0.45,-1.2 , 1.2,-1.2 , 1.2,-0.45); + this.fillPolygon(context, 'rgb(120,120,120)', -0.45,1.2 , -1.2,1.2 , -1.2,0.45); + this.fillPolygon(context, 'rgb(200,200,200)', -0.45,-1.2 , -1.2,-1.2 , -1.2,-0.45); + this.strokeSymmetricPolygon(context, 'rgb(156,156,156)', [[-1.2,1.2],[-1.2,-1.2]],0.01); + this.fillPolygon(context, 'rgb(255,0,0)', 0.05,-0.6 , 0.15,-0.6 , 0.15,-0.45 , 0.05,-0.45); + this.fillPolygon(context, 'rgb(255,0,0)', -0.05,-0.6 , -0.15,-0.6 , -0.15,-0.45 , -0.05,-0.45); + this.fillPolygon(context, 'rgb(255,0,0)', 0.05,-0.35 , 0.15,-0.35 , 0.15,-0.30 , 0.10,-0.20 , 0.05,-0.20); + this.fillPolygon(context, 'rgb(255,0,0)', -0.05,-0.35 , -0.15,-0.35 , -0.15,-0.30 , -0.10,-0.20 , -0.05,-0.20); + context.restore(); + break; + } + context.restore(); + } + + // draw dial + for (var i = 0; i < 60; i++) { + context.save(); + context.rotate(i * Math.PI / 30); + switch (this.dial) { + case StationClock.SwissStrokeDial: + if ((i % 5) == 0) { + this.strokeLine(context, this.dialColor, 0.0, -1.0, 0.0, -0.75, 0.07); + } else { + this.strokeLine(context, this.dialColor, 0.0, -1.0, 0.0, -0.92, 0.026); + } + break; + case StationClock.AustriaStrokeDial: + if ((i % 5) == 0) { + this.fillPolygon(context, this.dialColor, -0.04, -1.0, 0.04, -1.0, 0.03, -0.78, -0.03, -0.78); + } else { + this.strokeLine(context, this.dialColor, 0.0, -1.0, 0.0, -0.94, 0.02); + } + break; + case StationClock.GermanStrokeDial: + if ((i % 15) == 0) { + this.strokeLine(context, this.dialColor, 0.0, -1.0, 0.0, -0.70, 0.08); + } else if ((i % 5) == 0) { + this.strokeLine(context, this.dialColor, 0.0, -1.0, 0.0, -0.76, 0.08); + } else { + this.strokeLine(context, this.dialColor, 0.0, -1.0, 0.0, -0.92, 0.036); + } + break; + case StationClock.GermanHourStrokeDial: + if ((i % 15) == 0) { + this.strokeLine(context, this.dialColor, 0.0, -1.0, 0.0, -0.70, 0.10); + } else if ((i % 5) == 0) { + this.strokeLine(context, this.dialColor, 0.0, -1.0, 0.0, -0.74, 0.08); + } + break; + case StationClock.ViennaStrokeDial: + if ((i % 15) == 0) { + this.fillPolygon(context, this.dialColor, 0.7,-0.1, 0.6,0, 0.7,0.1, 1,0.03, 1,-0.03); + } else if ((i % 5) == 0) { + this.fillPolygon(context, this.dialColor, 0.85,-0.06, 0.78,0, 0.85,0.06, 1,0.03, 1,-0.03); + } + this.fillCircle(context, this.dialColor, 0.0, -1.0, 0.03); + break; + } + context.restore(); + } + + // get current time + var time = new Date(); + var millis = time.getMilliseconds() / 1000.0; + var seconds = time.getSeconds(); + var minutes = time.getMinutes(); + var hours = time.getHours() + this.hourOffset; + + // draw hour hand + context.save(); + context.rotate(hours * Math.PI / 6 + minutes * Math.PI / 360); + this.setShadow(context, this.handShadowColor, this.handShadowOffsetX, this.handShadowOffsetY, this.handShadowBlur); + switch (this.hourHand) { + case StationClock.BarHourHand: + this.fillPolygon(context, this.hourHandColor, -0.05, -0.6, 0.05, -0.6, 0.05, 0.15, -0.05, 0.15); + break; + case StationClock.PointedHourHand: + this.fillPolygon(context, this.hourHandColor, 0.0, -0.6, 0.065, -0.53, 0.065, 0.19, -0.065, 0.19, -0.065, -0.53); + break; + case StationClock.SwissHourHand: + this.fillPolygon(context, this.hourHandColor, -0.05, -0.6, 0.05, -0.6, 0.065, 0.26, -0.065, 0.26); + break; + case StationClock.ViennaHourHand: + this.fillSymmetricPolygon(context, this.hourHandColor, [[-0.02,-0.72],[-0.08,-0.56],[-0.15,-0.45],[-0.06,-0.30],[-0.03,0],[-0.1,0.2],[-0.05,0.23],[-0.03,0.2]]); + } + context.restore(); + + // draw minute hand + context.save(); + switch (this.minuteHandBehavoir) { + case StationClock.CreepingMinuteHand: + context.rotate((minutes + seconds / 60) * Math.PI / 30); + break; + case StationClock.BouncingMinuteHand: + context.rotate(minutes * Math.PI / 30); + break; + case StationClock.ElasticBouncingMinuteHand: + if (this.lastMinute != minutes) { + this.minuteHandAnimationStep = 3; + this.lastMinute = minutes; + } + context.rotate((minutes + this.getAnimationOffset(this.minuteHandAnimationStep)) * Math.PI / 30); + this.minuteHandAnimationStep--; + break; + } + this.setShadow(context, this.handShadowColor, this.handShadowOffsetX, this.handShadowOffsetY, this.handShadowBlur); + switch (this.minuteHand) { + case StationClock.BarMinuteHand: + this.fillPolygon(context, this.minuteHandColor, -0.05, -0.9, 0.035, -0.9, 0.035, 0.23, -0.05, 0.23); + break; + case StationClock.PointedMinuteHand: + this.fillPolygon(context, this.minuteHandColor, 0.0, -0.93, 0.045, -0.885, 0.045, 0.23, -0.045, 0.23, -0.045, -0.885); + break; + case StationClock.SwissMinuteHand: + this.fillPolygon(context, this.minuteHandColor, -0.035, -0.93, 0.035, -0.93, 0.05, 0.25, -0.05, 0.25); + break; + case StationClock.ViennaMinuteHand: + this.fillSymmetricPolygon(context, this.minuteHandColor, [[-0.02,-0.98],[-0.09,-0.7],[-0.03,0],[-0.05,0.2],[-0.01,0.4]]); + } + context.restore(); + + // draw second hand + context.save(); + switch (this.secondHandBehavoir) { + case StationClock.OverhastySecondHand: + context.rotate(Math.min((seconds + millis) * (60.0 / 58.5), 60.0) * Math.PI / 30); + break; + case StationClock.CreepingSecondHand: + context.rotate((seconds + millis) * Math.PI / 30); + break; + case StationClock.BouncingSecondHand: + context.rotate(seconds * Math.PI / 30); + break; + case StationClock.ElasticBouncingSecondHand: + if (this.lastSecond != seconds) { + this.secondHandAnimationStep = 3; + this.lastSecond = seconds; + } + context.rotate((seconds + this.getAnimationOffset(this.secondHandAnimationStep)) * Math.PI / 30); + this.secondHandAnimationStep--; + break; + } + this.setShadow(context, this.handShadowColor, this.handShadowOffsetX, this.handShadowOffsetY, this.handShadowBlur); + switch (this.secondHand) { + case StationClock.BarSecondHand: + this.fillPolygon(context, this.secondHandColor, -0.006, -0.92, 0.006, -0.92, 0.028, 0.23, -0.028, 0.23); + break; + case StationClock.HoleShapedSecondHand: + this.fillPolygon(context, this.secondHandColor, 0.0, -0.9, 0.011, -0.889, 0.01875, -0.6, -0.01875, -0.6, -0.011, -0.889); + this.fillPolygon(context, this.secondHandColor, 0.02, -0.4, 0.025, 0.22, -0.025, 0.22, -0.02, -0.4); + this.strokeCircle(context, this.secondHandColor, 0, -0.5, 0.083, 0.066); + break; + case StationClock.NewHoleShapedSecondHand: + this.fillPolygon(context, this.secondHandColor, 0.0, -0.95, 0.015, -0.935, 0.0187, -0.65, -0.0187, -0.65, -0.015, -0.935); + this.fillPolygon(context, this.secondHandColor, 0.022, -0.45, 0.03, 0.27, -0.03, 0.27, -0.022, -0.45); + this.strokeCircle(context, this.secondHandColor, 0, -0.55, 0.085, 0.07); + break; + case StationClock.SwissSecondHand: + this.strokeLine(context, this.secondHandColor, 0.0, -0.6, 0.0, 0.35, 0.026); + this.fillCircle(context, this.secondHandColor, 0, -0.64, 0.1); + break; + case StationClock.ViennaSecondHand: + this.strokeLine(context, this.secondHandColor, 0.0, -0.6, 0.0, 0.35, 0.026); + this.fillCircle(context, this.secondHandColor, 0, -0.64, 0.1); + break; + } + context.restore(); + + // draw clock boss + if (this.boss != StationClock.NoBoss) { + context.save(); + this.setShadow(context, this.bossShadowColor, this.bossShadowOffsetX, this.bossShadowOffsetY, this.bossShadowBlur); + switch (this.boss) { + case StationClock.BlackBoss: + this.fillCircle(context, 'rgb(0,0,0)', 0, 0, 0.1); + break; + case StationClock.RedBoss: + this.fillCircle(context, 'rgb(220,0,0)', 0, 0, 0.06); + break; + case StationClock.ViennaBoss: + this.fillCircle(context, 'rgb(0,0,0)', 0, 0, 0.07); + break; + } + context.restore(); + } + + context.restore(); + } + } +}; + +StationClock.prototype.getAnimationOffset = function(animationStep) { + switch (animationStep) { + case 3: return 0.2; + case 2: return -0.1; + case 1: return 0.05; + } + return 0; +}; + +StationClock.prototype.setShadow = function(context, color, offsetX, offsetY, blur) { + if (color) { + context.shadowColor = color; + context.shadowOffsetX = this.radius * offsetX; + context.shadowOffsetY = this.radius * offsetY; + context.shadowBlur = this.radius * blur; + } +}; + +StationClock.prototype.fillCircle = function(context, color, x, y, radius) { + if (color) { + context.beginPath(); + context.fillStyle = color; + context.arc(x * this.radius, y * this.radius, radius * this.radius, 0, 2 * Math.PI, true); + context.fill(); + } +}; + +StationClock.prototype.strokeCircle = function(context, color, x, y, radius, lineWidth) { + if (color) { + context.beginPath(); + context.strokeStyle = color; + context.lineWidth = lineWidth * this.radius; + context.arc(x * this.radius, y * this.radius, radius * this.radius, 0, 2 * Math.PI, true); + context.stroke(); + } +}; + +StationClock.prototype.fillSquare = function(context, color, x, y, size) { + if (color) { + context.fillStyle = color; + context.fillRect((x - size / 2) * this.radius, (y -size / 2) * this.radius, size * this.radius, size * this.radius); + } +}; + +StationClock.prototype.strokeSquare = function(context, color, x, y, size, lineWidth) { + if (color) { + context.strokeStyle = color; + context.lineWidth = lineWidth * this.radius; + context.strokeRect((x - size / 2) * this.radius, (y -size / 2) * this.radius, size * this.radius, size * this.radius); + } +}; + +StationClock.prototype.strokeLine = function(context, color, x1, y1, x2, y2, width) { + if (color) { + context.beginPath(); + context.strokeStyle = color; + context.moveTo(x1 * this.radius, y1 * this.radius); + context.lineTo(x2 * this.radius, y2 * this.radius); + context.lineWidth = width * this.radius; + context.stroke(); + } +}; + +StationClock.prototype.fillPolygon = function(context, color, x1, y1, x2, y2, x3, y3, x4, y4, x5, y5) { + if (color) { + context.beginPath(); + context.fillStyle = color; + context.moveTo(x1 * this.radius, y1 * this.radius); + context.lineTo(x2 * this.radius, y2 * this.radius); + context.lineTo(x3 * this.radius, y3 * this.radius); + context.lineTo(x4 * this.radius, y4 * this.radius); + if ((x5 != undefined) && (y5 != undefined)) { + context.lineTo(x5 * this.radius, y5 * this.radius); + } + context.lineTo(x1 * this.radius, y1 * this.radius); + context.fill(); + } +}; + +StationClock.prototype.fillSymmetricPolygon = function(context, color, points) { + context.beginPath(); + context.fillStyle = color; + context.moveTo(points[0][0] * this.radius, points[0][1] * this.radius); + for (var i = 1; i < points.length; i++) { + context.lineTo(points[i][0] * this.radius, points[i][1] * this.radius); + } + for (var i = points.length - 1; i >= 0; i--) { + context.lineTo(0 - points[i][0] * this.radius, points[i][1] * this.radius); + } + context.lineTo(points[0][0] * this.radius, points[0][1] * this.radius); + context.fill(); +}; + +StationClock.prototype.strokeSymmetricPolygon = function(context, color, points, width) { + context.beginPath(); + context.strokeStyle = color; + context.moveTo(points[0][0] * this.radius, points[0][1] * this.radius); + for (var i = 1; i < points.length; i++) { + context.lineTo(points[i][0] * this.radius, points[i][1] * this.radius); + } + for (var i = points.length - 1; i >= 0; i--) { + context.lineTo(0 - points[i][0] * this.radius, points[i][1] * this.radius); + } + context.lineTo(points[0][0] * this.radius, points[0][1] * this.radius); + context.lineWidth = width * this.radius; + context.stroke(); +}; + + diff --git a/resources/library/search/Audio Planete.wgs/config.xml b/resources/library/search/Audio Planete.wgs/config.xml deleted file mode 100755 index d7cc14eb..00000000 --- a/resources/library/search/Audio Planete.wgs/config.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - Choisir - Mnemis SA - Choisir widget - - - diff --git a/resources/library/search/Audio Planete.wgs/css/basic.css b/resources/library/search/Audio Planete.wgs/css/basic.css deleted file mode 100755 index 80b50fbc..00000000 --- a/resources/library/search/Audio Planete.wgs/css/basic.css +++ /dev/null @@ -1,315 +0,0 @@ -html, body{ - width: 100%; - padding: 0; - height: auto; - background-color: white; - margin: 0; -} - -::-webkit-scrollbar { - width: 14px; - background-color:white; -} - - -::-webkit-scrollbar-thumb { - border-radius: 10px; - background-color:lightgray; - border: 2px solid gray; -} - -::-webkit-scrollbar-button:vertical:start{ - border-radius: 10px; - background-color:lightgray; - background-image: url(../images/trgUp.png); - background-size: 8px auto; - background-position: center; - background-repeat: no-repeat; - border: 2px solid gray; -} - -::-webkit-scrollbar-button:vertical:end{ - border-radius: 10px; - background-color:lightgray; - background-image: url(../images/trgDown.png); - background-size: 8px auto; - background-position: center; - background-repeat: no-repeat; - border: 2px solid gray; -} - -a { - text-decoration: underline; -} - -#disc_nav_cont{ - height: auto; - position: fixed; - left: 0; - bottom: 0; - width: 100%; -} - -.disclaimer{ - padding: 5px; - text-align: center; - background-color: #BBBBBB; - border-top: solid 4px #EEEEEE; - border-bottom: none; - font-size: 12px; -} - -.resultFooter{ - width: 100%; - padding: 3px; - font-family: Verdana,Arial,Helvetica,sans-serif; - font-weight: bold; - font-size: x-large; - text-align: center; - background-color: white; -} - -#searchResult { - overflow: hidden; - text-align: center; - margin-top: 50px; - margin-bottom: 85px; -} - -.search{ - position: fixed; - top: 0; - left: 0; - padding: 5px; - background-color: #BBBBBB; - border-bottom: solid 4px #EEEEEE; -} - -.search, -.disclaimer { - width: 100%; - box-sizing: border-box; - -webkit-box-sizing: border-box; -} - -.searchInput{ - padding: 3px; - float: left; - width: 100%; - border-radius: 3px; - border-style: none; - height: 22px; - line-height: 18px; - vertical-align: middle; - box-sizing: border-box; - -webkit-box-sizing: border-box; -} - -.searchButton{ - background: url("../images/search_app.png") -38px -38px no-repeat; - width: 24px; - height: 24px; - overflow: hidden; - position: absolute; - right: 30px; - top: 9px; - margin-left: -2px; - cursor: pointer; -} - -.subSearch{ - margin: 0; - float: left; -} - -#subSearchInput{ - width: 100%; - float: left; - box-sizing: border-box; - -webkit-box-sizing: border-box; - padding: 5px; - padding-right: 26px; -} - -#subSearchFilter{ - width: 100%; - float: left; - display: none; -} - -.searchResult{ - width: 98%; - padding: 3px; - background-color:#123456; -} - -.imgContainer{ - display: inline-block; - padding: 3px; - margin: 3px; - text-align: center; - overflow: hidden; - font-size: small; - font-family: Verdana,Arial,Helvetica,sans-serif; - border: 1px solid #666; - border-radius: 5px; - -webkit-box-shadow: #dadada -1px 0 4px; - -webkit-border-radius: 5px; - box-shadow: #666 -1px 0 4px; - vertical-align: top; -} - - -.filterContainer{ - float: left; - margin: 2px; - padding: 2px; - font-size: 14px; - -} - -.filterSelect{ - border-style:none; - -webkit-border-top-right-radius: 15px; - -webkit-border-bottom-right-radius: 15px; - -moz-border-radius-topright: 15px; - -moz-border-radius-bottomright: 15px; - border-top-right-radius: 15px; - margin-top: 2px; - width: 100%; -} - -span{ - font-family: Verdana,Arial,Helvetica,sans-serif; - color: #666; -} - -[draggable] { - -webkit-user-select: none; - user-select: none; -} - -.toggleFilters{ - margin: 0; - padding: 0; - background-position: center; - background-image: url(../images/down.png); - position: absolute; - top: 11px; - right: 6px; - width: 20px; - height: 20px; - cursor: pointer; -} - -.colors_line { - float: left; - margin: 4px; - margin-right: 0; - clear: left; -} - -.custom { - opacity: 0; - position: absolute; - left: -10000px; -} - -.filter_button.button.color { - display: inline-block; - width: 15px; - height: 15px; - border: 1px solid #EBEBEB; - padding: 0; - margin: 0; - box-sizing: border-box; - -webkit-box-sizing: border-box; -} - -.filter_button.button.color:hover { - border: 1px solid rgb(128,128,128); - cursor: pointer; -} - -input[type="radio"]:checked + .filter_button.button.color { - border: 1px solid rgb(255,255,255); - box-shadow: 0 0 0px 1px #000; - -webkit-box-shadow: 0 0 0px 1px #000; -} - -#allcolor { - background: white url('../images/search_app.png') -43px -144px no-repeat; -} - -#colored { - background: white url('../images/search_app.png') -43px -244px no-repeat; -} - -#grayed { - background: white url('../images/search_app.png') -45px -343px no-repeat; -} - -#black{ - background-color:#ffffff; -} -#blue{ - background-color:#0000FF; -} -#brown{ - background-color:rgba(139, 82, 16, 1); -} - -#gray{ - background-color:#999999; -} - -#green{ - background-color:#00CC00; -} - -#orange{ - background-color:#FB940B; -} - -#pink{ - background-color:#FF98BF; -} - -#purple{ - background-color:#762CA7; -} - -#red{ - background-color:#CC0000; -} - -#teal{ - background-color:#03C0C6; -} - -#white{ - background-color:#000000; -} - -#yellow{ - background-color:#FFFF00; -} - -.selectBox-dropdown, .selectBox-options li a { - line-height: 1.3 !important; - font-size: 13px; -} - -.pager_button { - padding: 3px 5px; - font-size: 16px; - color: black; - display: inline-block; -} - -.pager_button.active { - border-radius: 3px; - -webkit-border-radius: 3px; - background-color: gray; - color: white; -} diff --git a/resources/library/search/Audio Planete.wgs/icon.png b/resources/library/search/Audio Planete.wgs/icon.png deleted file mode 100755 index 17286306..00000000 Binary files a/resources/library/search/Audio Planete.wgs/icon.png and /dev/null differ diff --git a/resources/library/search/Audio Planete.wgs/icon.thumbnail.png b/resources/library/search/Audio Planete.wgs/icon.thumbnail.png deleted file mode 100755 index 17286306..00000000 Binary files a/resources/library/search/Audio Planete.wgs/icon.thumbnail.png and /dev/null differ diff --git a/resources/library/search/Audio Planete.wgs/images/down.png b/resources/library/search/Audio Planete.wgs/images/down.png deleted file mode 100755 index 1de37e16..00000000 Binary files a/resources/library/search/Audio Planete.wgs/images/down.png and /dev/null differ diff --git a/resources/library/search/Audio Planete.wgs/images/greySquare.png b/resources/library/search/Audio Planete.wgs/images/greySquare.png deleted file mode 100755 index c0a7f14e..00000000 Binary files a/resources/library/search/Audio Planete.wgs/images/greySquare.png and /dev/null differ diff --git a/resources/library/search/Audio Planete.wgs/images/icon-close.png b/resources/library/search/Audio Planete.wgs/images/icon-close.png deleted file mode 100755 index c8d581cd..00000000 Binary files a/resources/library/search/Audio Planete.wgs/images/icon-close.png and /dev/null differ diff --git a/resources/library/search/Audio Planete.wgs/images/popupBack.png b/resources/library/search/Audio Planete.wgs/images/popupBack.png deleted file mode 100755 index 113b5196..00000000 Binary files a/resources/library/search/Audio Planete.wgs/images/popupBack.png and /dev/null differ diff --git a/resources/library/search/Audio Planete.wgs/images/search.png b/resources/library/search/Audio Planete.wgs/images/search.png deleted file mode 100755 index 20d72553..00000000 Binary files a/resources/library/search/Audio Planete.wgs/images/search.png and /dev/null differ diff --git a/resources/library/search/Audio Planete.wgs/images/search_app.png b/resources/library/search/Audio Planete.wgs/images/search_app.png deleted file mode 100755 index efd8ea4a..00000000 Binary files a/resources/library/search/Audio Planete.wgs/images/search_app.png and /dev/null differ diff --git a/resources/library/search/Audio Planete.wgs/images/thumbnail_icon.png b/resources/library/search/Audio Planete.wgs/images/thumbnail_icon.png deleted file mode 100755 index 5eedb793..00000000 Binary files a/resources/library/search/Audio Planete.wgs/images/thumbnail_icon.png and /dev/null differ diff --git a/resources/library/search/Audio Planete.wgs/images/trgDown.png b/resources/library/search/Audio Planete.wgs/images/trgDown.png deleted file mode 100755 index 632be5fb..00000000 Binary files a/resources/library/search/Audio Planete.wgs/images/trgDown.png and /dev/null differ diff --git a/resources/library/search/Audio Planete.wgs/images/trgUp.png b/resources/library/search/Audio Planete.wgs/images/trgUp.png deleted file mode 100755 index 869adf5b..00000000 Binary files a/resources/library/search/Audio Planete.wgs/images/trgUp.png and /dev/null differ diff --git a/resources/library/search/Audio Planete.wgs/images/up.png b/resources/library/search/Audio Planete.wgs/images/up.png deleted file mode 100755 index 7d9a8f7e..00000000 Binary files a/resources/library/search/Audio Planete.wgs/images/up.png and /dev/null differ diff --git a/resources/library/search/Audio Planete.wgs/index.html b/resources/library/search/Audio Planete.wgs/index.html deleted file mode 100755 index 2eb88f9e..00000000 --- a/resources/library/search/Audio Planete.wgs/index.html +++ /dev/null @@ -1,253 +0,0 @@ - - - - - Planete Sankore Image Search - - - - - - -
- - diff --git a/resources/library/search/Audio Planete.wgs/scripts/jquery-1.6.2.min.js b/resources/library/search/Audio Planete.wgs/scripts/jquery-1.6.2.min.js deleted file mode 100755 index e67db747..00000000 --- a/resources/library/search/Audio Planete.wgs/scripts/jquery-1.6.2.min.js +++ /dev/null @@ -1,18 +0,0 @@ -/*! - * jQuery JavaScript Library v1.6.2 - * http://jquery.com/ - * - * Copyright 2011, John Resig - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * Copyright 2011, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * - * Date: Thu Jun 30 14:16:56 2011 -0400 - */ -(function(a,b){function cv(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cs(a){if(!cg[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"":"")+""),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cr(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cq(){cn=b}function cp(){setTimeout(cq,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bx(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bm(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(be,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bl(a){f.nodeName(a,"input")?bk(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bk)}function bk(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bj(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bi(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bh(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i=0===c})}function V(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function N(a,b){return(a&&a!=="*"?a+".":"")+b.replace(z,"`").replace(A,"&")}function M(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;ic)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function K(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function E(){return!0}function D(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"$1-$2").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z])/ig,x=function(a,b){return b.toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!A){A=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a);return c===b||D.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(b,c,d){a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),d=c.documentElement,(!d||!d.nodeName||d.nodeName==="parsererror")&&e.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c
a",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0},m&&f.extend(p,{position:"absolute",left:-1e3,top:-1e3});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="
",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="
t
",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([a-z])([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g=f.expando,h=typeof c=="string",i,j=a.nodeType,k=j?f.cache:a,l=j?a[f.expando]:a[f.expando]&&f.expando;if((!l||e&&l&&!k[l][g])&&h&&d===b)return;l||(j?a[f.expando]=l=++f.uuid:l=f.expando),k[l]||(k[l]={},j||(k[l].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?k[l][g]=f.extend(k[l][g],c):k[l]=f.extend(k[l],c);i=k[l],e&&(i[g]||(i[g]={}),i=i[g]),d!==b&&(i[f.camelCase(c)]=d);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[f.camelCase(c)]||i[c]:i}},removeData:function(b,c,d){if(!!f.acceptData(b)){var e=f.expando,g=b.nodeType,h=g?f.cache:b,i=g?b[f.expando]:f.expando;if(!h[i])return;if(c){var j=d?h[i][e]:h[i];if(j){delete j[c];if(!l(j))return}}if(d){delete h[i][e];if(!l(h[i]))return}var k=h[i][e];f.support.deleteExpando||h!=a?delete h[i]:h[i]=null,k?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=k):g&&(f.support.deleteExpando?delete b[f.expando]:b.removeAttribute?b.removeAttribute(f.expando):b[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=w:v&&c!=="className"&&(f.nodeName(a,"form")||u.test(c))&&(i=v)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.support.getSetAttribute?a.removeAttribute(b):(f.attr(a,b,""),a.removeAttributeNode(a.getAttributeNode(b))),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},tabIndex:{get:function(a){var c=a.getAttributeNode("tabIndex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}},value:{get:function(a,b){if(v&&f.nodeName(a,"button"))return v.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(v&&f.nodeName(a,"button"))return v.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==b?g:a[c]},propHooks:{}}),w={get:function(a,c){return f.prop(a,c)?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(f.attrFix=f.propFix,v=f.attrHooks.name=f.attrHooks.title=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,c){var d=a.getAttributeNode(c);if(d){d.nodeValue=b;return b}}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var x=/\.(.*)$/,y=/^(?:textarea|input|select)$/i,z=/\./g,A=/ /g,B=/[^\w\s.|`]/g,C=function(a){return a.replace(B,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=D;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=D);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),C).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i. -shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},J=function(c){var d=c.target,e,g;if(!!y.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=I(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:J,beforedeactivate:J,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&J.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&J.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",I(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in H)f.event.add(this,c+".specialChange",H[c]);return y.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return y.test(this.nodeName)}},H=f.event.special.change.filters,H.focus=H.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g0)for(h=g;h0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=T.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a=="string")return f.inArray(this[0],a?f(a):this.parent().children());return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(V(c[0])||V(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=S.call(arguments);O.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!U[a]?f.unique(e):e,(this.length>1||Q.test(d))&&P.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var X=/ jQuery\d+="(?:\d+|null)"/g,Y=/^\s+/,Z=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,$=/<([\w:]+)/,_=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]};bf.optgroup=bf.option,bf.tbody=bf.tfoot=bf.colgroup=bf.caption=bf.thead,bf.th=bf.td,f.support.htmlSerialize||(bf._default=[1,"div
","
"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(X,""):null;if(typeof a=="string"&&!bb.test(a)&&(f.support.leadingWhitespace||!Y.test(a))&&!bf[($.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Z,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j -)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bi(a,d),e=bj(a),g=bj(d);for(h=0;e[h];++h)bi(e[h],g[h])}if(b){bh(a,d);if(c){e=bj(a),g=bj(d);for(h=0;e[h];++h)bh(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!ba.test(k))k=b.createTextNode(k);else{k=k.replace(Z,"<$1>");var l=($.exec(k)||["",""])[1].toLowerCase(),m=bf[l]||bf._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=_.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&Y.test(k)&&o.insertBefore(b.createTextNode(Y.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bo.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle;c.zoom=1;var e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.filter=bn.test(g)?g.replace(bn,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bx(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(by=function(a,c){var d,e,g;c=c.replace(bp,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bz=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bq.test(d)&&br.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bx=by||bz,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bB=/%20/g,bC=/\[\]$/,bD=/\r?\n/g,bE=/#.*$/,bF=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bG=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bH=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,bI=/^(?:GET|HEAD)$/,bJ=/^\/\//,bK=/\?/,bL=/)<[^<]*)*<\/script>/gi,bM=/^(?:select|textarea)/i,bN=/\s+/,bO=/([?&])_=[^&]*/,bP=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bQ=f.fn.load,bR={},bS={},bT,bU;try{bT=e.href}catch(bV){bT=c.createElement("a"),bT.href="",bT=bT.href}bU=bP.exec(bT.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bQ)return bQ.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bL,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bM.test(this.nodeName)||bG.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bD,"\r\n")}}):{name:b.name,value:c.replace(bD,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?f.extend(!0,a,f.ajaxSettings,b):(b=a,a=f.extend(!0,f.ajaxSettings,b));for(var c in{context:1,url:1})c in b?a[c]=b[c]:c in f.ajaxSettings&&(a[c]=f.ajaxSettings[c]);return a},ajaxSettings:{url:bT,isLocal:bH.test(bU[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML}},ajaxPrefilter:bW(bR),ajaxTransport:bW(bS),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a?4:0;var o,r,u,w=l?bZ(d,v,l):b,x,y;if(a>=200&&a<300||a===304){if(d.ifModified){if(x=v.getResponseHeader("Last-Modified"))f.lastModified[k]=x;if(y=v.getResponseHeader("Etag"))f.etag[k]=y}if(a===304)c="notmodified",o=!0;else try{r=b$(d,w),c="success",o=!0}catch(z){c="parsererror",u=z}}else{u=c;if(!c||a)c="error",a<0&&(a=0)}v.status=a,v.statusText=c,o?h.resolveWith(e,[r,c,v]):h.rejectWith(e,[v,c,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,c]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bF.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bE,"").replace(bJ,bU[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bN),d.crossDomain==null&&(r=bP.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bU[1]&&r[2]==bU[2]&&(r[3]||(r[1]==="http:"?80:443))==(bU[3]||(bU[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bX(bR,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bI.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bK.test(d.url)?"&":"?")+d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bO,"$1_="+x);d.url=y+(y===d.url?(bK.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", */*; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bX(bS,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){status<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bB,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn,co=a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cr("show",3),a,b,c);for(var g=0,h=this.length;g=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b
";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cu.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cu.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cv(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cv(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c];return e.document.compatMode==="CSS1Compat"&&g||e.document.body["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var h=f.css(e,d),i=parseFloat(h);return f.isNaN(i)?h:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window); \ No newline at end of file diff --git a/resources/library/search/Data AbulEdu.wgs/index.html b/resources/library/search/Data AbulEdu.wgs/index.html index 7f03fa99..498215b2 100644 --- a/resources/library/search/Data AbulEdu.wgs/index.html +++ b/resources/library/search/Data AbulEdu.wgs/index.html @@ -212,7 +212,7 @@ }); ( $(".imgContainer").live("click",function(){ - abuledu.sendFileMetadata(createMetaData($(this))); + sankore.sendFileMetadata(createMetaData($(this))); })); /*$(window).resize(function(){ diff --git a/resources/library/search/Flash Planete.wgs/config.xml b/resources/library/search/Flash Planete.wgs/config.xml deleted file mode 100755 index d7cc14eb..00000000 --- a/resources/library/search/Flash Planete.wgs/config.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - Choisir - Mnemis SA - Choisir widget - - - diff --git a/resources/library/search/Flash Planete.wgs/css/basic.css b/resources/library/search/Flash Planete.wgs/css/basic.css deleted file mode 100755 index 80b50fbc..00000000 --- a/resources/library/search/Flash Planete.wgs/css/basic.css +++ /dev/null @@ -1,315 +0,0 @@ -html, body{ - width: 100%; - padding: 0; - height: auto; - background-color: white; - margin: 0; -} - -::-webkit-scrollbar { - width: 14px; - background-color:white; -} - - -::-webkit-scrollbar-thumb { - border-radius: 10px; - background-color:lightgray; - border: 2px solid gray; -} - -::-webkit-scrollbar-button:vertical:start{ - border-radius: 10px; - background-color:lightgray; - background-image: url(../images/trgUp.png); - background-size: 8px auto; - background-position: center; - background-repeat: no-repeat; - border: 2px solid gray; -} - -::-webkit-scrollbar-button:vertical:end{ - border-radius: 10px; - background-color:lightgray; - background-image: url(../images/trgDown.png); - background-size: 8px auto; - background-position: center; - background-repeat: no-repeat; - border: 2px solid gray; -} - -a { - text-decoration: underline; -} - -#disc_nav_cont{ - height: auto; - position: fixed; - left: 0; - bottom: 0; - width: 100%; -} - -.disclaimer{ - padding: 5px; - text-align: center; - background-color: #BBBBBB; - border-top: solid 4px #EEEEEE; - border-bottom: none; - font-size: 12px; -} - -.resultFooter{ - width: 100%; - padding: 3px; - font-family: Verdana,Arial,Helvetica,sans-serif; - font-weight: bold; - font-size: x-large; - text-align: center; - background-color: white; -} - -#searchResult { - overflow: hidden; - text-align: center; - margin-top: 50px; - margin-bottom: 85px; -} - -.search{ - position: fixed; - top: 0; - left: 0; - padding: 5px; - background-color: #BBBBBB; - border-bottom: solid 4px #EEEEEE; -} - -.search, -.disclaimer { - width: 100%; - box-sizing: border-box; - -webkit-box-sizing: border-box; -} - -.searchInput{ - padding: 3px; - float: left; - width: 100%; - border-radius: 3px; - border-style: none; - height: 22px; - line-height: 18px; - vertical-align: middle; - box-sizing: border-box; - -webkit-box-sizing: border-box; -} - -.searchButton{ - background: url("../images/search_app.png") -38px -38px no-repeat; - width: 24px; - height: 24px; - overflow: hidden; - position: absolute; - right: 30px; - top: 9px; - margin-left: -2px; - cursor: pointer; -} - -.subSearch{ - margin: 0; - float: left; -} - -#subSearchInput{ - width: 100%; - float: left; - box-sizing: border-box; - -webkit-box-sizing: border-box; - padding: 5px; - padding-right: 26px; -} - -#subSearchFilter{ - width: 100%; - float: left; - display: none; -} - -.searchResult{ - width: 98%; - padding: 3px; - background-color:#123456; -} - -.imgContainer{ - display: inline-block; - padding: 3px; - margin: 3px; - text-align: center; - overflow: hidden; - font-size: small; - font-family: Verdana,Arial,Helvetica,sans-serif; - border: 1px solid #666; - border-radius: 5px; - -webkit-box-shadow: #dadada -1px 0 4px; - -webkit-border-radius: 5px; - box-shadow: #666 -1px 0 4px; - vertical-align: top; -} - - -.filterContainer{ - float: left; - margin: 2px; - padding: 2px; - font-size: 14px; - -} - -.filterSelect{ - border-style:none; - -webkit-border-top-right-radius: 15px; - -webkit-border-bottom-right-radius: 15px; - -moz-border-radius-topright: 15px; - -moz-border-radius-bottomright: 15px; - border-top-right-radius: 15px; - margin-top: 2px; - width: 100%; -} - -span{ - font-family: Verdana,Arial,Helvetica,sans-serif; - color: #666; -} - -[draggable] { - -webkit-user-select: none; - user-select: none; -} - -.toggleFilters{ - margin: 0; - padding: 0; - background-position: center; - background-image: url(../images/down.png); - position: absolute; - top: 11px; - right: 6px; - width: 20px; - height: 20px; - cursor: pointer; -} - -.colors_line { - float: left; - margin: 4px; - margin-right: 0; - clear: left; -} - -.custom { - opacity: 0; - position: absolute; - left: -10000px; -} - -.filter_button.button.color { - display: inline-block; - width: 15px; - height: 15px; - border: 1px solid #EBEBEB; - padding: 0; - margin: 0; - box-sizing: border-box; - -webkit-box-sizing: border-box; -} - -.filter_button.button.color:hover { - border: 1px solid rgb(128,128,128); - cursor: pointer; -} - -input[type="radio"]:checked + .filter_button.button.color { - border: 1px solid rgb(255,255,255); - box-shadow: 0 0 0px 1px #000; - -webkit-box-shadow: 0 0 0px 1px #000; -} - -#allcolor { - background: white url('../images/search_app.png') -43px -144px no-repeat; -} - -#colored { - background: white url('../images/search_app.png') -43px -244px no-repeat; -} - -#grayed { - background: white url('../images/search_app.png') -45px -343px no-repeat; -} - -#black{ - background-color:#ffffff; -} -#blue{ - background-color:#0000FF; -} -#brown{ - background-color:rgba(139, 82, 16, 1); -} - -#gray{ - background-color:#999999; -} - -#green{ - background-color:#00CC00; -} - -#orange{ - background-color:#FB940B; -} - -#pink{ - background-color:#FF98BF; -} - -#purple{ - background-color:#762CA7; -} - -#red{ - background-color:#CC0000; -} - -#teal{ - background-color:#03C0C6; -} - -#white{ - background-color:#000000; -} - -#yellow{ - background-color:#FFFF00; -} - -.selectBox-dropdown, .selectBox-options li a { - line-height: 1.3 !important; - font-size: 13px; -} - -.pager_button { - padding: 3px 5px; - font-size: 16px; - color: black; - display: inline-block; -} - -.pager_button.active { - border-radius: 3px; - -webkit-border-radius: 3px; - background-color: gray; - color: white; -} diff --git a/resources/library/search/Flash Planete.wgs/icon.png b/resources/library/search/Flash Planete.wgs/icon.png deleted file mode 100755 index 1f06b0e8..00000000 Binary files a/resources/library/search/Flash Planete.wgs/icon.png and /dev/null differ diff --git a/resources/library/search/Flash Planete.wgs/icon.thumbnail.png b/resources/library/search/Flash Planete.wgs/icon.thumbnail.png deleted file mode 100755 index 1f06b0e8..00000000 Binary files a/resources/library/search/Flash Planete.wgs/icon.thumbnail.png and /dev/null differ diff --git a/resources/library/search/Flash Planete.wgs/images/down.png b/resources/library/search/Flash Planete.wgs/images/down.png deleted file mode 100755 index 1de37e16..00000000 Binary files a/resources/library/search/Flash Planete.wgs/images/down.png and /dev/null differ diff --git a/resources/library/search/Flash Planete.wgs/images/greySquare.png b/resources/library/search/Flash Planete.wgs/images/greySquare.png deleted file mode 100755 index c0a7f14e..00000000 Binary files a/resources/library/search/Flash Planete.wgs/images/greySquare.png and /dev/null differ diff --git a/resources/library/search/Flash Planete.wgs/images/icon-close.png b/resources/library/search/Flash Planete.wgs/images/icon-close.png deleted file mode 100755 index c8d581cd..00000000 Binary files a/resources/library/search/Flash Planete.wgs/images/icon-close.png and /dev/null differ diff --git a/resources/library/search/Flash Planete.wgs/images/popupBack.png b/resources/library/search/Flash Planete.wgs/images/popupBack.png deleted file mode 100755 index 113b5196..00000000 Binary files a/resources/library/search/Flash Planete.wgs/images/popupBack.png and /dev/null differ diff --git a/resources/library/search/Flash Planete.wgs/images/search.png b/resources/library/search/Flash Planete.wgs/images/search.png deleted file mode 100755 index 20d72553..00000000 Binary files a/resources/library/search/Flash Planete.wgs/images/search.png and /dev/null differ diff --git a/resources/library/search/Flash Planete.wgs/images/search_app.png b/resources/library/search/Flash Planete.wgs/images/search_app.png deleted file mode 100755 index efd8ea4a..00000000 Binary files a/resources/library/search/Flash Planete.wgs/images/search_app.png and /dev/null differ diff --git a/resources/library/search/Flash Planete.wgs/images/thumbnail_icon.png b/resources/library/search/Flash Planete.wgs/images/thumbnail_icon.png deleted file mode 100755 index 1590c3e0..00000000 Binary files a/resources/library/search/Flash Planete.wgs/images/thumbnail_icon.png and /dev/null differ diff --git a/resources/library/search/Flash Planete.wgs/images/trgDown.png b/resources/library/search/Flash Planete.wgs/images/trgDown.png deleted file mode 100755 index 632be5fb..00000000 Binary files a/resources/library/search/Flash Planete.wgs/images/trgDown.png and /dev/null differ diff --git a/resources/library/search/Flash Planete.wgs/images/trgUp.png b/resources/library/search/Flash Planete.wgs/images/trgUp.png deleted file mode 100755 index 869adf5b..00000000 Binary files a/resources/library/search/Flash Planete.wgs/images/trgUp.png and /dev/null differ diff --git a/resources/library/search/Flash Planete.wgs/images/up.png b/resources/library/search/Flash Planete.wgs/images/up.png deleted file mode 100755 index 7d9a8f7e..00000000 Binary files a/resources/library/search/Flash Planete.wgs/images/up.png and /dev/null differ diff --git a/resources/library/search/Flash Planete.wgs/index.html b/resources/library/search/Flash Planete.wgs/index.html deleted file mode 100755 index d0a18aff..00000000 --- a/resources/library/search/Flash Planete.wgs/index.html +++ /dev/null @@ -1,253 +0,0 @@ - - - - - Planete Sankore Image Search - - - - - - -
- - diff --git a/resources/library/search/Flash Planete.wgs/scripts/jquery-1.6.2.min.js b/resources/library/search/Flash Planete.wgs/scripts/jquery-1.6.2.min.js deleted file mode 100755 index e67db747..00000000 --- a/resources/library/search/Flash Planete.wgs/scripts/jquery-1.6.2.min.js +++ /dev/null @@ -1,18 +0,0 @@ -/*! - * jQuery JavaScript Library v1.6.2 - * http://jquery.com/ - * - * Copyright 2011, John Resig - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * Copyright 2011, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * - * Date: Thu Jun 30 14:16:56 2011 -0400 - */ -(function(a,b){function cv(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cs(a){if(!cg[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"":"")+""),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cr(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cq(){cn=b}function cp(){setTimeout(cq,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bx(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bm(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(be,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bl(a){f.nodeName(a,"input")?bk(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bk)}function bk(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bj(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bi(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bh(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i=0===c})}function V(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function N(a,b){return(a&&a!=="*"?a+".":"")+b.replace(z,"`").replace(A,"&")}function M(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;ic)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function K(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function E(){return!0}function D(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"$1-$2").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z])/ig,x=function(a,b){return b.toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!A){A=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a);return c===b||D.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(b,c,d){a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),d=c.documentElement,(!d||!d.nodeName||d.nodeName==="parsererror")&&e.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c
a",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0},m&&f.extend(p,{position:"absolute",left:-1e3,top:-1e3});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="
",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="
t
",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([a-z])([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g=f.expando,h=typeof c=="string",i,j=a.nodeType,k=j?f.cache:a,l=j?a[f.expando]:a[f.expando]&&f.expando;if((!l||e&&l&&!k[l][g])&&h&&d===b)return;l||(j?a[f.expando]=l=++f.uuid:l=f.expando),k[l]||(k[l]={},j||(k[l].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?k[l][g]=f.extend(k[l][g],c):k[l]=f.extend(k[l],c);i=k[l],e&&(i[g]||(i[g]={}),i=i[g]),d!==b&&(i[f.camelCase(c)]=d);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[f.camelCase(c)]||i[c]:i}},removeData:function(b,c,d){if(!!f.acceptData(b)){var e=f.expando,g=b.nodeType,h=g?f.cache:b,i=g?b[f.expando]:f.expando;if(!h[i])return;if(c){var j=d?h[i][e]:h[i];if(j){delete j[c];if(!l(j))return}}if(d){delete h[i][e];if(!l(h[i]))return}var k=h[i][e];f.support.deleteExpando||h!=a?delete h[i]:h[i]=null,k?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=k):g&&(f.support.deleteExpando?delete b[f.expando]:b.removeAttribute?b.removeAttribute(f.expando):b[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=w:v&&c!=="className"&&(f.nodeName(a,"form")||u.test(c))&&(i=v)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.support.getSetAttribute?a.removeAttribute(b):(f.attr(a,b,""),a.removeAttributeNode(a.getAttributeNode(b))),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},tabIndex:{get:function(a){var c=a.getAttributeNode("tabIndex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}},value:{get:function(a,b){if(v&&f.nodeName(a,"button"))return v.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(v&&f.nodeName(a,"button"))return v.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==b?g:a[c]},propHooks:{}}),w={get:function(a,c){return f.prop(a,c)?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(f.attrFix=f.propFix,v=f.attrHooks.name=f.attrHooks.title=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,c){var d=a.getAttributeNode(c);if(d){d.nodeValue=b;return b}}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var x=/\.(.*)$/,y=/^(?:textarea|input|select)$/i,z=/\./g,A=/ /g,B=/[^\w\s.|`]/g,C=function(a){return a.replace(B,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=D;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=D);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),C).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i. -shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},J=function(c){var d=c.target,e,g;if(!!y.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=I(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:J,beforedeactivate:J,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&J.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&J.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",I(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in H)f.event.add(this,c+".specialChange",H[c]);return y.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return y.test(this.nodeName)}},H=f.event.special.change.filters,H.focus=H.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g0)for(h=g;h0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=T.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a=="string")return f.inArray(this[0],a?f(a):this.parent().children());return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(V(c[0])||V(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=S.call(arguments);O.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!U[a]?f.unique(e):e,(this.length>1||Q.test(d))&&P.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var X=/ jQuery\d+="(?:\d+|null)"/g,Y=/^\s+/,Z=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,$=/<([\w:]+)/,_=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]};bf.optgroup=bf.option,bf.tbody=bf.tfoot=bf.colgroup=bf.caption=bf.thead,bf.th=bf.td,f.support.htmlSerialize||(bf._default=[1,"div
","
"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(X,""):null;if(typeof a=="string"&&!bb.test(a)&&(f.support.leadingWhitespace||!Y.test(a))&&!bf[($.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Z,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j -)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bi(a,d),e=bj(a),g=bj(d);for(h=0;e[h];++h)bi(e[h],g[h])}if(b){bh(a,d);if(c){e=bj(a),g=bj(d);for(h=0;e[h];++h)bh(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!ba.test(k))k=b.createTextNode(k);else{k=k.replace(Z,"<$1>");var l=($.exec(k)||["",""])[1].toLowerCase(),m=bf[l]||bf._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=_.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&Y.test(k)&&o.insertBefore(b.createTextNode(Y.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bo.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle;c.zoom=1;var e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.filter=bn.test(g)?g.replace(bn,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bx(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(by=function(a,c){var d,e,g;c=c.replace(bp,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bz=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bq.test(d)&&br.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bx=by||bz,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bB=/%20/g,bC=/\[\]$/,bD=/\r?\n/g,bE=/#.*$/,bF=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bG=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bH=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,bI=/^(?:GET|HEAD)$/,bJ=/^\/\//,bK=/\?/,bL=/)<[^<]*)*<\/script>/gi,bM=/^(?:select|textarea)/i,bN=/\s+/,bO=/([?&])_=[^&]*/,bP=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bQ=f.fn.load,bR={},bS={},bT,bU;try{bT=e.href}catch(bV){bT=c.createElement("a"),bT.href="",bT=bT.href}bU=bP.exec(bT.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bQ)return bQ.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bL,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bM.test(this.nodeName)||bG.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bD,"\r\n")}}):{name:b.name,value:c.replace(bD,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?f.extend(!0,a,f.ajaxSettings,b):(b=a,a=f.extend(!0,f.ajaxSettings,b));for(var c in{context:1,url:1})c in b?a[c]=b[c]:c in f.ajaxSettings&&(a[c]=f.ajaxSettings[c]);return a},ajaxSettings:{url:bT,isLocal:bH.test(bU[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML}},ajaxPrefilter:bW(bR),ajaxTransport:bW(bS),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a?4:0;var o,r,u,w=l?bZ(d,v,l):b,x,y;if(a>=200&&a<300||a===304){if(d.ifModified){if(x=v.getResponseHeader("Last-Modified"))f.lastModified[k]=x;if(y=v.getResponseHeader("Etag"))f.etag[k]=y}if(a===304)c="notmodified",o=!0;else try{r=b$(d,w),c="success",o=!0}catch(z){c="parsererror",u=z}}else{u=c;if(!c||a)c="error",a<0&&(a=0)}v.status=a,v.statusText=c,o?h.resolveWith(e,[r,c,v]):h.rejectWith(e,[v,c,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,c]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bF.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bE,"").replace(bJ,bU[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bN),d.crossDomain==null&&(r=bP.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bU[1]&&r[2]==bU[2]&&(r[3]||(r[1]==="http:"?80:443))==(bU[3]||(bU[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bX(bR,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bI.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bK.test(d.url)?"&":"?")+d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bO,"$1_="+x);d.url=y+(y===d.url?(bK.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", */*; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bX(bS,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){status<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bB,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn,co=a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cr("show",3),a,b,c);for(var g=0,h=this.length;g=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b
";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cu.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cu.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cv(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cv(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c];return e.document.compatMode==="CSS1Compat"&&g||e.document.body["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var h=f.css(e,d),i=parseFloat(h);return f.isNaN(i)?h:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window); \ No newline at end of file diff --git a/resources/library/search/Image Planete.wgs/config.xml b/resources/library/search/Image Planete.wgs/config.xml deleted file mode 100755 index d7cc14eb..00000000 --- a/resources/library/search/Image Planete.wgs/config.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - Choisir - Mnemis SA - Choisir widget - - - diff --git a/resources/library/search/Image Planete.wgs/css/basic.css b/resources/library/search/Image Planete.wgs/css/basic.css deleted file mode 100755 index e7fabb8a..00000000 --- a/resources/library/search/Image Planete.wgs/css/basic.css +++ /dev/null @@ -1,314 +0,0 @@ -html, body{ - width: 100%; - padding: 0; - height: auto; - background-color: white; - margin: 0; -} - -::-webkit-scrollbar { - width: 14px; - background-color:white; -} - - -::-webkit-scrollbar-thumb { - border-radius: 10px; - background-color:lightgray; - border: 2px solid gray; -} - -::-webkit-scrollbar-button:vertical:start{ - border-radius: 10px; - background-color:lightgray; - background-image: url(../images/trgUp.png); - background-size: 8px auto; - background-position: center; - background-repeat: no-repeat; - border: 2px solid gray; -} - -::-webkit-scrollbar-button:vertical:end{ - border-radius: 10px; - background-color:lightgray; - background-image: url(../images/trgDown.png); - background-size: 8px auto; - background-position: center; - background-repeat: no-repeat; - border: 2px solid gray; -} - -a { - text-decoration: underline; -} - -#disc_nav_cont{ - height: auto; - position: fixed; - left: 0; - bottom: 0; - width: 100%; -} - -.disclaimer{ - padding: 5px; - text-align: center; - background-color: #BBBBBB; - border-top: solid 4px #EEEEEE; - border-bottom: none; - font-size: 12px; -} - -.resultFooter{ - width: 100%; - padding: 3px; - font-family: Verdana,Arial,Helvetica,sans-serif; - font-weight: bold; - font-size: x-large; - text-align: center; - background-color: white; -} - -#searchResult { - overflow: hidden; - text-align: center; - margin-top: 50px; - margin-bottom: 85px; -} - -.search{ - position: fixed; - top: 0; - left: 0; - padding: 5px; - background-color: #BBBBBB; - border-bottom: solid 4px #EEEEEE; -} - -.search, -.disclaimer { - width: 100%; - box-sizing: border-box; - -webkit-box-sizing: border-box; -} - -.searchInput{ - padding: 3px; - float: left; - width: 100%; - border-radius: 3px; - border-style: none; - height: 22px; - line-height: 18px; - vertical-align: middle; - box-sizing: border-box; - -webkit-box-sizing: border-box; -} - -.searchButton{ - background: url("../images/search_app.png") -38px -38px no-repeat; - width: 24px; - height: 24px; - overflow: hidden; - position: absolute; - right: 30px; - top: 9px; - margin-left: -2px; - cursor: pointer; -} - -.subSearch{ - margin: 0; - float: left; -} - -#subSearchInput{ - width: 100%; - float: left; - box-sizing: border-box; - -webkit-box-sizing: border-box; - padding: 5px; - padding-right: 26px; -} - -#subSearchFilter{ - width: 100%; - float: left; - display: none; -} - -.searchResult{ - width: 98%; - padding: 3px; - background-color:#123456; -} - -.imgContainer{ - display: inline-block; - padding: 3px; - margin: 3px; - text-align: center; - overflow: hidden; - font-size: small; - font-family: Verdana,Arial,Helvetica,sans-serif; - vertical-align: top; -} - -.imgContainer img{ - max-width: 150px; - max-height:150px; -} - -.filterContainer{ - float: left; - margin: 2px; - padding: 2px; - font-size: 14px; - -} - -.filterSelect{ - border-style:none; - -webkit-border-top-right-radius: 15px; - -webkit-border-bottom-right-radius: 15px; - -moz-border-radius-topright: 15px; - -moz-border-radius-bottomright: 15px; - border-top-right-radius: 15px; - margin-top: 2px; - width: 100%; -} - -span{ - font-family: Verdana,Arial,Helvetica,sans-serif; - color: #666; -} - -[draggable] { - -webkit-user-select: none; - user-select: none; -} - -.toggleFilters{ - margin: 0; - padding: 0; - background-position: center; - background-image: url(../images/down.png); - position: absolute; - top: 11px; - right: 6px; - width: 20px; - height: 20px; - cursor: pointer; -} - -.colors_line { - float: left; - margin: 4px; - margin-right: 0; - clear: left; -} - -.custom { - opacity: 0; - position: absolute; - left: -10000px; -} - -.filter_button.button.color { - display: inline-block; - width: 15px; - height: 15px; - border: 1px solid #EBEBEB; - padding: 0; - margin: 0; - box-sizing: border-box; - -webkit-box-sizing: border-box; -} - -.filter_button.button.color:hover { - border: 1px solid rgb(128,128,128); - cursor: pointer; -} - -input[type="radio"]:checked + .filter_button.button.color { - border: 1px solid rgb(255,255,255); - box-shadow: 0 0 0px 1px #000; - -webkit-box-shadow: 0 0 0px 1px #000; -} - -#allcolor { - background: white url('../images/search_app.png') -43px -144px no-repeat; -} - -#colored { - background: white url('../images/search_app.png') -43px -244px no-repeat; -} - -#grayed { - background: white url('../images/search_app.png') -45px -343px no-repeat; -} - -#black{ - background-color:#ffffff; -} -#blue{ - background-color:#0000FF; -} -#brown{ - background-color:rgba(139, 82, 16, 1); -} - -#gray{ - background-color:#999999; -} - -#green{ - background-color:#00CC00; -} - -#orange{ - background-color:#FB940B; -} - -#pink{ - background-color:#FF98BF; -} - -#purple{ - background-color:#762CA7; -} - -#red{ - background-color:#CC0000; -} - -#teal{ - background-color:#03C0C6; -} - -#white{ - background-color:#000000; -} - -#yellow{ - background-color:#FFFF00; -} - -.selectBox-dropdown, .selectBox-options li a { - line-height: 1.3 !important; - font-size: 13px; -} - -.pager_button { - padding: 3px 5px; - font-size: 16px; - color: black; - display: inline-block; -} - -.pager_button.active { - border-radius: 3px; - -webkit-border-radius: 3px; - background-color: gray; - color: white; -} diff --git a/resources/library/search/Image Planete.wgs/icon.png b/resources/library/search/Image Planete.wgs/icon.png deleted file mode 100755 index b9cd7783..00000000 Binary files a/resources/library/search/Image Planete.wgs/icon.png and /dev/null differ diff --git a/resources/library/search/Image Planete.wgs/icon.thumbnail.png b/resources/library/search/Image Planete.wgs/icon.thumbnail.png deleted file mode 100755 index b9cd7783..00000000 Binary files a/resources/library/search/Image Planete.wgs/icon.thumbnail.png and /dev/null differ diff --git a/resources/library/search/Image Planete.wgs/images/down.png b/resources/library/search/Image Planete.wgs/images/down.png deleted file mode 100755 index 1de37e16..00000000 Binary files a/resources/library/search/Image Planete.wgs/images/down.png and /dev/null differ diff --git a/resources/library/search/Image Planete.wgs/images/greySquare.png b/resources/library/search/Image Planete.wgs/images/greySquare.png deleted file mode 100755 index c0a7f14e..00000000 Binary files a/resources/library/search/Image Planete.wgs/images/greySquare.png and /dev/null differ diff --git a/resources/library/search/Image Planete.wgs/images/icon-close.png b/resources/library/search/Image Planete.wgs/images/icon-close.png deleted file mode 100755 index c8d581cd..00000000 Binary files a/resources/library/search/Image Planete.wgs/images/icon-close.png and /dev/null differ diff --git a/resources/library/search/Image Planete.wgs/images/popupBack.png b/resources/library/search/Image Planete.wgs/images/popupBack.png deleted file mode 100755 index 113b5196..00000000 Binary files a/resources/library/search/Image Planete.wgs/images/popupBack.png and /dev/null differ diff --git a/resources/library/search/Image Planete.wgs/images/search.png b/resources/library/search/Image Planete.wgs/images/search.png deleted file mode 100755 index 20d72553..00000000 Binary files a/resources/library/search/Image Planete.wgs/images/search.png and /dev/null differ diff --git a/resources/library/search/Image Planete.wgs/images/search_app.png b/resources/library/search/Image Planete.wgs/images/search_app.png deleted file mode 100755 index efd8ea4a..00000000 Binary files a/resources/library/search/Image Planete.wgs/images/search_app.png and /dev/null differ diff --git a/resources/library/search/Image Planete.wgs/images/trgDown.png b/resources/library/search/Image Planete.wgs/images/trgDown.png deleted file mode 100755 index 632be5fb..00000000 Binary files a/resources/library/search/Image Planete.wgs/images/trgDown.png and /dev/null differ diff --git a/resources/library/search/Image Planete.wgs/images/trgUp.png b/resources/library/search/Image Planete.wgs/images/trgUp.png deleted file mode 100755 index 869adf5b..00000000 Binary files a/resources/library/search/Image Planete.wgs/images/trgUp.png and /dev/null differ diff --git a/resources/library/search/Image Planete.wgs/images/up.png b/resources/library/search/Image Planete.wgs/images/up.png deleted file mode 100755 index 7d9a8f7e..00000000 Binary files a/resources/library/search/Image Planete.wgs/images/up.png and /dev/null differ diff --git a/resources/library/search/Image Planete.wgs/index.html b/resources/library/search/Image Planete.wgs/index.html deleted file mode 100755 index 375d9b94..00000000 --- a/resources/library/search/Image Planete.wgs/index.html +++ /dev/null @@ -1,268 +0,0 @@ - - - - - Planete Sankore Image Search - - - - - - -
- - diff --git a/resources/library/search/Image Planete.wgs/scripts/jquery-1.6.2.min.js b/resources/library/search/Image Planete.wgs/scripts/jquery-1.6.2.min.js deleted file mode 100755 index e67db747..00000000 --- a/resources/library/search/Image Planete.wgs/scripts/jquery-1.6.2.min.js +++ /dev/null @@ -1,18 +0,0 @@ -/*! - * jQuery JavaScript Library v1.6.2 - * http://jquery.com/ - * - * Copyright 2011, John Resig - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * Copyright 2011, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * - * Date: Thu Jun 30 14:16:56 2011 -0400 - */ -(function(a,b){function cv(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cs(a){if(!cg[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"":"")+""),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cr(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cq(){cn=b}function cp(){setTimeout(cq,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bx(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bm(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(be,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bl(a){f.nodeName(a,"input")?bk(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bk)}function bk(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bj(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bi(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bh(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i=0===c})}function V(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function N(a,b){return(a&&a!=="*"?a+".":"")+b.replace(z,"`").replace(A,"&")}function M(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;ic)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function K(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function E(){return!0}function D(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"$1-$2").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z])/ig,x=function(a,b){return b.toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!A){A=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a);return c===b||D.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(b,c,d){a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),d=c.documentElement,(!d||!d.nodeName||d.nodeName==="parsererror")&&e.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c
a",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0},m&&f.extend(p,{position:"absolute",left:-1e3,top:-1e3});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="
",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="
t
",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([a-z])([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g=f.expando,h=typeof c=="string",i,j=a.nodeType,k=j?f.cache:a,l=j?a[f.expando]:a[f.expando]&&f.expando;if((!l||e&&l&&!k[l][g])&&h&&d===b)return;l||(j?a[f.expando]=l=++f.uuid:l=f.expando),k[l]||(k[l]={},j||(k[l].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?k[l][g]=f.extend(k[l][g],c):k[l]=f.extend(k[l],c);i=k[l],e&&(i[g]||(i[g]={}),i=i[g]),d!==b&&(i[f.camelCase(c)]=d);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[f.camelCase(c)]||i[c]:i}},removeData:function(b,c,d){if(!!f.acceptData(b)){var e=f.expando,g=b.nodeType,h=g?f.cache:b,i=g?b[f.expando]:f.expando;if(!h[i])return;if(c){var j=d?h[i][e]:h[i];if(j){delete j[c];if(!l(j))return}}if(d){delete h[i][e];if(!l(h[i]))return}var k=h[i][e];f.support.deleteExpando||h!=a?delete h[i]:h[i]=null,k?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=k):g&&(f.support.deleteExpando?delete b[f.expando]:b.removeAttribute?b.removeAttribute(f.expando):b[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=w:v&&c!=="className"&&(f.nodeName(a,"form")||u.test(c))&&(i=v)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.support.getSetAttribute?a.removeAttribute(b):(f.attr(a,b,""),a.removeAttributeNode(a.getAttributeNode(b))),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},tabIndex:{get:function(a){var c=a.getAttributeNode("tabIndex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}},value:{get:function(a,b){if(v&&f.nodeName(a,"button"))return v.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(v&&f.nodeName(a,"button"))return v.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==b?g:a[c]},propHooks:{}}),w={get:function(a,c){return f.prop(a,c)?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(f.attrFix=f.propFix,v=f.attrHooks.name=f.attrHooks.title=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,c){var d=a.getAttributeNode(c);if(d){d.nodeValue=b;return b}}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var x=/\.(.*)$/,y=/^(?:textarea|input|select)$/i,z=/\./g,A=/ /g,B=/[^\w\s.|`]/g,C=function(a){return a.replace(B,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=D;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=D);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),C).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i. -shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},J=function(c){var d=c.target,e,g;if(!!y.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=I(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:J,beforedeactivate:J,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&J.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&J.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",I(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in H)f.event.add(this,c+".specialChange",H[c]);return y.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return y.test(this.nodeName)}},H=f.event.special.change.filters,H.focus=H.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g0)for(h=g;h0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=T.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a=="string")return f.inArray(this[0],a?f(a):this.parent().children());return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(V(c[0])||V(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=S.call(arguments);O.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!U[a]?f.unique(e):e,(this.length>1||Q.test(d))&&P.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var X=/ jQuery\d+="(?:\d+|null)"/g,Y=/^\s+/,Z=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,$=/<([\w:]+)/,_=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]};bf.optgroup=bf.option,bf.tbody=bf.tfoot=bf.colgroup=bf.caption=bf.thead,bf.th=bf.td,f.support.htmlSerialize||(bf._default=[1,"div
","
"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(X,""):null;if(typeof a=="string"&&!bb.test(a)&&(f.support.leadingWhitespace||!Y.test(a))&&!bf[($.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Z,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j -)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bi(a,d),e=bj(a),g=bj(d);for(h=0;e[h];++h)bi(e[h],g[h])}if(b){bh(a,d);if(c){e=bj(a),g=bj(d);for(h=0;e[h];++h)bh(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!ba.test(k))k=b.createTextNode(k);else{k=k.replace(Z,"<$1>");var l=($.exec(k)||["",""])[1].toLowerCase(),m=bf[l]||bf._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=_.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&Y.test(k)&&o.insertBefore(b.createTextNode(Y.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bo.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle;c.zoom=1;var e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.filter=bn.test(g)?g.replace(bn,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bx(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(by=function(a,c){var d,e,g;c=c.replace(bp,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bz=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bq.test(d)&&br.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bx=by||bz,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bB=/%20/g,bC=/\[\]$/,bD=/\r?\n/g,bE=/#.*$/,bF=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bG=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bH=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,bI=/^(?:GET|HEAD)$/,bJ=/^\/\//,bK=/\?/,bL=/)<[^<]*)*<\/script>/gi,bM=/^(?:select|textarea)/i,bN=/\s+/,bO=/([?&])_=[^&]*/,bP=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bQ=f.fn.load,bR={},bS={},bT,bU;try{bT=e.href}catch(bV){bT=c.createElement("a"),bT.href="",bT=bT.href}bU=bP.exec(bT.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bQ)return bQ.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bL,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bM.test(this.nodeName)||bG.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bD,"\r\n")}}):{name:b.name,value:c.replace(bD,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?f.extend(!0,a,f.ajaxSettings,b):(b=a,a=f.extend(!0,f.ajaxSettings,b));for(var c in{context:1,url:1})c in b?a[c]=b[c]:c in f.ajaxSettings&&(a[c]=f.ajaxSettings[c]);return a},ajaxSettings:{url:bT,isLocal:bH.test(bU[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML}},ajaxPrefilter:bW(bR),ajaxTransport:bW(bS),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a?4:0;var o,r,u,w=l?bZ(d,v,l):b,x,y;if(a>=200&&a<300||a===304){if(d.ifModified){if(x=v.getResponseHeader("Last-Modified"))f.lastModified[k]=x;if(y=v.getResponseHeader("Etag"))f.etag[k]=y}if(a===304)c="notmodified",o=!0;else try{r=b$(d,w),c="success",o=!0}catch(z){c="parsererror",u=z}}else{u=c;if(!c||a)c="error",a<0&&(a=0)}v.status=a,v.statusText=c,o?h.resolveWith(e,[r,c,v]):h.rejectWith(e,[v,c,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,c]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bF.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bE,"").replace(bJ,bU[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bN),d.crossDomain==null&&(r=bP.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bU[1]&&r[2]==bU[2]&&(r[3]||(r[1]==="http:"?80:443))==(bU[3]||(bU[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bX(bR,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bI.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bK.test(d.url)?"&":"?")+d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bO,"$1_="+x);d.url=y+(y===d.url?(bK.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", */*; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bX(bS,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){status<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bB,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn,co=a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cr("show",3),a,b,c);for(var g=0,h=this.length;g=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b
";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cu.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cu.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cv(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cv(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c];return e.document.compatMode==="CSS1Compat"&&g||e.document.body["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var h=f.css(e,d),i=parseFloat(h);return f.isNaN(i)?h:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window); \ No newline at end of file diff --git a/resources/library/search/Video Planete.wgs/config.xml b/resources/library/search/Video Planete.wgs/config.xml deleted file mode 100755 index d7cc14eb..00000000 --- a/resources/library/search/Video Planete.wgs/config.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - Choisir - Mnemis SA - Choisir widget - - - diff --git a/resources/library/search/Video Planete.wgs/css/basic.css b/resources/library/search/Video Planete.wgs/css/basic.css deleted file mode 100755 index 80b50fbc..00000000 --- a/resources/library/search/Video Planete.wgs/css/basic.css +++ /dev/null @@ -1,315 +0,0 @@ -html, body{ - width: 100%; - padding: 0; - height: auto; - background-color: white; - margin: 0; -} - -::-webkit-scrollbar { - width: 14px; - background-color:white; -} - - -::-webkit-scrollbar-thumb { - border-radius: 10px; - background-color:lightgray; - border: 2px solid gray; -} - -::-webkit-scrollbar-button:vertical:start{ - border-radius: 10px; - background-color:lightgray; - background-image: url(../images/trgUp.png); - background-size: 8px auto; - background-position: center; - background-repeat: no-repeat; - border: 2px solid gray; -} - -::-webkit-scrollbar-button:vertical:end{ - border-radius: 10px; - background-color:lightgray; - background-image: url(../images/trgDown.png); - background-size: 8px auto; - background-position: center; - background-repeat: no-repeat; - border: 2px solid gray; -} - -a { - text-decoration: underline; -} - -#disc_nav_cont{ - height: auto; - position: fixed; - left: 0; - bottom: 0; - width: 100%; -} - -.disclaimer{ - padding: 5px; - text-align: center; - background-color: #BBBBBB; - border-top: solid 4px #EEEEEE; - border-bottom: none; - font-size: 12px; -} - -.resultFooter{ - width: 100%; - padding: 3px; - font-family: Verdana,Arial,Helvetica,sans-serif; - font-weight: bold; - font-size: x-large; - text-align: center; - background-color: white; -} - -#searchResult { - overflow: hidden; - text-align: center; - margin-top: 50px; - margin-bottom: 85px; -} - -.search{ - position: fixed; - top: 0; - left: 0; - padding: 5px; - background-color: #BBBBBB; - border-bottom: solid 4px #EEEEEE; -} - -.search, -.disclaimer { - width: 100%; - box-sizing: border-box; - -webkit-box-sizing: border-box; -} - -.searchInput{ - padding: 3px; - float: left; - width: 100%; - border-radius: 3px; - border-style: none; - height: 22px; - line-height: 18px; - vertical-align: middle; - box-sizing: border-box; - -webkit-box-sizing: border-box; -} - -.searchButton{ - background: url("../images/search_app.png") -38px -38px no-repeat; - width: 24px; - height: 24px; - overflow: hidden; - position: absolute; - right: 30px; - top: 9px; - margin-left: -2px; - cursor: pointer; -} - -.subSearch{ - margin: 0; - float: left; -} - -#subSearchInput{ - width: 100%; - float: left; - box-sizing: border-box; - -webkit-box-sizing: border-box; - padding: 5px; - padding-right: 26px; -} - -#subSearchFilter{ - width: 100%; - float: left; - display: none; -} - -.searchResult{ - width: 98%; - padding: 3px; - background-color:#123456; -} - -.imgContainer{ - display: inline-block; - padding: 3px; - margin: 3px; - text-align: center; - overflow: hidden; - font-size: small; - font-family: Verdana,Arial,Helvetica,sans-serif; - border: 1px solid #666; - border-radius: 5px; - -webkit-box-shadow: #dadada -1px 0 4px; - -webkit-border-radius: 5px; - box-shadow: #666 -1px 0 4px; - vertical-align: top; -} - - -.filterContainer{ - float: left; - margin: 2px; - padding: 2px; - font-size: 14px; - -} - -.filterSelect{ - border-style:none; - -webkit-border-top-right-radius: 15px; - -webkit-border-bottom-right-radius: 15px; - -moz-border-radius-topright: 15px; - -moz-border-radius-bottomright: 15px; - border-top-right-radius: 15px; - margin-top: 2px; - width: 100%; -} - -span{ - font-family: Verdana,Arial,Helvetica,sans-serif; - color: #666; -} - -[draggable] { - -webkit-user-select: none; - user-select: none; -} - -.toggleFilters{ - margin: 0; - padding: 0; - background-position: center; - background-image: url(../images/down.png); - position: absolute; - top: 11px; - right: 6px; - width: 20px; - height: 20px; - cursor: pointer; -} - -.colors_line { - float: left; - margin: 4px; - margin-right: 0; - clear: left; -} - -.custom { - opacity: 0; - position: absolute; - left: -10000px; -} - -.filter_button.button.color { - display: inline-block; - width: 15px; - height: 15px; - border: 1px solid #EBEBEB; - padding: 0; - margin: 0; - box-sizing: border-box; - -webkit-box-sizing: border-box; -} - -.filter_button.button.color:hover { - border: 1px solid rgb(128,128,128); - cursor: pointer; -} - -input[type="radio"]:checked + .filter_button.button.color { - border: 1px solid rgb(255,255,255); - box-shadow: 0 0 0px 1px #000; - -webkit-box-shadow: 0 0 0px 1px #000; -} - -#allcolor { - background: white url('../images/search_app.png') -43px -144px no-repeat; -} - -#colored { - background: white url('../images/search_app.png') -43px -244px no-repeat; -} - -#grayed { - background: white url('../images/search_app.png') -45px -343px no-repeat; -} - -#black{ - background-color:#ffffff; -} -#blue{ - background-color:#0000FF; -} -#brown{ - background-color:rgba(139, 82, 16, 1); -} - -#gray{ - background-color:#999999; -} - -#green{ - background-color:#00CC00; -} - -#orange{ - background-color:#FB940B; -} - -#pink{ - background-color:#FF98BF; -} - -#purple{ - background-color:#762CA7; -} - -#red{ - background-color:#CC0000; -} - -#teal{ - background-color:#03C0C6; -} - -#white{ - background-color:#000000; -} - -#yellow{ - background-color:#FFFF00; -} - -.selectBox-dropdown, .selectBox-options li a { - line-height: 1.3 !important; - font-size: 13px; -} - -.pager_button { - padding: 3px 5px; - font-size: 16px; - color: black; - display: inline-block; -} - -.pager_button.active { - border-radius: 3px; - -webkit-border-radius: 3px; - background-color: gray; - color: white; -} diff --git a/resources/library/search/Video Planete.wgs/icon.png b/resources/library/search/Video Planete.wgs/icon.png deleted file mode 100755 index abda6d9d..00000000 Binary files a/resources/library/search/Video Planete.wgs/icon.png and /dev/null differ diff --git a/resources/library/search/Video Planete.wgs/icon.thumbnail.png b/resources/library/search/Video Planete.wgs/icon.thumbnail.png deleted file mode 100755 index abda6d9d..00000000 Binary files a/resources/library/search/Video Planete.wgs/icon.thumbnail.png and /dev/null differ diff --git a/resources/library/search/Video Planete.wgs/images/down.png b/resources/library/search/Video Planete.wgs/images/down.png deleted file mode 100755 index 1de37e16..00000000 Binary files a/resources/library/search/Video Planete.wgs/images/down.png and /dev/null differ diff --git a/resources/library/search/Video Planete.wgs/images/greySquare.png b/resources/library/search/Video Planete.wgs/images/greySquare.png deleted file mode 100755 index c0a7f14e..00000000 Binary files a/resources/library/search/Video Planete.wgs/images/greySquare.png and /dev/null differ diff --git a/resources/library/search/Video Planete.wgs/images/icon-close.png b/resources/library/search/Video Planete.wgs/images/icon-close.png deleted file mode 100755 index c8d581cd..00000000 Binary files a/resources/library/search/Video Planete.wgs/images/icon-close.png and /dev/null differ diff --git a/resources/library/search/Video Planete.wgs/images/popupBack.png b/resources/library/search/Video Planete.wgs/images/popupBack.png deleted file mode 100755 index 113b5196..00000000 Binary files a/resources/library/search/Video Planete.wgs/images/popupBack.png and /dev/null differ diff --git a/resources/library/search/Video Planete.wgs/images/search.png b/resources/library/search/Video Planete.wgs/images/search.png deleted file mode 100755 index 20d72553..00000000 Binary files a/resources/library/search/Video Planete.wgs/images/search.png and /dev/null differ diff --git a/resources/library/search/Video Planete.wgs/images/search_app.png b/resources/library/search/Video Planete.wgs/images/search_app.png deleted file mode 100755 index efd8ea4a..00000000 Binary files a/resources/library/search/Video Planete.wgs/images/search_app.png and /dev/null differ diff --git a/resources/library/search/Video Planete.wgs/images/thumbnail_icon.png b/resources/library/search/Video Planete.wgs/images/thumbnail_icon.png deleted file mode 100755 index e296e4a9..00000000 Binary files a/resources/library/search/Video Planete.wgs/images/thumbnail_icon.png and /dev/null differ diff --git a/resources/library/search/Video Planete.wgs/images/trgDown.png b/resources/library/search/Video Planete.wgs/images/trgDown.png deleted file mode 100755 index 632be5fb..00000000 Binary files a/resources/library/search/Video Planete.wgs/images/trgDown.png and /dev/null differ diff --git a/resources/library/search/Video Planete.wgs/images/trgUp.png b/resources/library/search/Video Planete.wgs/images/trgUp.png deleted file mode 100755 index 869adf5b..00000000 Binary files a/resources/library/search/Video Planete.wgs/images/trgUp.png and /dev/null differ diff --git a/resources/library/search/Video Planete.wgs/images/up.png b/resources/library/search/Video Planete.wgs/images/up.png deleted file mode 100755 index 7d9a8f7e..00000000 Binary files a/resources/library/search/Video Planete.wgs/images/up.png and /dev/null differ diff --git a/resources/library/search/Video Planete.wgs/index.html b/resources/library/search/Video Planete.wgs/index.html deleted file mode 100755 index cd2d8762..00000000 --- a/resources/library/search/Video Planete.wgs/index.html +++ /dev/null @@ -1,254 +0,0 @@ - - - - - Planete Sankore Image Search - - - - - - -
- - diff --git a/resources/library/search/Video Planete.wgs/scripts/jquery-1.6.2.min.js b/resources/library/search/Video Planete.wgs/scripts/jquery-1.6.2.min.js deleted file mode 100755 index e67db747..00000000 --- a/resources/library/search/Video Planete.wgs/scripts/jquery-1.6.2.min.js +++ /dev/null @@ -1,18 +0,0 @@ -/*! - * jQuery JavaScript Library v1.6.2 - * http://jquery.com/ - * - * Copyright 2011, John Resig - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * Copyright 2011, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * - * Date: Thu Jun 30 14:16:56 2011 -0400 - */ -(function(a,b){function cv(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cs(a){if(!cg[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"":"")+""),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cr(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cq(){cn=b}function cp(){setTimeout(cq,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bx(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bm(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(be,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bl(a){f.nodeName(a,"input")?bk(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bk)}function bk(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bj(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bi(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bh(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i=0===c})}function V(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function N(a,b){return(a&&a!=="*"?a+".":"")+b.replace(z,"`").replace(A,"&")}function M(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;ic)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function K(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function E(){return!0}function D(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"$1-$2").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z])/ig,x=function(a,b){return b.toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!A){A=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a);return c===b||D.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(b,c,d){a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),d=c.documentElement,(!d||!d.nodeName||d.nodeName==="parsererror")&&e.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c
a",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0},m&&f.extend(p,{position:"absolute",left:-1e3,top:-1e3});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="
",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="
t
",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([a-z])([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g=f.expando,h=typeof c=="string",i,j=a.nodeType,k=j?f.cache:a,l=j?a[f.expando]:a[f.expando]&&f.expando;if((!l||e&&l&&!k[l][g])&&h&&d===b)return;l||(j?a[f.expando]=l=++f.uuid:l=f.expando),k[l]||(k[l]={},j||(k[l].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?k[l][g]=f.extend(k[l][g],c):k[l]=f.extend(k[l],c);i=k[l],e&&(i[g]||(i[g]={}),i=i[g]),d!==b&&(i[f.camelCase(c)]=d);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[f.camelCase(c)]||i[c]:i}},removeData:function(b,c,d){if(!!f.acceptData(b)){var e=f.expando,g=b.nodeType,h=g?f.cache:b,i=g?b[f.expando]:f.expando;if(!h[i])return;if(c){var j=d?h[i][e]:h[i];if(j){delete j[c];if(!l(j))return}}if(d){delete h[i][e];if(!l(h[i]))return}var k=h[i][e];f.support.deleteExpando||h!=a?delete h[i]:h[i]=null,k?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=k):g&&(f.support.deleteExpando?delete b[f.expando]:b.removeAttribute?b.removeAttribute(f.expando):b[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=w:v&&c!=="className"&&(f.nodeName(a,"form")||u.test(c))&&(i=v)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.support.getSetAttribute?a.removeAttribute(b):(f.attr(a,b,""),a.removeAttributeNode(a.getAttributeNode(b))),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},tabIndex:{get:function(a){var c=a.getAttributeNode("tabIndex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}},value:{get:function(a,b){if(v&&f.nodeName(a,"button"))return v.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(v&&f.nodeName(a,"button"))return v.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==b?g:a[c]},propHooks:{}}),w={get:function(a,c){return f.prop(a,c)?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(f.attrFix=f.propFix,v=f.attrHooks.name=f.attrHooks.title=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,c){var d=a.getAttributeNode(c);if(d){d.nodeValue=b;return b}}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var x=/\.(.*)$/,y=/^(?:textarea|input|select)$/i,z=/\./g,A=/ /g,B=/[^\w\s.|`]/g,C=function(a){return a.replace(B,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=D;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=D);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),C).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i. -shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},J=function(c){var d=c.target,e,g;if(!!y.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=I(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:J,beforedeactivate:J,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&J.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&J.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",I(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in H)f.event.add(this,c+".specialChange",H[c]);return y.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return y.test(this.nodeName)}},H=f.event.special.change.filters,H.focus=H.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g0)for(h=g;h0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=T.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a=="string")return f.inArray(this[0],a?f(a):this.parent().children());return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(V(c[0])||V(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=S.call(arguments);O.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!U[a]?f.unique(e):e,(this.length>1||Q.test(d))&&P.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var X=/ jQuery\d+="(?:\d+|null)"/g,Y=/^\s+/,Z=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,$=/<([\w:]+)/,_=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]};bf.optgroup=bf.option,bf.tbody=bf.tfoot=bf.colgroup=bf.caption=bf.thead,bf.th=bf.td,f.support.htmlSerialize||(bf._default=[1,"div
","
"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(X,""):null;if(typeof a=="string"&&!bb.test(a)&&(f.support.leadingWhitespace||!Y.test(a))&&!bf[($.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Z,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j -)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bi(a,d),e=bj(a),g=bj(d);for(h=0;e[h];++h)bi(e[h],g[h])}if(b){bh(a,d);if(c){e=bj(a),g=bj(d);for(h=0;e[h];++h)bh(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!ba.test(k))k=b.createTextNode(k);else{k=k.replace(Z,"<$1>");var l=($.exec(k)||["",""])[1].toLowerCase(),m=bf[l]||bf._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=_.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&Y.test(k)&&o.insertBefore(b.createTextNode(Y.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bo.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle;c.zoom=1;var e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.filter=bn.test(g)?g.replace(bn,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bx(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(by=function(a,c){var d,e,g;c=c.replace(bp,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bz=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bq.test(d)&&br.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bx=by||bz,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bB=/%20/g,bC=/\[\]$/,bD=/\r?\n/g,bE=/#.*$/,bF=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bG=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bH=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,bI=/^(?:GET|HEAD)$/,bJ=/^\/\//,bK=/\?/,bL=/)<[^<]*)*<\/script>/gi,bM=/^(?:select|textarea)/i,bN=/\s+/,bO=/([?&])_=[^&]*/,bP=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bQ=f.fn.load,bR={},bS={},bT,bU;try{bT=e.href}catch(bV){bT=c.createElement("a"),bT.href="",bT=bT.href}bU=bP.exec(bT.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bQ)return bQ.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bL,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bM.test(this.nodeName)||bG.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bD,"\r\n")}}):{name:b.name,value:c.replace(bD,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?f.extend(!0,a,f.ajaxSettings,b):(b=a,a=f.extend(!0,f.ajaxSettings,b));for(var c in{context:1,url:1})c in b?a[c]=b[c]:c in f.ajaxSettings&&(a[c]=f.ajaxSettings[c]);return a},ajaxSettings:{url:bT,isLocal:bH.test(bU[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML}},ajaxPrefilter:bW(bR),ajaxTransport:bW(bS),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a?4:0;var o,r,u,w=l?bZ(d,v,l):b,x,y;if(a>=200&&a<300||a===304){if(d.ifModified){if(x=v.getResponseHeader("Last-Modified"))f.lastModified[k]=x;if(y=v.getResponseHeader("Etag"))f.etag[k]=y}if(a===304)c="notmodified",o=!0;else try{r=b$(d,w),c="success",o=!0}catch(z){c="parsererror",u=z}}else{u=c;if(!c||a)c="error",a<0&&(a=0)}v.status=a,v.statusText=c,o?h.resolveWith(e,[r,c,v]):h.rejectWith(e,[v,c,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,c]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bF.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bE,"").replace(bJ,bU[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bN),d.crossDomain==null&&(r=bP.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bU[1]&&r[2]==bU[2]&&(r[3]||(r[1]==="http:"?80:443))==(bU[3]||(bU[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bX(bR,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bI.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bK.test(d.url)?"&":"?")+d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bO,"$1_="+x);d.url=y+(y===d.url?(bK.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", */*; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bX(bS,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){status<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bB,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn,co=a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cr("show",3),a,b,c);for(var g=0,h=this.length;g=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b
";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cu.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cu.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cv(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cv(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c];return e.document.compatMode==="CSS1Compat"&&g||e.document.body["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var h=f.css(e,d),i=parseFloat(h);return f.isNaN(i)?h:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window); \ No newline at end of file diff --git a/resources/style.qss b/resources/style.qss index e53e0ee6..a877c11b 100644 --- a/resources/style.qss +++ b/resources/style.qss @@ -1,5 +1,6 @@ QWidget#DockPaletteWidgetBox, QWidget#documentNavigator, +QWidget#UBBoardThumbnailsView, QWidget#UBLibPathViewer, QWidget#UBLibNavigatorWidget, QWidget#UBLibItemProperties, diff --git a/src/adaptors/UBExportFullPDF.cpp b/src/adaptors/UBExportFullPDF.cpp index 64b989a0..9b6684f0 100644 --- a/src/adaptors/UBExportFullPDF.cpp +++ b/src/adaptors/UBExportFullPDF.cpp @@ -97,8 +97,8 @@ void UBExportFullPDF::saveOverlayPdf(UBDocumentProxy* pDocumentProxy, const QStr UBGraphicsScene* scene = UBPersistenceManager::persistenceManager()->loadDocumentScene(pDocumentProxy, pageIndex); // set background to white, no grid for PDF output bool isDark = scene->isDarkBackground(); - bool isCrossed = scene->isCrossedBackground(); - scene->setBackground(false, false); + UBPageBackground pageBackground = scene->pageBackground(); + scene->setBackground(false, UBPageBackground::plain); // set high res rendering scene->setRenderingQuality(UBItem::RenderingQualityHigh); @@ -126,7 +126,7 @@ void UBExportFullPDF::saveOverlayPdf(UBDocumentProxy* pDocumentProxy, const QStr //restore background state scene->setDrawingMode(false); - scene->setBackground(isDark, isCrossed); + scene->setBackground(isDark, pageBackground); } if (pdfPainter) delete pdfPainter; diff --git a/src/adaptors/UBExportPDF.cpp b/src/adaptors/UBExportPDF.cpp index 65db6e63..f8d22cdc 100644 --- a/src/adaptors/UBExportPDF.cpp +++ b/src/adaptors/UBExportPDF.cpp @@ -94,8 +94,8 @@ bool UBExportPDF::persistsDocument(UBDocumentProxy* pDocumentProxy, const QStrin // set background to white, no crossing for PDF output bool isDark = scene->isDarkBackground(); - bool isCrossed = scene->isCrossedBackground(); - scene->setBackground(false, false); + UBPageBackground pageBackground = scene->pageBackground(); + scene->setBackground(false, UBPageBackground::plain); // pageSize is the output PDF page size; it is set to equal the scene's boundary size; if the contents // of the scene overflow from the boundaries, they will be scaled down. @@ -124,7 +124,7 @@ bool UBExportPDF::persistsDocument(UBDocumentProxy* pDocumentProxy, const QStrin scene->setRenderingQuality(UBItem::RenderingQualityNormal); // Restore background state - scene->setBackground(isDark, isCrossed); + scene->setBackground(isDark, pageBackground); } if(!painterNeedsBegin) diff --git a/src/adaptors/UBSvgSubsetAdaptor.cpp b/src/adaptors/UBSvgSubsetAdaptor.cpp index 66cd9978..53bef3e1 100644 --- a/src/adaptors/UBSvgSubsetAdaptor.cpp +++ b/src/adaptors/UBSvgSubsetAdaptor.cpp @@ -447,6 +447,7 @@ UBGraphicsScene* UBSvgSubsetAdaptor::UBSvgSubsetReader::loadScene(UBDocumentProx bool darkBackground = false; bool crossedBackground = false; + bool ruledBackground = false; QStringRef ubDarkBackground = mXmlReader.attributes().value(mNamespaceUri, "dark-background"); @@ -455,10 +456,44 @@ UBGraphicsScene* UBSvgSubsetAdaptor::UBSvgSubsetReader::loadScene(UBDocumentProx QStringRef ubCrossedBackground = mXmlReader.attributes().value(mNamespaceUri, "crossed-background"); - if (!ubDarkBackground.isNull()) + if (!ubCrossedBackground.isNull()) crossedBackground = (ubCrossedBackground.toString() == xmlTrue); - mScene->setBackground(darkBackground, crossedBackground); + + if (crossedBackground) { + QStringRef ubGridSize = mXmlReader.attributes().value(mNamespaceUri, "grid-size"); + + if (!ubGridSize.isNull()) { + int gridSize = ubGridSize.toInt(); + + mScene->setBackgroundGridSize(gridSize); + } + } + + QStringRef ubRuledBackground = mXmlReader.attributes().value(mNamespaceUri, "ruled-background"); + + if (!ubRuledBackground.isNull()) + ruledBackground = (ubRuledBackground.toString() == xmlTrue); + + if (ruledBackground && !crossedBackground) { // if for some reason both are true, the background will be a grid + QStringRef ubGridSize = mXmlReader.attributes().value(mNamespaceUri, "grid-size"); + + if (!ubGridSize.isNull()) { + int gridSize = ubGridSize.toInt(); + + mScene->setBackgroundGridSize(gridSize); + } + } + + UBPageBackground bg; + if (crossedBackground) + bg = UBPageBackground::crossed; + else if (ruledBackground) + bg = UBPageBackground::ruled; + else + bg = UBPageBackground::plain; + + mScene->setBackground(darkBackground, bg); QStringRef pageNominalSize = mXmlReader.attributes().value(mNamespaceUri, "nominal-size"); if (!pageNominalSize.isNull()) @@ -938,6 +973,24 @@ UBGraphicsGroupContainerItem* UBSvgSubsetAdaptor::UBSvgSubsetReader::readGroup() if(mStrokesList.contains(id)) shouldSkipSubElements = true; + QString ubLocked = mXmlReader.attributes().value(mNamespaceUri, "locked").toString(); + if (!ubLocked.isEmpty()) + { + bool isLocked = ubLocked.contains(xmlTrue); + group->setData(UBGraphicsItemData::ItemLocked, QVariant(isLocked)); + } + + QStringRef ubLayer = mXmlReader.attributes().value(mNamespaceUri, "layer"); + if (!ubLayer.isNull()) + { + bool ok; + int layerAsInt = ubLayer.toString().toInt(&ok); + + if (ok) + group->setData(UBGraphicsItemData::ItemLayerType, QVariant(layerAsInt)); + } + + mXmlReader.readNext(); while (!mXmlReader.atEnd()) { @@ -994,13 +1047,9 @@ void UBSvgSubsetAdaptor::UBSvgSubsetReader::readGroupRoot() } else if (mXmlReader.isStartElement()) { if (mXmlReader.name() == tGroup) { - QString ubLocked = mXmlReader.attributes().value(UBSettings::uniboardDocumentNamespaceUri, "locked").toString(); + UBGraphicsGroupContainerItem *curGroup = readGroup(); - if (!ubLocked.isEmpty()) - { - bool isLocked = ubLocked.contains(xmlTrue); - curGroup->Delegate()->setLocked(isLocked); - } + if (curGroup) { mScene->addGroup(curGroup); } @@ -1070,7 +1119,18 @@ void UBSvgSubsetAdaptor::UBSvgSubsetWriter::writeSvgElement(UBDocumentProxy* pro } mXmlWriter.writeAttribute(UBSettings::uniboardDocumentNamespaceUri, "dark-background", mScene->isDarkBackground() ? xmlTrue : xmlFalse); - mXmlWriter.writeAttribute(UBSettings::uniboardDocumentNamespaceUri, "crossed-background", mScene->isCrossedBackground() ? xmlTrue : xmlFalse); + + bool crossedBackground = mScene->pageBackground() == UBPageBackground::crossed; + bool ruledBackground = mScene->pageBackground() == UBPageBackground::ruled; + + mXmlWriter.writeAttribute(UBSettings::uniboardDocumentNamespaceUri, "crossed-background", crossedBackground ? xmlTrue : xmlFalse); + mXmlWriter.writeAttribute(UBSettings::uniboardDocumentNamespaceUri, "ruled-background", ruledBackground ? xmlTrue : xmlFalse); + + if (crossedBackground || ruledBackground) { + int gridSize = mScene->backgroundGridSize(); + + mXmlWriter.writeAttribute(UBSettings::uniboardDocumentNamespaceUri, "grid-size", QString::number(gridSize)); + } QDesktopWidget* desktop = UBApplication::desktop(); @@ -1169,6 +1229,9 @@ bool UBSvgSubsetAdaptor::UBSvgSubsetWriter::persistScene(UBDocumentProxy* proxy, if (!locked.isNull() && locked.toBool()) mXmlWriter.writeAttribute(UBSettings::uniboardDocumentNamespaceUri, "locked", xmlTrue); + QVariant layer = sg->data(UBGraphicsItemData::ItemLayerType); + mXmlWriter.writeAttribute(UBSettings::uniboardDocumentNamespaceUri, "layer", QString("%1").arg(layer.toInt())); + QMatrix matrix = sg->sceneMatrix(); if (!matrix.isIdentity()) mXmlWriter.writeAttribute("transform", toSvgTransform(matrix)); @@ -1349,6 +1412,10 @@ bool UBSvgSubsetAdaptor::UBSvgSubsetWriter::persistScene(UBDocumentProxy* proxy, if(curElement.hasAttribute("locked")){ mXmlWriter.writeAttribute(UBSettings::uniboardDocumentNamespaceUri,"locked",curElement.attribute("locked")); } + if(curElement.hasAttribute("layer")){ + mXmlWriter.writeAttribute(UBSettings::uniboardDocumentNamespaceUri,"layer",curElement.attribute("layer")); + } + QDomElement curSubElement = curElement.firstChildElement(); while (!curSubElement.isNull()) { if (curSubElement.hasAttribute(aId)) { @@ -1393,6 +1460,8 @@ void UBSvgSubsetAdaptor::UBSvgSubsetWriter::persistGroupToDom(QGraphicsItem *gro curGroupElement.setAttribute("locked", xmlTrue); else curGroupElement.setAttribute("locked", xmlFalse); + + curGroupElement.setAttribute("layer", group->data(UBGraphicsItemData::ItemLayerType).toString()); } curParent->appendChild(curGroupElement); foreach (QGraphicsItem *item, groupItem->childItems()) { @@ -1557,6 +1626,8 @@ void UBSvgSubsetAdaptor::UBSvgSubsetWriter::polygonItemToSvgPolygon(UBGraphicsPo if (polygonItem->fillRule() == Qt::OddEvenFill) mXmlWriter.writeAttribute("fill-rule", "evenodd"); + else + mXmlWriter.writeAttribute("fill-rule", "winding"); if (!groupHoldsInfo) { @@ -1678,6 +1749,17 @@ UBGraphicsPolygonItem* UBSvgSubsetAdaptor::UBSvgSubsetReader::polygonItemFromPol color.setAlphaF(opacity); polygonItem->setColorOnLightBackground(color); } + + // Before OpenBoard v1.4, fill rule was only saved if it was "Even-odd". Therefore if no fill rule + // is specified, we assume that it should be Winding fill. + + QStringRef fillRule = mXmlReader.attributes().value("fill-rule"); + + if (!fillRule.isNull() && fillRule.toString() == "evenodd") + polygonItem->setFillRule(Qt::OddEvenFill); + else + polygonItem->setFillRule(Qt::WindingFill); + return polygonItem; } diff --git a/src/api/UBWidgetUniboardAPI.cpp b/src/api/UBWidgetUniboardAPI.cpp index c84bb546..5645519c 100644 --- a/src/api/UBWidgetUniboardAPI.cpp +++ b/src/api/UBWidgetUniboardAPI.cpp @@ -223,8 +223,12 @@ void UBWidgetUniboardAPI::addObject(QString pUrl, int width, int height, int x, void UBWidgetUniboardAPI::setBackground(bool pIsDark, bool pIsCrossed) { - if (mScene) - mScene->setBackground(pIsDark, pIsCrossed); + if (mScene) { + if (pIsCrossed) + mScene->setBackground(pIsDark, UBPageBackground::crossed); + else + mScene->setBackground(pIsDark, UBPageBackground::plain); + } } diff --git a/src/board/UBBoardController.cpp b/src/board/UBBoardController.cpp index 6464d01b..e9ba86c1 100644 --- a/src/board/UBBoardController.cpp +++ b/src/board/UBBoardController.cpp @@ -122,10 +122,6 @@ UBBoardController::UBBoardController(UBMainWindow* mainWindow) mMarkerColorOnDarkBackground = UBSettings::settings()->markerColors(true).at(markerColorIndex); mMarkerColorOnLightBackground = UBSettings::settings()->markerColors(false).at(markerColorIndex); - QDesktopWidget* desktop = UBApplication::desktop(); - int dpiCommon = (desktop->physicalDpiX() + desktop->physicalDpiY()) / 2; - int sPixelsPerMillimeter = qRound(dpiCommon / UBGeometryUtils::inchSize); - UBSettings::settings()->crossSize = 10*sPixelsPerMillimeter; } @@ -156,6 +152,8 @@ void UBBoardController::init() setActiveDocumentScene(doc); + initBackgroundGridSize(); + undoRedoStateChange(true); } @@ -166,6 +164,36 @@ UBBoardController::~UBBoardController() delete mDisplayView; } +/** + * @brief Set the default background grid size to appear as roughly 1cm on screen + */ +void UBBoardController::initBackgroundGridSize() +{ + // Besides adjusting for DPI, we also need to scale the grid size by the ratio of the control view size + // to document size. However the control view isn't available as soon as the boardController is created, + // so we approximate this ratio as (document resolution) / (screen resolution). + // Later on, this is calculated by `updateSystemScaleFactor` and stored in `mSystemScaleFactor`. + + QDesktopWidget* desktop = UBApplication::desktop(); + qreal dpi = (desktop->physicalDpiX() + desktop->physicalDpiY()) / 2.; + + //qDebug() << "dpi: " << dpi; + + // The display manager isn't initialized yet so we have to just assume the control view is on the main display + qreal screenY = desktop->screenGeometry(mControlView).height(); + qreal documentY = mActiveScene->nominalSize().height(); + qreal resolutionRatio = documentY / screenY; + + //qDebug() << "resolution ratio: " << resolutionRatio; + + int gridSize = (resolutionRatio * 10. * dpi) / UBGeometryUtils::inchSize; + + UBSettings::settings()->crossSize = gridSize; + UBSettings::settings()->defaultCrossSize = gridSize; + mActiveScene->setBackgroundGridSize(gridSize); + + //qDebug() << "grid size: " << gridSize; +} int UBBoardController::currentPage() { @@ -201,10 +229,11 @@ void UBBoardController::setupViews() mDisplayView->setInteractive(false); mDisplayView->setTransformationAnchor(QGraphicsView::NoAnchor); - mMessageWindow = new UBMessageWindow(mControlView); + mPaletteManager = new UBBoardPaletteManager(mControlContainer, this); + + mMessageWindow = new UBMessageWindow(mControlContainer); mMessageWindow->hide(); - mPaletteManager = new UBBoardPaletteManager(mControlContainer, this); connect(this, SIGNAL(activeSceneChanged()), mPaletteManager, SLOT(activeSceneChanged())); } @@ -476,6 +505,7 @@ void UBBoardController::stylusToolDoubleClicked(int tool) else if (tool == UBStylusTool::Hand) { centerRestore(); + mActiveScene->setLastCenter(QPointF(0,0)); } } @@ -484,6 +514,7 @@ void UBBoardController::stylusToolDoubleClicked(int tool) void UBBoardController::addScene() { QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); + persistViewPositionOnCurrentScene(); persistCurrentScene(false,true); UBDocumentContainer::addPage(mActiveSceneIndex + 1); @@ -521,6 +552,7 @@ void UBBoardController::addScene(UBGraphicsScene* scene, bool replaceActiveIfEmp if (replaceActiveIfEmpty && mActiveScene->isEmpty()) { UBPersistenceManager::persistenceManager()->insertDocumentSceneAt(selectedDocument(), clone, mActiveSceneIndex); + emit addThumbnailRequired(this, mActiveSceneIndex); setActiveDocumentScene(mActiveSceneIndex); deleteScene(mActiveSceneIndex + 1); } @@ -528,6 +560,7 @@ void UBBoardController::addScene(UBGraphicsScene* scene, bool replaceActiveIfEmp { persistCurrentScene(false,true); UBPersistenceManager::persistenceManager()->insertDocumentSceneAt(selectedDocument(), clone, mActiveSceneIndex + 1); + emit addThumbnailRequired(this, mActiveSceneIndex + 1); setActiveDocumentScene(mActiveSceneIndex + 1); } @@ -556,6 +589,7 @@ void UBBoardController::duplicateScene(int nIndex) duplicatePages(scIndexes); insertThumbPage(nIndex); emit documentThumbnailsUpdated(this); + emit addThumbnailRequired(this, nIndex + 1); selectedDocument()->setMetaData(UBSettings::documentUpdatedAt, UBStringUtils::toUtcIsoDateTime(QDateTime::currentDateTime())); setActiveDocumentScene(nIndex + 1); @@ -739,7 +773,7 @@ void UBBoardController::deleteScene(int nIndex) mDeletingSceneIndex = nIndex; QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); persistCurrentScene(); - showMessage(tr("Delete page %1 from document").arg(nIndex), true); + showMessage(tr("Deleting page %1").arg(nIndex+1), true); QList scIndexes; scIndexes << nIndex; @@ -749,7 +783,7 @@ void UBBoardController::deleteScene(int nIndex) if (nIndex >= pageCount()) nIndex = pageCount()-1; setActiveDocumentScene(nIndex); - showMessage(tr("Page %1 deleted").arg(nIndex)); + showMessage(tr("Page %1 deleted").arg(nIndex+1)); QApplication::restoreOverrideCursor(); mDeletingSceneIndex = -1; } @@ -762,6 +796,8 @@ void UBBoardController::clearScene() { freezeW3CWidgets(true); mActiveScene->clearContent(UBGraphicsScene::clearItemsAndAnnotations); + mActiveScene->setLastCenter(QPointF(0,0)); + mControlView->centerOn(mActiveScene->lastCenter()); updateActionStates(); } } @@ -931,14 +967,23 @@ void UBBoardController::handScroll(qreal dx, qreal dy) emit controlViewportChanged(); } +void UBBoardController::persistViewPositionOnCurrentScene() +{ + QRect rect = mControlView->rect(); + QPoint center(rect.x() + rect.width() / 2, rect.y() + rect.height() / 2); + QPointF viewRelativeCenter = mControlView->mapToScene(center); + mActiveScene->setLastCenter(viewRelativeCenter); +} void UBBoardController::previousScene() { if (mActiveSceneIndex > 0) { QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); + persistViewPositionOnCurrentScene(); persistCurrentScene(); setActiveDocumentScene(mActiveSceneIndex - 1); + mControlView->centerOn(mActiveScene->lastCenter()); QApplication::restoreOverrideCursor(); } @@ -951,8 +996,10 @@ void UBBoardController::nextScene() if (mActiveSceneIndex < selectedDocument()->pageCount() - 1) { QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); + persistViewPositionOnCurrentScene(); persistCurrentScene(); setActiveDocumentScene(mActiveSceneIndex + 1); + mControlView->centerOn(mActiveScene->lastCenter()); QApplication::restoreOverrideCursor(); } @@ -965,8 +1012,10 @@ void UBBoardController::firstScene() if (mActiveSceneIndex > 0) { QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); + persistViewPositionOnCurrentScene(); persistCurrentScene(); setActiveDocumentScene(0); + mControlView->centerOn(mActiveScene->lastCenter()); QApplication::restoreOverrideCursor(); } @@ -979,8 +1028,10 @@ void UBBoardController::lastScene() if (mActiveSceneIndex < selectedDocument()->pageCount() - 1) { QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); + persistViewPositionOnCurrentScene(); persistCurrentScene(); setActiveDocumentScene(selectedDocument()->pageCount() - 1); + mControlView->centerOn(mActiveScene->lastCenter()); QApplication::restoreOverrideCursor(); } @@ -1372,7 +1423,6 @@ UBItem *UBBoardController::downloadFinished(bool pSuccess, QUrl sourceUrl, QUrl if (result){ selectedDocument()->setMetaData(UBSettings::documentUpdatedAt, UBStringUtils::toUtcIsoDateTime(QDateTime::currentDateTime())); - reloadThumbnails(); } } else if (UBMimeType::OpenboardTool == itemMimeType) @@ -1507,12 +1557,11 @@ void UBBoardController::setActiveDocumentScene(UBDocumentProxy* pDocumentProxy, { freezeW3CWidgets(true); - persistCurrentScene(); - ClearUndoStack(); mActiveScene = targetScene; mActiveSceneIndex = index; + setDocument(pDocumentProxy, forceReload); updateSystemScaleFactor(); @@ -1520,6 +1569,7 @@ void UBBoardController::setActiveDocumentScene(UBDocumentProxy* pDocumentProxy, mControlView->setScene(mActiveScene); disconnect(mControlView, SIGNAL(mouseReleased()), mActiveScene, SLOT(updateSelectionFrame())); connect(mControlView, SIGNAL(mouseReleased()), mActiveScene, SLOT(updateSelectionFrame())); + mDisplayView->setScene(mActiveScene); mActiveScene->setBackgroundZoomFactor(mControlView->transform().m11()); pDocumentProxy->setDefaultDocumentSize(mActiveScene->nominalSize()); @@ -1528,20 +1578,24 @@ void UBBoardController::setActiveDocumentScene(UBDocumentProxy* pDocumentProxy, adjustDisplayViews(); UBSettings::settings()->setDarkBackground(mActiveScene->isDarkBackground()); - UBSettings::settings()->setCrossedBackground(mActiveScene->isCrossedBackground()); + UBSettings::settings()->setPageBackground(mActiveScene->pageBackground()); freezeW3CWidgets(false); } selectionChanged(); - updateBackgroundActionsState(mActiveScene->isDarkBackground(), mActiveScene->isCrossedBackground()); + updateBackgroundActionsState(mActiveScene->isDarkBackground(), mActiveScene->pageBackground()); if(documentChange) + { UBGraphicsTextItem::lastUsedTextColor = QColor(); + } if (sceneChange) + { emit activeSceneChanged(); + } } @@ -1549,7 +1603,6 @@ void UBBoardController::moveSceneToIndex(int source, int target) { if (selectedDocument()) { - persistCurrentScene(false,true); UBDocumentContainer::movePageToIndex(source, target); @@ -1557,9 +1610,12 @@ void UBBoardController::moveSceneToIndex(int source, int target) selectedDocument()->setMetaData(UBSettings::documentUpdatedAt, UBStringUtils::toUtcIsoDateTime(QDateTime::currentDateTime())); UBPersistenceManager::persistenceManager()->persistDocumentMetadata(selectedDocument()); mMovingSceneIndex = source; + mActiveSceneIndex = target; setActiveDocumentScene(target); mMovingSceneIndex = -1; + emit activeSceneChanged(); + emit updateThumbnailsRequired(); } } @@ -1673,17 +1729,17 @@ int UBBoardController::autosaveTimeoutFromSettings() return value * minute; } -void UBBoardController::changeBackground(bool isDark, bool isCrossed) +void UBBoardController::changeBackground(bool isDark, UBPageBackground pageBackground) { bool currentIsDark = mActiveScene->isDarkBackground(); - bool currentIsCrossed = mActiveScene->isCrossedBackground(); + UBPageBackground currentBackgroundType = mActiveScene->pageBackground(); - if ((isDark != currentIsDark) || (currentIsCrossed != isCrossed)) + if ((isDark != currentIsDark) || (currentBackgroundType != pageBackground)) { UBSettings::settings()->setDarkBackground(isDark); - UBSettings::settings()->setCrossedBackground(isCrossed); + UBSettings::settings()->setPageBackground(pageBackground); - mActiveScene->setBackground(isDark, isCrossed); + mActiveScene->setBackground(isDark, pageBackground); emit backgroundChanged(); } @@ -1752,6 +1808,7 @@ void UBBoardController::selectionChanged() { updateActionStates(); emit pageSelectionChanged(activeSceneIndex()); + emit updateThumbnailsRequired(); } @@ -1793,6 +1850,7 @@ void UBBoardController::documentSceneChanged(UBDocumentProxy* pDocumentProxy, in if(selectedDocument() == pDocumentProxy) { setActiveDocumentScene(mActiveSceneIndex); + updatePage(pIndex); } } @@ -1829,9 +1887,9 @@ void UBBoardController::appMainModeChanged(UBApplicationController::MainMode md) void UBBoardController::closing() { mIsClosing = true; + lastWindowClosed(); ClearUndoStack(); showKeyboard(false); - lastWindowClosed(); } void UBBoardController::lastWindowClosed() @@ -2054,7 +2112,8 @@ void UBBoardController::saveViewState() { mActiveScene->setViewState(UBGraphicsScene::SceneViewState(currentZoom(), mControlView->horizontalScrollBar()->value(), - mControlView->verticalScrollBar()->value())); + mControlView->verticalScrollBar()->value(), + mActiveScene->lastCenter())); } } @@ -2474,16 +2533,31 @@ void UBBoardController::moveToolWidgetToScene(UBToolWidget* toolWidget) } -void UBBoardController::updateBackgroundActionsState(bool isDark, bool isCrossed) +void UBBoardController::updateBackgroundActionsState(bool isDark, UBPageBackground pageBackground) { - if (isDark && !isCrossed) - mMainWindow->actionPlainDarkBackground->setChecked(true); - else if (isDark && isCrossed) - mMainWindow->actionCrossedDarkBackground->setChecked(true); - else if (!isDark && isCrossed) - mMainWindow->actionCrossedLightBackground->setChecked(true); - else - mMainWindow->actionPlainLightBackground->setChecked(true); + switch (pageBackground) { + + case UBPageBackground::crossed: + if (isDark) + mMainWindow->actionCrossedDarkBackground->setChecked(true); + else + mMainWindow->actionCrossedLightBackground->setChecked(true); + break; + + case UBPageBackground::ruled : + if (isDark) + mMainWindow->actionRuledDarkBackground->setChecked(true); + else + mMainWindow->actionRuledLightBackground->setChecked(true); + break; + + default: + if (isDark) + mMainWindow->actionPlainDarkBackground->setChecked(true); + else + mMainWindow->actionPlainLightBackground->setChecked(true); + break; + } } diff --git a/src/board/UBBoardController.h b/src/board/UBBoardController.h index f57b21ef..23fc688f 100644 --- a/src/board/UBBoardController.h +++ b/src/board/UBBoardController.h @@ -159,6 +159,7 @@ class UBBoardController : public UBDocumentContainer return mSystemScaleFactor; } qreal currentZoom(); + void persistViewPositionOnCurrentScene(); void persistCurrentScene(bool isAnAutomaticBackup = false, bool forceImmediateSave = false); void showNewVersionAvailable(bool automatic, const UBVersion &installedVersion, const UBSoftwareUpdate &softwareUpdate); void setBoxing(QRect displayRect); @@ -220,7 +221,7 @@ class UBBoardController : public UBDocumentContainer UBItem *downloadFinished(bool pSuccess, QUrl sourceUrl, QUrl contentUrl, QString pHeader, QByteArray pData, QPointF pPos, QSize pSize, bool isBackground = false, bool internalData = false); - void changeBackground(bool isDark, bool isCrossed); + void changeBackground(bool isDark, UBPageBackground pageBackground); void setToolCursor(int tool); void showMessage(const QString& message, bool showSpinningWheel = false); void hideMessage(); @@ -263,6 +264,7 @@ class UBBoardController : public UBDocumentContainer void documentReorganized(int index); void displayMetadata(QMap metadata); void pageSelectionChanged(int index); + void centerOnThumbnailRequired(int index); void npapiWidgetCreated(const QString &Url); protected: @@ -284,6 +286,7 @@ class UBBoardController : public UBDocumentContainer void appMainModeChanged(UBApplicationController::MainMode); private: + void initBackgroundGridSize(); void updatePageSizeState(); void saveViewState(); void adjustDisplayViews(); @@ -321,7 +324,7 @@ class UBBoardController : public UBDocumentContainer void stylusToolDoubleClicked(int tool); void boardViewResized(QResizeEvent* event); void documentWillBeDeleted(UBDocumentProxy* pProxy); - void updateBackgroundActionsState(bool isDark, bool isCrossed); + void updateBackgroundActionsState(bool isDark, UBPageBackground pageBackground); void colorPaletteChanged(); void libraryDialogClosed(int ret); void lastWindowClosed(); diff --git a/src/board/UBBoardPaletteManager.cpp b/src/board/UBBoardPaletteManager.cpp index b5dc37b0..581eb6b1 100644 --- a/src/board/UBBoardPaletteManager.cpp +++ b/src/board/UBBoardPaletteManager.cpp @@ -45,6 +45,7 @@ #include "gui/UBZoomPalette.h" #include "gui/UBWebToolsPalette.h" #include "gui/UBActionPalette.h" +#include "gui/UBBackgroundPalette.h" #include "gui/UBFavoriteToolPalette.h" #include "gui/UBStartupHintsPalette.h" @@ -134,7 +135,6 @@ void UBBoardPaletteManager::setupDockPaletteWidgets() //------------------------------------------------// // Create the widgets for the dock palettes - mpPageNavigWidget = new UBPageNavigationWidget(); mpCachePropWidget = new UBCachePropertiesWidget(); @@ -145,7 +145,6 @@ void UBBoardPaletteManager::setupDockPaletteWidgets() mLeftPalette = new UBLeftPalette(mContainer); // LEFT palette widgets - mpPageNavigWidget = new UBPageNavigationWidget(); mLeftPalette->registerWidget(mpPageNavigWidget); mLeftPalette->addTab(mpPageNavigWidget); @@ -251,14 +250,16 @@ void UBBoardPaletteManager::setupPalettes() backgroundsActions << UBApplication::mainWindow->actionPlainLightBackground; backgroundsActions << UBApplication::mainWindow->actionCrossedLightBackground; + backgroundsActions << UBApplication::mainWindow->actionRuledLightBackground; backgroundsActions << UBApplication::mainWindow->actionPlainDarkBackground; backgroundsActions << UBApplication::mainWindow->actionCrossedDarkBackground; + backgroundsActions << UBApplication::mainWindow->actionRuledDarkBackground; - mBackgroundsPalette = new UBActionPalette(backgroundsActions, Qt::Horizontal , mContainer); + mBackgroundsPalette = new UBBackgroundPalette(backgroundsActions, mContainer); mBackgroundsPalette->setButtonIconSize(QSize(128, 128)); mBackgroundsPalette->groupActions(); mBackgroundsPalette->setClosable(true); - mBackgroundsPalette->setAutoClose(true); + mBackgroundsPalette->setAutoClose(false); mBackgroundsPalette->adjustSizeAndPosition(); mBackgroundsPalette->hide(); @@ -434,8 +435,10 @@ void UBBoardPaletteManager::connectPalettes() connect(UBApplication::mainWindow->actionPlainLightBackground, SIGNAL(triggered()), this, SLOT(changeBackground())); connect(UBApplication::mainWindow->actionCrossedLightBackground, SIGNAL(triggered()), this, SLOT(changeBackground())); + connect(UBApplication::mainWindow->actionRuledLightBackground, SIGNAL(triggered()), this, SLOT(changeBackground())); connect(UBApplication::mainWindow->actionPlainDarkBackground, SIGNAL(triggered()), this, SLOT(changeBackground())); connect(UBApplication::mainWindow->actionCrossedDarkBackground, SIGNAL(triggered()), this, SLOT(changeBackground())); + connect(UBApplication::mainWindow->actionRuledDarkBackground, SIGNAL(triggered()), this, SLOT(changeBackground())); connect(UBApplication::mainWindow->actionPodcast, SIGNAL(triggered(bool)), this, SLOT(tooglePodcastPalette(bool))); connect(UBApplication::mainWindow->actionAddItemToCurrentPage, SIGNAL(triggered()), this, SLOT(addItemToCurrentPage())); @@ -526,15 +529,24 @@ void UBBoardPaletteManager::containerResized() void UBBoardPaletteManager::changeBackground() { if (UBApplication::mainWindow->actionCrossedLightBackground->isChecked()) - UBApplication::boardController->changeBackground(false, true); + UBApplication::boardController->changeBackground(false, UBPageBackground::crossed); + + else if (UBApplication::mainWindow->actionRuledLightBackground->isChecked()) + UBApplication::boardController->changeBackground(false, UBPageBackground::ruled); + else if (UBApplication::mainWindow->actionPlainDarkBackground->isChecked()) - UBApplication::boardController->changeBackground(true, false); + UBApplication::boardController->changeBackground(true, UBPageBackground::plain); + else if (UBApplication::mainWindow->actionCrossedDarkBackground->isChecked()) - UBApplication::boardController->changeBackground(true, true); + UBApplication::boardController->changeBackground(true, UBPageBackground::crossed); + + else if (UBApplication::mainWindow->actionRuledDarkBackground->isChecked()) + UBApplication::boardController->changeBackground(true, UBPageBackground::ruled); + else - UBApplication::boardController->changeBackground(false, false); + UBApplication::boardController->changeBackground(false, UBPageBackground::plain); - UBApplication::mainWindow->actionBackgrounds->setChecked(false); + mBackgroundsPalette->backgroundChanged(); } @@ -554,8 +566,10 @@ void UBBoardPaletteManager::activeSceneChanged() if (mZoomPalette) connect(mZoomPalette, SIGNAL(mouseEntered()), activeScene, SLOT(hideTool())); - if (mBackgroundsPalette) + if (mBackgroundsPalette) { connect(mBackgroundsPalette, SIGNAL(mouseEntered()), activeScene, SLOT(hideTool())); + mBackgroundsPalette->refresh(); + } } diff --git a/src/board/UBBoardPaletteManager.h b/src/board/UBBoardPaletteManager.h index e6b42aa1..408e895f 100644 --- a/src/board/UBBoardPaletteManager.h +++ b/src/board/UBBoardPaletteManager.h @@ -48,6 +48,7 @@ class UBClockPalette; class UBPageNumberPalette; class UBZoomPalette; class UBActionPalette; +class UBBackgroundPalette; class UBBoardController; class UBServerXMLHttpRequest; class UBKeyboardPalette; @@ -113,7 +114,7 @@ class UBBoardPaletteManager : public QObject /** The right dock palette */ UBRightPalette* mRightPalette; - UBActionPalette *mBackgroundsPalette; + UBBackgroundPalette *mBackgroundsPalette; UBActionPalette *mToolsPalette; UBActionPalette* mAddItemPalette; UBActionPalette* mErasePalette; diff --git a/src/board/UBBoardView.cpp b/src/board/UBBoardView.cpp index 4ca060dd..52936055 100644 --- a/src/board/UBBoardView.cpp +++ b/src/board/UBBoardView.cpp @@ -1310,10 +1310,6 @@ void UBBoardView::mouseReleaseEvent (QMouseEvent *event) } else if (currentTool == UBStylusTool::Text) { - UBGraphicsItem *graphicsItem = dynamic_cast(movingItem); - if (graphicsItem) - graphicsItem->Delegate()->commitUndoStep(); - bool bReleaseIsNeed = true; if (movingItem != determineItemToPress(scene()->itemAt(this->mapToScene(event->localPos().toPoint()), QTransform()))) { @@ -1321,6 +1317,10 @@ void UBBoardView::mouseReleaseEvent (QMouseEvent *event) bReleaseIsNeed = false; } + UBGraphicsItem *graphicsItem = dynamic_cast(movingItem); + if (graphicsItem) + graphicsItem->Delegate()->commitUndoStep(); + if (mWidgetMoved) { mWidgetMoved = false; @@ -1609,30 +1609,42 @@ void UBBoardView::drawBackground (QPainter *painter, const QRectF &rect) else bgCrossColor = QColor(UBSettings::settings()->boardCrossColorLightBackground->get().toString()); - if (transform ().m11 () < 1.0) + if (transform ().m11 () < 0.7) { int alpha = 255 * transform ().m11 () / 2; bgCrossColor.setAlpha (alpha); // fade the crossing on small zooms } + qreal gridSize = scene()->backgroundGridSize(); + painter->setPen (bgCrossColor); - if (scene () && scene ()->isCrossedBackground ()) + if (scene () && scene ()->pageBackground() == UBPageBackground::crossed) { - qreal firstY = ((int) (rect.y () / UBSettings::crossSize)) * UBSettings::crossSize; + qreal firstY = ((int) (rect.y () / gridSize)) * gridSize; - for (qreal yPos = firstY; yPos < rect.y () + rect.height (); yPos += UBSettings::crossSize) + for (qreal yPos = firstY; yPos < rect.y () + rect.height (); yPos += gridSize) { painter->drawLine (rect.x (), yPos, rect.x () + rect.width (), yPos); } - qreal firstX = ((int) (rect.x () / UBSettings::crossSize)) * UBSettings::crossSize; + qreal firstX = ((int) (rect.x () / gridSize)) * gridSize; - for (qreal xPos = firstX; xPos < rect.x () + rect.width (); xPos += UBSettings::crossSize) + for (qreal xPos = firstX; xPos < rect.x () + rect.width (); xPos += gridSize) { painter->drawLine (xPos, rect.y (), xPos, rect.y () + rect.height ()); } } + + if (scene() && scene()->pageBackground() == UBPageBackground::ruled) + { + qreal firstY = ((int) (rect.y () / gridSize)) * gridSize; + + for (qreal yPos = firstY; yPos < rect.y () + rect.height (); yPos += gridSize) + { + painter->drawLine (rect.x (), yPos, rect.x () + rect.width (), yPos); + } + } } if (!mFilterZIndex && scene ()) diff --git a/src/core/UB.h b/src/core/UB.h index 6b218858..0b9e285c 100644 --- a/src/core/UB.h +++ b/src/core/UB.h @@ -137,6 +137,7 @@ struct UBGraphicsItemData //Duplicating delegate's functions to make possible working with pure QGraphicsItem , ItemFlippable // (bool) , ItemRotatable // (bool) + , ItemCanBeSetAsBackground }; }; @@ -214,4 +215,11 @@ struct UBUndoType }; }; +enum UBPageBackground +{ + plain = 0, + crossed, + ruled +}; + #endif /* UB_H_ */ diff --git a/src/core/UBApplication.cpp b/src/core/UBApplication.cpp index c1ebd477..d26da5df 100644 --- a/src/core/UBApplication.cpp +++ b/src/core/UBApplication.cpp @@ -58,6 +58,7 @@ #include "gui/UBMainWindow.h" #include "gui/UBResources.h" +#include "gui/UBThumbnailWidget.h" #include "adaptors/publishing/UBSvgSubsetRasterizer.h" @@ -286,6 +287,8 @@ int UBApplication::exec(const QString& pFileToImport) mainWindow->actionPaste->setShortcuts(QKeySequence::Paste); mainWindow->actionCut->setShortcuts(QKeySequence::Cut); + UBThumbnailUI::_private::initCatalog(); + connect(mainWindow->actionBoard, SIGNAL(triggered()), this, SLOT(showBoard())); connect(mainWindow->actionWeb, SIGNAL(triggered()), this, SLOT(showInternet())); connect(mainWindow->actionWeb, SIGNAL(triggered()), this, SLOT(stopScript())); @@ -511,13 +514,12 @@ void UBApplication::decorateActionMenu(QAction* action) menu->addSeparator(); menu->addAction(mainWindow->actionPreferences); menu->addAction(mainWindow->actionMultiScreen); - menu->addAction(mainWindow->actionCheckUpdate); + if (!UBSettings::settings()->appHideCheckForSoftwareUpdate->get().toBool()) + menu->addAction(mainWindow->actionCheckUpdate); menu->addSeparator(); -#ifndef Q_OS_LINUX // No Podcast on Linux yet menu->addAction(mainWindow->actionPodcast); mainWindow->actionPodcast->setText(tr("Podcast")); -#endif menu->addSeparator(); menu->addAction(mainWindow->actionQuit); diff --git a/src/core/UBApplicationController.cpp b/src/core/UBApplicationController.cpp index 8b22b47c..d8bdc89f 100644 --- a/src/core/UBApplicationController.cpp +++ b/src/core/UBApplicationController.cpp @@ -110,7 +110,7 @@ UBApplicationController::UBApplicationController(UBBoardView *pControlView, } mBlackScene = new UBGraphicsScene(0); // deleted by UBApplicationController::destructor - mBlackScene->setBackground(true, false); + mBlackScene->setBackground(true, UBPageBackground::plain); if (mDisplayManager->numScreens() >= 2 && mDisplayManager->useMultiScreen()) { diff --git a/src/core/UBPersistenceManager.cpp b/src/core/UBPersistenceManager.cpp index d5de377b..4f3f9704 100644 --- a/src/core/UBPersistenceManager.cpp +++ b/src/core/UBPersistenceManager.cpp @@ -179,10 +179,11 @@ void UBPersistenceManager::errorString(QString error) void UBPersistenceManager::onSceneLoaded(QByteArray scene, UBDocumentProxy* proxy, int sceneIndex) { + Q_UNUSED(scene); qDebug() << "scene loaded " << sceneIndex; QTime time; time.start(); - mSceneCache.insert(proxy,sceneIndex,UBSvgSubsetAdaptor::loadScene(proxy,scene)); + mSceneCache.insert(proxy, sceneIndex, loadDocumentScene(proxy, sceneIndex, false)); qDebug() << "millisecond for sceneCache " << time.elapsed(); } @@ -504,6 +505,7 @@ void UBPersistenceManager::deleteDocumentScenes(UBDocumentProxy* proxy, const QL QFile::rename(source, target); } + UBApplication::showMessage(tr("Moving page to trash folder...")); insertDocumentSceneAt(trashDocProxy, scene, trashDocProxy->pageCount()); } } @@ -658,8 +660,9 @@ UBGraphicsScene* UBPersistenceManager::createDocumentSceneAt(UBDocumentProxy* pr UBGraphicsScene *newScene = mSceneCache.createScene(proxy, index, useUndoRedoStack); newScene->setBackground(UBSettings::settings()->isDarkBackground(), - UBSettings::settings()->UBSettings::isCrossedBackground()); + UBSettings::settings()->UBSettings::pageBackground()); + newScene->setBackgroundGridSize(UBSettings::settings()->crossSize); persistDocumentScene(proxy, newScene, index); proxy->incPageCount(); @@ -744,7 +747,6 @@ UBGraphicsScene* UBPersistenceManager::loadDocumentScene(UBDocumentProxy* proxy, if (scene) mSceneCache.insert(proxy, sceneIndex, scene); } - if (cacheNeighboringScenes) { if(sceneIndex + 1 < proxy->pageCount() && !mSceneCache.contains(proxy, sceneIndex + 1)) mWorker->readScene(proxy,sceneIndex+1); diff --git a/src/core/UBPreferencesController.cpp b/src/core/UBPreferencesController.cpp index 8e787e56..b7f4dfdd 100644 --- a/src/core/UBPreferencesController.cpp +++ b/src/core/UBPreferencesController.cpp @@ -39,6 +39,7 @@ #include "core/UBDisplayManager.h" #include "board/UBBoardController.h" +#include "domain/UBGraphicsScene.h" #include "board/UBDrawingController.h" #include "podcast/UBPodcastController.h" @@ -76,6 +77,8 @@ UBPreferencesController::UBPreferencesController(QWidget *parent) , mPreferencesUI(0) , mPenProperties(0) , mMarkerProperties(0) + , mDarkBackgroundGridColorPicker(0) + , mLightBackgroundGridColorPicker(0) { mDesktop = qApp->desktop(); mPreferencesWindow = new UBPreferencesDialog(this,parent, Qt::Dialog); @@ -149,6 +152,58 @@ void UBPreferencesController::wire() connect(mPreferencesUI->verticalChoice, SIGNAL(clicked(bool)), this, SLOT(toolbarOrientationVertical(bool))); connect(mPreferencesUI->toolbarDisplayTextCheckBox, SIGNAL(clicked(bool)), settings->appToolBarDisplayText, SLOT(setBool(bool))); + //grid tab + //On light background + QPalette lightBackgroundPalette = QApplication::palette(); + lightBackgroundPalette.setColor(QPalette::Window, Qt::white); + + mPreferencesUI->crossColorLightBackgroundFrame->setAutoFillBackground(true); + mPreferencesUI->crossColorLightBackgroundFrame->setPalette(lightBackgroundPalette); + + QPalette darkBackgroundPalette = QApplication::palette(); + darkBackgroundPalette.setColor(QPalette::Window, Qt::black); + darkBackgroundPalette.setColor(QPalette::ButtonText, Qt::white); + darkBackgroundPalette.setColor(QPalette::WindowText, Qt::white); + + mPreferencesUI->crossColorDarkBackgroundFrame->setAutoFillBackground(true); + mPreferencesUI->crossColorDarkBackgroundFrame->setPalette(darkBackgroundPalette); + mPreferencesUI->crossColorDarkBackgroundLabel->setPalette(darkBackgroundPalette); + + QList gridLightBackgroundColors = settings->boardGridLightBackgroundColors->colors(); + QColor selectedCrossColorLightBackground(settings->boardCrossColorLightBackground->get().toString()); + + mLightBackgroundGridColorPicker = new UBColorPicker(mPreferencesUI->crossColorLightBackgroundFrame); + mLightBackgroundGridColorPicker->setObjectName(QString::fromUtf8("crossColorLightBackgroundFrame")); + mLightBackgroundGridColorPicker->setMinimumSize(QSize(32, 32)); + mLightBackgroundGridColorPicker->setFrameShape(QFrame::StyledPanel); + mLightBackgroundGridColorPicker->setFrameShadow(QFrame::Raised); + + mPreferencesUI->crossColorLightBackgroundLayout->addWidget(mLightBackgroundGridColorPicker); + mLightBackgroundGridColorPicker->setColors(gridLightBackgroundColors); + mLightBackgroundGridColorPicker->setSelectedColorIndex(gridLightBackgroundColors.indexOf(selectedCrossColorLightBackground)); + mPreferencesUI->lightBackgroundOpacitySlider->setValue(selectedCrossColorLightBackground.alpha()*100 / 255); + + QObject::connect(mLightBackgroundGridColorPicker, SIGNAL(colorSelected(const QColor&)), this, SLOT(setCrossColorOnLightBackground(const QColor&))); + connect(mPreferencesUI->lightBackgroundOpacitySlider, SIGNAL(valueChanged(int)), this, SLOT(lightBackgroundCrossOpacityValueChanged(int))); + + //On dark background + QList gridDarkBackgroundColors = settings->boardGridDarkBackgroundColors->colors(); + QColor selectedCrossColorDarkBackground(settings->boardCrossColorDarkBackground->get().toString()); + + mDarkBackgroundGridColorPicker = new UBColorPicker(mPreferencesUI->crossColorDarkBackgroundFrame); + mDarkBackgroundGridColorPicker->setObjectName(QString::fromUtf8("crossColorDarkBackgroundFrame")); + mDarkBackgroundGridColorPicker->setMinimumSize(QSize(32, 32)); + mDarkBackgroundGridColorPicker->setFrameShape(QFrame::StyledPanel); + mDarkBackgroundGridColorPicker->setFrameShadow(QFrame::Raised); + + mPreferencesUI->crossColorDarkBackgroundLayout->addWidget(mDarkBackgroundGridColorPicker); + mDarkBackgroundGridColorPicker->setColors(gridDarkBackgroundColors); + mDarkBackgroundGridColorPicker->setSelectedColorIndex(gridDarkBackgroundColors.indexOf(selectedCrossColorDarkBackground)); + mPreferencesUI->darkBackgroundOpacitySlider->setValue(selectedCrossColorDarkBackground.alpha()*100 / 255); + + QObject::connect(mDarkBackgroundGridColorPicker, SIGNAL(colorSelected(const QColor&)), this, SLOT(setCrossColorOnDarkBackground(const QColor&))); + connect(mPreferencesUI->darkBackgroundOpacitySlider, SIGNAL(valueChanged(int)), this, SLOT(darkBackgroundCrossOpacityValueChanged(int))); + // pen QList penLightBackgroundColors = settings->boardPenLightBackgroundColors->colors(); QList penDarkBackgroundColors = settings->boardPenDarkBackgroundColors->colors(); @@ -165,6 +220,8 @@ void UBPreferencesController::wire() connect(mPenProperties->mediumSlider, SIGNAL(valueChanged(int)), this, SLOT(widthSliderChanged(int))); connect(mPenProperties->strongSlider, SIGNAL(valueChanged(int)), this, SLOT(widthSliderChanged(int))); connect(mPenProperties->pressureSensitiveCheckBox, SIGNAL(clicked(bool)), settings, SLOT(setPenPressureSensitive(bool))); + connect(mPenProperties->circleCheckBox, SIGNAL(clicked(bool)), settings, SLOT(setPenPreviewCircle(bool))); + connect(mPenProperties->circleSpinBox, SIGNAL(valueChanged(int)), this, SLOT(penPreviewFromSizeChanged(int))); // marker QList markerLightBackgroundColors = settings->boardMarkerLightBackgroundColors->colors(); @@ -178,6 +235,8 @@ void UBPreferencesController::wire() mMarkerProperties->pressureSensitiveCheckBox->setText(tr("Marker is pressure sensitive")); + mMarkerProperties->circleFrame->hide(); + connect(mMarkerProperties->fineSlider, SIGNAL(valueChanged(int)), this, SLOT(widthSliderChanged(int))); connect(mMarkerProperties->mediumSlider, SIGNAL(valueChanged(int)), this, SLOT(widthSliderChanged(int))); connect(mMarkerProperties->strongSlider, SIGNAL(valueChanged(int)), this, SLOT(widthSliderChanged(int))); @@ -229,6 +288,8 @@ void UBPreferencesController::init() mPenProperties->mediumSlider->setValue(settings->boardPenMediumWidth->get().toDouble() * sSliderRatio); mPenProperties->strongSlider->setValue(settings->boardPenStrongWidth->get().toDouble() * sSliderRatio); mPenProperties->pressureSensitiveCheckBox->setChecked(settings->boardPenPressureSensitive->get().toBool()); + mPenProperties->circleCheckBox->setChecked(settings->showPenPreviewCircle->get().toBool()); + mPenProperties->circleSpinBox->setValue(settings->penPreviewFromSize->get().toInt()); // marker tab mMarkerProperties->fineSlider->setValue(settings->boardMarkerFineWidth->get().toDouble() * sSliderRatio); @@ -278,6 +339,8 @@ void UBPreferencesController::defaultSettings() mPenProperties->mediumSlider->setValue(settings->boardPenMediumWidth->reset().toDouble() * sSliderRatio); mPenProperties->strongSlider->setValue(settings->boardPenStrongWidth->reset().toDouble() * sSliderRatio); mPenProperties->pressureSensitiveCheckBox->setChecked(settings->boardPenPressureSensitive->reset().toBool()); + mPenProperties->circleCheckBox->setChecked(settings->showPenPreviewCircle->reset().toBool()); + mPenProperties->circleSpinBox->setValue(settings->penPreviewFromSize->reset().toInt()); settings->boardPenLightBackgroundSelectedColors->reset(); QList lightBackgroundSelectedColors = settings->boardPenLightBackgroundSelectedColors->colors(); @@ -329,9 +392,87 @@ void UBPreferencesController::defaultSettings() mPreferencesUI->webHomePage->setText(settings->webHomePage->reset().toString()); } + else if(mPreferencesUI->mainTabWidget->currentWidget() == mPreferencesUI->gridTab) + { + settings->boardCrossColorDarkBackground->reset(); + settings->boardGridDarkBackgroundColors->reset(); + + QList gridDarkBackgroundColors = settings->boardGridDarkBackgroundColors->colors(); + QColor selectedCrossColorDarkBackground(settings->boardCrossColorDarkBackground->get().toString()); + + mDarkBackgroundGridColorPicker->setColors(gridDarkBackgroundColors); + mDarkBackgroundGridColorPicker->setSelectedColorIndex(gridDarkBackgroundColors.indexOf(selectedCrossColorDarkBackground)); + int darkBackgroundOpacity = selectedCrossColorDarkBackground.alpha()*100 / 255; + mPreferencesUI->darkBackgroundOpacitySlider->setValue(darkBackgroundOpacity); + darkBackgroundCrossOpacityValueChanged(darkBackgroundOpacity); + + settings->boardCrossColorLightBackground->reset(); + settings->boardGridLightBackgroundColors->reset(); + + QList gridLightBackgroundColors = settings->boardGridLightBackgroundColors->colors(); + QColor selectedCrossColorLightBackground(settings->boardCrossColorLightBackground->get().toString()); + mLightBackgroundGridColorPicker->setColors(gridLightBackgroundColors); + mLightBackgroundGridColorPicker->setSelectedColorIndex(gridLightBackgroundColors.indexOf(selectedCrossColorLightBackground)); + int lightBackgroundOpacity = selectedCrossColorLightBackground.alpha()*100 / 255; + mPreferencesUI->lightBackgroundOpacitySlider->setValue(lightBackgroundOpacity); + lightBackgroundCrossOpacityValueChanged(lightBackgroundOpacity); + + } } +void UBPreferencesController::darkBackgroundCrossOpacityValueChanged(int value) +{ + UBSettings* settings = UBSettings::settings(); + int opacity = value * 255 / 100; + + QList gridDarkBackgroundColors = settings->boardGridDarkBackgroundColors->colors(); + + int index = mDarkBackgroundGridColorPicker->selectedColorIndex(); + QColor currentColor = gridDarkBackgroundColors.at(index); + currentColor.setAlpha(opacity); + gridDarkBackgroundColors.replace(index, currentColor); + mDarkBackgroundGridColorPicker->setColors(gridDarkBackgroundColors); + + settings->boardGridDarkBackgroundColors->setColor(index, currentColor); + + UBSettings::settings()->boardCrossColorDarkBackground->set(currentColor.name(QColor::HexArgb)); + + if (UBApplication::boardController && UBApplication::boardController->activeScene()) + { + foreach(QGraphicsView* view, UBApplication::boardController->activeScene()->views()) + view->resetCachedContent(); + } +} + +void UBPreferencesController::lightBackgroundCrossOpacityValueChanged(int value) +{ + UBSettings* settings = UBSettings::settings(); + int opacity = value * 255 / 100; + + QList gridLightBackgroundColors = settings->boardGridLightBackgroundColors->colors(); + + int index = mLightBackgroundGridColorPicker->selectedColorIndex(); + QColor currentColor = gridLightBackgroundColors.at(index); + currentColor.setAlpha(opacity); + gridLightBackgroundColors.replace(index, currentColor); + mLightBackgroundGridColorPicker->setColors(gridLightBackgroundColors); + + settings->boardGridLightBackgroundColors->setColor(index, currentColor); + + UBSettings::settings()->boardCrossColorLightBackground->set(currentColor.name(QColor::HexArgb)); + + if (UBApplication::boardController && UBApplication::boardController->activeScene()) + { + foreach(QGraphicsView* view, UBApplication::boardController->activeScene()->views()) + view->resetCachedContent(); + } +} + +void UBPreferencesController::penPreviewFromSizeChanged(int value) +{ + UBSettings::settings()->setPenPreviewFromSize(value); +} void UBPreferencesController::widthSliderChanged(int value) { @@ -434,6 +575,31 @@ void UBPreferencesController::colorSelected(const QColor& color) } +void UBPreferencesController::setCrossColorOnDarkBackground(const QColor& color) +{ + UBSettings::settings()->boardCrossColorDarkBackground->set(color.name(QColor::HexArgb)); + + mPreferencesUI->darkBackgroundOpacitySlider->setValue(color.alpha() * 100 / 255); + + if (UBApplication::boardController && UBApplication::boardController->activeScene()) + { + foreach(QGraphicsView* view, UBApplication::boardController->activeScene()->views()) + view->resetCachedContent(); + } +} + +void UBPreferencesController::setCrossColorOnLightBackground(const QColor& color) +{ + UBSettings::settings()->boardCrossColorLightBackground->set(color.name(QColor::HexArgb)); + + mPreferencesUI->lightBackgroundOpacitySlider->setValue(color.alpha() * 100 / 255); + + if (UBApplication::boardController && UBApplication::boardController->activeScene()) + { + foreach(QGraphicsView* view, UBApplication::boardController->activeScene()->views()) + view->resetCachedContent(); + } +} void UBPreferencesController::toolbarPositionChanged(bool checked) { diff --git a/src/core/UBPreferencesController.h b/src/core/UBPreferencesController.h index 3c129d03..b25fdbc7 100644 --- a/src/core/UBPreferencesController.h +++ b/src/core/UBPreferencesController.h @@ -47,7 +47,6 @@ namespace Ui class UBBrushPropertiesFrame; - class UBPreferencesDialog : public QDialog { Q_OBJECT; @@ -84,14 +83,21 @@ class UBPreferencesController : public QObject Ui::preferencesDialog* mPreferencesUI; UBBrushPropertiesFrame* mPenProperties; UBBrushPropertiesFrame* mMarkerProperties; + UBColorPicker* mDarkBackgroundGridColorPicker; + UBColorPicker* mLightBackgroundGridColorPicker; protected slots: void close(); void defaultSettings(); + void penPreviewFromSizeChanged(int value); + void darkBackgroundCrossOpacityValueChanged(int value); + void lightBackgroundCrossOpacityValueChanged(int value); void widthSliderChanged(int value); void opacitySliderChanged(int value); void colorSelected(const QColor&); + void setCrossColorOnDarkBackground(const QColor& color); + void setCrossColorOnLightBackground(const QColor& color); void toolbarPositionChanged(bool checked); void toolbarOrientationVertical(bool checked); void toolbarOrientationHorizontal(bool checked); @@ -121,5 +127,4 @@ class UBBrushPropertiesFrame : public Ui::brushProperties }; - #endif /* UBPREFERENCESCONTROLLER_H_ */ diff --git a/src/core/UBSceneCache.cpp b/src/core/UBSceneCache.cpp index 086535e5..756acef4 100644 --- a/src/core/UBSceneCache.cpp +++ b/src/core/UBSceneCache.cpp @@ -81,11 +81,6 @@ void UBSceneCache::insert (UBDocumentProxy* proxy, int pageIndex, UBGraphicsScen } else { - if (mCachedSceneCount >= UBSettings::settings()->pageCacheSize->get().toInt()) - { - compactCache(); - } - QHash::insert(key, scene); mCachedKeyFIFO.enqueue(key); @@ -231,41 +226,6 @@ void UBSceneCache::internalMoveScene(UBDocumentProxy* proxy, int sourceIndex, in } } - -void UBSceneCache::compactCache() -{ - bool foundUnusedScene = false; - int count = 0; - - do - { - if (!mCachedKeyFIFO.isEmpty()) - { - const UBSceneCacheID nextKey = mCachedKeyFIFO.dequeue(); - - if (QHash::contains(nextKey)) - { - UBGraphicsScene* scene = QHash::value(nextKey); - - if (scene && scene->views().size() == 0) - { - removeScene(nextKey.documentProxy, nextKey.pageIndex); - foundUnusedScene = true; - } - else - { - mCachedKeyFIFO.enqueue(nextKey); - } - } - } - - count++; - } - while (!foundUnusedScene && count < mCachedKeyFIFO.size()); - -} - - void UBSceneCache::dumpCacheContent() { foreach(UBSceneCacheID key, keys()) diff --git a/src/core/UBSceneCache.h b/src/core/UBSceneCache.h index dcc47fb3..ea80320e 100644 --- a/src/core/UBSceneCache.h +++ b/src/core/UBSceneCache.h @@ -107,8 +107,6 @@ class UBSceneCache : public QHash void dumpCacheContent(); - void compactCache(); - int mCachedSceneCount; QQueue mCachedKeyFIFO; diff --git a/src/core/UBSetting.cpp b/src/core/UBSetting.cpp index 3340ea8f..b4fab800 100644 --- a/src/core/UBSetting.cpp +++ b/src/core/UBSetting.cpp @@ -105,13 +105,16 @@ UBColorListSetting::UBColorListSetting(UBSettings* owner, const QString& pDomain : UBSetting(owner, pDomain, pKey, pDefaultValue) , mAlpha(pAlpha) { + foreach(QString s, get().toStringList()) { QColor color; color.setNamedColor(s); - color.setAlphaF(mAlpha); + if (mAlpha>=0) + color.setAlphaF(mAlpha); mColors.append(color); } + } UBColorListSetting::~UBColorListSetting() @@ -129,7 +132,9 @@ QVariant UBColorListSetting::reset() { QColor color; color.setNamedColor(s); - color.setAlphaF(mAlpha); + if (mAlpha>=0) + color.setAlphaF(mAlpha); + mColors.append(color); } @@ -146,10 +151,15 @@ QList UBColorListSetting::colors() const void UBColorListSetting::setColor(int pIndex, const QColor& color) { QStringList list = get().toStringList(); - list.replace(pIndex, color.name()); - QColor c = color; - c.setAlphaF(mAlpha); - mColors.replace(pIndex, c); + list.replace(pIndex, color.name(QColor::HexArgb)); + if (mAlpha>=0) + { + QColor c = color; + c.setAlphaF(mAlpha); + mColors.replace(pIndex, c); + } + else + mColors.replace(pIndex, color); set(list); } diff --git a/src/core/UBSettings.cpp b/src/core/UBSettings.cpp index bea6dd66..d30855cc 100644 --- a/src/core/UBSettings.cpp +++ b/src/core/UBSettings.cpp @@ -46,7 +46,10 @@ QPointer UBSettings::sSingleton = 0; int UBSettings::pointerDiameter = 40; -int UBSettings::crossSize = 32; +int UBSettings::crossSize = 24; +int UBSettings::defaultCrossSize = 24; +int UBSettings::minCrossSize = 12; +int UBSettings::maxCrossSize = 96; //TODO: user-settable? int UBSettings::colorPaletteSize = 5; int UBSettings::objectFrameWidth = 20; int UBSettings::boardMargin = 10; @@ -83,6 +86,12 @@ QColor UBSettings::markerCircleBrushColorLightBackground = QColor(255, 255, 255, QColor UBSettings::markerCirclePenColorDarkBackground = QColor(255, 255, 255, 127); QColor UBSettings::markerCirclePenColorLightBackground = QColor(0, 0, 0, 127); +QColor UBSettings::penCircleBrushColorDarkBackground = QColor(127, 127, 127, 80); +QColor UBSettings::penCircleBrushColorLightBackground = QColor(255, 255, 255, 30); + +QColor UBSettings::penCirclePenColorDarkBackground = QColor(255, 255, 255, 127); +QColor UBSettings::penCirclePenColorLightBackground = QColor(0, 0, 0, 127); + QColor UBSettings::documentSizeMarkColorDarkBackground = QColor(44, 44, 44, 200); QColor UBSettings::documentSizeMarkColorLightBackground = QColor(241, 241, 241); @@ -226,6 +235,7 @@ void UBSettings::init() appToolBarDisplayText = new UBSetting(this, "App", "ToolBarDisplayText", true); appEnableAutomaticSoftwareUpdates = new UBSetting(this, "App", "EnableAutomaticSoftwareUpdates", false); appSoftwareUpdateURL = new UBSetting(this, "App", "SoftwareUpdateURL", "http://www.openboard.ch/update.json"); + appHideCheckForSoftwareUpdate = new UBSetting(this, "App", "HideCheckForSoftwareUpdate", false); appToolBarOrientationVertical = new UBSetting(this, "App", "ToolBarOrientationVertical", false); appPreferredLanguage = new UBSetting(this,"App","PreferredLanguage", ""); @@ -264,15 +274,30 @@ void UBSettings::init() boardUseHighResTabletEvent = new UBSetting(this, "Board", "UseHighResTabletEvent", true); + boardInterpolatePenStrokes = new UBSetting(this, "Board", "InterpolatePenStrokes", true); + boardSimplifyPenStrokes = new UBSetting(this, "Board", "SimplifyPenStrokes", true); + boardSimplifyPenStrokesThresholdAngle = new UBSetting(this, "Board", "SimplifyPenStrokesThresholdAngle", 2); + boardSimplifyPenStrokesThresholdWidthDifference = new UBSetting(this, "Board", "SimplifyPenStrokesThresholdWidthDifference", 2.0); + + boardInterpolateMarkerStrokes = new UBSetting(this, "Board", "InterpolateMarkerStrokes", true); + boardSimplifyMarkerStrokes = new UBSetting(this, "Board", "SimplifyMarkerStrokes", true); + boardKeyboardPaletteKeyBtnSize = new UBSetting(this, "Board", "KeyboardPaletteKeyBtnSize", "16x16"); ValidateKeyboardPaletteKeyBtnSize(); pageSize = new UBSetting(this, "Board", "DefaultPageSize", documentSizes.value(DocumentSizeRatio::Ratio4_3)); - boardCrossColorDarkBackground = new UBSetting(this, "Board", "CrossColorDarkBackground", "#C8C0C0C0"); boardCrossColorLightBackground = new UBSetting(this, "Board", "CrossColorLightBackground", "#A5E1FF"); + QStringList gridLightBackgroundColors; + gridLightBackgroundColors << "#000000" << "#FF0000" << "#004080" << "#008000" << "#FFDD00" << "#C87400" << "#800040" << "#008080" << "#A5E1FF"; + boardGridLightBackgroundColors = new UBColorListSetting(this, "Board", "GridLightBackgroundColors", gridLightBackgroundColors, -1.0); + + QStringList gridDarkBackgroundColors; + gridDarkBackgroundColors << "#FFFFFF" << "#FF3400" << "#66C0FF" << "#81FF5C" << "#FFFF00" << "#B68360" << "#FF497E" << "#8D69FF" << "#C8C0C0C0"; + boardGridDarkBackgroundColors = new UBColorListSetting(this, "Board", "GridDarkBackgroundColors", gridDarkBackgroundColors, -1.0); + QStringList penLightBackgroundColors; penLightBackgroundColors << "#000000" << "#FF0000" <<"#004080" << "#008000" << "#FFDD00" << "#C87400" << "#800040" << "#008080" << "#5F2D0A" << "#FFFFFF"; boardPenLightBackgroundColors = new UBColorListSetting(this, "Board", "PenLightBackgroundColors", penLightBackgroundColors, 1.0); @@ -313,6 +338,8 @@ void UBSettings::init() showEraserPreviewCircle = new UBSetting(this, "Board", "ShowEraserPreviewCircle", true); showMarkerPreviewCircle = new UBSetting(this, "Board", "ShowMarkerPreviewCircle", true); + showPenPreviewCircle = new UBSetting(this, "Board", "ShowPenPreviewCircle", true); + penPreviewFromSize = new UBSetting(this, "Board", "PenPreviewFromSize", 5); webUseExternalBrowser = new UBSetting(this, "Web", "UseExternalBrowser", false); @@ -399,6 +426,8 @@ void UBSettings::init() documentThumbnailWidth = new UBSetting(this, "Document", "ThumbnailWidth", UBSettings::defaultThumbnailWidth); + libraryShowDetailsForLocalItems = new UBSetting(this, "Library", "ShowDetailsForLocalItems", false); + imageThumbnailWidth = new UBSetting(this, "Library", "ImageThumbnailWidth", UBSettings::defaultImageWidth); videoThumbnailWidth = new UBSetting(this, "Library", "VideoThumbnailWidth", UBSettings::defaultVideoWidth); shapeThumbnailWidth = new UBSetting(this, "Library", "ShapeThumbnailWidth", UBSettings::defaultShapeWidth); @@ -732,9 +761,16 @@ bool UBSettings::isDarkBackground() } -bool UBSettings::isCrossedBackground() +UBPageBackground UBSettings::pageBackground() { - return value("Board/CrossedBackground", 0).toBool(); + QString val = value("Board/PageBackground", 0).toString(); + + if (val == "crossed") + return UBPageBackground::crossed; + else if (val == "ruled") + return UBPageBackground::ruled; + else + return UBPageBackground::plain; } @@ -745,9 +781,18 @@ void UBSettings::setDarkBackground(bool isDarkBackground) } -void UBSettings::setCrossedBackground(bool isCrossedBackground) +void UBSettings::setPageBackground(UBPageBackground background) { - setValue("Board/CrossedBackground", isCrossedBackground); + QString val; + + if (background == UBPageBackground::crossed) + val = "crossed"; + else if (background == UBPageBackground::ruled) + val = "ruled"; + else + val = "plain"; + + setValue("Board/PageBackground", val); } @@ -756,6 +801,15 @@ void UBSettings::setPenPressureSensitive(bool sensitive) boardPenPressureSensitive->set(sensitive); } +void UBSettings::setPenPreviewCircle(bool circle) +{ + showPenPreviewCircle->set(circle); +} + +void UBSettings::setPenPreviewFromSize(int size) +{ + penPreviewFromSize->set(size); +} void UBSettings::setMarkerPressureSensitive(bool sensitive) { @@ -1410,4 +1464,8 @@ void UBSettings::checkNewSettings() // A typo was corrected in version 1.3 removeSetting("Board/useSystemOnScreenKeybard"); + + // CrossedBackground changed in 1.4 (no longer a bool but an enum; can be crossed or ruled) + removeSetting("Board/CrossedBackground"); + } diff --git a/src/core/UBSettings.h b/src/core/UBSettings.h index c191a4cd..28af670b 100644 --- a/src/core/UBSettings.h +++ b/src/core/UBSettings.h @@ -87,9 +87,9 @@ class UBSettings : public QObject // Background related bool isDarkBackground(); - bool isCrossedBackground(); + UBPageBackground pageBackground(); void setDarkBackground(bool isDarkBackground); - void setCrossedBackground(bool isCrossedBackground); + void setPageBackground(UBPageBackground background); // Stylus palette related bool isStylusPaletteVisible(); @@ -177,10 +177,21 @@ class UBSettings : public QObject static QColor markerCirclePenColorDarkBackground; static QColor markerCirclePenColorLightBackground; + static QColor penCircleBrushColorDarkBackground; + static QColor penCircleBrushColorLightBackground; + + static QColor penCirclePenColorDarkBackground; + static QColor penCirclePenColorLightBackground; + static QColor documentSizeMarkColorDarkBackground; static QColor documentSizeMarkColorLightBackground; + // Background grid static int crossSize; + static int defaultCrossSize; + static int minCrossSize; + static int maxCrossSize; + static int colorPaletteSize; static int objectFrameWidth; @@ -240,6 +251,7 @@ class UBSettings : public QObject UBSetting* appToolBarDisplayText; UBSetting* appEnableAutomaticSoftwareUpdates; UBSetting* appSoftwareUpdateURL; + UBSetting* appHideCheckForSoftwareUpdate; UBSetting* appToolBarOrientationVertical; UBSetting* appPreferredLanguage; @@ -267,6 +279,13 @@ class UBSettings : public QObject UBSetting* boardUseHighResTabletEvent; + UBSetting* boardInterpolatePenStrokes; + UBSetting* boardSimplifyPenStrokes; + UBSetting* boardSimplifyPenStrokesThresholdAngle; + UBSetting* boardSimplifyPenStrokesThresholdWidthDifference; + UBSetting* boardInterpolateMarkerStrokes; + UBSetting* boardSimplifyMarkerStrokes; + UBSetting* boardKeyboardPaletteKeyBtnSize; UBSetting* appStartMode; @@ -276,6 +295,9 @@ class UBSettings : public QObject UBSetting* boardCrossColorDarkBackground; UBSetting* boardCrossColorLightBackground; + UBColorListSetting* boardGridLightBackgroundColors; + UBColorListSetting* boardGridDarkBackgroundColors; + UBColorListSetting* boardPenLightBackgroundColors; UBColorListSetting* boardPenLightBackgroundSelectedColors; @@ -292,6 +314,8 @@ class UBSettings : public QObject UBSetting* showEraserPreviewCircle; UBSetting* showMarkerPreviewCircle; + UBSetting* showPenPreviewCircle; + UBSetting* penPreviewFromSize; UBSetting* webUseExternalBrowser; UBSetting* webShowPageImmediatelyOnMirroredScreen; @@ -353,6 +377,8 @@ class UBSettings : public QObject UBSetting* gipThumbnailWidth; UBSetting* soundThumbnailWidth; + UBSetting* libraryShowDetailsForLocalItems; + UBSetting* rightLibPaletteBoardModeWidth; UBSetting* rightLibPaletteBoardModeIsCollapsed; UBSetting* rightLibPaletteDesktopModeWidth; @@ -397,6 +423,8 @@ class UBSettings : public QObject void setStylusPaletteVisible(bool visible); void setPenPressureSensitive(bool sensitive); + void setPenPreviewCircle(bool sensitive); + void setPenPreviewFromSize(int size); void setMarkerPressureSensitive(bool sensitive); QVariant value ( const QString & key, const QVariant & defaultValue = QVariant() ); diff --git a/src/desktop/UBDesktopAnnotationController.cpp b/src/desktop/UBDesktopAnnotationController.cpp index f17911be..17b7062c 100644 --- a/src/desktop/UBDesktopAnnotationController.cpp +++ b/src/desktop/UBDesktopAnnotationController.cpp @@ -187,9 +187,9 @@ UBDesktopAnnotationController::~UBDesktopAnnotationController() void UBDesktopAnnotationController::updateColors(){ if(UBApplication::boardController->activeScene()->isDarkBackground()){ - mTransparentDrawingScene->setBackground(true, false); + mTransparentDrawingScene->setBackground(true, UBPageBackground::plain); }else{ - mTransparentDrawingScene->setBackground(false, false); + mTransparentDrawingScene->setBackground(false, UBPageBackground::plain); } } diff --git a/src/document/UBDocumentContainer.cpp b/src/document/UBDocumentContainer.cpp index e6f30d03..7af9e433 100644 --- a/src/document/UBDocumentContainer.cpp +++ b/src/document/UBDocumentContainer.cpp @@ -51,6 +51,7 @@ void UBDocumentContainer::setDocument(UBDocumentProxy* document, bool forceReloa if (mCurrentDocument != document || forceReload) { mCurrentDocument = document; + reloadThumbnails(); emit documentSet(mCurrentDocument); } @@ -68,10 +69,13 @@ void UBDocumentContainer::duplicatePages(QList& pageIndexes) bool UBDocumentContainer::movePageToIndex(int source, int target) { + //on document view UBPersistenceManager::persistenceManager()->moveSceneToIndex(mCurrentDocument, source, target); deleteThumbPage(source); insertThumbPage(target); emit documentThumbnailsUpdated(this); + //on board thumbnails view + emit moveThumbnailRequired(source, target); return true; } @@ -82,7 +86,9 @@ void UBDocumentContainer::deletePages(QList& pageIndexes) foreach(int index, pageIndexes) { deleteThumbPage(index - offset); + emit removeThumbnailRequired(index - offset); offset++; + } emit documentThumbnailsUpdated(this); } @@ -91,7 +97,23 @@ void UBDocumentContainer::addPage(int index) { UBPersistenceManager::persistenceManager()->createDocumentSceneAt(mCurrentDocument, index); insertThumbPage(index); + emit documentThumbnailsUpdated(this); + emit addThumbnailRequired(this, index); +} + +void UBDocumentContainer::clearThumbPage() +{ + qDeleteAll(mDocumentThumbs); + mDocumentThumbs.clear(); +} + +void UBDocumentContainer::initThumbPage() +{ + clearThumbPage(); + + for (int i=0; i < selectedDocument()->pageCount(); i++) + insertThumbPage(i); } void UBDocumentContainer::updatePage(int index) diff --git a/src/document/UBDocumentContainer.h b/src/document/UBDocumentContainer.h index 4fc35b96..428a2b30 100644 --- a/src/document/UBDocumentContainer.h +++ b/src/document/UBDocumentContainer.h @@ -44,7 +44,7 @@ class UBDocumentContainer : public QObject void setDocument(UBDocumentProxy* document, bool forceReload = false); UBDocumentProxy* selectedDocument(){return mCurrentDocument;} - int pageCount(){return mDocumentThumbs.size();} + int pageCount(){return mCurrentDocument->pageCount();} const QPixmap* pageAt(int index){return mDocumentThumbs[index];} static int pageFromSceneIndex(int sceneIndex); @@ -53,13 +53,14 @@ class UBDocumentContainer : public QObject void duplicatePages(QList& pageIndexes); bool movePageToIndex(int source, int target); void deletePages(QList& pageIndexes); + void clearThumbPage(); + void initThumbPage(); void addPage(int index); void updatePage(int index); void addEmptyThumbPage(); void insertThumbPage(int index); - private: UBDocumentProxy* mCurrentDocument; QList mDocumentThumbs; @@ -73,6 +74,13 @@ class UBDocumentContainer : public QObject signals: void documentSet(UBDocumentProxy* document); void documentPageUpdated(int index); + + void initThumbnailsRequired(UBDocumentContainer* source); + void addThumbnailRequired(UBDocumentContainer* source, int index); + void removeThumbnailRequired(int index); + void moveThumbnailRequired(int from, int to); + void updateThumbnailsRequired(); + void documentThumbnailsUpdated(UBDocumentContainer* source); }; diff --git a/src/document/UBDocumentController.cpp b/src/document/UBDocumentController.cpp index 088544f8..47eeee22 100644 --- a/src/document/UBDocumentController.cpp +++ b/src/document/UBDocumentController.cpp @@ -168,6 +168,7 @@ void UBDocumentController::selectDocument(UBDocumentProxy* proxy, bool setAsCurr if (selected) { setDocument(proxy); + emit documentThumbnailsUpdated(this); selected->setSelected(true); @@ -267,7 +268,7 @@ void UBDocumentController::itemSelectionChanged() { updateCurrentSelection(); - reloadThumbnails(); + emit documentThumbnailsUpdated(this); if (multipleSelection()) mSelectionType = Multiple; @@ -1440,7 +1441,7 @@ void UBDocumentController::documentSceneChanged(UBDocumentProxy* proxy, int pSce if (proxy == selectedDocumentProxy()) { - reloadThumbnails(); + emit documentThumbnailsUpdated(this); } } @@ -1867,7 +1868,7 @@ void UBDocumentController::refreshDocumentThumbnailsView(UBDocumentContainer*) if (proxy) { setDocument(proxy); - + initThumbPage(); for (int i = 0; i < selectedDocument()->pageCount(); i++) { const QPixmap* pix = pageAt(i); diff --git a/src/domain/UBDragableThumbnail.cpp b/src/domain/UBDragableThumbnail.cpp new file mode 100644 index 00000000..a8e05ec8 --- /dev/null +++ b/src/domain/UBDragableThumbnail.cpp @@ -0,0 +1,128 @@ +#include "UBDragableThumbnail.h" + +#include +#include +#include + +UBDraggableThumbnail::UBDraggableThumbnail(QWidget* parent, const QPixmap& pixmap) : + QFrame(parent) + , mThumbnail(new QLabel(this)) + , mHBoxLayout(new QHBoxLayout(this)) +{ + setFrameStyle(QFrame::Sunken | QFrame::StyledPanel); + setAcceptDrops(true); + + //set stylesheet + setObjectName("DockPaletteWidgetBox"); + setStyleSheet("background:white"); + + mHBoxLayout->setAlignment(Qt::AlignHCenter); + + setThumbnail(pixmap); + + setLayout(mHBoxLayout); +} + +void UBDraggableThumbnail::setThumbnail(const QPixmap& pixmap) +{ + mThumbnail->setAttribute(Qt::WA_DeleteOnClose); + setPixmap(pixmap); + + mHBoxLayout->addWidget(mThumbnail); +} + +void UBDraggableThumbnail::setPixmap(const QPixmap& pixmap) +{ + mThumbnail->setPixmap(pixmap); +} + +void UBDraggableThumbnail::dragEnterEvent(QDragEnterEvent *event) +{ + if (event->mimeData()->hasFormat("application/x-dnditemdata")) { + if (event->source() == this) { + event->setDropAction(Qt::MoveAction); + event->accept(); + } else { + event->acceptProposedAction(); + } + } else { + event->ignore(); + } + } + + void UBDraggableThumbnail::dragMoveEvent(QDragMoveEvent *event) + { + if (event->mimeData()->hasFormat("application/x-dnditemdata")) { + if (event->source() == this) { + event->setDropAction(Qt::MoveAction); + event->accept(); + } else { + event->acceptProposedAction(); + } + } else { + event->ignore(); + } +} + +void UBDraggableThumbnail::dropEvent(QDropEvent *event) +{ + if (event->mimeData()->hasFormat("application/x-dnditemdata")) { + QByteArray itemData = event->mimeData()->data("application/x-dnditemdata"); + QDataStream dataStream(&itemData, QIODevice::ReadOnly); + + QPixmap pixmap; + QPoint offset; + dataStream >> pixmap >> offset; + + //don't have to delete previous Thumbnail (Drag'n'Drop behavior with WA_DeleteOnClose attribute will do it) + mThumbnail = new QLabel(this); + setThumbnail(pixmap); + + if (event->source() == this) { + event->setDropAction(Qt::MoveAction); + event->accept(); + } else { + event->acceptProposedAction(); + } + } else { + event->ignore(); + } +} + + +void UBDraggableThumbnail::mousePressEvent(QMouseEvent *event) +{ + QLabel *child = static_cast(childAt(event->pos())); + if (!child) + return; + + QPixmap pixmap = *child->pixmap(); + + QByteArray itemData; + QDataStream dataStream(&itemData, QIODevice::WriteOnly); + dataStream << pixmap << QPoint(event->pos() - child->pos()); + + QMimeData *mimeData = new QMimeData; + mimeData->setData("application/x-dnditemdata", itemData); + + QDrag *drag = new QDrag(this); + drag->setMimeData(mimeData); + drag->setPixmap(pixmap); + drag->setHotSpot(event->pos() - child->pos()); + + QPixmap tempPixmap = pixmap; + QPainter painter; + painter.begin(&tempPixmap); + painter.fillRect(pixmap.rect(), QColor(127, 127, 127, 127)); + painter.end(); + + child->setPixmap(tempPixmap); + + if (drag->exec(Qt::CopyAction | Qt::MoveAction, Qt::CopyAction) == Qt::MoveAction) + child->close(); + else { + child->show(); + child->setPixmap(pixmap); + } +} + diff --git a/src/domain/UBDragableThumbnail.h b/src/domain/UBDragableThumbnail.h new file mode 100644 index 00000000..fe25c2c5 --- /dev/null +++ b/src/domain/UBDragableThumbnail.h @@ -0,0 +1,31 @@ +#ifndef UBDRAGABLELABEL_H +#define UBDRAGABLELABEL_H + +#include +#include +#include +#include +#include +#include +#include + +class UBDraggableThumbnail : public QFrame +{ + public: + UBDraggableThumbnail(QWidget* parent =0, const QPixmap& pixmap = QPixmap(":images/libpalette/notFound.png")); + + void setThumbnail(const QPixmap &pixmap); + void setPixmap(const QPixmap & pixmap); + + protected: + void dragEnterEvent(QDragEnterEvent *event); + void dragMoveEvent(QDragMoveEvent *event); + void dropEvent(QDropEvent *event); + void mousePressEvent(QMouseEvent *event); + + private: + QLabel* mThumbnail; + QHBoxLayout* mHBoxLayout; +}; + +#endif // UBDRAGABLELABEL_H diff --git a/src/domain/UBGraphicsGroupContainerItem.cpp b/src/domain/UBGraphicsGroupContainerItem.cpp index 646f8b6d..1ce3826d 100644 --- a/src/domain/UBGraphicsGroupContainerItem.cpp +++ b/src/domain/UBGraphicsGroupContainerItem.cpp @@ -89,7 +89,10 @@ void UBGraphicsGroupContainerItem::addToGroup(QGraphicsItem *item) Delegate()->setUBFlag(GF_FLIPPABLE_ALL_AXIS, UBGraphicsItem::isFlippable(item)); Delegate()->setUBFlag(GF_REVOLVABLE, UBGraphicsItem::isRotatable(item)); Delegate()->setLocked(UBGraphicsItem::isLocked(item)); - } + } + + if (item->data(UBGraphicsItemData::ItemLayerType) == UBItemLayerType::Control) + setData(UBGraphicsItemData::ItemLayerType, item->data(UBGraphicsItemData::ItemLayerType)); // COMBINE bool ok; diff --git a/src/domain/UBGraphicsItemDelegate.cpp b/src/domain/UBGraphicsItemDelegate.cpp index f7f76f5c..6d1065e5 100644 --- a/src/domain/UBGraphicsItemDelegate.cpp +++ b/src/domain/UBGraphicsItemDelegate.cpp @@ -287,7 +287,12 @@ QVariant UBGraphicsItemDelegate::itemChange(QGraphicsItem::GraphicsItemChange ch } } break; - + case QGraphicsItem::ItemVisibleHasChanged : + { + bool shownOnDisplay = mDelegated->data(UBGraphicsItemData::ItemLayerType).toInt() != UBItemLayerType::Control; + showHide(shownOnDisplay); + break; + } case QGraphicsItem::ItemPositionHasChanged : case QGraphicsItem::ItemTransformHasChanged : case QGraphicsItem::ItemZValueHasChanged : @@ -565,25 +570,20 @@ void UBGraphicsItemDelegate::increaseZlevelBottom() void UBGraphicsItemDelegate::lock(bool locked) { - if (locked) - { - mDelegated->setData(UBGraphicsItemData::ItemLocked, QVariant(true)); - } - else - { - mDelegated->setData(UBGraphicsItemData::ItemLocked, QVariant(false)); - } - + setLockedRecurs(locked, mDelegated); mDelegated->update(); + positionHandles(); mFrame->positionHandles(); } -void UBGraphicsItemDelegate::showHideRecurs(const QVariant &pShow, QGraphicsItem *pItem) + +void UBGraphicsItemDelegate::setLockedRecurs(const QVariant &pLock, QGraphicsItem *pItem) { - pItem->setData(UBGraphicsItemData::ItemLayerType, pShow); - foreach (QGraphicsItem *insideItem, pItem->childItems()) { - showHideRecurs(pShow, insideItem); + pItem->setData(UBGraphicsItemData::ItemLocked, pLock); + foreach (QGraphicsItem *insideItem, pItem->childItems()) + { + setLockedRecurs(pLock, insideItem); } } @@ -596,6 +596,40 @@ void UBGraphicsItemDelegate::showHide(bool show) emit showOnDisplayChanged(show); } +void UBGraphicsItemDelegate::showHideRecurs(const QVariant &pShow, QGraphicsItem *pItem) +{ + pItem->setData(UBGraphicsItemData::ItemLayerType, pShow); + foreach (QGraphicsItem *insideItem, pItem->childItems()) { + showHideRecurs(pShow, insideItem); + } +} + +/** + * @brief Set delegate as background for the scene, replacing any existing background. + */ +void UBGraphicsItemDelegate::setAsBackground() +{ + UBGraphicsScene* scene = castUBGraphicsScene(); + QGraphicsItem* item = delegated(); + + if (scene && item) { + startUndoStep(); + + item->resetTransform(); + item->setPos(item->sceneBoundingRect().width()/-2., item->sceneBoundingRect().height()/-2.); + + scene->setAsBackgroundObject(item, true); + + UBGraphicsItemTransformUndoCommand *uc = + new UBGraphicsItemTransformUndoCommand(mDelegated, + mPreviousPosition, + mPreviousTransform, + mPreviousZValue, + mPreviousSize, + true); + UBApplication::undoStack->push(uc); + } +} void UBGraphicsItemDelegate::gotoContentSource() { @@ -681,6 +715,15 @@ void UBGraphicsItemDelegate::decorateMenu(QMenu* menu) showIcon.addPixmap(QPixmap(":/images/eyeClosed.svg"), QIcon::Normal, QIcon::Off); mShowOnDisplayAction->setIcon(showIcon); + if (delegated()->data(UBGraphicsItemData::ItemCanBeSetAsBackground).toBool()) { + mSetAsBackgroundAction = mMenu->addAction(tr("Set as background"), this, SLOT(setAsBackground())); + mSetAsBackgroundAction->setCheckable(false); + + QIcon backgroundIcon; + backgroundIcon.addPixmap(QPixmap(":/images/setAsBackground.svg"), QIcon::Normal, QIcon::On); + mSetAsBackgroundAction->setIcon(backgroundIcon); + } + if (testUBFlags(GF_SHOW_CONTENT_SOURCE)) { mGotoContentSourceAction = menu->addAction(tr("Go to Content Source"), this, SLOT(gotoContentSource())); diff --git a/src/domain/UBGraphicsItemDelegate.h b/src/domain/UBGraphicsItemDelegate.h index ef9f1e0f..bfa30bd5 100644 --- a/src/domain/UBGraphicsItemDelegate.h +++ b/src/domain/UBGraphicsItemDelegate.h @@ -326,6 +326,7 @@ class UBGraphicsItemDelegate : public QObject virtual void updateMenuActionState(); void showHideRecurs(const QVariant &pShow, QGraphicsItem *pItem); + void setLockedRecurs(const QVariant &pLock, QGraphicsItem *pItem); QList buttons() {return mButtons;} QGraphicsItem* mDelegated; @@ -343,6 +344,7 @@ class UBGraphicsItemDelegate : public QObject QAction* mLockAction; QAction* mShowOnDisplayAction; + QAction* mSetAsBackgroundAction; QAction* mGotoContentSourceAction; UBGraphicsDelegateFrame* mFrame; @@ -354,6 +356,7 @@ class UBGraphicsItemDelegate : public QObject UBGraphicsToolBarItem* mToolBarItem; protected slots: + virtual void setAsBackground(); virtual void gotoContentSource(); private: diff --git a/src/domain/UBGraphicsItemTransformUndoCommand.cpp b/src/domain/UBGraphicsItemTransformUndoCommand.cpp index fad0a3af..f280fd5b 100644 --- a/src/domain/UBGraphicsItemTransformUndoCommand.cpp +++ b/src/domain/UBGraphicsItemTransformUndoCommand.cpp @@ -30,12 +30,14 @@ #include "UBGraphicsItemTransformUndoCommand.h" #include "UBResizableGraphicsItem.h" #include "domain/UBItem.h" +#include "domain/UBGraphicsScene.h" #include "core/memcheck.h" UBGraphicsItemTransformUndoCommand::UBGraphicsItemTransformUndoCommand(QGraphicsItem* pItem, const QPointF& prevPos, const QTransform& prevTransform, const qreal& prevZValue, - const QSizeF& prevSize):UBUndoCommand() + const QSizeF& prevSize, bool setToBackground) + : UBUndoCommand() { mItem = pItem; mPreviousTransform = prevTransform; @@ -52,6 +54,8 @@ UBGraphicsItemTransformUndoCommand::UBGraphicsItemTransformUndoCommand(QGraphics if (resizableItem) mCurrentSize = resizableItem->size(); + + mSetToBackground = setToBackground; } UBGraphicsItemTransformUndoCommand::~UBGraphicsItemTransformUndoCommand() @@ -61,6 +65,13 @@ UBGraphicsItemTransformUndoCommand::~UBGraphicsItemTransformUndoCommand() void UBGraphicsItemTransformUndoCommand::undo() { + if (mSetToBackground) { + UBGraphicsScene* scene = dynamic_cast(mItem->scene()); + if (scene && scene->isBackgroundObject(mItem)) { + scene->unsetBackgroundObject(); + } + } + mItem->setPos(mPreviousPosition); mItem->setTransform(mPreviousTransform); mItem->setZValue(mPreviousZValue); @@ -73,6 +84,12 @@ void UBGraphicsItemTransformUndoCommand::undo() void UBGraphicsItemTransformUndoCommand::redo() { + if (mSetToBackground) { + UBGraphicsScene* scene = dynamic_cast(mItem->scene()); + if (scene) + scene->setAsBackgroundObject(mItem); + } + mItem->setPos(mCurrentPosition); mItem->setTransform(mCurrentTransform); mItem->setZValue(mCurrentZValue); diff --git a/src/domain/UBGraphicsItemTransformUndoCommand.h b/src/domain/UBGraphicsItemTransformUndoCommand.h index da67efad..9cd6b93a 100644 --- a/src/domain/UBGraphicsItemTransformUndoCommand.h +++ b/src/domain/UBGraphicsItemTransformUndoCommand.h @@ -42,7 +42,8 @@ class UBGraphicsItemTransformUndoCommand : public UBUndoCommand const QPointF& prevPos, const QTransform& prevTransform, const qreal& prevZValue, - const QSizeF& prevSize = QSizeF()); + const QSizeF& prevSize = QSizeF(), + bool setToBackground = false); virtual ~UBGraphicsItemTransformUndoCommand(); virtual int getType() const { return UBUndoType::undotype_GRAPHICITEMTRANSFORM; } @@ -63,6 +64,8 @@ class UBGraphicsItemTransformUndoCommand : public UBUndoCommand qreal mPreviousZValue; qreal mCurrentZValue; + bool mSetToBackground; + }; #endif /* UBGRAPHICSITEMTRANSFORMUNDOCOMMAND_H_ */ diff --git a/src/domain/UBGraphicsPixmapItem.cpp b/src/domain/UBGraphicsPixmapItem.cpp index 6a5e6072..b5dacc78 100644 --- a/src/domain/UBGraphicsPixmapItem.cpp +++ b/src/domain/UBGraphicsPixmapItem.cpp @@ -61,6 +61,8 @@ UBGraphicsPixmapItem::UBGraphicsPixmapItem(QGraphicsItem* parent) setData(UBGraphicsItemData::itemLayerType, QVariant(itemLayerType::ObjectItem)); //Necessary to set if we want z value to be assigned correctly setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); + setData(UBGraphicsItemData::ItemCanBeSetAsBackground, true); + setUuid(QUuid::createUuid()); //more logical solution is in creating uuid for element in element's constructor } diff --git a/src/domain/UBGraphicsPolygonItem.cpp b/src/domain/UBGraphicsPolygonItem.cpp index d5f8d4f6..4e74420a 100644 --- a/src/domain/UBGraphicsPolygonItem.cpp +++ b/src/domain/UBGraphicsPolygonItem.cpp @@ -121,10 +121,12 @@ void UBGraphicsPolygonItem::setStrokesGroup(UBGraphicsStrokesGroup *group) void UBGraphicsPolygonItem::setStroke(UBGraphicsStroke* stroke) { - clearStroke(); + if (stroke) { + clearStroke(); - mStroke = stroke; - mStroke->addPolygon(this); + mStroke = stroke; + mStroke->addPolygon(this); + } } UBGraphicsStroke* UBGraphicsPolygonItem::stroke() const @@ -136,38 +138,9 @@ UBGraphicsStroke* UBGraphicsPolygonItem::stroke() const void UBGraphicsPolygonItem::setColor(const QColor& pColor) { QGraphicsPolygonItem::setBrush(QBrush(pColor)); + setPen(Qt::NoPen); - if (pColor.alphaF() >= 1.0) - { - mHasAlpha = false; - setPen(Qt::NoPen); - } - else - { - mHasAlpha = true; - - QColor penColor = pColor; - - // trick QT antialiasing - // TODO UB 4.x see if we can do better ... it does not behave well with 16 bit color depth - qreal trickAlpha = pColor.alphaF(); - - if (trickAlpha >= 0.2 && trickAlpha < 0.6) - { - trickAlpha /= 12; - } - else if (trickAlpha < 0.8) - { - trickAlpha /= 5; - } - else if (trickAlpha < 1.0) - { - trickAlpha /= 2; - } - - penColor.setAlphaF(trickAlpha); - QGraphicsPolygonItem::setPen(QPen(penColor)); - } + mHasAlpha = (pColor.alphaF() < 1.0); } @@ -198,6 +171,7 @@ void UBGraphicsPolygonItem::copyItemParameters(UBItem *copy) const cp->setBrush(this->brush()); cp->setPen(this->pen()); cp->mHasAlpha = this->mHasAlpha; + cp->setFillRule(this->fillRule()); cp->setColorOnDarkBackground(this->colorOnDarkBackground()); cp->setColorOnLightBackground(this->colorOnLightBackground()); diff --git a/src/domain/UBGraphicsScene.cpp b/src/domain/UBGraphicsScene.cpp index a70c5528..eb6e9dfe 100644 --- a/src/domain/UBGraphicsScene.cpp +++ b/src/domain/UBGraphicsScene.cpp @@ -48,6 +48,7 @@ #include "gui/UBMagnifer.h" #include "gui/UBMainWindow.h" #include "gui/UBToolWidget.h" +#include "gui/UBResources.h" #include "tools/UBGraphicsRuler.h" #include "tools/UBGraphicsProtractor.h" @@ -317,13 +318,15 @@ UBGraphicsScene::UBGraphicsScene(UBDocumentProxy* parent, bool enableUndoRedoSta , mEraser(0) , mPointer(0) , mMarkerCircle(0) + , mPenCircle(0) , mDocument(parent) , mDarkBackground(false) - , mCrossedBackground(false) + , mPageBackground(UBPageBackground::plain) , mIsDesktopMode(false) , mZoomFactor(1) , mBackgroundObject(0) , mPreviousWidth(0) + , mDistanceFromLastStrokePoint(0) , mInputDeviceIsPressed(false) , mArcPolygonItem(0) , mRenderingContext(Screen) @@ -335,6 +338,7 @@ UBGraphicsScene::UBGraphicsScene(UBDocumentProxy* parent, bool enableUndoRedoSta , mZLayerController(new UBZLayerController(this)) , mpLastPolygon(NULL) , mCurrentPolygon(0) + , mTempPolygon(NULL) , mSelectionFrame(0) { UBCoreGraphicsScene::setObjectName("BoardScene"); @@ -345,6 +349,7 @@ UBGraphicsScene::UBGraphicsScene(UBDocumentProxy* parent, bool enableUndoRedoSta createEraiser(); createPointer(); createMarkerCircle(); + createPenCircle(); if (UBApplication::applicationController) { @@ -353,6 +358,8 @@ UBGraphicsScene::UBGraphicsScene(UBDocumentProxy* parent, bool enableUndoRedoSta UBApplication::applicationController->initialVScroll())); } + mBackgroundGridSize = UBSettings::settings()->crossSize; + // Just for debug. Do not delete please // connect(this, SIGNAL(selectionChanged()), this, SLOT(selectionChangedProcessing())); connect(UBApplication::undoStack.data(), SIGNAL(indexChanged(int)), this, SLOT(updateSelectionFrameWrapper(int))); @@ -378,6 +385,16 @@ void UBGraphicsScene::selectionChangedProcessing() } } +void UBGraphicsScene::setLastCenter(QPointF center) +{ + mViewState.setLastSceneCenter(center); +} + +QPointF UBGraphicsScene::lastCenter() +{ + return mViewState.lastSceneCenter(); +} + bool UBGraphicsScene::inputDevicePress(const QPointF& scenePos, const qreal& pressure) { bool accepted = false; @@ -407,10 +424,14 @@ bool UBGraphicsScene::inputDevicePress(const QPointF& scenePos, const qreal& pre if (currentTool == UBStylusTool::Marker) hideMarkerCircle(); + // hide the pen preview circle + if (currentTool == UBStylusTool::Pen) + hidePenCircle(); + // --------------------------------------------------------------- // Create a new Stroke. A Stroke is a collection of QGraphicsLines // --------------------------------------------------------------- - mCurrentStroke = new UBGraphicsStroke(); + mCurrentStroke = new UBGraphicsStroke(this); if (currentTool != UBStylusTool::Line){ // Handle the pressure @@ -432,6 +453,8 @@ bool UBGraphicsScene::inputDevicePress(const QPointF& scenePos, const qreal& pre else { moveTo(scenePos); drawLineTo(scenePos, width, UBDrawingController::drawingController()->stylusTool() == UBStylusTool::Line); + + mCurrentStroke->addPoint(scenePos, width); } accepted = true; } @@ -487,6 +510,15 @@ bool UBGraphicsScene::inputDeviceMove(const QPointF& scenePos, const qreal& pres } } + else if (currentTool == UBStylusTool::Pen) { + if (mInputDeviceIsPressed) + hidePenCircle(); + else { + drawPenCircle(position); + accepted = true; + } + } + if (mInputDeviceIsPressed) { if (dc->isDrawingTool()) @@ -495,7 +527,7 @@ bool UBGraphicsScene::inputDeviceMove(const QPointF& scenePos, const qreal& pres if (currentTool != UBStylusTool::Line){ // Handle the pressure - width = dc->currentToolWidth() * pressure; + width = dc->currentToolWidth() * qMax(pressure, 0.2); }else{ // Ignore pressure for line tool width = dc->currentToolWidth(); @@ -535,11 +567,60 @@ bool UBGraphicsScene::inputDeviceMove(const QPointF& scenePos, const qreal& pres position = newPosition; } + if (!mCurrentStroke) + mCurrentStroke = new UBGraphicsStroke(this); + if(dc->mActiveRuler){ dc->mActiveRuler->DrawLine(position, width); } - else{ - drawLineTo(position, width, UBDrawingController::drawingController()->stylusTool() == UBStylusTool::Line); + + else if (currentTool == UBStylusTool::Line) { + drawLineTo(position, width, true); + } + + else { + bool interpolate = false; + + if ((currentTool == UBStylusTool::Pen && UBSettings::settings()->boardInterpolatePenStrokes->get().toBool()) + || (currentTool == UBStylusTool::Marker && UBSettings::settings()->boardInterpolateMarkerStrokes->get().toBool())) + { + interpolate = true; + } + + + // Don't draw segments smaller than a certain length. This can help with performance + // (less polygons to draw) but mostly with making the curve look smooth. + + qreal antiScaleRatio = 1./(UBApplication::boardController->systemScaleFactor() * UBApplication::boardController->currentZoom()); + qreal MIN_DISTANCE = 10*antiScaleRatio; // arbitrary. Move to settings if relevant. + qreal distance = QLineF(mPreviousPoint, scenePos).length(); + + mDistanceFromLastStrokePoint += distance; + + if (mDistanceFromLastStrokePoint > MIN_DISTANCE) { + QList > newPoints = mCurrentStroke->addPoint(scenePos, width, interpolate); + if (newPoints.length() > 1) + drawCurve(newPoints); + + mDistanceFromLastStrokePoint = 0; + } + + if (interpolate) { + // Bezier curves aren't drawn all the way to the scenePos (they stop halfway between the previous and + // current scenePos), so we add a line from the last drawn position in the stroke and the + // scenePos, to make the drawing feel more responsive. This line is then deleted if a new segment is + // added to the stroke. (Or it is added to the stroke when we stop drawing) + + if (mTempPolygon) { + removeItem(mTempPolygon); + mTempPolygon = NULL; + } + + QPointF lastDrawnPoint = mCurrentStroke->points().last().first; + + mTempPolygon = lineToPolygonItem(QLineF(lastDrawnPoint, scenePos), mPreviousWidth, width); + addItem(mTempPolygon); + } } } else if (currentTool == UBStylusTool::Eraser) @@ -597,7 +678,9 @@ bool UBGraphicsScene::inputDeviceRelease() mAddedItems.remove(item); removeItem(item); UBCoreGraphicsScene::removeItemFromDeletion(item); - mArcPolygonItem->setStrokesGroup(pStrokes); + UBGraphicsPolygonItem* pi = qgraphicsitem_cast(item); + if (pi) + pi->setStrokesGroup(pStrokes); pStrokes->addToGroup(item); } @@ -608,6 +691,21 @@ bool UBGraphicsScene::inputDeviceRelease() mDrawWithCompass = false; } else if (mCurrentStroke){ + if (mTempPolygon) { + UBGraphicsPolygonItem * poly = dynamic_cast(mTempPolygon->deepCopy()); + removeItem(mTempPolygon); + mTempPolygon = NULL; + addPolygonItemToCurrentStroke(poly); + } + + // replace the stroke by a simplified version of it + if ((currentTool == UBStylusTool::Pen && UBSettings::settings()->boardSimplifyPenStrokes->get().toBool()) + || (currentTool == UBStylusTool::Marker && UBSettings::settings()->boardSimplifyMarkerStrokes->get().toBool())) + { + simplifyCurrentStroke(); + } + + UBGraphicsStrokesGroup* pStrokes = new UBGraphicsStrokesGroup(); // Remove the strokes that were just drawn here and replace them by a stroke item @@ -728,6 +826,33 @@ void UBGraphicsScene::drawMarkerCircle(const QPointF &pPoint) } +void UBGraphicsScene::drawPenCircle(const QPointF &pPoint) +{ + if (mPenCircle && UBSettings::settings()->showPenPreviewCircle->get().toBool() && + UBSettings::settings()->currentPenWidth() >= UBSettings::settings()->penPreviewFromSize->get().toInt()) { + qreal penDiameter = UBSettings::settings()->currentPenWidth(); + penDiameter /= UBApplication::boardController->systemScaleFactor(); + penDiameter /= UBApplication::boardController->currentZoom(); + qreal penRadius = penDiameter/2; + + mPenCircle->setRect(QRectF(pPoint.x() - penRadius, pPoint.y() - penRadius, + penDiameter, penDiameter)); + + if (controlView()) + if (controlView()->viewport()) + controlView()->viewport()->setCursor(QCursor (Qt::BlankCursor)); + + mPenCircle->show(); + } + else + { + if (controlView()) + if (controlView()->viewport()) + controlView()->viewport()->setCursor(UBResources::resources()->penCursor); + } + +} + void UBGraphicsScene::hideMarkerCircle() { if (mMarkerCircle) { @@ -735,6 +860,12 @@ void UBGraphicsScene::hideMarkerCircle() } } +void UBGraphicsScene::hidePenCircle() +{ + if (mPenCircle) + mPenCircle->hide(); +} + // call this function when user release mouse button in Magnifier mode void UBGraphicsScene::DisposeMagnifierQWidgets() { @@ -773,16 +904,60 @@ void UBGraphicsScene::moveTo(const QPointF &pPoint) mArcPolygonItem = 0; mDrawWithCompass = false; } - void UBGraphicsScene::drawLineTo(const QPointF &pEndPoint, const qreal &pWidth, bool bLineStyle) +{ + drawLineTo(pEndPoint, pWidth, pWidth, bLineStyle); + +} + +void UBGraphicsScene::drawLineTo(const QPointF &pEndPoint, const qreal &startWidth, const qreal &endWidth, bool bLineStyle) { if (mPreviousWidth == -1.0) - mPreviousWidth = pWidth; + mPreviousWidth = startWidth; + + qreal initialWidth = startWidth; + if (initialWidth == endWidth) + initialWidth = mPreviousWidth; + + if (bLineStyle) { + QSetIterator itItems(mAddedItems); - // UBGraphicsPolygonItem *polygonItem = lineToPolygonItem(QLineF(mPreviousPoint, pEndPoint), pWidth); + while (itItems.hasNext()) { + QGraphicsItem* item = itItems.next(); + removeItem(item); + } + mAddedItems.clear(); + } - UBGraphicsPolygonItem *polygonItem = lineToPolygonItem(QLineF(mPreviousPoint, pEndPoint), mPreviousWidth,pWidth); + UBGraphicsPolygonItem *polygonItem = lineToPolygonItem(QLineF(mPreviousPoint, pEndPoint), initialWidth, endWidth); + addPolygonItemToCurrentStroke(polygonItem); + if (!bLineStyle) { + mPreviousPoint = pEndPoint; + mPreviousWidth = endWidth; + } +} + +void UBGraphicsScene::drawCurve(const QList >& points) +{ + UBGraphicsPolygonItem* polygonItem = curveToPolygonItem(points); + addPolygonItemToCurrentStroke(polygonItem); + + mPreviousPoint = points.last().first; + mPreviousWidth = points.last().second; +} + +void UBGraphicsScene::drawCurve(const QList& points, qreal startWidth, qreal endWidth) +{ + UBGraphicsPolygonItem* polygonItem = curveToPolygonItem(points, startWidth, endWidth); + addPolygonItemToCurrentStroke(polygonItem); + + mPreviousWidth = endWidth; + mPreviousPoint = points.last(); +} + +void UBGraphicsScene::addPolygonItemToCurrentStroke(UBGraphicsPolygonItem* polygonItem) +{ if (!polygonItem->brush().isOpaque()) { // ------------------------------------------------------------------------------------- @@ -795,37 +970,18 @@ void UBGraphicsScene::drawLineTo(const QPointF &pEndPoint, const qreal &pWidth, } } - - if (bLineStyle) - { - QSetIterator itItems(mAddedItems); - - while (itItems.hasNext()) - { - QGraphicsItem* item = itItems.next(); - removeItem(item); - } - mAddedItems.clear(); - } - mpLastPolygon = polygonItem; mAddedItems.insert(polygonItem); // Here we add the item to the scene addItem(polygonItem); if (!mCurrentStroke) - mCurrentStroke = new UBGraphicsStroke(); + mCurrentStroke = new UBGraphicsStroke(this); polygonItem->setStroke(mCurrentStroke); mPreviousPolygonItems.append(polygonItem); - - if (!bLineStyle) - { - mPreviousPoint = pEndPoint; - mPreviousWidth = pWidth; - } } void UBGraphicsScene::eraseLineTo(const QPointF &pEndPoint, const qreal &pWidth) @@ -868,7 +1024,7 @@ void UBGraphicsScene::eraseLineTo(const QPointF &pEndPoint, const qreal &pWidth) } else if (eraserPath.intersects(itemPainterPath)) { - + itemPainterPath.setFillRule(Qt::WindingFill); QPainterPath newPath = itemPainterPath.subtracted(eraserPath); #pragma omp critical { @@ -938,6 +1094,7 @@ void UBGraphicsScene::drawArcTo(const QPointF& pCenterPoint, qreal pSpanAngle) penWidth /= UBApplication::boardController->currentZoom(); mArcPolygonItem = arcToPolygonItem(QLineF(pCenterPoint, mPreviousPoint), pSpanAngle, penWidth); + mArcPolygonItem->setFillRule(Qt::WindingFill); mArcPolygonItem->setStroke(mCurrentStroke); mAddedItems.insert(mArcPolygonItem); addItem(mArcPolygonItem); @@ -945,7 +1102,7 @@ void UBGraphicsScene::drawArcTo(const QPointF& pCenterPoint, qreal pSpanAngle) setDocumentUpdated(); } -void UBGraphicsScene::setBackground(bool pIsDark, bool pIsCrossed) +void UBGraphicsScene::setBackground(bool pIsDark, UBPageBackground pBackground) { bool needRepaint = false; @@ -955,15 +1112,16 @@ void UBGraphicsScene::setBackground(bool pIsDark, bool pIsCrossed) updateEraserColor(); updateMarkerCircleColor(); + updatePenCircleColor(); recolorAllItems(); needRepaint = true; setModified(true); } - if (mCrossedBackground != pIsCrossed) + if (mPageBackground != pBackground) { - mCrossedBackground = pIsCrossed; + mPageBackground = pBackground; needRepaint = true; setModified(true); } @@ -982,6 +1140,18 @@ void UBGraphicsScene::setBackgroundZoomFactor(qreal zoom) mZoomFactor = zoom; } + +void UBGraphicsScene::setBackgroundGridSize(int pSize) +{ + if (pSize > 0) { + mBackgroundGridSize = pSize; + setModified(true); + + foreach(QGraphicsView* view, views()) + view->resetCachedContent(); + } +} + void UBGraphicsScene::setDrawingMode(bool bModeDesktop) { mIsDesktopMode = bModeDesktop; @@ -1061,6 +1231,8 @@ void UBGraphicsScene::initPolygonItem(UBGraphicsPolygonItem* polygonItem) polygonItem->setColor(colorOnLightBG); } + //polygonItem->setColor(QColor(rand()%256, rand()%256, rand()%256, polygonItem->brush().color().alpha())); + polygonItem->setColorOnDarkBackground(colorOnDarkBG); polygonItem->setColorOnLightBackground(colorOnLightBG); @@ -1074,6 +1246,21 @@ UBGraphicsPolygonItem* UBGraphicsScene::arcToPolygonItem(const QLineF& pStartRad return polygonToPolygonItem(polygon); } +UBGraphicsPolygonItem* UBGraphicsScene::curveToPolygonItem(const QList >& points) +{ + QPolygonF polygon = UBGeometryUtils::curveToPolygon(points, false, true); + + return polygonToPolygonItem(polygon); + +} + +UBGraphicsPolygonItem* UBGraphicsScene::curveToPolygonItem(const QList& points, qreal startWidth, qreal endWidth) +{ + QPolygonF polygon = UBGeometryUtils::curveToPolygon(points, startWidth, endWidth); + + return polygonToPolygonItem(polygon); +} + void UBGraphicsScene::clearSelectionFrame() { if (mSelectionFrame) { @@ -1146,6 +1333,7 @@ void UBGraphicsScene::hideTool() { hideEraser(); hideMarkerCircle(); + hidePenCircle(); } void UBGraphicsScene::leaveEvent(QEvent * event) @@ -1158,7 +1346,8 @@ UBGraphicsScene* UBGraphicsScene::sceneDeepCopy() const { UBGraphicsScene* copy = new UBGraphicsScene(this->document(), this->mUndoRedoStackEnabled); - copy->setBackground(this->isDarkBackground(), this->isCrossedBackground()); + copy->setBackground(this->isDarkBackground(), mPageBackground); + copy->setBackgroundGridSize(mBackgroundGridSize); copy->setSceneRect(this->sceneRect()); if (this->mNominalSize.isValid()) @@ -1872,6 +2061,21 @@ QGraphicsItem* UBGraphicsScene::setAsBackgroundObject(QGraphicsItem* item, bool return item; } +void UBGraphicsScene::unsetBackgroundObject() +{ + if (!mBackgroundObject) + return; + + mBackgroundObject->setFlag(QGraphicsItem::ItemIsSelectable, true); + mBackgroundObject->setFlag(QGraphicsItem::ItemIsMovable, true); + mBackgroundObject->setAcceptedMouseButtons(Qt::LeftButton); + + // Item zLayer and Layer Type should be set by the caller of this function, as + // it may depend on the object type, where it was before, etc. + + mBackgroundObject = 0; +} + QRectF UBGraphicsScene::normalizedSceneRect(qreal ratio) { @@ -2424,7 +2628,7 @@ void UBGraphicsScene::drawBackground(QPainter *painter, const QRectF &rect) bgCrossColor = QColor(UBSettings::settings()->boardCrossColorDarkBackground->get().toString()); else bgCrossColor = QColor(UBSettings::settings()->boardCrossColorLightBackground->get().toString()); - if (mZoomFactor < 1.0) + if (mZoomFactor < 0.7) { int alpha = 255 * mZoomFactor / 2; bgCrossColor.setAlpha (alpha); // fade the crossing on small zooms @@ -2432,22 +2636,32 @@ void UBGraphicsScene::drawBackground(QPainter *painter, const QRectF &rect) painter->setPen (bgCrossColor); - if (isCrossedBackground()) + if (mPageBackground == UBPageBackground::crossed) { - qreal firstY = ((int) (rect.y () / UBSettings::crossSize)) * UBSettings::crossSize; + qreal firstY = ((int) (rect.y () / backgroundGridSize())) * backgroundGridSize(); - for (qreal yPos = firstY; yPos < rect.y () + rect.height (); yPos += UBSettings::crossSize) + for (qreal yPos = firstY; yPos < rect.y () + rect.height (); yPos += backgroundGridSize()) { painter->drawLine (rect.x (), yPos, rect.x () + rect.width (), yPos); } - qreal firstX = ((int) (rect.x () / UBSettings::crossSize)) * UBSettings::crossSize; + qreal firstX = ((int) (rect.x () / backgroundGridSize())) * backgroundGridSize(); - for (qreal xPos = firstX; xPos < rect.x () + rect.width (); xPos += UBSettings::crossSize) + for (qreal xPos = firstX; xPos < rect.x () + rect.width (); xPos += backgroundGridSize()) { painter->drawLine (xPos, rect.y (), xPos, rect.y () + rect.height ()); } } + + else if (mPageBackground == UBPageBackground::ruled) + { + qreal firstY = ((int) (rect.y () / backgroundGridSize())) * backgroundGridSize(); + + for (qreal yPos = firstY; yPos < rect.y () + rect.height (); yPos += backgroundGridSize()) + { + painter->drawLine (rect.x (), yPos, rect.x () + rect.width (), yPos); + } + } } } @@ -2558,6 +2772,30 @@ bool UBGraphicsScene::hasTextItemWithFocus(UBGraphicsGroupContainerItem *item){ return bHasFocus; } + +void UBGraphicsScene::simplifyCurrentStroke() +{ + if (!mCurrentStroke) + return; + + UBGraphicsStroke* simplerStroke = mCurrentStroke->simplify(); + if (!simplerStroke) + return; + + foreach(UBGraphicsPolygonItem* poly, mCurrentStroke->polygons()){ + mPreviousPolygonItems.removeAll(poly); + removeItem(poly); + } + + mCurrentStroke = simplerStroke; + + foreach(UBGraphicsPolygonItem* poly, mCurrentStroke->polygons()) { + addItem(poly); + mPreviousPolygonItems.append(poly); + } + +} + void UBGraphicsScene::setDocumentUpdated() { if (document()) @@ -2617,6 +2855,25 @@ void UBGraphicsScene::createMarkerCircle() } } +void UBGraphicsScene::createPenCircle() +{ + if (UBSettings::settings()->showPenPreviewCircle->get().toBool()) { + mPenCircle = new QGraphicsEllipseItem(); + + mPenCircle->setRect(QRect(0, 0, 0, 0)); + mPenCircle->setVisible(false); + + mPenCircle->setPen(Qt::DotLine); + updatePenCircleColor(); + + mPenCircle->setData(UBGraphicsItemData::ItemLayerType, QVariant(UBItemLayerType::Control)); + mPenCircle->setData(UBGraphicsItemData::itemLayerType, QVariant(itemLayerType::Eraiser)); + + mTools << mPenCircle; + addItem(mPenCircle); + } +} + void UBGraphicsScene::updateEraserColor() { if (!mEraser) @@ -2654,12 +2911,35 @@ void UBGraphicsScene::updateMarkerCircleColor() mMarkerCircle->setPen(mcPen); } +void UBGraphicsScene::updatePenCircleColor() +{ + if (!mPenCircle) + return; + + QPen mcPen = mPenCircle->pen(); + + if (mDarkBackground) { + mcPen.setColor(UBSettings::penCirclePenColorDarkBackground); + mPenCircle->setBrush(UBSettings::penCircleBrushColorDarkBackground); + } + + else { + mcPen.setColor(UBSettings::penCirclePenColorLightBackground); + mPenCircle->setBrush(UBSettings::penCircleBrushColorLightBackground); + } + + mcPen.setStyle(Qt::DotLine); + mPenCircle->setPen(mcPen); +} + void UBGraphicsScene::setToolCursor(int tool) { if (tool == (int)UBStylusTool::Selector || tool == (int)UBStylusTool::Text || tool == (int)UBStylusTool::Play) { deselectAllItems(); + hideMarkerCircle(); + hidePenCircle(); } if (mCurrentStroke && mCurrentStroke->polygons().empty()){ @@ -2671,5 +2951,5 @@ void UBGraphicsScene::setToolCursor(int tool) void UBGraphicsScene::initStroke() { - mCurrentStroke = new UBGraphicsStroke(); + mCurrentStroke = new UBGraphicsStroke(this); } diff --git a/src/domain/UBGraphicsScene.h b/src/domain/UBGraphicsScene.h index 43a29836..91625103 100644 --- a/src/domain/UBGraphicsScene.h +++ b/src/domain/UBGraphicsScene.h @@ -156,7 +156,8 @@ class UBGraphicsScene: public UBCoreGraphicsScene, public UBItem UBGraphicsW3CWidgetItem* addW3CWidget(const QUrl& pWidgetUrl, const QPointF& pPos = QPointF(0, 0)); void addGraphicsWidget(UBGraphicsWidgetItem* graphicsWidget, const QPointF& pPos = QPointF(0, 0)); - + QPointF lastCenter(); + void setLastCenter(QPointF center); UBGraphicsMediaItem* addMedia(const QUrl& pMediaFileUrl, bool shouldPlayAsap, const QPointF& pPos = QPointF(0, 0)); UBGraphicsMediaItem* addVideo(const QUrl& pVideoFileUrl, bool shouldPlayAsap, const QPointF& pPos = QPointF(0, 0)); @@ -174,6 +175,7 @@ class UBGraphicsScene: public UBCoreGraphicsScene, public UBItem void addGroup(UBGraphicsGroupContainerItem *groupItem); QGraphicsItem* setAsBackgroundObject(QGraphicsItem* item, bool pAdaptTransformation = false, bool expand = false); + void unsetBackgroundObject(); QGraphicsItem* backgroundObject() const { @@ -193,8 +195,11 @@ class UBGraphicsScene: public UBCoreGraphicsScene, public UBItem void moveTo(const QPointF& pPoint); void drawLineTo(const QPointF& pEndPoint, const qreal& pWidth, bool bLineStyle); + void drawLineTo(const QPointF& pEndPoint, const qreal& pStartWidth, const qreal& endWidth, bool bLineStyle); void eraseLineTo(const QPointF& pEndPoint, const qreal& pWidth); void drawArcTo(const QPointF& pCenterPoint, qreal pSpanAngle); + void drawCurve(const QList > &points); + void drawCurve(const QList& points, qreal startWidth, qreal endWidth); bool isEmpty() const; @@ -215,9 +220,14 @@ class UBGraphicsScene: public UBCoreGraphicsScene, public UBItem return !mDarkBackground; } - bool isCrossedBackground() const + UBPageBackground pageBackground() const + { + return mPageBackground; + } + + int backgroundGridSize() const { - return mCrossedBackground; + return mBackgroundGridSize; } bool hasBackground() @@ -247,15 +257,29 @@ class UBGraphicsScene: public UBCoreGraphicsScene, public UBItem zoomFactor = 1; horizontalPosition = 0; verticalPostition = 0; + mLastSceneCenter = QPointF(); } - SceneViewState(qreal pZoomFactor, int pHorizontalPosition, int pVerticalPostition) + SceneViewState(qreal pZoomFactor, int pHorizontalPosition, int pVerticalPostition, QPointF sceneCenter = QPointF())// 1595/1605 { zoomFactor = pZoomFactor; horizontalPosition = pHorizontalPosition; verticalPostition = pVerticalPostition; + mLastSceneCenter = sceneCenter; + } + + QPointF lastSceneCenter() // Save Scene Center to replace the view when the scene becomes active + { + return mLastSceneCenter; + } + + void setLastSceneCenter(QPointF center) + { + mLastSceneCenter = center; } + QPointF mLastSceneCenter; + qreal zoomFactor; int horizontalPosition; int verticalPostition; @@ -331,8 +355,9 @@ public slots: void initStroke(); void hideTool(); - void setBackground(bool pIsDark, bool pIsCrossed); + void setBackground(bool pIsDark, UBPageBackground pBackground); void setBackgroundZoomFactor(qreal zoom); + void setBackgroundGridSize(int pSize); void setDrawingMode(bool bModeDesktop); void deselectAllItems(); @@ -362,6 +387,9 @@ public slots: UBGraphicsPolygonItem* lineToPolygonItem(const QLineF &pLine, const qreal &pStartWidth, const qreal &pEndWidth); UBGraphicsPolygonItem* arcToPolygonItem(const QLineF& pStartRadius, qreal pSpanAngle, qreal pWidth); + UBGraphicsPolygonItem* curveToPolygonItem(const QList > &points); + UBGraphicsPolygonItem* curveToPolygonItem(const QList &points, qreal startWidth, qreal endWidth); + void addPolygonItemToCurrentStroke(UBGraphicsPolygonItem* polygonItem); void initPolygonItem(UBGraphicsPolygonItem*); @@ -370,7 +398,9 @@ public slots: void hideEraser(); void drawPointer(const QPointF& pEndPoint, bool isFirstDraw = false); void drawMarkerCircle(const QPointF& pEndPoint); + void drawPenCircle(const QPointF& pEndPoint); void hideMarkerCircle(); + void hidePenCircle(); void DisposeMagnifierQWidgets(); @@ -391,13 +421,17 @@ public slots: void createEraiser(); void createPointer(); void createMarkerCircle(); + void createPenCircle(); void updateEraserColor(); void updateMarkerCircleColor(); + void updatePenCircleColor(); bool hasTextItemWithFocus(UBGraphicsGroupContainerItem* item); + void simplifyCurrentStroke(); QGraphicsEllipseItem* mEraser; QGraphicsEllipseItem* mPointer; // "laser" pointer QGraphicsEllipseItem* mMarkerCircle; // dotted circle around marker + QGraphicsEllipseItem* mPenCircle; // dotted circle around pen QSet mAddedItems; QSet mRemovedItems; @@ -405,7 +439,9 @@ public slots: UBDocumentProxy* mDocument; bool mDarkBackground; - bool mCrossedBackground; + UBPageBackground mPageBackground; + int mBackgroundGridSize; + bool mIsDesktopMode; qreal mZoomFactor; @@ -413,6 +449,7 @@ public slots: QPointF mPreviousPoint; qreal mPreviousWidth; + qreal mDistanceFromLastStrokePoint; QList mPreviousPolygonItems; @@ -444,6 +481,7 @@ public slots: UBZLayerController *mZLayerController; UBGraphicsPolygonItem* mpLastPolygon; + UBGraphicsPolygonItem* mTempPolygon; bool mDrawWithCompass; UBGraphicsPolygonItem *mCurrentPolygon; diff --git a/src/domain/UBGraphicsStroke.cpp b/src/domain/UBGraphicsStroke.cpp index c9b456d8..3cf10a65 100644 --- a/src/domain/UBGraphicsStroke.cpp +++ b/src/domain/UBGraphicsStroke.cpp @@ -31,17 +31,29 @@ #include "UBGraphicsPolygonItem.h" +#include "board/UBBoardController.h" +#include "core/UBApplication.h" #include "core/memcheck.h" +#include "domain/UBGraphicsScene.h" -UBGraphicsStroke::UBGraphicsStroke() +#include "frameworks/UBGeometryUtils.h" + + +typedef QPair strokePoint; + +UBGraphicsStroke::UBGraphicsStroke(UBGraphicsScene *scene) + :mScene(scene) { - // NOOP + mAntiScaleRatio = 1./(UBApplication::boardController->systemScaleFactor() * UBApplication::boardController->currentZoom()); } UBGraphicsStroke::~UBGraphicsStroke() { - // NOOP + foreach(UBGraphicsPolygonItem* poly, mPolygons) + poly->setStroke(NULL); + + mPolygons.clear(); } @@ -63,6 +75,83 @@ QList UBGraphicsStroke::polygons() const return mPolygons; } +/** + * @brief Add a point to the curve, interpolating extra points if required + * @param point The position of the point to add + * @param width The width of the stroke at that point. + * @param interpolate If true, a Bézier curve will be drawn rather than a straight line + * @return A list containing the last point drawn plus the point(s) that were added + * + * This method should be called when a new point is given by the input method (mouse, pen or other), and the points that are returned + * should be used to draw the actual stroke on-screen. This is because if interpolation (bézier curves) are to be used, the points to draw + * do not correspond to the points that were given by the input method. + * + */ +QList > UBGraphicsStroke::addPoint(const QPointF& point, qreal width, bool interpolate) +{ + strokePoint newPoint(point, width); + + int n = mReceivedPoints.size(); + + if (n == 0) { + mReceivedPoints << newPoint; + mDrawnPoints << newPoint; + return QList() << newPoint; + } + + if (!interpolate) { + strokePoint lastPoint = mReceivedPoints.last(); + mReceivedPoints << newPoint; + mDrawnPoints << newPoint; + return QList() << lastPoint << newPoint; + } + + else { + // The curve we are interpolating is not between two drawn points; + // it is between the midway points of the second-to-last and last point, and last and current point. + + + // The first segment is just a straight line to the first midway point + if (n == 1) { + QPointF lastPoint = mReceivedPoints[0].first; + qreal lastWidth = mReceivedPoints[0].second; + strokePoint p(((lastPoint+point)/2.0), (lastWidth+width)/2.0); + mReceivedPoints << newPoint; + mDrawnPoints << p; + + return QList() << mReceivedPoints[0] << p; + } + + QPointF p0 = mReceivedPoints[mReceivedPoints.size() - 2].first; + QPointF p1 = mReceivedPoints[mReceivedPoints.size() - 1].first; + QPointF p2 = point; + + QPointF startPoint = (p1+p0)/2.0; + QPointF endPoint = (p2+p1)/2.0; + + QList calculated = UBGeometryUtils::quadraticBezier(startPoint, p1, endPoint, 10); + QList newPoints; + + qreal startWidth = mDrawnPoints.last().second; + + for (int i(0); i < calculated.size(); ++i) { + qreal w = startWidth + (qreal(i)/qreal(calculated.size()-1)) * (width - startWidth); + newPoints << strokePoint(calculated[i], w); + } + + // avoid adding duplicates + if (newPoints.first().first == mDrawnPoints.last().first) + mDrawnPoints.removeLast(); + + foreach(strokePoint p, newPoints) + mDrawnPoints << p; + + mReceivedPoints << strokePoint(point, width); + return newPoints; + } + + return QList(); +} bool UBGraphicsStroke::hasPressure() { @@ -77,8 +166,8 @@ bool UBGraphicsStroke::hasPressure() } return false; } - - return true; + else + return true; } @@ -108,3 +197,129 @@ void UBGraphicsStroke::clear() } } +/** + * @brief Return a simplified version of the stroke, with less points and polygons. + * + */ +UBGraphicsStroke* UBGraphicsStroke::simplify() +{ + if (mDrawnPoints.size() < 3) + return NULL; + + UBGraphicsStroke* newStroke = new UBGraphicsStroke(); + newStroke->mDrawnPoints = QList(mDrawnPoints); + + QList& points = newStroke->mDrawnPoints; + //qDebug() << "Simplifying. Before: " << points.size() << " points and " << polygons().size() << " polygons"; + + /* Basic simplifying algorithm: consider A, B and C the current point and the two following ones. + * If the angle between (AB) and (BC) is lower than a certain threshold, + * the three points are considered to be aligned and the middle one (B) is removed. + * + * We then consider the two following points as the new B and C while keeping the same A, and + * test these three points. As long as they are aligned, B is erased and we start over. + * If not, the current B becomes the new A, and so on. + * + * In case the stroke thickness varies a lot between A and B, then B is not removed even if it + * should be according to the previous criteria. + * + * TODO: more advanced algorithm that could also simplify curved sections of the stroke + */ + + // angle difference in degrees between AB and BC below which the segments are considered colinear + qreal thresholdAngle = UBSettings::settings()->boardSimplifyPenStrokesThresholdAngle->get().toReal(); + + // Relative difference in thickness between two consecutive points (A and B) below which they are considered equal + qreal thresholdWidthDifference = UBSettings::settings()->boardSimplifyPenStrokesThresholdWidthDifference->get().toReal(); + + QList::iterator it = points.begin(); + QList::iterator> toDelete; + + while (it+2 != points.end()) { + // it, b_it and (b_it+1) correspond to A, B and C respectively + QList::iterator b_it(it+1); + + while (b_it+1 != points.end()) { + qreal angle = qFabs(180-(UBGeometryUtils::angle(it->first, b_it->first, (b_it+1)->first))); + qreal widthRatio = qMax(it->second, b_it->second)/qMin(it->second, b_it->second); + + if (angle < thresholdAngle && widthRatio < thresholdWidthDifference) + b_it = points.erase(b_it); + else + break; + } + + if (b_it+1 == points.end()) + break; + else + it = b_it; + } + + // Next, we iterate over the new points to build the polygons that make up the stroke. + // A new polygon is created every time drawCurve is true. + + QList newPolygons; + QList newStrokePoints; + int i(0); + + while (i < points.size()) { + bool drawCurve = false; + + newStrokePoints << points[i]; + + // Limiting the size of the polygons, and creating new ones when there is a sharp angle between + // consecutive point helps with two issues: + // 1. When a polygon is transparent and it overlaps with itself, it is *sometimes* filled incorrectly. + // 2. This way of simplifying strokes resuls in sharp, rather than rounded, corners when there is a sharp angle + // in the stroke + + if (newStrokePoints.size() > 1 && i < points.size() - 1) { + qreal angle = qFabs(UBGeometryUtils::angle(points[i-1].first, points[i].first, points[i+1].first)); + if (angle < 150) // arbitrary threshold, change if necessary + drawCurve = true; + } + + if (hasAlpha() && newStrokePoints.size() % 20 == 0) + drawCurve = true; + + if (drawCurve) { + UBGraphicsPolygonItem* poly = mScene->polygonToPolygonItem(UBGeometryUtils::curveToPolygon(newStrokePoints, true, true)); + //poly->setColor(QColor(rand()%256, rand()%256, rand()%256, poly->brush().color().alpha())); // useful for debugging + + // Subtract overlapping polygons if the stroke is translucent + if (!poly->brush().isOpaque()) { + foreach(UBGraphicsPolygonItem* prev, newPolygons) + poly->subtract(prev); + } + + newPolygons << poly; + newStrokePoints.clear(); + --i; + } + + ++i; + } + + if (newStrokePoints.size() > 0) { + UBGraphicsPolygonItem* poly = mScene->polygonToPolygonItem(UBGeometryUtils::curveToPolygon(newStrokePoints, true, true)); + + if (!poly->brush().isOpaque()) { + foreach(UBGraphicsPolygonItem* prev, newPolygons) + poly->subtract(prev); + } + + newPolygons << poly; + } + + + newStroke->mPolygons = QList(newPolygons); + + foreach(UBGraphicsPolygonItem* poly, newStroke->mPolygons) { + poly->setFillRule(Qt::WindingFill); + poly->setStroke(newStroke); + } + + //qDebug() << "After: " << points.size() << " points and " << newStroke->polygons().size() << " polygons"; + + return newStroke; +} diff --git a/src/domain/UBGraphicsStroke.h b/src/domain/UBGraphicsStroke.h index 4b6759d6..930d9546 100644 --- a/src/domain/UBGraphicsStroke.h +++ b/src/domain/UBGraphicsStroke.h @@ -35,14 +35,16 @@ #include "core/UB.h" + class UBGraphicsPolygonItem; +class UBGraphicsScene; class UBGraphicsStroke { friend class UBGraphicsPolygonItem; public: - UBGraphicsStroke(); + UBGraphicsStroke(UBGraphicsScene* scene = NULL); virtual ~UBGraphicsStroke(); bool hasPressure(); @@ -57,13 +59,28 @@ class UBGraphicsStroke void clear(); + QList > addPoint(const QPointF& point, qreal width, bool interpolate = false); + + const QList >& points() { return mDrawnPoints; } + + UBGraphicsStroke* simplify(); + protected: void addPolygon(UBGraphicsPolygonItem* pol); private: + UBGraphicsScene * mScene; + QList mPolygons; + /// Points that were drawn by the user (i.e, actually received through input device) + QList > mReceivedPoints; + + /// All the points (including interpolated) that are used to draw the stroke + QList > mDrawnPoints; + + qreal mAntiScaleRatio; }; #endif /* UBGRAPHICSSTROKE_H_ */ diff --git a/src/domain/UBGraphicsSvgItem.cpp b/src/domain/UBGraphicsSvgItem.cpp index 81f81333..90c188ab 100644 --- a/src/domain/UBGraphicsSvgItem.cpp +++ b/src/domain/UBGraphicsSvgItem.cpp @@ -87,6 +87,8 @@ void UBGraphicsSvgItem::init() setData(UBGraphicsItemData::itemLayerType, QVariant(itemLayerType::ObjectItem)); //Necessary to set if we want z value to be assigned correctly + setData(UBGraphicsItemData::ItemCanBeSetAsBackground, true); + setUuid(QUuid::createUuid()); } diff --git a/src/domain/UBGraphicsTextItem.cpp b/src/domain/UBGraphicsTextItem.cpp index f2326bb9..1f29eeee 100644 --- a/src/domain/UBGraphicsTextItem.cpp +++ b/src/domain/UBGraphicsTextItem.cpp @@ -188,6 +188,11 @@ void UBGraphicsTextItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) } } +void UBGraphicsTextItem::dragMoveEvent(QGraphicsSceneDragDropEvent *event) +{ + +} + void UBGraphicsTextItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { // scene()->itemAt(pos) returns 0 if pos is not over text, but over text item, but mouse press comes. diff --git a/src/domain/UBGraphicsTextItem.h b/src/domain/UBGraphicsTextItem.h index bb031f71..e3a3688b 100644 --- a/src/domain/UBGraphicsTextItem.h +++ b/src/domain/UBGraphicsTextItem.h @@ -118,6 +118,8 @@ class UBGraphicsTextItem : public QGraphicsTextItem, public UBItem, public UBRes virtual void keyPressEvent(QKeyEvent *event); virtual void keyReleaseEvent(QKeyEvent *event); + virtual void dragMoveEvent(QGraphicsSceneDragDropEvent *event); + virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value); diff --git a/src/domain/UBGraphicsTextItemDelegate.cpp b/src/domain/UBGraphicsTextItemDelegate.cpp index dfb45989..b90a9062 100644 --- a/src/domain/UBGraphicsTextItemDelegate.cpp +++ b/src/domain/UBGraphicsTextItemDelegate.cpp @@ -41,6 +41,7 @@ #include "core/UBSettings.h" #include "board/UBBoardController.h" +#include "board/UBBoardView.h" #include "core/memcheck.h" @@ -321,7 +322,7 @@ void UBGraphicsTextItemDelegate::pickFont() { if (mDelegated && mDelegated->scene() && mDelegated->scene()->views().size() > 0) { - QFontDialog fontDialog(delegated()->textCursor().charFormat().font(), mDelegated->scene()->views().at(0)); + QFontDialog fontDialog(delegated()->textCursor().charFormat().font(), static_cast(UBApplication::boardController->controlView())); customize(fontDialog); if (fontDialog.exec()) @@ -354,8 +355,9 @@ void UBGraphicsTextItemDelegate::pickColor() { if (mDelegated && mDelegated->scene() && mDelegated->scene()->views().size() > 0) { - QColorDialog colorDialog(delegated()->defaultTextColor(), mDelegated->scene()->views().at(0)); + QColorDialog colorDialog(delegated()->defaultTextColor(), static_cast(UBApplication::boardController->controlView())); colorDialog.setWindowTitle(tr("Text Color")); + colorDialog.setOption(QColorDialog::DontUseNativeDialog); if (UBSettings::settings()->isDarkBackground()) { colorDialog.setStyleSheet("background-color: white;"); @@ -754,10 +756,5 @@ QVariant UBGraphicsTextItemDelegate::itemChange(QGraphicsItem::GraphicsItemChang } } - if (value.toBool() == false && delegated()->document()->toPlainText().isEmpty()) { - int wdth = QFontMetrics(delegated()->font()).width(delegated()->mTypeTextHereLabel); - delegated()->setTextWidth(qMax(wdth, (int)(delegated()->textWidth()))); - } - return UBGraphicsItemDelegate::itemChange(change, value); } diff --git a/src/frameworks/UBGeometryUtils.cpp b/src/frameworks/UBGeometryUtils.cpp index 481ba1a9..3dabcc5c 100644 --- a/src/frameworks/UBGeometryUtils.cpp +++ b/src/frameworks/UBGeometryUtils.cpp @@ -225,23 +225,153 @@ QPolygonF UBGeometryUtils::arcToPolygon(const QLineF& startRadius, qreal spanAng endAngleInDegrees = - endAngleInDegrees; spanAngleInDegrees = - spanAngleInDegrees; - if (overlap) - { - painterPath.addEllipse(outerSquare); - QPainterPath innerPainterPath; - innerPainterPath.addEllipse(innerSquare); - painterPath = painterPath.subtracted(innerPainterPath); + painterPath.setFillRule(Qt::WindingFill); + painterPath.arcTo(innerSquare, startAngleInDegrees, spanAngleInDegrees); + painterPath.arcTo(endSquare, 180.0 + endAngleInDegrees, spanAngleInDegrees > 0 ? -180.0 : 180.0); + painterPath.arcTo(outerSquare, endAngleInDegrees, - spanAngleInDegrees); + painterPath.arcTo(startSquare, startAngleInDegrees, spanAngleInDegrees > 0 ? -180.0 : 180.0); + painterPath.closeSubpath(); + + return painterPath.toFillPolygon(); +} + +/** + * @brief Build and return a polygon from a list of points (at least 2), and start and end widths. + * + * The resulting polygon will pass by all points in the curve; its thickness is calculated at each point + * of the curve (linearly interpolated between start and end widths) and the segments are joined by + * (approximately) curved joints. + * + * Like with lineToPolygon, the ends are semi-circular. + */ +QPolygonF UBGeometryUtils::curveToPolygon(const QList& points, qreal startWidth, qreal endWidth) +{ + int n_points = points.size(); + + if (n_points < 2) + return QPolygonF(); + + if (n_points == 2) + return lineToPolygon(points[0], points[1], startWidth, endWidth); + + QList > pointsAndWidths; + for (int i(0); i < n_points; ++i) { + qreal width = startWidth + (qreal(i)/qreal(n_points-1)) * (endWidth - startWidth); + + pointsAndWidths << QPair(points[i], width); + } + + return curveToPolygon(pointsAndWidths, true, true); +} + +/** + * @brief Build and return a polygon from a list of points and thicknesses (at least 2) + * + * The resulting polygon will pass by all points in the curve; the segments are joined by + * (approximately) curved joints. The ends of the polygon can be terminated by arcs by passing + * `true` as the `roundStart` and/or `roundEnd` parameters. + * + */ +QPolygonF UBGeometryUtils::curveToPolygon(const QList >& points, bool roundStart, bool roundEnd) +{ + int n_points = points.size(); + + if (n_points == 0) + return QPolygonF(); + if (n_points == 1) + return lineToPolygon(points.first().first, points.first().first, points.first().second, points.first().second); + + qreal startWidth = points.first().second; + qreal endWidth = points.last().second; + + /* The vertices (x's) are calculated based on the stroke's width and angle, and the position of the + supplied points (o's): + + x----------x--------x + + o o o + + x----------x -------x + + The vertices above and below each 'o' point are temporarily stored together, + as a pair of points. + */ + + typedef QPair pointPair; + QList newPoints; + + + QLineF firstSegment = QLineF(points[0].first, points[1].first); + QLineF normal = firstSegment.normalVector(); + normal.setLength(startWidth/2.0); + newPoints << pointPair(normal.p2(), points[0].first - QPointF(normal.dx(), normal.dy())); + + /* + Calculating the vertices (d1 and d2, below) is a little less trivial for the + next points: their positions depend on the angle between one segment and the next. + + d1 + ------------x + \ + .a b . \ + \ + --------x \ + d2 \ \ + \ .c \ + + Here, points a, b and c are supplied in the `points` list. + + N.B: The drawing isn't quite accurate; we don't do a miter joint but a kind + of rounded-off joint (the distance between b and d1 is half the width of the stroke) + */ + + for (int i(1); i < n_points-1; ++i) { + //qreal width = startWidth + (qreal(i)/qreal(n_points-1)) * (endWidth - startWidth); + + QLineF normal = (QLineF(points[i-1].first, points[i+1].first)).normalVector(); + normal.setLength(points[i].second/2.0); + QPointF d1 = points[i].first + QPointF(normal.dx(), normal.dy()); + QPointF d2 = points[i].first - QPointF(normal.dx(), normal.dy()); + + newPoints << pointPair(d1, d2); + } + + // The last point is similar to the first + QLineF lastSegment = QLineF(points[n_points-2].first, points[n_points-1].first); + normal = lastSegment.normalVector(); + normal.setLength(endWidth/2.0); + + QPointF d1 = points.last().first + QPointF(normal.dx(), normal.dy()); + QPointF d2 = points.last().first - QPointF(normal.dx(), normal.dy()); + + newPoints << pointPair(d1, d2); + + QPainterPath path; + path.setFillRule(Qt::WindingFill); + path.moveTo(newPoints[0].first); + + for (int i(1); i < n_points; ++i) { + path.lineTo(newPoints[i].first); } + + if (roundEnd) + path.arcTo(points.last().first.x() - endWidth/2.0, points.last().first.y() - endWidth/2.0, endWidth, endWidth, (90.0 + lastSegment.angle()), -180.0); else - { - painterPath.arcTo(innerSquare, startAngleInDegrees, spanAngleInDegrees); - painterPath.arcTo(endSquare, 180.0 + endAngleInDegrees, spanAngleInDegrees > 0 ? -180.0 : 180.0); - painterPath.arcTo(outerSquare, endAngleInDegrees, - spanAngleInDegrees); - painterPath.arcTo(startSquare, startAngleInDegrees, spanAngleInDegrees > 0 ? -180.0 : 180.0); - painterPath.closeSubpath(); + path.lineTo(newPoints.last().second); + + for (int i(n_points-1); i >= 0; --i) { + path.lineTo(newPoints[i].second); } - return painterPath.toFillPolygon(); + if (roundStart) + path.arcTo(points[0].first.x() - startWidth/2.0, points[0].first.y() - startWidth/2.0, startWidth, startWidth, (firstSegment.angle() - 90.0), -180.0); + else + path.lineTo(newPoints[0].first); + + + //path.closeSubpath(); + + return path.toFillPolygon(); } QPointF UBGeometryUtils::pointConstrainedInRect(QPointF point, QRectF rect) @@ -286,3 +416,54 @@ void UBGeometryUtils::crashPointList(QVector &points) } } } + +/** + * @brief Return the angle in degrees between three points + */ +qreal UBGeometryUtils::angle(const QPointF& p1, const QPointF& p2, const QPointF& p3) +{ + // Angle between three points, using the law of cosines: + // The angle at B equals arccos((a^2-b^2+c^2)/(2*a*c)), where a, b and c are the sides of the triangle + // opposite A, B and C, respectively + + qreal a, b, c, beta; + a = qSqrt(qPow(p2.x() - p3.x(), 2) + qPow(p2.y() - p3.y(), 2)); + b = qSqrt(qPow(p1.x() - p3.x(), 2) + qPow(p1.y() - p3.y(), 2)); + c = qSqrt(qPow(p1.x() - p2.x(), 2) + qPow(p1.y() - p2.y(), 2)); + + if (a == 0 || c == 0) + beta = 3.14159; + else + beta = qAcos(std::max(-1.0, std::min(1.0, (a*a - b*b + c*c)/(2*a*c)))); + + + return 180.* beta/3.14159; +} + + + +/** + * @brief Calculate a quadratic Bézier curve and return it in the form of a list of points + * @param p0 The start point of the curve + * @param p1 The control point of the curve + * @param p2 The end point of the curve + * @param nPoints The number of points by which to approximate the curve, i.e. the length of the returned list + * @return A list of points that can be used to draw the curve. + */ +QList UBGeometryUtils::quadraticBezier(const QPointF& p0, const QPointF& p1, const QPointF& p2, unsigned int nPoints) +{ + QPainterPath path(p0); + path.quadTo(p1, p2); + + QList points; + + if (nPoints <= 1) + return points; + + for (unsigned int i(0); i <= nPoints; ++i) { + qreal percent = qreal(i)/qreal(nPoints); + points << path.pointAtPercent(percent); + } + + return points; +} diff --git a/src/frameworks/UBGeometryUtils.h b/src/frameworks/UBGeometryUtils.h index 83832401..6e2992cc 100644 --- a/src/frameworks/UBGeometryUtils.h +++ b/src/frameworks/UBGeometryUtils.h @@ -47,12 +47,18 @@ class UBGeometryUtils static QPolygonF lineToPolygon(const QPointF& pStart, const QPointF& pEnd, const qreal& pStartWidth, const qreal& pEndWidth); + static QPolygonF curveToPolygon(const QList& points, qreal startWidth, qreal endWidth); + static QPolygonF curveToPolygon(const QList >& points, bool roundStart, bool roundEnd); static QPointF pointConstrainedInRect(QPointF point, QRectF rect); static QPoint pointConstrainedInRect(QPoint point, QRect rect); static void crashPointList(QVector &points); + static qreal angle(const QPointF& p1, const QPointF& p2, const QPointF& p3); + + static QList quadraticBezier(const QPointF& p0, const QPointF& p1, const QPointF& p2, unsigned int nPoints); + const static int centimeterGraduationHeight; const static int halfCentimeterGraduationHeight; const static int millimeterGraduationHeight; diff --git a/src/gui/UBActionPalette.h b/src/gui/UBActionPalette.h index 97752769..3e1e3238 100644 --- a/src/gui/UBActionPalette.h +++ b/src/gui/UBActionPalette.h @@ -55,9 +55,9 @@ class UBActionPalette : public UBFloatingPalette void setToolButtonStyle(Qt::ToolButtonStyle); QList actions(); - void setActions(QList actions); + virtual void setActions(QList actions); void groupActions(); - void addAction(QAction* action); + virtual void addAction(QAction* action); void setClosable(bool closable); void setAutoClose(bool autoClose) @@ -72,10 +72,10 @@ class UBActionPalette : public UBFloatingPalette bool m_customCloseProcessing; virtual int border(); - void clearLayout(); + virtual void clearLayout(); QSize buttonSize(); - UBActionPaletteButton* getButtonFromAction(QAction* action); + virtual UBActionPaletteButton* getButtonFromAction(QAction* action); public slots: void close(); @@ -91,7 +91,7 @@ class UBActionPalette : public UBFloatingPalette virtual void mouseReleaseEvent(QMouseEvent * event); virtual void init(Qt::Orientation orientation); - void updateLayout(); + virtual void updateLayout(); QList mButtons; QButtonGroup* mButtonGroup; @@ -105,7 +105,7 @@ class UBActionPalette : public UBFloatingPalette QPoint mMousePos; UBActionPaletteButton *createPaletteButton(QAction* action, QWidget *parent); - private slots: + protected slots: void buttonClicked(); void actionChanged(); }; diff --git a/src/gui/UBBackgroundPalette.cpp b/src/gui/UBBackgroundPalette.cpp new file mode 100644 index 00000000..92ce0bd8 --- /dev/null +++ b/src/gui/UBBackgroundPalette.cpp @@ -0,0 +1,169 @@ +#include "UBBackgroundPalette.h" + +#include "gui/UBMainWindow.h" + +UBBackgroundPalette::UBBackgroundPalette(QList actions, QWidget * parent) + : UBActionPalette(parent) +{ + init(); + setActions(actions); +} + + +UBBackgroundPalette::UBBackgroundPalette(QWidget * parent) + : UBActionPalette(parent) +{ + init(); +} + + + +void UBBackgroundPalette::init() +{ + UBActionPalette::clearLayout(); + delete layout(); + + + m_customCloseProcessing = false; + + mButtonSize = QSize(32, 32); + mIsClosable = false; + mAutoClose = false; + mButtonGroup = 0; + mToolButtonStyle = Qt::ToolButtonIconOnly; + mButtons.clear(); + + mVLayout = new QVBoxLayout(this); + mTopLayout = new QHBoxLayout(); + mBottomLayout = new QHBoxLayout(); + + mVLayout->addLayout(mTopLayout); + mVLayout->addLayout(mBottomLayout); + + mSlider = new QSlider(Qt::Horizontal); + + mSlider->setMinimum(UBSettings::settings()->minCrossSize); + mSlider->setMaximum(UBSettings::settings()->maxCrossSize); + mSlider->setSingleStep(2); + mSlider->setTracking(true); // valueChanged() is emitted during movement and not just upon releasing the slider + + mSliderLabel = new QLabel(tr("Grid size")); + + mResetDefaultGridSizeButton = createPaletteButton(UBApplication::mainWindow->actionDefaultGridSize, this); + mResetDefaultGridSizeButton->setFixedSize(24,24); + mActions << UBApplication::mainWindow->actionDefaultGridSize; + + connect(UBApplication::mainWindow->actionDefaultGridSize, SIGNAL(triggered()), this, SLOT(defaultBackgroundGridSize())); + + mBottomLayout->addSpacing(16); + mBottomLayout->addWidget(mSliderLabel); + mBottomLayout->addWidget(mSlider); + mBottomLayout->addWidget(mResetDefaultGridSizeButton); + mBottomLayout->addSpacing(16); + + updateLayout(); +} + +void UBBackgroundPalette::addAction(QAction* action) +{ + UBActionPaletteButton* button = createPaletteButton(action, this); + + mTopLayout->addWidget(button); + mActions << action; +} + +void UBBackgroundPalette::setActions(QList actions) +{ + mMapActionToButton.clear(); + + foreach(QAction* action, actions) + { + addAction(action); + } + + actionChanged(); +} + +void UBBackgroundPalette::updateLayout() +{ + if (mToolButtonStyle == Qt::ToolButtonIconOnly) { + mVLayout->setContentsMargins (sLayoutContentMargin / 2 + border(), sLayoutContentMargin / 2 + border() + , sLayoutContentMargin / 2 + border(), sLayoutContentMargin / 2 + border()); + } + else + { + mVLayout->setContentsMargins (sLayoutContentMargin + border(), sLayoutContentMargin + border() + , sLayoutContentMargin + border(), sLayoutContentMargin + border()); + + } + update(); +} + +void UBBackgroundPalette::clearLayout() +{ + while(!mTopLayout->isEmpty()) { + QLayoutItem* pItem = mTopLayout->itemAt(0); + QWidget* pW = pItem->widget(); + mTopLayout->removeItem(pItem); + delete pItem; + mTopLayout->removeWidget(pW); + delete pW; + } + + delete mTopLayout; + + while(!mBottomLayout->isEmpty()) { + QLayoutItem* pItem = mBottomLayout->itemAt(0); + QWidget* pW = pItem->widget(); + mBottomLayout->removeItem(pItem); + delete pItem; + mBottomLayout->removeWidget(pW); + delete pW; + } + + delete mBottomLayout; + + delete mVLayout; + + mActions.clear(); + mButtons.clear(); +} + +void UBBackgroundPalette::showEvent(QShowEvent* event) +{ + backgroundChanged(); + + mSlider->setValue(UBApplication::boardController->activeScene()->backgroundGridSize()); + connect(mSlider, SIGNAL(valueChanged(int)), + this, SLOT(sliderValueChanged(int))); + + QWidget::showEvent(event); +} + +void UBBackgroundPalette::sliderValueChanged(int value) +{ + UBApplication::boardController->activeScene()->setBackgroundGridSize(value); + UBSettings::settings()->crossSize = value; // since this function is called (indirectly, by refresh) when we switch scenes, the settings will always have the current scene's cross size. +} + +void UBBackgroundPalette::defaultBackgroundGridSize() +{ + mSlider->setValue(UBSettings::settings()->defaultCrossSize); + sliderValueChanged(UBSettings::settings()->defaultCrossSize); +} + +void UBBackgroundPalette::backgroundChanged() +{ + bool dark = UBApplication::boardController->activeScene()->isDarkBackground(); + + if (dark) + mSliderLabel->setStyleSheet("QLabel { color : white; }"); + else + mSliderLabel->setStyleSheet("QLabel { color : black; }"); +} + +void UBBackgroundPalette::refresh() +{ + backgroundChanged(); + mSlider->setValue(UBApplication::boardController->activeScene()->backgroundGridSize()); +} diff --git a/src/gui/UBBackgroundPalette.h b/src/gui/UBBackgroundPalette.h new file mode 100644 index 00000000..83472d47 --- /dev/null +++ b/src/gui/UBBackgroundPalette.h @@ -0,0 +1,48 @@ +#ifndef UBBACKGROUNDPALETTE_H +#define UBBACKGROUNDPALETTE_H + +#include "gui/UBActionPalette.h" +#include "core/UBApplication.h" +#include "board/UBBoardController.h" +#include "domain/UBGraphicsScene.h" + +class UBBackgroundPalette : public UBActionPalette +{ + Q_OBJECT + + public: + + UBBackgroundPalette(QList actions, QWidget* parent = 0); + UBBackgroundPalette(QWidget* parent = 0); + + void addAction(QAction *action); + void setActions(QList actions); + void clearLayout(); + + + public slots: + void showEvent(QShowEvent* event); + void backgroundChanged(); + void refresh(); + + protected slots: + void sliderValueChanged(int value); + void defaultBackgroundGridSize(); + + protected: + virtual void updateLayout(); + void init(); + + + QVBoxLayout* mVLayout; + QHBoxLayout* mTopLayout; + QHBoxLayout* mBottomLayout; + + QSlider* mSlider; + QLabel* mSliderLabel; + UBActionPaletteButton* mResetDefaultGridSizeButton; + + +}; + +#endif // UBBACKGROUNDPALETTE_H diff --git a/src/gui/UBBoardThumbnailsView.cpp b/src/gui/UBBoardThumbnailsView.cpp new file mode 100644 index 00000000..1c512182 --- /dev/null +++ b/src/gui/UBBoardThumbnailsView.cpp @@ -0,0 +1,339 @@ +/* + * Copyright (C) 2015-2016 Département de l'Instruction Publique (DIP-SEM) + * + * Copyright (C) 2013 Open Education Foundation + * + * Copyright (C) 2010-2013 Groupement d'Intérêt Public pour + * l'Education Numérique en Afrique (GIP ENA) + * + * This file is part of OpenBoard. + * + * OpenBoard is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3 of the License, + * with a specific linking exception for the OpenSSL project's + * "OpenSSL" library (or with modified versions of it that use the + * same license as the "OpenSSL" library). + * + * OpenBoard is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenBoard. If not, see . + */ + + + + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "core/UBApplication.h" +#include "UBBoardThumbnailsView.h" +#include "board/UBBoardController.h" +#include "adaptors/UBThumbnailAdaptor.h" +#include "adaptors/UBSvgSubsetAdaptor.h" +#include "document/UBDocumentController.h" +#include "domain/UBGraphicsScene.h" +#include "board/UBBoardPaletteManager.h" +#include "core/UBApplicationController.h" +#include "core/UBPersistenceManager.h" +#include "UBThumbnailView.h" + +UBBoardThumbnailsView::UBBoardThumbnailsView(QWidget *parent, const char *name) + : QGraphicsView(parent) + , mThumbnailWidth(0) + , mThumbnailMinWidth(100) + , mMargin(20) + , mDropSource(NULL) + , mDropTarget(NULL) + , mDropBar(new QGraphicsRectItem(0)) + , mLongPressInterval(350) +{ + setScene(new QGraphicsScene(this)); + + mDropBar->setPen(QPen(Qt::darkGray)); + mDropBar->setBrush(QBrush(Qt::lightGray)); + scene()->addItem(mDropBar); + mDropBar->hide(); + + setObjectName(name); + setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + setFrameShadow(QFrame::Plain); + + mThumbnailWidth = width() - 2*mMargin; + + mLongPressTimer.setInterval(mLongPressInterval); + mLongPressTimer.setSingleShot(true); + + connect(UBApplication::boardController, SIGNAL(initThumbnailsRequired(UBDocumentContainer*)), this, SLOT(initThumbnails(UBDocumentContainer*)), Qt::UniqueConnection); + connect(UBApplication::boardController, SIGNAL(addThumbnailRequired(UBDocumentContainer*, int)), this, SLOT(addThumbnail(UBDocumentContainer*, int)), Qt::UniqueConnection); + connect(UBApplication::boardController, SIGNAL(moveThumbnailRequired(int, int)), this, SLOT(moveThumbnail(int, int)), Qt::UniqueConnection); + connect(this, SIGNAL(moveThumbnailRequired(int, int)), this, SLOT(moveThumbnail(int, int)), Qt::UniqueConnection); + connect(UBApplication::boardController, SIGNAL(updateThumbnailsRequired()), this, SLOT(updateThumbnails()), Qt::UniqueConnection); + connect(UBApplication::boardController, SIGNAL(removeThumbnailRequired(int)), this, SLOT(removeThumbnail(int)), Qt::UniqueConnection); + + connect(&mLongPressTimer, SIGNAL(timeout()), this, SLOT(longPressTimeout()), Qt::UniqueConnection); + + connect(this, SIGNAL(mousePressAndHoldEventRequired(QPoint)), this, SLOT(mousePressAndHoldEvent(QPoint)), Qt::UniqueConnection); + + connect(UBApplication::boardController, SIGNAL(pageSelectionChanged(int)), this, SLOT(ensureVisibleThumbnail(int)), Qt::UniqueConnection); + connect(UBApplication::boardController, SIGNAL(centerOnThumbnailRequired(int)), this, SLOT(centerOnThumbnail(int)), Qt::UniqueConnection); +} + +void UBBoardThumbnailsView::moveThumbnail(int from, int to) +{ + mThumbnails.move(from, to); + + updateThumbnailsPos(); +} + +void UBBoardThumbnailsView::updateThumbnails() +{ + updateThumbnailsPos(); +} + +void UBBoardThumbnailsView::removeThumbnail(int i) +{ + UBDraggableThumbnailView* item = mThumbnails.at(i); + + scene()->removeItem(item->pageNumber()); + scene()->removeItem(item); + + mThumbnails.removeAt(i); + + updateThumbnailsPos(); +} + +UBDraggableThumbnailView* UBBoardThumbnailsView::createThumbnail(UBDocumentContainer* source, int i) +{ + UBApplication::showMessage(tr("Loading page (%1/%2)").arg(i+1).arg(source->selectedDocument()->pageCount())); + + UBGraphicsScene* pageScene = UBPersistenceManager::persistenceManager()->loadDocumentScene(source->selectedDocument(), i); + UBThumbnailView* pageView = new UBThumbnailView(pageScene); + + return new UBDraggableThumbnailView(pageView, source->selectedDocument(), i); +} + +void UBBoardThumbnailsView::addThumbnail(UBDocumentContainer* source, int i) +{ + UBDraggableThumbnailView* item = createThumbnail(source, i); + mThumbnails.insert(i, item); + + scene()->addItem(item); + scene()->addItem(item->pageNumber()); + + updateThumbnailsPos(); +} + +void UBBoardThumbnailsView::clearThumbnails() +{ + for(int i = 0; i < mThumbnails.size(); i++) + { + scene()->removeItem(mThumbnails.at(i)->pageNumber()); + scene()->removeItem(mThumbnails.at(i)); + mThumbnails.at(i)->deleteLater(); + } + + mThumbnails.clear(); +} + +void UBBoardThumbnailsView::initThumbnails(UBDocumentContainer* source) +{ + clearThumbnails(); + + for(int i = 0; i < source->selectedDocument()->pageCount(); i++) + { + mThumbnails.append(createThumbnail(source, i)); + + scene()->addItem(mThumbnails.last()); + scene()->addItem(mThumbnails.last()->pageNumber()); + } + + updateThumbnailsPos(); +} + +void UBBoardThumbnailsView::centerOnThumbnail(int index) +{ + centerOn(mThumbnails.at(index)); +} + +void UBBoardThumbnailsView::ensureVisibleThumbnail(int index) +{ + ensureVisible(mThumbnails.at(index)); +} + +void UBBoardThumbnailsView::updateThumbnailsPos() +{ + qreal thumbnailHeight = mThumbnailWidth / UBSettings::minScreenRatio; + + for (int i=0; i < mThumbnails.length(); i++) + { + mThumbnails.at(i)->setSceneIndex(i); + mThumbnails.at(i)->setPageNumber(i); + mThumbnails.at(i)->updatePos(mThumbnailWidth, thumbnailHeight); + } + + scene()->setSceneRect(0, 0, scene()->itemsBoundingRect().size().width() - verticalScrollBar()->width(), scene()->itemsBoundingRect().size().height()); + + update(); +} + +void UBBoardThumbnailsView::resizeEvent(QResizeEvent *event) +{ + Q_UNUSED(event); + + // Update the thumbnails width + mThumbnailWidth = (width() > mThumbnailMinWidth) ? width() - verticalScrollBar()->width() - 2*mMargin : mThumbnailMinWidth; + + // Refresh the scene + updateThumbnailsPos(); + + emit UBApplication::boardController->centerOnThumbnailRequired(UBApplication::boardController->activeSceneIndex()); +} + +void UBBoardThumbnailsView::mousePressEvent(QMouseEvent *event) +{ + QGraphicsView::mousePressEvent(event); + + if (!event->isAccepted()) + { + mLongPressTimer.start(); + mLastPressedMousePos = event->pos(); + + UBDraggableThumbnailView* item = dynamic_cast(itemAt(event->pos())); + + if (item) + { + UBApplication::boardController->persistViewPositionOnCurrentScene(); + UBApplication::boardController->persistCurrentScene(); + UBApplication::boardController->setActiveDocumentScene(item->sceneIndex()); + UBApplication::boardController->centerOn(UBApplication::boardController->activeScene()->lastCenter()); + } + } +} + +void UBBoardThumbnailsView::mouseMoveEvent(QMouseEvent *event) +{ + QGraphicsView::mouseMoveEvent(event); +} + +void UBBoardThumbnailsView::longPressTimeout() +{ + if (QApplication::mouseButtons() != Qt::NoButton) + emit mousePressAndHoldEventRequired(mLastPressedMousePos); + + mLongPressTimer.stop(); +} + +void UBBoardThumbnailsView::mousePressAndHoldEvent(QPoint pos) +{ + UBDraggableThumbnailView* item = dynamic_cast(itemAt(pos)); + if (item) + { + mDropSource = item; + mDropTarget = item; + + QPixmap pixmap = item->widget()->grab().scaledToWidth(mThumbnailWidth/2); + + QDrag *drag = new QDrag(this); + drag->setMimeData(new QMimeData()); + drag->setPixmap(pixmap); + drag->setHotSpot(QPoint(pixmap.width()/2, pixmap.height()/2)); + + drag->exec(); + } +} + +void UBBoardThumbnailsView::mouseReleaseEvent(QMouseEvent *event) +{ + mLongPressTimer.stop(); + + QGraphicsView::mouseReleaseEvent(event); +} + +void UBBoardThumbnailsView::dragEnterEvent(QDragEnterEvent *event) +{ + mDropBar->show(); + + if (event->source() == this) + { + event->setDropAction(Qt::MoveAction); + event->accept(); + } + else + { + event->acceptProposedAction(); + } +} + +void UBBoardThumbnailsView::dragMoveEvent(QDragMoveEvent *event) +{ + QPointF position = event->pos(); + + //autoscroll during drag'n'drop + QPointF scenePos = mapToScene(position.toPoint()); + int thumbnailHeight = mThumbnailWidth / UBSettings::minScreenRatio; + QRectF thumbnailArea(0, scenePos.y() - thumbnailHeight/2, mThumbnailWidth, thumbnailHeight); + + ensureVisible(thumbnailArea); + + UBDraggableThumbnailView* item = dynamic_cast(itemAt(position.toPoint())); + if (item) + { + if (item != mDropTarget) + mDropTarget = item; + + qreal scale = item->transform().m11(); + + QPointF itemCenter(item->pos().x() + (item->boundingRect().width()-verticalScrollBar()->width()) * scale, + item->pos().y() + item->boundingRect().height() * scale / 2); + + bool dropAbove = mapToScene(position.toPoint()).y() < itemCenter.y(); + bool movingUp = mDropSource->sceneIndex() > item->sceneIndex(); + qreal y = 0; + + if (movingUp) + { + if (dropAbove) + { + y = item->pos().y() - UBSettings::thumbnailSpacing / 2; + if (mDropBar->y() != y) + mDropBar->setRect(QRectF(item->pos().x(), y, mThumbnailWidth-verticalScrollBar()->width(), 3)); + } + } + else + { + if (!dropAbove) + { + y = item->pos().y() + item->boundingRect().height() * scale + UBSettings::thumbnailSpacing / 2; + if (mDropBar->y() != y) + mDropBar->setRect(QRectF(item->pos().x(), y, mThumbnailWidth-verticalScrollBar()->width(), 3)); + } + } + } + + event->acceptProposedAction(); +} + +void UBBoardThumbnailsView::dropEvent(QDropEvent *event) +{ + Q_UNUSED(event); + + if (mDropSource->sceneIndex() != mDropTarget->sceneIndex()) + UBApplication::boardController->moveSceneToIndex(mDropSource->sceneIndex(), mDropTarget->sceneIndex()); + + mDropSource = NULL; + mDropTarget = NULL; + + mDropBar->setRect(QRectF()); + mDropBar->hide(); +} diff --git a/src/gui/UBBoardThumbnailsView.h b/src/gui/UBBoardThumbnailsView.h new file mode 100644 index 00000000..27574828 --- /dev/null +++ b/src/gui/UBBoardThumbnailsView.h @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2015-2016 Département de l'Instruction Publique (DIP-SEM) + * + * Copyright (C) 2013 Open Education Foundation + * + * Copyright (C) 2010-2013 Groupement d'Intérêt Public pour + * l'Education Numérique en Afrique (GIP ENA) + * + * This file is part of OpenBoard. + * + * OpenBoard is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3 of the License, + * with a specific linking exception for the OpenSSL project's + * "OpenSSL" library (or with modified versions of it that use the + * same license as the "OpenSSL" library). + * + * OpenBoard is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenBoard. If not, see . + */ + + + + +#ifndef UBBOARDTHUMBNAILSVIEW_H +#define UBBOARDTHUMBNAILSVIEW_H + +#include +#include +#include +#include + +#include "document/UBDocumentContainer.h" +#include "UBThumbnailWidget.h" + +class UBBoardThumbnailsView : public QGraphicsView +{ + Q_OBJECT +public: + UBBoardThumbnailsView(QWidget* parent=0, const char* name="UBBoardThumbnailsView"); + +public slots: + void ensureVisibleThumbnail(int index); + void centerOnThumbnail(int index); + + void clearThumbnails(); + void initThumbnails(UBDocumentContainer* source); + void addThumbnail(UBDocumentContainer* source, int i); + void moveThumbnail(int from, int to); + void removeThumbnail(int i); + void updateThumbnails(); + + void longPressTimeout(); + void mousePressAndHoldEvent(QPoint pos); + +protected: + virtual void resizeEvent(QResizeEvent *event); + + virtual void dragEnterEvent(QDragEnterEvent* event); + virtual void dragMoveEvent(QDragMoveEvent* event); + virtual void dropEvent(QDropEvent* event); + + virtual void mousePressEvent(QMouseEvent *event); + virtual void mouseMoveEvent(QMouseEvent *event); + virtual void mouseReleaseEvent(QMouseEvent *event); + +signals: + void mousePressAndHoldEventRequired(QPoint pos); + void moveThumbnailRequired(int from, int to); + +private: + UBDraggableThumbnailView* createThumbnail(UBDocumentContainer* source, int i); + void updateThumbnailsPos(); + + QList mThumbnails; + + int mThumbnailWidth; + const int mThumbnailMinWidth; + const int mMargin; + + UBDraggableThumbnailView* mDropSource; + UBDraggableThumbnailView* mDropTarget; + QGraphicsRectItem *mDropBar; + + int mLongPressInterval; + QTimer mLongPressTimer; + QPoint mLastPressedMousePos; +}; + +#endif // UBBOARDTHUMBNAILSVIEW_H diff --git a/src/gui/UBDockPalette.cpp b/src/gui/UBDockPalette.cpp index 7dda5258..0bdad23f 100644 --- a/src/gui/UBDockPalette.cpp +++ b/src/gui/UBDockPalette.cpp @@ -100,6 +100,7 @@ UBDockPalette::UBDockPalette(eUBDockPaletteType paletteType, QWidget *parent, co connect(UBDownloadManager::downloadManager(), SIGNAL(allDownloadsFinished()), this, SLOT(onAllDownloadsFinished())); connect(UBApplication::boardController,SIGNAL(documentSet(UBDocumentProxy*)),this,SLOT(onDocumentSet(UBDocumentProxy*))); + connect(this,SIGNAL(pageSelectionChangedRequired()),UBApplication::boardController,SLOT(selectionChanged())); } /** @@ -315,6 +316,7 @@ void UBDockPalette::tabClicked(int tabIndex) toggleCollapseExpand(); } mTabPalette->update(); + emit pageSelectionChangedRequired(); } /** diff --git a/src/gui/UBDockPalette.h b/src/gui/UBDockPalette.h index d13b36bf..641ded2e 100644 --- a/src/gui/UBDockPalette.h +++ b/src/gui/UBDockPalette.h @@ -152,6 +152,7 @@ public slots: signals: void mouseEntered(); + void pageSelectionChangedRequired(); protected: virtual int border(); diff --git a/src/gui/UBDocumentNavigator.cpp b/src/gui/UBDocumentNavigator.cpp index db8c19ce..7dc1564c 100644 --- a/src/gui/UBDocumentNavigator.cpp +++ b/src/gui/UBDocumentNavigator.cpp @@ -59,6 +59,10 @@ UBDocumentNavigator::UBDocumentNavigator(QWidget *parent, const char *name):QGra , mThumbnailWidth(0) , mThumbnailMinWidth(100) , mSelectedThumbnail(NULL) + , mDropSource(NULL) + , mDropTarget(NULL) + , mDropBar(new QGraphicsRectItem()) + , mLongPressInterval(350) { setObjectName(name); mScene = new QGraphicsScene(this); @@ -66,11 +70,23 @@ UBDocumentNavigator::UBDocumentNavigator(QWidget *parent, const char *name):QGra setScene(mScene); mThumbnailWidth = width() - 2*border(); + mDropBar->setPen(QPen(Qt::darkGray)); + mDropBar->setBrush(QBrush(Qt::lightGray)); + scene()->addItem(mDropBar); + mDropBar->hide(); + + mLongPressTimer.setInterval(mLongPressInterval); + mLongPressTimer.setSingleShot(true); + setFrameShadow(QFrame::Plain); connect(UBApplication::boardController, SIGNAL(documentThumbnailsUpdated(UBDocumentContainer*)), this, SLOT(generateThumbnails(UBDocumentContainer*))); connect(UBApplication::boardController, SIGNAL(documentPageUpdated(int)), this, SLOT(updateSpecificThumbnail(int))); connect(UBApplication::boardController, SIGNAL(pageSelectionChanged(int)), this, SLOT(onScrollToSelectedPage(int))); + + connect(&mLongPressTimer, SIGNAL(timeout()), this, SLOT(longPressTimeout()), Qt::UniqueConnection); + + connect(this, SIGNAL(mousePressAndHoldEventRequired(QPoint)), this, SLOT(mousePressAndHoldEvent(QPoint)), Qt::UniqueConnection); } /** @@ -98,9 +114,13 @@ void UBDocumentNavigator::generateThumbnails(UBDocumentContainer* source) QGraphicsItem* item = graphicsItemList.at(i); if(item->isSelected()) selectedIndex = i; - mScene->removeItem(item); - delete item; - item = NULL; + + if (item != mDropBar) + { + mScene->removeItem(item); + delete item; + item = NULL; + } } for(int i = 0; i < source->selectedDocument()->pageCount(); i++) @@ -265,6 +285,9 @@ void UBDocumentNavigator::resizeEvent(QResizeEvent *event) */ void UBDocumentNavigator::mousePressEvent(QMouseEvent *event) { + mLongPressTimer.start(); + mLastPressedMousePos = event->pos(); + QGraphicsItem* pClickedItem = itemAt(event->pos()); if(NULL != pClickedItem) { @@ -300,7 +323,10 @@ void UBDocumentNavigator::mousePressEvent(QMouseEvent *event) break; } } + UBApplication::boardController->persistViewPositionOnCurrentScene(); + UBApplication::boardController->persistCurrentScene(); UBApplication::boardController->setActiveDocumentScene(index); + UBApplication::boardController->centerOn(UBApplication::boardController->activeScene()->lastCenter()); } QGraphicsView::mousePressEvent(event); } @@ -309,3 +335,108 @@ void UBDocumentNavigator::mouseReleaseEvent(QMouseEvent *event) { event->accept(); } + +void UBDocumentNavigator::longPressTimeout() +{ + if (QApplication::mouseButtons() != Qt::NoButton) + emit mousePressAndHoldEventRequired(mLastPressedMousePos); + + mLongPressTimer.stop(); +} + +void UBDocumentNavigator::mousePressAndHoldEvent(QPoint pos) +{ + UBSceneThumbnailNavigPixmap* item = dynamic_cast(itemAt(pos)); + if (item) + { + mDropSource = item; + mDropTarget = item; + + QPixmap pixmap = item->pixmap().scaledToWidth(mThumbnailWidth/2); + + QDrag *drag = new QDrag(this); + drag->setMimeData(new QMimeData()); + drag->setPixmap(pixmap); + drag->setHotSpot(QPoint(pixmap.width()/2, pixmap.height()/2)); + + drag->exec(); + } +} + +void UBDocumentNavigator::dragEnterEvent(QDragEnterEvent *event) +{ + mDropBar->show(); + + if (event->source() == this) + { + event->setDropAction(Qt::MoveAction); + event->accept(); + } + else + { + event->acceptProposedAction(); + } +} + +void UBDocumentNavigator::dragMoveEvent(QDragMoveEvent *event) +{ + QPointF position = event->pos(); + + //autoscroll during drag'n'drop + QPointF scenePos = mapToScene(position.toPoint()); + int thumbnailHeight = mThumbnailWidth / UBSettings::minScreenRatio; + QRectF thumbnailArea(0, scenePos.y() - thumbnailHeight/2, mThumbnailWidth, thumbnailHeight); + + ensureVisible(thumbnailArea); + + UBSceneThumbnailNavigPixmap* item = dynamic_cast(itemAt(position.toPoint())); + if (item) + { + if (item != mDropTarget) + mDropTarget = item; + + qreal scale = item->transform().m11(); + + QPointF itemCenter(item->pos().x() + (item->boundingRect().width()-verticalScrollBar()->width()) * scale, + item->pos().y() + item->boundingRect().height() * scale / 2); + + bool dropAbove = mapToScene(position.toPoint()).y() < itemCenter.y(); + bool movingUp = mDropSource->sceneIndex() > item->sceneIndex(); + qreal y = 0; + + if (movingUp) + { + if (dropAbove) + { + y = item->pos().y() - UBSettings::thumbnailSpacing / 2; + if (mDropBar->y() != y) + mDropBar->setRect(QRectF(item->pos().x(), y, mThumbnailWidth-verticalScrollBar()->width(), 3)); + } + } + else + { + if (!dropAbove) + { + y = item->pos().y() + item->boundingRect().height() * scale + UBSettings::thumbnailSpacing / 2; + if (mDropBar->y() != y) + mDropBar->setRect(QRectF(item->pos().x(), y, mThumbnailWidth-verticalScrollBar()->width(), 3)); + } + } + } + + event->acceptProposedAction(); +} + +void UBDocumentNavigator::dropEvent(QDropEvent *event) +{ + Q_UNUSED(event); + + if (mDropSource->sceneIndex() != mDropTarget->sceneIndex()) + UBApplication::boardController->moveSceneToIndex(mDropSource->sceneIndex(), mDropTarget->sceneIndex()); + + mDropSource = NULL; + mDropTarget = NULL; + + mDropBar->setRect(QRectF()); + mDropBar->hide(); +} diff --git a/src/gui/UBDocumentNavigator.h b/src/gui/UBDocumentNavigator.h index aebcce18..3b68dbd7 100644 --- a/src/gui/UBDocumentNavigator.h +++ b/src/gui/UBDocumentNavigator.h @@ -57,19 +57,29 @@ public: public slots: void onScrollToSelectedPage(int index);// { if (mCrntItem) centerOn(mCrntItem); } void generateThumbnails(UBDocumentContainer* source); - void updateSpecificThumbnail(int iPage); + void updateSpecificThumbnail(int iPage); + + void longPressTimeout(); + void mousePressAndHoldEvent(QPoint pos); protected: virtual void resizeEvent(QResizeEvent *event); virtual void mousePressEvent(QMouseEvent *event); virtual void mouseReleaseEvent(QMouseEvent *event); + virtual void dragEnterEvent(QDragEnterEvent* event); + virtual void dragMoveEvent(QDragMoveEvent* event); + virtual void dropEvent(QDropEvent* event); + +signals: + void mousePressAndHoldEventRequired(QPoint pos); + void moveThumbnailRequired(int from, int to); + private: void refreshScene(); int border(); - /** The scene */ QGraphicsScene* mScene; /** The current selected item */ @@ -84,6 +94,15 @@ private: int mThumbnailMinWidth; /** The selected thumbnail */ UBSceneThumbnailNavigPixmap* mSelectedThumbnail; + + UBSceneThumbnailNavigPixmap* mDropSource; + UBSceneThumbnailNavigPixmap* mDropTarget; + QGraphicsRectItem *mDropBar; + + int mLongPressInterval; + QTimer mLongPressTimer; + QPoint mLastPressedMousePos; }; #endif // UBDOCUMENTNAVIGATOR_H + diff --git a/src/gui/UBDocumentThumbnailWidget.cpp b/src/gui/UBDocumentThumbnailWidget.cpp index 19ad39b1..f700530b 100644 --- a/src/gui/UBDocumentThumbnailWidget.cpp +++ b/src/gui/UBDocumentThumbnailWidget.cpp @@ -150,21 +150,21 @@ void UBDocumentThumbnailWidget::dragMoveEvent(QDragMoveEvent *event) mScrollTimer->stop(); } - QList pixmapItems; + QList pixmapItems; foreach (QGraphicsItem *item, scene()->items(mapToScene(boundingFrame))) { - UBSceneThumbnailPixmap* sceneItem = dynamic_cast(item); + UBThumbnailPixmap* sceneItem = dynamic_cast(item); if (sceneItem) pixmapItems.append(sceneItem); } int minDistance = 0; QGraphicsItem *underlyingItem = itemAt(event->pos()); - mClosestDropItem = dynamic_cast(underlyingItem); + mClosestDropItem = dynamic_cast(underlyingItem); if (!mClosestDropItem) { - foreach (UBSceneThumbnailPixmap *item, pixmapItems) + foreach (UBThumbnailPixmap *item, pixmapItems) { qreal scale = item->transform().m11(); QPointF itemCenter( diff --git a/src/gui/UBDocumentThumbnailWidget.h b/src/gui/UBDocumentThumbnailWidget.h index 617cee13..ba99acdf 100644 --- a/src/gui/UBDocumentThumbnailWidget.h +++ b/src/gui/UBDocumentThumbnailWidget.h @@ -71,7 +71,7 @@ class UBDocumentThumbnailWidget: public UBThumbnailWidget void deleteDropCaret(); QGraphicsRectItem *mDropCaretRectItem; - UBSceneThumbnailPixmap *mClosestDropItem; + UBThumbnailPixmap *mClosestDropItem; bool mDropIsRight; bool mDragEnabled; QTimer* mScrollTimer; diff --git a/src/gui/UBFeaturesWidget.cpp b/src/gui/UBFeaturesWidget.cpp index fe3520c7..444eacff 100644 --- a/src/gui/UBFeaturesWidget.cpp +++ b/src/gui/UBFeaturesWidget.cpp @@ -174,7 +174,9 @@ void UBFeaturesWidget::currentSelected(const QModelIndex ¤t) // } else if (feature.getType() == FEATURE_SEARCH) { // centralWidget->showElement(feature, UBFeaturesCentralWidget::FeaturesWebView); - } else { + } + + else if (UBSettings::settings()->libraryShowDetailsForLocalItems->get().toBool() == true) { centralWidget->showElement(feature, UBFeaturesCentralWidget::FeaturePropertiesList); mActionBar->setCurrentState( IN_PROPERTIES ); } @@ -865,7 +867,6 @@ UBFeatureProperties::UBFeatureProperties( QWidget *parent, const char *name ) : , mpButtonLayout(NULL) , mpAddPageButton(NULL) , mpAddToLibButton(NULL) - , mpSetAsBackgroundButton(NULL) , mpObjInfoLabel(NULL) , mpObjInfos(NULL) , mpThumbnail(NULL) @@ -897,10 +898,6 @@ UBFeatureProperties::UBFeatureProperties( QWidget *parent, const char *name ) : mpAddPageButton->setText(tr("Add to page")); mpButtonLayout->addWidget(mpAddPageButton); - mpSetAsBackgroundButton = new UBFeatureItemButton(); - mpSetAsBackgroundButton->setText(tr("Set as background")); - mpButtonLayout->addWidget(mpSetAsBackgroundButton); - mpAddToLibButton = new UBFeatureItemButton(); mpAddToLibButton->setText(tr("Add to library")); mpButtonLayout->addWidget(mpAddToLibButton); @@ -922,7 +919,6 @@ UBFeatureProperties::UBFeatureProperties( QWidget *parent, const char *name ) : mpLayout->setMargin(0); connect( mpAddPageButton, SIGNAL(clicked()), this, SLOT(onAddToPage()) ); - connect( mpSetAsBackgroundButton, SIGNAL( clicked() ), this, SLOT( onSetAsBackground() ) ); connect( mpAddToLibButton, SIGNAL( clicked() ), this, SLOT(onAddToLib() ) ); } @@ -953,11 +949,6 @@ UBFeatureProperties::~UBFeatureProperties() delete mpAddPageButton; mpAddPageButton = NULL; } - if ( mpSetAsBackgroundButton ) - { - delete mpSetAsBackgroundButton; - mpSetAsBackgroundButton = NULL; - } if ( mpAddToLibButton ) { delete mpAddToLibButton; @@ -1045,26 +1036,10 @@ void UBFeatureProperties::showElement(const UBFeature &elem) if ( UBApplication::isFromWeb( elem.getFullPath().toString() ) ) { mpAddToLibButton->show(); - if( elem.getMetadata()["Type"].toLower().contains("image") ) - { - mpSetAsBackgroundButton->show(); - } - else - { - mpSetAsBackgroundButton->hide(); - } } else { mpAddToLibButton->hide(); - if (UBFileSystemUtils::mimeTypeFromFileName( elem.getFullPath().toLocalFile() ).contains("image")) - { - mpSetAsBackgroundButton->show(); - } - else - { - mpSetAsBackgroundButton->hide(); - } } } diff --git a/src/gui/UBMessageWindow.cpp b/src/gui/UBMessageWindow.cpp index 1d499a98..d973810a 100644 --- a/src/gui/UBMessageWindow.cpp +++ b/src/gui/UBMessageWindow.cpp @@ -42,7 +42,7 @@ UBMessageWindow::UBMessageWindow(QWidget *parent) mLabel = new QLabel(parent); mLabel->setStyleSheet(QString("QLabel { color: white; background-color: transparent; border: none; font-family: Arial; font-size: 14px }")); - mOriginalAlpha = mBackgroundBrush.color().alpha(); + mOriginalAlpha = 255; mLayout->setContentsMargins(radius() + 15, 4, radius() + 15, 4); @@ -79,7 +79,7 @@ void UBMessageWindow::showMessage(const QString& message, bool showSpinningWheel { mSpinningWheel->hide(); mSpinningWheel->stopAnimation(); - mTimer.start(200, this); + mTimer.start(50, this); } adjustSizeAndPosition(); @@ -88,6 +88,7 @@ void UBMessageWindow::showMessage(const QString& message, bool showSpinningWheel repaint(); // I mean it, *right now*, also on Mac qApp->flush(); + //qApp->sendPostedEvents(); } void UBMessageWindow::timerEvent(QTimerEvent *event) diff --git a/src/gui/UBPageNavigationWidget.h b/src/gui/UBPageNavigationWidget.h index 9fe7a388..e72b74f4 100644 --- a/src/gui/UBPageNavigationWidget.h +++ b/src/gui/UBPageNavigationWidget.h @@ -38,6 +38,7 @@ #include #include +#include "UBBoardThumbnailsView.h" #include "UBDocumentNavigator.h" #include "UBDockPaletteWidget.h" #include "document/UBDocumentProxy.h" diff --git a/src/gui/UBThumbnailView.cpp b/src/gui/UBThumbnailView.cpp index c6fc2713..f5f6f3ed 100644 --- a/src/gui/UBThumbnailView.cpp +++ b/src/gui/UBThumbnailView.cpp @@ -34,34 +34,29 @@ #include "core/memcheck.h" -UBThumbnailView::UBThumbnailView() +UBThumbnailView::UBThumbnailView(UBGraphicsScene *scene, QWidget* parent) + : QGraphicsView(scene, parent) + , mHBoxLayout(new QHBoxLayout(this)) { + setAcceptDrops(true); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform | QPainter::TextAntialiasing); -} -UBThumbnailView::~UBThumbnailView() -{ - // NOOP -} + int nominalWidth = scene->nominalSize().width(); + int nominalHeight = scene->nominalSize().height(); + QRectF nominalSceneRect(-nominalWidth/2, -nominalHeight/2, nominalWidth, nominalHeight); + fitInView(nominalSceneRect, Qt::KeepAspectRatio); + setSceneRect(nominalSceneRect); -void UBThumbnailView::drawBackground(QPainter *painter, const QRectF &rect) -{ - // Do not draw crossed background in thumbnails - if (qobject_cast(scene())->isDarkBackground()) - { - painter->fillRect(rect, QBrush(QColor(Qt::black))); - } - else - { - painter->fillRect(rect, QBrush(QColor(Qt::white))); - } -} + setStyleSheet( "QGraphicsView { border-style: none; }" ); -void UBThumbnailView::mouseDoubleClickEvent ( QMouseEvent * event ) -{ - Q_UNUSED(event); - emit doubleClicked(); -} + setFrameStyle(QFrame::Sunken | QFrame::StyledPanel); + //set stylesheet + setObjectName("DockPaletteWidgetBox"); + setStyleSheet("background:white"); + + mHBoxLayout->setAlignment(Qt::AlignHCenter); + setLayout(mHBoxLayout); +} diff --git a/src/gui/UBThumbnailView.h b/src/gui/UBThumbnailView.h index c2f00fb0..3a043c41 100644 --- a/src/gui/UBThumbnailView.h +++ b/src/gui/UBThumbnailView.h @@ -31,6 +31,9 @@ #define UBTHUMBNAILVIEW_H_ #include +#include +#include +#include class UBGraphicsScene; @@ -39,15 +42,15 @@ class UBThumbnailView : public QGraphicsView Q_OBJECT public: - UBThumbnailView(); - virtual ~UBThumbnailView(); - signals: - void doubleClicked(); + UBThumbnailView(UBGraphicsScene *scene, QWidget* parent =0); + virtual ~UBThumbnailView() + { - protected: - virtual void drawBackground(QPainter *painter, const QRectF &rect); - virtual void mouseDoubleClickEvent ( QMouseEvent * event ); + } + + private: + QHBoxLayout* mHBoxLayout; }; diff --git a/src/gui/UBThumbnailWidget.cpp b/src/gui/UBThumbnailWidget.cpp index 95d2b4cf..a21f4546 100644 --- a/src/gui/UBThumbnailWidget.cpp +++ b/src/gui/UBThumbnailWidget.cpp @@ -34,6 +34,8 @@ #include "UBRubberBand.h" #include "UBMainWindow.h" +#include + #include "board/UBBoardController.h" #include "core/UBSettings.h" @@ -42,6 +44,8 @@ #include "document/UBDocumentProxy.h" #include "document/UBDocumentController.h" +#include "board/UBBoardPaletteManager.h" + #include "core/memcheck.h" UBThumbnailWidget::UBThumbnailWidget(QWidget* parent) @@ -225,7 +229,7 @@ void UBThumbnailWidget::mousePressEvent(QMouseEvent *event) mClickTime = QTime::currentTime(); mMousePressPos = event->pos(); - UBSceneThumbnailPixmap* sceneItem = dynamic_cast(itemAt(mMousePressPos)); + UBThumbnailPixmap* sceneItem = dynamic_cast(itemAt(mMousePressPos)); if(sceneItem==NULL) { event->ignore(); @@ -359,7 +363,7 @@ void UBThumbnailWidget::mouseMoveEvent(QMouseEvent *event) { if (lassoSelectedItem) { - UBSceneThumbnailPixmap *thumbnailItem = dynamic_cast(lassoSelectedItem); + UBThumbnailPixmap *thumbnailItem = dynamic_cast(lassoSelectedItem); if (thumbnailItem) lassoSelectedThumbnailItems += lassoSelectedItem; } @@ -385,7 +389,7 @@ void UBThumbnailWidget::mouseMoveEvent(QMouseEvent *event) { if (lassoSelectedItem) { - UBSceneThumbnailPixmap *thumbnailItem = dynamic_cast(lassoSelectedItem); + UBThumbnailPixmap *thumbnailItem = dynamic_cast(lassoSelectedItem); if (thumbnailItem) lassoSelectedThumbnailItems += lassoSelectedItem; @@ -767,7 +771,6 @@ UBThumbnail::~UBThumbnail() delete mSelectionItem; } - UBSceneThumbnailNavigPixmap::UBSceneThumbnailNavigPixmap(const QPixmap& pix, UBDocumentProxy* proxy, int pSceneIndex) : UBSceneThumbnailPixmap(pix, proxy, pSceneIndex) , bButtonsVisible(false) @@ -824,14 +827,14 @@ void UBSceneThumbnailNavigPixmap::paint(QPainter *painter, const QStyleOptionGra painter->drawPixmap(BUTTONSIZE + BUTTONSPACING, 0, BUTTONSIZE, BUTTONSIZE, QPixmap(":images/duplicate.svg")); - if(bCanMoveUp) - painter->drawPixmap(2*(BUTTONSIZE + BUTTONSPACING), 0, BUTTONSIZE, BUTTONSIZE, QPixmap(":images/moveUp.svg")); - else - painter->drawPixmap(2*(BUTTONSIZE + BUTTONSPACING), 0, BUTTONSIZE, BUTTONSIZE, QPixmap(":images/moveUpDisabled.svg")); - if(bCanMoveDown) - painter->drawPixmap(3*(BUTTONSIZE + BUTTONSPACING), 0, BUTTONSIZE, BUTTONSIZE, QPixmap(":images/menu.svg")); - else - painter->drawPixmap(3*(BUTTONSIZE + BUTTONSPACING), 0, BUTTONSIZE, BUTTONSIZE, QPixmap(":images/menuDisabled.svg")); +// if(bCanMoveUp) +// painter->drawPixmap(2*(BUTTONSIZE + BUTTONSPACING), 0, BUTTONSIZE, BUTTONSIZE, QPixmap(":images/moveUp.svg")); +// else +// painter->drawPixmap(2*(BUTTONSIZE + BUTTONSPACING), 0, BUTTONSIZE, BUTTONSIZE, QPixmap(":images/moveUpDisabled.svg")); +// if(bCanMoveDown) +// painter->drawPixmap(3*(BUTTONSIZE + BUTTONSPACING), 0, BUTTONSIZE, BUTTONSIZE, QPixmap(":images/menu.svg")); +// else +// painter->drawPixmap(3*(BUTTONSIZE + BUTTONSPACING), 0, BUTTONSIZE, BUTTONSIZE, QPixmap(":images/menuDisabled.svg")); } } @@ -845,10 +848,10 @@ void UBSceneThumbnailNavigPixmap::mousePressEvent(QGraphicsSceneMouseEvent *even if(p.x() >= BUTTONSIZE + BUTTONSPACING && p.x() <= 2*BUTTONSIZE + BUTTONSPACING && p.y() >= 0 && p.y() <= BUTTONSIZE) duplicatePage(); - if(bCanMoveUp && p.x() >= 2*(BUTTONSIZE + BUTTONSPACING) && p.x() <= 3*BUTTONSIZE + 2*BUTTONSPACING && p.y() >= 0 && p.y() <= BUTTONSIZE) - moveUpPage(); - if(bCanMoveDown && p.x() >= 3*(BUTTONSIZE + BUTTONSPACING) && p.x() <= 4*BUTTONSIZE + 3*BUTTONSPACING && p.y() >= 0 && p.y() <= BUTTONSIZE) - moveDownPage(); +// if(bCanMoveUp && p.x() >= 2*(BUTTONSIZE + BUTTONSPACING) && p.x() <= 3*BUTTONSIZE + 2*BUTTONSPACING && p.y() >= 0 && p.y() <= BUTTONSIZE) +// moveUpPage(); +// if(bCanMoveDown && p.x() >= 3*(BUTTONSIZE + BUTTONSPACING) && p.x() <= 4*BUTTONSIZE + 3*BUTTONSPACING && p.y() >= 0 && p.y() <= BUTTONSIZE) +// moveDownPage(); event->accept(); } @@ -877,6 +880,7 @@ void UBSceneThumbnailNavigPixmap::moveDownPage() UBApplication::boardController->moveSceneToIndex(sceneIndex(), sceneIndex() + 1); } + void UBImgTextThumbnailElement::Place(int row, int col, qreal width, qreal height) { int labelSpacing = 0; @@ -908,8 +912,11 @@ void UBImgTextThumbnailElement::Place(int row, int col, qreal width, qreal heigh pix->setRow(row); } - QPointF pos(border + (width - w * scaleFactor) / 2 + col * (width + border), - border + row * (height + border + labelSpacing) + (height - h * scaleFactor) / 2); + QPointF pos((width - w * scaleFactor) / 2, + row * (height + labelSpacing) + (height - h * scaleFactor) / 2); + + /*QPointF pos(border + (width - w * scaleFactor) / 2 + col * (width + border), + border + row * (height + border + labelSpacing) + (height - h * scaleFactor) / 2);*/ this->thumbnail->setPos(pos); @@ -922,8 +929,227 @@ void UBImgTextThumbnailElement::Place(int row, int col, qreal width, qreal heigh this->caption->setWidth(fm.width(elidedText) + 2 * this->caption->document()->documentMargin()); pos.setY(pos.y() + (height + h * scaleFactor) / 2 + 5); // What is this 5 ?? qreal labelWidth = fm.width(elidedText); - pos.setX(border + (width - labelWidth) / 2 + col * (width + border)); + pos.setX((width - labelWidth) / 2 + col * (width + border)); this->caption->setPos(pos); } } } + +void UBDraggableThumbnail::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) +{ + QGraphicsProxyWidget::paint(painter, option, widget); + using namespace UBThumbnailUI; + + if (editable()) + { + if(deletable()) + draw(painter, *getIcon("close")); + else + draw(painter, *getIcon("closeDisabled")); + + draw(painter, *getIcon("duplicate")); + + /* + if(movableUp()) + draw(painter, *getIcon("moveUp")); + else + draw(painter, *getIcon("moveUpDisabled")); + + if(movableDown()) + draw(painter, *getIcon("moveDown")); + else + draw(painter, *getIcon("moveDownDisabled")); + */ + + } +} + +void UBDraggableThumbnail::hoverEnterEvent(QGraphicsSceneHoverEvent *event) +{ + event->accept(); + showUI(); + update(); +} + +void UBDraggableThumbnail::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) +{ + event->accept(); + hideUI(); + update(); +} + +void UBDraggableThumbnail::deletePage() +{ + if(UBApplication::mainWindow->yesNoQuestion(QObject::tr("Remove Page"), QObject::tr("Are you sure you want to remove 1 page from the selected document '%0'?").arg(UBApplication::documentController->selectedDocument()->metaData(UBSettings::documentName).toString()))){ + UBApplication::boardController->deleteScene(sceneIndex()); + } +} + +void UBDraggableThumbnail::duplicatePage() +{ + UBApplication::boardController->duplicateScene(sceneIndex()); +} + +void UBDraggableThumbnail::moveUpPage() +{ + if (sceneIndex()!=0) + UBApplication::boardController->moveSceneToIndex(sceneIndex(), sceneIndex() - 1); +} + +void UBDraggableThumbnail::moveDownPage() +{ + if (sceneIndex() < UBApplication::boardController->selectedDocument()->pageCount()-1) + UBApplication::boardController->moveSceneToIndex(sceneIndex(), sceneIndex() + 1); +} + +void UBDraggableThumbnail::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ + QPointF p = event->pos(); + + using namespace UBThumbnailUI; + + if (triggered(p.y())) + { + if(deletable() && getIcon("close")->triggered(p.x())) + { + event->accept(); + deletePage(); + } + else if(getIcon("duplicate")->triggered(p.x())) + { + event->accept(); + duplicatePage(); + } + else + { + event->ignore(); + } + /* + else if(movableUp() && getIcon("moveUp")->triggered(p.x())) + moveUpPage(); + else if (movableDown() && getIcon("moveDown")->triggered(p.x())) + moveDownPage();*/ + } + else + { + event->ignore(); + } +} + +void UBDraggableThumbnail::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) +{ + event->accept(); +} + + +void UBDraggableThumbnail::updatePos(qreal width, qreal height) +{ + QFontMetrics fm(mPageNumber->font()); + int labelSpacing = UBSettings::thumbnailSpacing + fm.height(); + + int w = boundingRect().width(); + int h = boundingRect().height(); + + qreal scaledWidth = width / w; + qreal scaledHeight = height / h; + qreal scaledFactor = qMin(scaledWidth, scaledHeight); + + QTransform transform; + transform.scale(scaledFactor, scaledFactor); + + // Apply the scaling + setTransform(transform); + setFlag(QGraphicsItem::ItemIsSelectable, true); + + QPointF position((width - w * scaledFactor) / 2, + sceneIndex() * (height + labelSpacing) + (height - h * scaledFactor) / 2); + + setPos(position); + + position.setY(position.y() + (height + h * scaledFactor) / 2); + position.setX(position.x() + (w * scaledFactor - fm.width(mPageNumber->toPlainText())) / 2); + + mPageNumber->setPos(position); +} + +void UBDraggableThumbnailPixmap::updatePos(qreal width, qreal height) +{ + QFontMetrics fm(mPageNumber->font()); + int labelSpacing = UBSettings::thumbnailSpacing + fm.height(); + + int w = thumbnailPixmap()->boundingRect().width(); + int h = thumbnailPixmap()->boundingRect().height(); + + qreal scaledWidth = width / w; + qreal scaledHeight = height / h; + qreal scaledFactor = qMin(scaledWidth, scaledHeight); + + QTransform transform; + transform.scale(scaledFactor, scaledFactor); + + // Apply the scaling + thumbnailPixmap()->setTransform(transform); + thumbnailPixmap()->setFlag(QGraphicsItem::ItemIsSelectable, true); + + QPointF position((width - w * scaledFactor) / 2, + sceneIndex() * (height + labelSpacing) + (height - h * scaledFactor) / 2); + + thumbnailPixmap()->setPos(position); + + position.setY(position.y() + (height + h * scaledFactor) / 2); + position.setX(position.x() + (w * scaledFactor - fm.width(mPageNumber->toPlainText())) / 2); + + mPageNumber->setPos(position); +} + + +UBThumbnailUI::UBThumbnailUIIcon* UBThumbnailUI::addIcon(const QString& thumbnailIcon, int pos) +{ + QString thumbnailIconPath = ":images/" + thumbnailIcon + ".svg"; + UBThumbnailUIIcon* newIcon = new UBThumbnailUIIcon(thumbnailIconPath, pos); + + using namespace UBThumbnailUI::_private; + if (!newIcon) + qDebug() << "cannot add Icon : check path : " + thumbnailIconPath; + else + catalog.insert(thumbnailIcon, newIcon); + + return newIcon; +} + +UBThumbnailUI::UBThumbnailUIIcon* UBThumbnailUI::getIcon(const QString& thumbnailIcon) +{ + using namespace UBThumbnailUI::_private; + if (!catalog.contains(thumbnailIcon)) + qDebug() << "cannot get Icon: check path ':images/" + thumbnailIcon + ".svg'"; + + return catalog.value(thumbnailIcon, NULL); +} + +void UBThumbnailUI::draw(QPainter *painter, const UBThumbnailUIIcon &thumbnailIcon) +{ + using namespace UBThumbnailUI; + painter->drawPixmap(thumbnailIcon.pos() * (ICONSIZE + ICONSPACING), 0, ICONSIZE, ICONSIZE, thumbnailIcon); +} + +void UBThumbnailUI::_private::initCatalog() +{ + using namespace UBThumbnailUI; + using namespace UBThumbnailUI::_private; + + addIcon("close", 0); + addIcon("closeDisabled", 0); + + addIcon("duplicate", 1); + + addIcon("moveUp", 2); + addIcon("moveUpDisabled", 2); + + addIcon("moveDown", 3); + addIcon("moveDownDisabled", 3); +} + +bool UBThumbnailUI::triggered(qreal y) +{ + return (y >= 0 && y <= UBThumbnailUI::ICONSIZE); +} diff --git a/src/gui/UBThumbnailWidget.h b/src/gui/UBThumbnailWidget.h index 8d9770ab..75b025b2 100644 --- a/src/gui/UBThumbnailWidget.h +++ b/src/gui/UBThumbnailWidget.h @@ -35,13 +35,21 @@ #include #include +#include "core/UBApplication.h" +#include "board/UBBoardController.h" #include "frameworks/UBCoreGraphicsScene.h" #include "core/UBSettings.h" #include "domain/UBItem.h" +#include "gui/UBThumbnailView.h" +#include "document/UBDocumentProxy.h" + +#include +#include + #define STARTDRAGTIME 1000000 -#define BUTTONSIZE 48 -#define BUTTONSPACING 5 +#define BUTTONSIZE 96 +#define BUTTONSPACING 10 class UBDocumentProxy; class UBThumbnailTextItem; @@ -135,7 +143,6 @@ class UBThumbnailWidget : public QGraphicsView QTime mClickTime; }; - class UBThumbnail { public: @@ -190,6 +197,8 @@ class UBThumbnail void setColumn(int column) { mColumn = column; } int row() { return mRow; } void setRow(int row) { mRow = row; } + UBThumbnailTextItem *label(){return mLabel;} + void setLabel(UBThumbnailTextItem *label){mLabel = label;} protected: QGraphicsRectItem *mSelectionItem; @@ -198,38 +207,75 @@ class UBThumbnail int mColumn; int mRow; + UBThumbnailTextItem *mLabel; }; - -class UBThumbnailSvg : public QGraphicsSvgItem, public UBThumbnail +class UBThumbnailTextItem : public QGraphicsTextItem { + Q_OBJECT public: - UBThumbnailSvg(const QString& path) - : QGraphicsSvgItem(path) + UBThumbnailTextItem(int index) + : QGraphicsTextItem(tr("Page %0").arg(index+1)) + , mWidth(0) + , mUnelidedText(toPlainText()) + , mIsHighlighted(false) + { + + } + + UBThumbnailTextItem(const QString& text) + : QGraphicsTextItem(text) + , mWidth(0) + , mUnelidedText(text) + , mIsHighlighted(false) { setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); } - virtual ~UBThumbnailSvg() + QRectF boundingRect() const { return QRectF(QPointF(0.0, 0.0), QSize(mWidth, QFontMetricsF(font()).height() + 5));} + + void setWidth(qreal pWidth) { - // NOOP + if (mWidth != pWidth) + { + prepareGeometryChange(); + mWidth = pWidth; + computeText(); + } } - virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) + qreal width() {return mWidth;} + + void highlight() { - QStyleOptionGraphicsItem styleOption = UBThumbnail::muteStyleOption(option); - QGraphicsSvgItem::paint(painter, &styleOption, widget); + if (!mIsHighlighted) + { + mIsHighlighted = true; + computeText(); + } } - virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value) + void computeText() { - UBThumbnail::itemChange(this, change, value); - return QGraphicsSvgItem::itemChange(change, value); + QFontMetricsF fm(font()); + QString elidedText = fm.elidedText(mUnelidedText, Qt::ElideRight, mWidth); + + if (mIsHighlighted) + { + setHtml("" + elidedText + ""); + } + else + { + setPlainText(elidedText); + } } + private: + qreal mWidth; + QString mUnelidedText; + bool mIsHighlighted; }; - class UBThumbnailPixmap : public QGraphicsPixmapItem, public UBThumbnail { public: @@ -267,7 +313,6 @@ class UBThumbnailPixmap : public QGraphicsPixmapItem, public UBThumbnail } }; - class UBSceneThumbnailPixmap : public UBThumbnailPixmap { public: @@ -328,111 +373,264 @@ class UBSceneThumbnailNavigPixmap : public UBSceneThumbnailPixmap bool bCanMoveDown; }; -class UBThumbnailVideo : public UBThumbnailPixmap +class UBImgTextThumbnailElement +{ +private: + UBSceneThumbnailNavigPixmap* thumbnail; + UBThumbnailTextItem* caption; + int border; + +public: + UBImgTextThumbnailElement(UBSceneThumbnailNavigPixmap* thumb, UBThumbnailTextItem* text): border(0) + { + this->thumbnail = thumb; + this->caption = text; + } + + UBSceneThumbnailNavigPixmap* getThumbnail() const { return this->thumbnail; } + void setThumbnail(UBSceneThumbnailNavigPixmap* newGItem) { this->thumbnail = newGItem; } + + UBThumbnailTextItem* getCaption() const { return this->caption; } + void setCaption(UBThumbnailTextItem* newcaption) { this->caption = newcaption; } + + void Place(int row, int col, qreal width, qreal height); + + int getBorder() const { return this->border; } + void setBorder(int newBorder) { this->border = newBorder; } +}; + +class UBThumbnailProxyWidget : public QGraphicsProxyWidget { public: - UBThumbnailVideo(const QUrl &path) - : UBThumbnailPixmap(QPixmap(":/images/movie.svg")) - , mPath(path) + UBThumbnailProxyWidget(UBDocumentProxy* proxy, int index) + : mDocumentProxy(proxy) + , mSceneIndex(index) { - // NOOP + } - virtual ~UBThumbnailVideo() + UBDocumentProxy* documentProxy() { - // NOOP + return mDocumentProxy; } - QUrl path() + void setSceneIndex(int i) { - return mPath; + mSceneIndex = i; } - private: + int sceneIndex() + { + return mSceneIndex; + } - QUrl mPath; +private: + UBDocumentProxy* mDocumentProxy; + int mSceneIndex; }; -class UBThumbnailTextItem : public QGraphicsTextItem +class UBDraggableThumbnail : public UBThumbnailProxyWidget { public: - UBThumbnailTextItem(const QString& text) - : QGraphicsTextItem(text) - , mUnelidedText(text) - , mIsHighlighted(false) + UBDraggableThumbnail(UBDocumentProxy* documentProxy, int index) + : UBThumbnailProxyWidget(documentProxy, index) + , mPageNumber(new UBThumbnailTextItem(index)) + , mEditable(false) { - setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); + } - QRectF boundingRect() const { return QRectF(QPointF(0.0, 0.0), QSize(mWidth, QFontMetricsF(font()).height() + 5));} + ~UBDraggableThumbnail() + { + delete mPageNumber; // not a child of "this" QObject so it has to be deleted manually + } - void setWidth(qreal pWidth) + bool editable() { - if (mWidth != pWidth) - { - prepareGeometryChange(); - mWidth = pWidth; - computeText(); - } - }; + return mEditable; + } - qreal width() {return mWidth;} + bool deletable() + { + return documentProxy()->pageCount() > 1; + } - void highlight() + bool movableUp() { - if (!mIsHighlighted) - { - mIsHighlighted = true; - computeText(); - } + return sceneIndex() > 0; } - void computeText() + bool movableDown() { - QFontMetricsF fm(font()); - QString elidedText = fm.elidedText(mUnelidedText, Qt::ElideRight, mWidth); + return sceneIndex() < (documentProxy()->pageCount() -1); + } - if (mIsHighlighted) - { - setHtml("" + elidedText + ""); - } + void showUI() + { + setEditable(true); + } + + void hideUI() + { + setEditable(false); + } + + void setEditable(bool editable) + { + mEditable = editable; + } + + UBThumbnailTextItem* pageNumber() + { + return mPageNumber; + } + + void setPageNumber(int i) + { + mPageNumber->setPlainText(tr("Page %0").arg(i+1)); + + if (UBApplication::boardController->activeSceneIndex() == i) + mPageNumber->setHtml("" + tr("Page %0").arg(i+1) + ""); else - { - setPlainText(elidedText); - } + mPageNumber->setHtml("" + tr("Page %0").arg(i+1) + ""); } + virtual void updatePos(qreal w, qreal h); + + protected: + void hoverEnterEvent(QGraphicsSceneHoverEvent *event); + void hoverLeaveEvent(QGraphicsSceneHoverEvent *event); + void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); + void mousePressEvent(QGraphicsSceneMouseEvent *event); + void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); + + UBThumbnailTextItem* mPageNumber; private: - qreal mWidth; - QString mUnelidedText; - bool mIsHighlighted; + void deletePage(); + void duplicatePage(); + void moveUpPage(); + void moveDownPage(); + + bool mEditable; }; -class UBImgTextThumbnailElement +class UBDraggableThumbnailPixmap : public UBDraggableThumbnail { -private: - UBSceneThumbnailNavigPixmap* thumbnail; - UBThumbnailTextItem* caption; - int border; + Q_OBJECT + public: + UBDraggableThumbnailPixmap(UBThumbnailPixmap* thumbnailPixmap, UBDocumentProxy* documentProxy, int index) + : UBDraggableThumbnail(documentProxy, index) + , mThumbnailPixmap(thumbnailPixmap) + { + setFlag(QGraphicsItem::ItemIsSelectable, true); + setAcceptDrops(true); + } -public: - UBImgTextThumbnailElement(UBSceneThumbnailNavigPixmap* thumb, UBThumbnailTextItem* text): border(0) - { - this->thumbnail = thumb; - this->caption = text; - } + ~UBDraggableThumbnailPixmap() + { - UBSceneThumbnailNavigPixmap* getThumbnail() const { return this->thumbnail; } - void setThumbnail(UBSceneThumbnailNavigPixmap* newGItem) { this->thumbnail = newGItem; } + } - UBThumbnailTextItem* getCaption() const { return this->caption; } - void setCaption(UBThumbnailTextItem* newcaption) { this->caption = newcaption; } + UBThumbnailPixmap* thumbnailPixmap() + { + return mThumbnailPixmap; + } - void Place(int row, int col, qreal width, qreal height); + void updatePos(qreal w, qreal h); - int getBorder() const { return this->border; } - void setBorder(int newBorder) { this->border = newBorder; } + private: + UBThumbnailPixmap* mThumbnailPixmap; }; +class UBDraggableThumbnailView : public UBDraggableThumbnail +{ + Q_OBJECT + public: + UBDraggableThumbnailView(UBThumbnailView* thumbnailView, UBDocumentProxy* documentProxy, int index) + : UBDraggableThumbnail(documentProxy, index) + , mThumbnailView(thumbnailView) + { + setFlag(QGraphicsItem::ItemIsSelectable, true); + setWidget(mThumbnailView); + setAcceptDrops(true); + } + + ~UBDraggableThumbnailView() + { + delete mPageNumber; // not a child of "this" QObject so it has to be deleted manually + } + + UBThumbnailView* thumbnailView() + { + return mThumbnailView; + } + + UBThumbnailTextItem* pageNumber() + { + return mPageNumber; + } + + void setPageNumber(int i) + { + mPageNumber->setPlainText(tr("Page %0").arg(i+1)); + + if (UBApplication::boardController->activeSceneIndex() == i) + mPageNumber->setHtml("" + tr("Page %0").arg(i+1) + ""); + else + mPageNumber->setHtml("" + tr("Page %0").arg(i+1) + ""); + } + + private: + UBThumbnailView* mThumbnailView; +}; + +namespace UBThumbnailUI +{ + const int ICONSIZE = 96; + const int ICONSPACING = 10; + + class UBThumbnailUIIcon : public QPixmap + { + public: + + UBThumbnailUIIcon(const QString& filename, int pos) + : QPixmap(QSize(ICONSIZE, ICONSIZE)) + , mPos(pos) + { + QSvgRenderer svgRenderer(filename); + QPainter painter; + fill(Qt::transparent); + painter.begin(this); + svgRenderer.render(&painter); + painter.end(); + } + + int pos() const + { + return mPos; + } + + bool triggered(qreal x) const + { + using namespace UBThumbnailUI; + return (x >= pos()*(ICONSIZE + ICONSPACING) && x <= (pos()+1)*ICONSIZE + pos()*ICONSPACING); + } + + private: + int mPos; + }; + + namespace _private + { + //do not use this directly + static QMap catalog; + void initCatalog(); + } + + UBThumbnailUIIcon* addIcon(const QString& thumbnailIcon, int pos); + UBThumbnailUIIcon* getIcon(const QString& thumbnailIcon); + void draw(QPainter* painter, const UBThumbnailUIIcon& thumbnailIcon); + bool triggered(qreal y); +} #endif /* UBTHUMBNAILWIDGET_H_ */ diff --git a/src/gui/gui.pri b/src/gui/gui.pri index 38f5f654..fe59b318 100644 --- a/src/gui/gui.pri +++ b/src/gui/gui.pri @@ -24,7 +24,6 @@ HEADERS += src/gui/UBThumbnailView.h \ src/gui/UBActionPalette.h \ src/gui/UBFavoriteToolPalette.h \ src/gui/UBKeyboardPalette.h \ - src/gui/UBDocumentNavigator.h \ src/gui/UBDockPalette.h \ src/gui/UBPropertyPalette.h \ src/gui/UBUpdateDlg.h \ @@ -40,7 +39,10 @@ HEADERS += src/gui/UBThumbnailView.h \ src/gui/UBFeaturesActionBar.h \ src/gui/UBMessagesDialog.h \ src/gui/UBOpenSankoreImporterWidget.h \ - src/gui/UBStartupHintsPalette.h + src/gui/UBStartupHintsPalette.h \ + src/gui/UBBackgroundPalette.h \ + src/gui/UBBoardThumbnailsView.h \ + src/gui/UBDocumentNavigator.h SOURCES += src/gui/UBThumbnailView.cpp \ src/gui/UBFloatingPalette.cpp \ src/gui/UBToolbarButtonGroup.cpp \ @@ -67,7 +69,6 @@ SOURCES += src/gui/UBThumbnailView.cpp \ src/gui/UBActionPalette.cpp \ src/gui/UBFavoriteToolPalette.cpp \ src/gui/UBKeyboardPalette.cpp \ - src/gui/UBDocumentNavigator.cpp \ src/gui/UBDockPalette.cpp \ src/gui/UBPropertyPalette.cpp \ src/gui/UBUpdateDlg.cpp \ @@ -83,7 +84,10 @@ SOURCES += src/gui/UBThumbnailView.cpp \ src/gui/UBFeaturesActionBar.cpp \ src/gui/UBMessagesDialog.cpp \ src/gui/UBOpenSankoreImporterWidget.cpp \ - src/gui/UBStartupHintsPalette.cpp + src/gui/UBStartupHintsPalette.cpp \ + src/gui/UBBackgroundPalette.cpp \ + src/gui/UBBoardThumbnailsView.cpp \ + src/gui/UBDocumentNavigator.cpp win32:SOURCES += src/gui/UBKeyboardPalette_win.cpp macx:OBJECTIVE_SOURCES += src/gui/UBKeyboardPalette_mac.mm linux-g++:SOURCES += src/gui/UBKeyboardPalette_linux.cpp diff --git a/src/podcast/UBPodcastController.cpp b/src/podcast/UBPodcastController.cpp index 598b5135..efe22027 100644 --- a/src/podcast/UBPodcastController.cpp +++ b/src/podcast/UBPodcastController.cpp @@ -64,6 +64,9 @@ #elif defined(Q_OS_OSX) #include "quicktime/UBQuickTimeVideoEncoder.h" #include "quicktime/UBAudioQueueRecorder.h" +#elif defined(Q_OS_LINUX) + #include "ffmpeg/UBFFmpegVideoEncoder.h" + #include "ffmpeg/UBMicrophoneInput.h" #endif #include "core/memcheck.h" @@ -309,6 +312,8 @@ void UBPodcastController::start() mVideoEncoder = new UBWindowsMediaVideoEncoder(this); //deleted on stop #elif defined(Q_OS_OSX) mVideoEncoder = new UBQuickTimeVideoEncoder(this); //deleted on stop +#elif defined(Q_OS_LINUX) + mVideoEncoder = new UBFFmpegVideoEncoder(this); #endif if (mVideoEncoder) @@ -804,6 +809,8 @@ QStringList UBPodcastController::audioRecordingDevices() devices = UBWaveRecorder::waveInDevices(); #elif defined(Q_OS_OSX) devices = UBAudioQueueRecorder::waveInDevices(); +#elif defined(Q_OS_LINUX) + devices = UBMicrophoneInput::availableDevicesNames(); #endif return devices; diff --git a/src/podcast/ffmpeg/UBFFmpegVideoEncoder.cpp b/src/podcast/ffmpeg/UBFFmpegVideoEncoder.cpp new file mode 100644 index 00000000..320464dd --- /dev/null +++ b/src/podcast/ffmpeg/UBFFmpegVideoEncoder.cpp @@ -0,0 +1,751 @@ +/* + * Copyright (C) 2015-2016 Département de l'Instruction Publique (DIP-SEM) + * + * This file is part of OpenBoard. + * + * OpenBoard is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3 of the License, + * with a specific linking exception for the OpenSSL project's + * "OpenSSL" library (or with modified versions of it that use the + * same license as the "OpenSSL" library). + * + * OpenBoard is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenBoard. If not, see . + */ + +#include "UBFFmpegVideoEncoder.h" + +// Due to the whole FFmpeg / libAV silliness, we have to support libavresample instead +// of libswresapmle on some platforms, as well as now-obsolete function names +#if LIBAVFORMAT_VERSION_MICRO < 100 + #define swr_alloc avresample_alloc_context + #define swr_init avresample_open + #define swr_get_out_samples avresample_get_out_samples + #define swr_free avresample_free + #define av_opt_set_sample_fmt av_opt_set_int + + #define av_frame_alloc avcodec_alloc_frame + #define av_frame_free avcodec_free_frame + #define av_packet_unref av_free_packet + + #define AV_ERROR_MAX_STRING_SIZE 64 + #define AV_CODEC_FLAG_GLOBAL_HEADER (1 << 22) + + uint8_t* audio_samples_buffer; // used by processAudio because av_frame_get_buffer doesn't exist in this version + + int avformat_alloc_output_context2(AVFormatContext **avctx, AVOutputFormat *oformat, + const char *format, const char *filename) + { + AVFormatContext *s = avformat_alloc_context(); + int ret = 0; + + *avctx = NULL; + if (!s) + goto nomem; + + if (!oformat) { + if (format) { + oformat = av_guess_format(format, NULL, NULL); + if (!oformat) { + av_log(s, AV_LOG_ERROR, "Requested output format '%s' is not a suitable output format\n", format); + ret = AVERROR(EINVAL); + goto error; + } + } else { + oformat = av_guess_format(NULL, filename, NULL); + if (!oformat) { + ret = AVERROR(EINVAL); + av_log(s, AV_LOG_ERROR, "Unable to find a suitable output format for '%s'\n", + filename); + goto error; + } + } + } + + s->oformat = oformat; + if (s->oformat->priv_data_size > 0) { + s->priv_data = av_mallocz(s->oformat->priv_data_size); + if (!s->priv_data) + goto nomem; + if (s->oformat->priv_class) { + *(const AVClass**)s->priv_data= s->oformat->priv_class; + av_opt_set_defaults(s->priv_data); + } + } else + s->priv_data = NULL; + + if (filename) + av_strlcpy(s->filename, filename, sizeof(s->filename)); + + *avctx = s; + return 0; + + nomem: + av_log(s, AV_LOG_ERROR, "Out of memory\n"); + ret = AVERROR(ENOMEM); + error: + avformat_free_context(s); + return ret; + } + + + int av_samples_alloc_array_and_samples(uint8_t ***audio_data, int *linesize, int nb_channels, + int nb_samples, enum AVSampleFormat sample_fmt, int align) + { + int ret, nb_planes = av_sample_fmt_is_planar(sample_fmt) ? nb_channels : 1; + + *audio_data = (uint8_t**) av_malloc(sizeof(*audio_data) * nb_planes); + if (!*audio_data) + return AVERROR(ENOMEM); + ret = av_samples_alloc(*audio_data, linesize, nb_channels, + nb_samples, sample_fmt, align); + if (ret < 0) + av_freep(audio_data); + return ret; + } + + int swr_convert(struct SwrContext *s, uint8_t **out, int out_count, const uint8_t **in, int in_count) + { + return avresample_convert(s, out, 0, out_count, const_cast(in), 0, in_count); + } + + +#endif + +#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(55,55,0) + void av_packet_rescale_ts(AVPacket *pkt, AVRational src_tb, AVRational dst_tb) + { + if (pkt->pts != AV_NOPTS_VALUE) + pkt->pts = av_rescale_q(pkt->pts, src_tb, dst_tb); + if (pkt->dts != AV_NOPTS_VALUE) + pkt->dts = av_rescale_q(pkt->dts, src_tb, dst_tb); + if (pkt->duration > 0) + pkt->duration = av_rescale_q(pkt->duration, src_tb, dst_tb); + if (pkt->convergence_duration > 0) + pkt->convergence_duration = av_rescale_q(pkt->convergence_duration, src_tb, dst_tb); + } +#endif + +#if defined(LIBAVRESAMPLE_VERSION_INT) && LIBAVRESAMPLE_VERSION_INT < AV_VERSION_INT(1,3,0) + //#include + int avresample_get_out_samples(AVAudioResampleContext *avr, int in_nb_samples) + { + int64_t samples = avresample_get_delay(avr) + (int64_t)in_nb_samples; + /* + if (avr->resample_needed) { + samples = av_rescale_rnd(samples, + avr->out_sample_rate, + avr->in_sample_rate, + AV_ROUND_UP); + } + */ + samples += avresample_available(avr); + if (samples > INT_MAX) + return AVERROR(EINVAL); + return samples; + } + +#endif + +//------------------------------------------------------------------------- +// Utility functions +//------------------------------------------------------------------------- + +QString avErrorToQString(int errnum) +{ + char error[AV_ERROR_MAX_STRING_SIZE]; + av_strerror(errnum, error, AV_ERROR_MAX_STRING_SIZE); + + return QString(error); +} + +/** + * @brief Write a given frame to the audio stream or, if a null frame is passed, flush the stream. + * + * @param frame An AVFrame to be written to the stream, or NULL to flush the stream + * @param packet A (reusable) packet, used to temporarily store frame data + * @param stream The stream to write to + * @param outputFormatContext The output format context + */ +void writeFrame(AVFrame *frame, AVPacket *packet, AVStream *stream, AVFormatContext *outputFormatContext) +{ + int gotOutput, ret; + + av_init_packet(packet); + + do { + if (stream->codec->codec_type == AVMEDIA_TYPE_AUDIO) + ret = avcodec_encode_audio2(stream->codec, packet, frame, &gotOutput); + else + ret = avcodec_encode_video2(stream->codec, packet, frame, &gotOutput); + + if (ret < 0) + qWarning() << "Couldn't encode audio frame: " << avErrorToQString(ret); + + else if (gotOutput) { + AVRational codecTimebase = stream->codec->time_base; + AVRational streamVideoTimebase = stream->time_base; + + av_packet_rescale_ts(packet, codecTimebase, streamVideoTimebase); + packet->stream_index = stream->index; + + av_interleaved_write_frame(outputFormatContext, packet); + av_packet_unref(packet); + } + + } while (gotOutput && !frame); +} + +void flushStream(AVPacket *packet, AVStream *stream, AVFormatContext *outputFormatContext) +{ + writeFrame(NULL, packet, stream, outputFormatContext); +} + +//------------------------------------------------------------------------- +// UBFFmpegVideoEncoder +//------------------------------------------------------------------------- + +UBFFmpegVideoEncoder::UBFFmpegVideoEncoder(QObject* parent) + : UBAbstractVideoEncoder(parent) + , mOutputFormatContext(NULL) + , mSwsContext(NULL) + , mShouldRecordAudio(true) + , mAudioInput(NULL) + , mSwrContext(NULL) + , mAudioOutBuffer(NULL) + , mAudioSampleRate(44100) + , mAudioFrameCount(0) +{ + + mVideoTimebase = 100 * framesPerSecond(); + + mVideoEncoderThread = new QThread; + mVideoWorker = new UBFFmpegVideoEncoderWorker(this); + mVideoWorker->moveToThread(mVideoEncoderThread); + + connect(mVideoWorker, SIGNAL(error(QString)), + this, SLOT(setLastErrorMessage(QString))); + + connect(mVideoEncoderThread, SIGNAL(started()), + mVideoWorker, SLOT(runEncoding())); + + connect(mVideoWorker, SIGNAL(encodingFinished()), + mVideoEncoderThread, SLOT(quit())); + + connect(mVideoEncoderThread, SIGNAL(finished()), + this, SLOT(finishEncoding())); +} + +UBFFmpegVideoEncoder::~UBFFmpegVideoEncoder() +{ + if (mVideoWorker) + delete mVideoWorker; + + if (mVideoEncoderThread) + delete mVideoEncoderThread; + + if (mAudioInput) + delete mAudioInput; +} + +void UBFFmpegVideoEncoder::setLastErrorMessage(const QString& pMessage) +{ + qWarning() << "FFmpeg video encoder:" << pMessage; + mLastErrorMessage = pMessage; +} + + +bool UBFFmpegVideoEncoder::start() +{ + bool initialized = init(); + + if (initialized) { + mVideoEncoderThread->start(); + if (mShouldRecordAudio) + mAudioInput->start(); + } + + return initialized; +} + +bool UBFFmpegVideoEncoder::stop() +{ + qDebug() << "Video encoder: stop requested"; + + mVideoWorker->stopEncoding(); + + if (mShouldRecordAudio) + mAudioInput->stop(); + + return true; +} + +bool UBFFmpegVideoEncoder::init() +{ + av_register_all(); + avcodec_register_all(); + + AVDictionary * options = NULL; + int ret; + + // Output format and context + // -------------------------------------- + if (avformat_alloc_output_context2(&mOutputFormatContext, NULL, + "mp4", NULL) < 0) + { + setLastErrorMessage("Couldn't allocate video format context"); + return false; + } + + // The default codecs for mp4 are h264 and aac, we use those + + + // Video codec and context + // ------------------------------------- + mVideoStream = avformat_new_stream(mOutputFormatContext, 0); + + AVCodec * videoCodec = avcodec_find_encoder(mOutputFormatContext->oformat->video_codec); + if (!videoCodec) { + setLastErrorMessage("Video codec not found"); + return false; + } + + AVCodecContext* c = avcodec_alloc_context3(videoCodec); + + c->bit_rate = videoBitsPerSecond(); + c->width = videoSize().width(); + c->height = videoSize().height(); + c->time_base = {1, mVideoTimebase}; + c->gop_size = 10; + c->max_b_frames = 0; + c->pix_fmt = AV_PIX_FMT_YUV420P; + + if (mOutputFormatContext->oformat->flags & AVFMT_GLOBALHEADER) + c->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; + + /* + * Supported pixel formats for h264 are: + * AV_PIX_FMT_YUV420P + * AV_PIX_FMT_YUV422P + * AV_PIX_FMT_YUV444P + * AV_PIX_FMT_YUVJ420P + */ + + av_dict_set(&options, "preset", "slow", 0); + av_dict_set(&options, "crf", "20", 0); + + ret = avcodec_open2(c, videoCodec, &options); + + if (ret < 0) { + setLastErrorMessage(QString("Couldn't open video codec: ") + avErrorToQString(ret)); + return false; + } + + mVideoStream->codec = c; + + // Source images are RGB32, and should be converted to YUV for h264 video + mSwsContext = sws_getCachedContext(mSwsContext, + c->width, c->height, AV_PIX_FMT_RGB32, + c->width, c->height, c->pix_fmt, + SWS_BICUBIC, 0, 0, 0); + + // Audio codec and context + // ------------------------------------- + if (mShouldRecordAudio) { + + // Microphone input + + mAudioInput = new UBMicrophoneInput(); + + connect(mAudioInput, SIGNAL(audioLevelChanged(quint8)), + this, SIGNAL(audioLevelChanged(quint8))); + + connect(mAudioInput, SIGNAL(dataAvailable(QByteArray)), + this, SLOT(onAudioAvailable(QByteArray))); + + if (!mAudioInput->init()) { + setLastErrorMessage("Couldn't initialize audio input"); + return false; + } + + int inChannelCount = mAudioInput->channelCount(); + int inSampleRate = mAudioInput->sampleRate(); + + // Codec + + AVCodec * audioCodec = avcodec_find_encoder(mOutputFormatContext->oformat->audio_codec); + + if (!audioCodec) { + setLastErrorMessage("Audio codec not found"); + return false; + } + + mAudioStream = avformat_new_stream(mOutputFormatContext, audioCodec); + mAudioStream->id = mOutputFormatContext->nb_streams-1; + + c = mAudioStream->codec; + + c->bit_rate = 96000; + c->sample_fmt = audioCodec->sample_fmts[0]; // FLTP by default for AAC + c->sample_rate = mAudioSampleRate; + c->channels = 2; + c->channel_layout = av_get_default_channel_layout(c->channels); + c->profile = FF_PROFILE_AAC_MAIN; + c->time_base = {1, mAudioSampleRate}; + c->strict_std_compliance = -2; // Enable use of experimental codec + + if (mOutputFormatContext->oformat->flags & AVFMT_GLOBALHEADER) + c->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; + + ret = avcodec_open2(c, audioCodec, NULL); + + if (ret < 0) { + setLastErrorMessage(QString("Couldn't open audio codec: ") + avErrorToQString(ret)); + return false; + } + + // The input (raw sound from the microphone) may not match the codec's sampling rate, + // sample format or number of channels; we use libswresample to convert and resample it + mSwrContext = swr_alloc(); + if (!mSwrContext) { + setLastErrorMessage("Could not allocate resampler context"); + return false; + } + + av_opt_set_int(mSwrContext, "in_channel_count", inChannelCount, 0); + av_opt_set_int(mSwrContext, "in_channel_layout", av_get_default_channel_layout(inChannelCount), 0); + av_opt_set_int(mSwrContext, "in_sample_rate", inSampleRate, 0); + av_opt_set_sample_fmt(mSwrContext, "in_sample_fmt", (AVSampleFormat)mAudioInput->sampleFormat(), 0); + av_opt_set_int(mSwrContext, "out_channel_count", c->channels, 0); + av_opt_set_int(mSwrContext, "out_channel_layout", c->channel_layout, 0); + av_opt_set_int(mSwrContext, "out_sample_rate", c->sample_rate, 0); + av_opt_set_sample_fmt(mSwrContext, "out_sample_fmt", c->sample_fmt, 0); + + ret = swr_init(mSwrContext); + if (ret < 0) { + setLastErrorMessage(QString("Couldn't initialize the resampling context: ") + avErrorToQString(ret)); + return false; + } + + // Buffer for resampled/converted audio + mAudioOutBuffer = av_audio_fifo_alloc(c->sample_fmt, c->channels, c->frame_size); + } + + + // Open the output file + ret = avio_open(&(mOutputFormatContext->pb), videoFileName().toStdString().c_str(), AVIO_FLAG_WRITE); + + if (ret < 0) { + setLastErrorMessage(QString("Couldn't open video file for writing: ") + avErrorToQString(ret)); + return false; + } + + // Write stream header + ret = avformat_write_header(mOutputFormatContext, NULL); + + if (ret < 0) { + setLastErrorMessage(QString("Couldn't write header to file: ") + avErrorToQString(ret)); + return false; + } + + return true; +} + +/** + * This function should be called every time a new "screenshot" is ready. + * The image is converted to the right format and sent to the encoder. + */ +void UBFFmpegVideoEncoder::newPixmap(const QImage &pImage, long timestamp) +{ + if (!mVideoWorker->isRunning()) { + qDebug() << "Encoder worker thread not running. Queuing frame."; + mPendingFrames.enqueue({pImage, timestamp}); + } + + else { + // First send any queued frames, then the latest one + while (!mPendingFrames.isEmpty()) { + AVFrame* avFrame = convertImageFrame(mPendingFrames.dequeue()); + if (avFrame) + mVideoWorker->queueVideoFrame(avFrame); + } + + // note: if converting the frame turns out to be too slow to do here, it + // can always be done from the worker thread (in that case, + // the worker's queue would contain ImageFrames rather than AVFrames) + + AVFrame* avFrame = convertImageFrame({pImage, timestamp}); + if (avFrame) + mVideoWorker->queueVideoFrame(avFrame); + + // signal the worker that frames are available + mVideoWorker->mWaitCondition.wakeAll(); + } +} + +/** + * Convert a frame consisting of a QImage and timestamp to an AVFrame + * with the right pixel format and PTS + */ +AVFrame* UBFFmpegVideoEncoder::convertImageFrame(ImageFrame frame) +{ + AVFrame* avFrame = av_frame_alloc(); + + avFrame->format = mVideoStream->codec->pix_fmt; + avFrame->width = mVideoStream->codec->width; + avFrame->height = mVideoStream->codec->height; + avFrame->pts = mVideoTimebase * frame.timestamp / 1000; + + const uchar * rgbImage = frame.image.bits(); + + const int in_linesize[1] = { frame.image.bytesPerLine() }; + + // Allocate the output image + if (av_image_alloc(avFrame->data, avFrame->linesize, mVideoStream->codec->width, + mVideoStream->codec->height, mVideoStream->codec->pix_fmt, 32) < 0) + { + qWarning() << "Couldn't allocate image"; + return NULL; + } + + sws_scale(mSwsContext, + (const uint8_t* const*)&rgbImage, + in_linesize, + 0, + mVideoStream->codec->height, + avFrame->data, + avFrame->linesize); + + return avFrame; +} + +void UBFFmpegVideoEncoder::onAudioAvailable(QByteArray data) +{ + if (!data.isEmpty()) + processAudio(data); +} + +/** +* Resample and convert audio to match the encoder's settings and queue the +* output. If enough output data is available, it is packaged into AVFrames and +* sent to the encoder thread. +*/ +void UBFFmpegVideoEncoder::processAudio(QByteArray &data) +{ + int ret; + AVCodecContext* codecContext = mAudioStream->codec; + + const char * inSamples = data.constData(); + + // The number of samples (per channel) in the input + int inSamplesCount = data.size() / ((mAudioInput->sampleSize() / 8) * mAudioInput->channelCount()); + + // The number of samples we will get after conversion + int outSamplesCount = swr_get_out_samples(mSwrContext, inSamplesCount); + + // Allocate output samples + uint8_t ** outSamples = NULL; + int outSamplesLineSize; + + ret = av_samples_alloc_array_and_samples(&outSamples, &outSamplesLineSize, + codecContext->channels, outSamplesCount, + codecContext->sample_fmt, 0); + if (ret < 0) { + qWarning() << "Could not allocate audio samples" << avErrorToQString(ret); + return; + } + + // Convert to destination format + ret = swr_convert(mSwrContext, + outSamples, outSamplesCount, + (const uint8_t **)&inSamples, inSamplesCount); + if (ret < 0) { + qWarning() << "Error converting audio samples: " << avErrorToQString(ret); + return; + } + + // Append the converted samples to the out buffer. + ret = av_audio_fifo_write(mAudioOutBuffer, (void**)outSamples, outSamplesCount); + if (ret < 0) { + qWarning() << "Could not write to FIFO queue: " << avErrorToQString(ret); + return; + } + + // Keep the data queued until next call if the encoder thread isn't running + if (!mVideoWorker->isRunning()) + return; + + bool framesAdded = false; + while (av_audio_fifo_size(mAudioOutBuffer) > codecContext->frame_size) { + + AVFrame * avFrame = av_frame_alloc(); + avFrame->nb_samples = codecContext->frame_size; + avFrame->channel_layout = codecContext->channel_layout; + avFrame->format = codecContext->sample_fmt; + avFrame->sample_rate = codecContext->sample_rate; + avFrame->pts = mAudioFrameCount; + +#if LIBAVFORMAT_VERSION_MICRO < 100 + int buffer_size = av_samples_get_buffer_size(NULL, codecContext->channels, codecContext->frame_size, codecContext->sample_fmt, 0); + audio_samples_buffer = (uint8_t*)av_malloc(buffer_size); + if (!audio_samples_buffer) { + qWarning() << "Couldn't allocate samples for audio frame: " << avErrorToQString(ret); + break; + } + + ret = avcodec_fill_audio_frame(avFrame, + codecContext->channels, + codecContext->sample_fmt, + (const uint8_t*)audio_samples_buffer, + buffer_size, + 0); + +#else + ret = av_frame_get_buffer(avFrame, 0); +#endif + if (ret < 0) { + qWarning() << "Couldn't allocate frame: " << avErrorToQString(ret); + break; + } + + ret = av_audio_fifo_read(mAudioOutBuffer, (void**)avFrame->data, codecContext->frame_size); + if (ret < 0) + qWarning() << "Could not read from FIFO queue: " << avErrorToQString(ret); + + else { + mAudioFrameCount += codecContext->frame_size; + + mVideoWorker->queueAudioFrame(avFrame); + framesAdded = true; + } + } + + if (framesAdded) + mVideoWorker->mWaitCondition.wakeAll(); +} + +void UBFFmpegVideoEncoder::finishEncoding() +{ + qDebug() << "VideoEncoder::finishEncoding called"; + + flushStream(mVideoWorker->mVideoPacket, mVideoStream, mOutputFormatContext); + + if (mShouldRecordAudio) + flushStream(mVideoWorker->mAudioPacket, mAudioStream, mOutputFormatContext); + + av_write_trailer(mOutputFormatContext); + avio_close(mOutputFormatContext->pb); + + avcodec_close(mVideoStream->codec); + sws_freeContext(mSwsContext); + + if (mShouldRecordAudio) { + avcodec_close(mAudioStream->codec); + swr_free(&mSwrContext); + } + + avformat_free_context(mOutputFormatContext); + + emit encodingFinished(true); +} + + +//------------------------------------------------------------------------- +// Worker +//------------------------------------------------------------------------- + +UBFFmpegVideoEncoderWorker::UBFFmpegVideoEncoderWorker(UBFFmpegVideoEncoder* controller) + : mController(controller) +{ + mStopRequested = false; + mIsRunning = false; + mVideoPacket = new AVPacket(); + mAudioPacket = new AVPacket(); +} + +UBFFmpegVideoEncoderWorker::~UBFFmpegVideoEncoderWorker() +{ + if (mVideoPacket) + delete mVideoPacket; + + if (mAudioPacket) + delete mAudioPacket; +} + +void UBFFmpegVideoEncoderWorker::stopEncoding() +{ + qDebug() << "Video worker: stop requested"; + mStopRequested = true; + mWaitCondition.wakeAll(); +} + +void UBFFmpegVideoEncoderWorker::queueVideoFrame(AVFrame* frame) +{ + if (frame) { + mFrameQueueMutex.lock(); + mImageQueue.enqueue(frame); + mFrameQueueMutex.unlock(); + } +} + +void UBFFmpegVideoEncoderWorker::queueAudioFrame(AVFrame* frame) +{ + if (frame) { + mFrameQueueMutex.lock(); + mAudioQueue.enqueue(frame); + mFrameQueueMutex.unlock(); + } +} + +/** + * The main encoding function. Takes the queued frames and + * writes them to the video and audio streams + */ +void UBFFmpegVideoEncoderWorker::runEncoding() +{ + mIsRunning = true; + + while (!mStopRequested) { + mFrameQueueMutex.lock(); + mWaitCondition.wait(&mFrameQueueMutex); + + while (!mImageQueue.isEmpty()) { + writeLatestVideoFrame(); + } + + while (!mAudioQueue.isEmpty()) { + writeLatestAudioFrame(); + } + + mFrameQueueMutex.unlock(); + } + + emit encodingFinished(); +} + +void UBFFmpegVideoEncoderWorker::writeLatestVideoFrame() +{ + AVFrame* frame = mImageQueue.dequeue(); + writeFrame(frame, mVideoPacket, mController->mVideoStream, mController->mOutputFormatContext); + av_frame_free(&frame); +} + +void UBFFmpegVideoEncoderWorker::writeLatestAudioFrame() +{ + AVFrame *frame = mAudioQueue.dequeue(); + writeFrame(frame, mAudioPacket, mController->mAudioStream, mController->mOutputFormatContext); + av_frame_free(&frame); + +#if LIBAVFORMAT_VERSION_MICRO < 100 + if (audio_samples_buffer) { + av_free(audio_samples_buffer); + audio_samples_buffer = NULL; + } +#endif +} diff --git a/src/podcast/ffmpeg/UBFFmpegVideoEncoder.h b/src/podcast/ffmpeg/UBFFmpegVideoEncoder.h new file mode 100644 index 00000000..6068a369 --- /dev/null +++ b/src/podcast/ffmpeg/UBFFmpegVideoEncoder.h @@ -0,0 +1,188 @@ +/* + * Copyright (C) 2015-2016 Département de l'Instruction Publique (DIP-SEM) + * + * This file is part of OpenBoard. + * + * OpenBoard is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3 of the License, + * with a specific linking exception for the OpenSSL project's + * "OpenSSL" library (or with modified versions of it that use the + * same license as the "OpenSSL" library). + * + * OpenBoard is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenBoard. If not, see . + */ + +#ifndef UBFFMPEGVIDEOENCODER_H +#define UBFFMPEGVIDEOENCODER_H + +extern "C" { + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + +// Due to the whole ffmpeg / libAV silliness, we have to support libavresample on some platforms +#if LIBAVFORMAT_VERSION_MICRO > 100 + #include +#else + #include + #define SwrContext AVAudioResampleContext +#endif + +} + +#include + +#include +#include + +#include "podcast/UBAbstractVideoEncoder.h" +#include "podcast/ffmpeg/UBMicrophoneInput.h" + +class UBFFmpegVideoEncoderWorker; +class UBPodcastController; + +/** + * This class provides an interface between the podcast controller and the ffmpeg + * back-end. + * It includes all the necessary objects and methods to record video (muxer, audio and + * video streams and encoders, etc) from inputs consisting of raw PCM audio and raw RGBA + * images. + * + * A worker thread is used to encode and write the audio and video on-the-fly. + */ + +class UBFFmpegVideoEncoder : public UBAbstractVideoEncoder +{ + Q_OBJECT + + friend class UBFFmpegVideoEncoderWorker; + +public: + + UBFFmpegVideoEncoder(QObject* parent = NULL); + virtual ~UBFFmpegVideoEncoder(); + + bool start(); + bool stop(); + + void newPixmap(const QImage& pImage, long timestamp); + + QString videoFileExtension() const { return "mp4"; } + + QString lastErrorMessage() { return mLastErrorMessage; } + + void setRecordAudio(bool pRecordAudio) { mShouldRecordAudio = pRecordAudio; } + +private slots: + + void setLastErrorMessage(const QString& pMessage); + void onAudioAvailable(QByteArray data); + void finishEncoding(); + +private: + + struct ImageFrame + { + QImage image; + long timestamp; // unit: ms + }; + + AVFrame* convertImageFrame(ImageFrame frame); + AVFrame* convertAudio(QByteArray data); + void processAudio(QByteArray& data); + bool init(); + + QString mLastErrorMessage; + + QThread* mVideoEncoderThread; + UBFFmpegVideoEncoderWorker* mVideoWorker; + + // Muxer + // ------------------------------------------ + AVFormatContext* mOutputFormatContext; + AVStream* mVideoStream; + AVStream* mAudioStream; + + // Video + // ------------------------------------------ + QQueue mPendingFrames; + struct SwsContext * mSwsContext; + + int mVideoTimebase; + + // Audio + // ------------------------------------------ + bool mShouldRecordAudio; + + UBMicrophoneInput * mAudioInput; + struct SwrContext * mSwrContext; + /// Queue for audio that has been rescaled/converted but not encoded yet + AVAudioFifo *mAudioOutBuffer; + + /// Sample rate for encoded audio + int mAudioSampleRate; + /// Total audio frames sent to encoder + int mAudioFrameCount; +}; + + +class UBFFmpegVideoEncoderWorker : public QObject +{ + Q_OBJECT + + friend class UBFFmpegVideoEncoder; + +public: + UBFFmpegVideoEncoderWorker(UBFFmpegVideoEncoder* controller); + ~UBFFmpegVideoEncoderWorker(); + + bool isRunning() { return mIsRunning; } + + void queueVideoFrame(AVFrame* frame); + void queueAudioFrame(AVFrame* frame); + +public slots: + void runEncoding(); + void stopEncoding(); + +signals: + void encodingFinished(); + void error(QString message); + +private: + void writeLatestVideoFrame(); + void writeLatestAudioFrame(); + + UBFFmpegVideoEncoder* mController; + + // std::atomic is C++11. This won't work with msvc2010, so a + // newer compiler must be used if this class is to be used on Windows + std::atomic mStopRequested; + std::atomic mIsRunning; + + QQueue mImageQueue; + QQueue mAudioQueue; + + QMutex mFrameQueueMutex; + QWaitCondition mWaitCondition; + + AVPacket* mVideoPacket; + AVPacket* mAudioPacket; +}; + +#endif // UBFFMPEGVIDEOENCODER_H diff --git a/src/podcast/ffmpeg/UBMicrophoneInput.cpp b/src/podcast/ffmpeg/UBMicrophoneInput.cpp new file mode 100644 index 00000000..ad17dd49 --- /dev/null +++ b/src/podcast/ffmpeg/UBMicrophoneInput.cpp @@ -0,0 +1,299 @@ +/* + * Copyright (C) 2015-2016 Département de l'Instruction Publique (DIP-SEM) + * + * This file is part of OpenBoard. + * + * OpenBoard is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3 of the License, + * with a specific linking exception for the OpenSSL project's + * "OpenSSL" library (or with modified versions of it that use the + * same license as the "OpenSSL" library). + * + * OpenBoard is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenBoard. If not, see . + */ + +#include "UBMicrophoneInput.h" + +UBMicrophoneInput::UBMicrophoneInput() + : mAudioInput(NULL) + , mIODevice(NULL) + , mSeekPos(0) +{ +} + +UBMicrophoneInput::~UBMicrophoneInput() +{ + if (mAudioInput) + delete mAudioInput; +} + +bool UBMicrophoneInput::init() +{ + if (mAudioDeviceInfo.isNull()) { + qWarning("No audio input device selected; using default"); + mAudioDeviceInfo = QAudioDeviceInfo::defaultInputDevice(); + } + + mAudioFormat = mAudioDeviceInfo.preferredFormat(); + mAudioInput = new QAudioInput(mAudioDeviceInfo, mAudioFormat, NULL); + + connect(mAudioInput, SIGNAL(stateChanged(QAudio::State)), + this, SLOT(onAudioInputStateChanged(QAudio::State))); + + + qDebug() << "Input device name: " << mAudioDeviceInfo.deviceName(); + qDebug() << "Input sample format: " << mAudioFormat.sampleSize() << "bit" + << mAudioFormat.sampleType() << "at" << mAudioFormat.sampleRate() << "Hz" + << "; codec: " << mAudioFormat.codec(); + + return true; +} + +void UBMicrophoneInput::start() +{ + mIODevice = mAudioInput->start(); + + connect(mIODevice, SIGNAL(readyRead()), + this, SLOT(onDataReady())); + + if (mAudioInput->error() == QAudio::OpenError) + qWarning() << "Error opening audio input"; +} + +void UBMicrophoneInput::stop() +{ + mAudioInput->stop(); +} + +QStringList UBMicrophoneInput::availableDevicesNames() +{ + QStringList names; + QList devices = QAudioDeviceInfo::availableDevices(QAudio::AudioInput); + + foreach (QAudioDeviceInfo device, devices) { + names.push_back(device.deviceName()); + } + + return names; +} + +void UBMicrophoneInput::setInputDevice(QString name) +{ + if (name.isEmpty()) { + mAudioDeviceInfo = QAudioDeviceInfo::defaultInputDevice(); + return; + } + + QList devices = QAudioDeviceInfo::availableDevices(QAudio::AudioInput); + bool found = false; + + foreach (QAudioDeviceInfo device, devices) { + if (device.deviceName() == name) { + mAudioDeviceInfo = device; + found = true; + break; + } + } + + if (!found) { + qWarning() << "Audio input device not found; using default instead"; + mAudioDeviceInfo = QAudioDeviceInfo::defaultInputDevice(); + } + +} + +int UBMicrophoneInput::channelCount() +{ + return mAudioFormat.channelCount(); +} + +int UBMicrophoneInput::sampleRate() +{ + return mAudioFormat.sampleRate(); +} + +/* Return the sample size in bits */ +int UBMicrophoneInput::sampleSize() +{ + return mAudioFormat.sampleSize(); +} + +/** Return the sample format in FFMpeg style (AVSampleFormat enum) */ +int UBMicrophoneInput::sampleFormat() +{ + enum AVSampleFormat { + AV_SAMPLE_FMT_NONE = -1, + AV_SAMPLE_FMT_U8, + AV_SAMPLE_FMT_S16, + AV_SAMPLE_FMT_S32, + AV_SAMPLE_FMT_FLT, + AV_SAMPLE_FMT_DBL, + AV_SAMPLE_FMT_U8P, + AV_SAMPLE_FMT_S16P, + AV_SAMPLE_FMT_S32P, + AV_SAMPLE_FMT_FLTP, + AV_SAMPLE_FMT_DBLP, + AV_SAMPLE_FMT_NB + }; + + int sampleSize = mAudioFormat.sampleSize(); + QAudioFormat::SampleType sampleType = mAudioFormat.sampleType(); + + switch (sampleType) { + case QAudioFormat::Unknown: + return AV_SAMPLE_FMT_NONE; + + case QAudioFormat::SignedInt: + if (sampleSize == 16) + return AV_SAMPLE_FMT_S16; + if (sampleSize == 32) + return AV_SAMPLE_FMT_S32; + break; + + case QAudioFormat::UnSignedInt: + if (sampleSize == 8) + return AV_SAMPLE_FMT_U8; + break; + + case QAudioFormat::Float: + return AV_SAMPLE_FMT_FLT; + + default: + return AV_SAMPLE_FMT_NONE; + } + + return AV_SAMPLE_FMT_NONE; +} + +QString UBMicrophoneInput::codec() +{ + return mAudioFormat.codec(); +} + +static qint64 uSecsElapsed = 0; +void UBMicrophoneInput::onDataReady() +{ + int numBytes = mAudioInput->bytesReady(); + + uSecsElapsed += mAudioFormat.durationForBytes(numBytes); + + // Only emit data every 100ms + if (uSecsElapsed > 100000) { + uSecsElapsed = 0; + QByteArray data = mIODevice->read(numBytes); + + quint8 level = audioLevel(data); + if (level != mLastAudioLevel) { + mLastAudioLevel = level; + emit audioLevelChanged(level); + } + + emit dataAvailable(data); + } +} + +void UBMicrophoneInput::onAudioInputStateChanged(QAudio::State state) +{ + switch (state) { + case QAudio::StoppedState: + if (mAudioInput->error() != QAudio::NoError) { + emit error(getErrorString(mAudioInput->error())); + } + break; + + // handle other states? + + default: + break; + } +} + +/** + * @brief Calculate the current audio level of an array of samples and return it + * @param data An array of audio samples + * @return A value between 0 and 255 + * + * Audio level is calculated as the RMS (root mean square) of the samples + * in the supplied array. + */ +quint8 UBMicrophoneInput::audioLevel(const QByteArray &data) +{ + int bytesPerSample = mAudioFormat.bytesPerFrame() / mAudioFormat.channelCount(); + + const char * ptr = data.constData(); + double sum = 0; + int n_samples = data.size() / bytesPerSample; + + for (int i(0); i < (data.size() - bytesPerSample); i += bytesPerSample) { + sum += pow(sampleRelativeLevel(ptr + i), 2); + } + + double rms = sqrt(sum/n_samples); + + // The vu meter looks a bit better when the RMS isn't displayed linearly, as perceived sound + // level increases logarithmically. So here RMS is substituted by rms^(1/e) + rms = pow(rms, 1./exp(1)); + + return UINT8_MAX * rms; +} + +/** + * @brief Calculate one sample's level relative to its maximum value + * @param sample One sample, in the format specified by mAudioFormat + * @return A double between 0 and 1.0, where 1.0 is the maximum value the sample can take, + * or -1 if the value couldn't be calculated. + */ +double UBMicrophoneInput::sampleRelativeLevel(const char* sample) +{ + QAudioFormat::SampleType type = mAudioFormat.sampleType(); + int sampleSize = mAudioFormat.sampleSize(); + + if (sampleSize == 16 && type == QAudioFormat::SignedInt) + return double(*reinterpret_cast(sample))/INT16_MAX; + + if (sampleSize == 8 && type == QAudioFormat::SignedInt) + return double(*reinterpret_cast(sample))/INT8_MAX; + + if (sampleSize == 16 && type == QAudioFormat::UnSignedInt) + return double(*reinterpret_cast(sample))/UINT16_MAX; + + if (sampleSize == 8 && type == QAudioFormat::UnSignedInt) + return double(*reinterpret_cast(sample))/UINT8_MAX; + + if (type == QAudioFormat::Float) + return (*reinterpret_cast(sample) + 1.0)/2.; + + return -1; +} + +/** + * @brief Return a meaningful error string based on QAudio error codes + */ +QString UBMicrophoneInput::getErrorString(QAudio::Error errorCode) +{ + switch (errorCode) { + case QAudio::NoError : + return ""; + + case QAudio::OpenError : + return "Couldn't open the audio device"; + + case QAudio::IOError : + return "Error reading from audio device"; + + case QAudio::UnderrunError : + return "Underrun error"; + + case QAudio::FatalError : + return "Fatal error; audio device unusable"; + + } + return ""; +} diff --git a/src/podcast/ffmpeg/UBMicrophoneInput.h b/src/podcast/ffmpeg/UBMicrophoneInput.h new file mode 100644 index 00000000..b82f5e70 --- /dev/null +++ b/src/podcast/ffmpeg/UBMicrophoneInput.h @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2015-2016 Département de l'Instruction Publique (DIP-SEM) + * + * This file is part of OpenBoard. + * + * OpenBoard is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3 of the License, + * with a specific linking exception for the OpenSSL project's + * "OpenSSL" library (or with modified versions of it that use the + * same license as the "OpenSSL" library). + * + * OpenBoard is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenBoard. If not, see . + */ + +#ifndef UBMICROPHONEINPUT_H +#define UBMICROPHONEINPUT_H + +#include +#include + +/** + * @brief The UBMicrophoneInput class captures uncompressed sound from a microphone. + * + * Audio samples can be read by connecting to the dataAvailable signal. + */ +class UBMicrophoneInput : public QObject +{ + Q_OBJECT + +public: + UBMicrophoneInput(); + virtual ~UBMicrophoneInput(); + + bool init(); + void start(); + void stop(); + + static QStringList availableDevicesNames(); + void setInputDevice(QString name = ""); + + int channelCount(); + int sampleRate(); + int sampleSize(); + int sampleFormat(); + QString codec(); + +signals: + /// Send the new audio level, between 0 and 255 + void audioLevelChanged(quint8 level); + + /// Emitted when new audio data is available + void dataAvailable(QByteArray data); + + void error(QString message); + +private slots: + void onAudioInputStateChanged(QAudio::State state); + void onDataReady(); + +private: + double sampleRelativeLevel(const char* sample); + quint8 audioLevel(const QByteArray& data); + QString getErrorString(QAudio::Error errorCode); + + QAudioInput* mAudioInput; + QIODevice * mIODevice; + QAudioDeviceInfo mAudioDeviceInfo; + QAudioFormat mAudioFormat; + + qint64 mSeekPos; + quint8 mLastAudioLevel; +}; + +#endif // UBMICROPHONEINPUT_H diff --git a/src/podcast/podcast.pri b/src/podcast/podcast.pri index af441814..91dd3f5d 100644 --- a/src/podcast/podcast.pri +++ b/src/podcast/podcast.pri @@ -3,13 +3,13 @@ HEADERS += src/podcast/UBPodcastController.h \ src/podcast/UBAbstractVideoEncoder.h \ src/podcast/UBPodcastRecordingPalette.h \ src/podcast/youtube/UBYouTubePublisher.h \ - src/podcast/intranet/UBIntranetPodcastPublisher.h + src/podcast/intranet/UBIntranetPodcastPublisher.h \ SOURCES += src/podcast/UBPodcastController.cpp \ src/podcast/UBAbstractVideoEncoder.cpp \ src/podcast/UBPodcastRecordingPalette.cpp \ src/podcast/youtube/UBYouTubePublisher.cpp \ - src/podcast/intranet/UBIntranetPodcastPublisher.cpp + src/podcast/intranet/UBIntranetPodcastPublisher.cpp \ win32 { @@ -33,3 +33,30 @@ macx { OBJECTIVE_SOURCES += src/podcast/quicktime/UBQuickTimeFile.mm } + +linux-g++* { + HEADERS += src/podcast/ffmpeg/UBFFmpegVideoEncoder.h \ + src/podcast/ffmpeg/UBMicrophoneInput.h + + SOURCES += src/podcast/ffmpeg/UBFFmpegVideoEncoder.cpp \ + src/podcast/ffmpeg/UBMicrophoneInput.cpp + + + DEPENDPATH += /usr/lib/x86_64-linux-gnu + + LIBS += -lavformat -lavcodec -lswscale -lavutil \ + -lva-x11 \ + -lva \ + -lxcb-shm \ + -lxcb-xfixes \ + -lxcb-render -lxcb-shape -lxcb -lX11 -lasound -lSDL -lx264 -lpthread -lvpx -lvorbisenc -lvorbis -ltheoraenc -ltheoradec -logg -lopus -lmp3lame -lfreetype -lfdk-aac -lass -llzma -lbz2 -lz -ldl -lswresample -lswscale -lavutil -lm + + UBUNTU_VERSION = $$system(lsb_release -irs) + equals(UBUNTU_VERSION, Ubuntu 14.04) { + LIBS -= -lswresample + LIBS += -lavresample + } + + + QMAKE_CXXFLAGS += -std=c++11 # move this to OpenBoard.pro when we can use C++11 on all platforms +} diff --git a/src/tools/UBAbstractDrawRuler.cpp b/src/tools/UBAbstractDrawRuler.cpp index 170c4b2b..70fde592 100644 --- a/src/tools/UBAbstractDrawRuler.cpp +++ b/src/tools/UBAbstractDrawRuler.cpp @@ -58,11 +58,8 @@ UBAbstractDrawRuler::UBAbstractDrawRuler() : mShowButtons(false) , mAntiScaleRatio(1.0) { - //we actually need to evaluate pixels per millimeter - QDesktopWidget* desktop = UBApplication::desktop(); - int dpiCommon = (desktop->physicalDpiX() + desktop->physicalDpiY()) / 2; - sPixelsPerMillimeter = qRound(dpiCommon / UBGeometryUtils::inchSize); + sPixelsPerCentimeter = UBApplication::boardController->activeScene()->backgroundGridSize(); } void UBAbstractDrawRuler::create(QGraphicsItem& item) diff --git a/src/tools/UBAbstractDrawRuler.h b/src/tools/UBAbstractDrawRuler.h index 60bc2e5f..caf84821 100644 --- a/src/tools/UBAbstractDrawRuler.h +++ b/src/tools/UBAbstractDrawRuler.h @@ -92,7 +92,7 @@ protected: static const int sFillTransparency; static const int sDrawTransparency; static const int sRoundingRadius; - int sPixelsPerMillimeter; + qreal sPixelsPerCentimeter; }; #endif diff --git a/src/tools/UBGraphicsCompass.cpp b/src/tools/UBGraphicsCompass.cpp index d1180d5d..1172ee36 100644 --- a/src/tools/UBGraphicsCompass.cpp +++ b/src/tools/UBGraphicsCompass.cpp @@ -65,10 +65,6 @@ UBGraphicsCompass::UBGraphicsCompass() , mDrewCenterCross(false) { setRect(sDefaultRect); - //TODO claudio: remove code duplication - QDesktopWidget* desktop = UBApplication::desktop(); - int dpiCommon = (desktop->physicalDpiX() + desktop->physicalDpiY()) / 2; - mPixelsPerMillimeter = qRound(dpiCommon / 25.4f); setFlag(QGraphicsItem::ItemIsMovable, true); setFlag(QGraphicsItem::ItemIsSelectable, true); @@ -428,7 +424,9 @@ void UBGraphicsCompass::paintAngleDisplay(QPainter *painter) void UBGraphicsCompass::paintRadiusDisplay(QPainter *painter) { - qreal radiusInCentimeters = rect().width() / (mPixelsPerMillimeter * 10); + double pixelsPerCentimeter = UBApplication::boardController->activeScene()->backgroundGridSize(); + + qreal radiusInCentimeters = rect().width() / pixelsPerCentimeter; QString format = rect().width() >= sDisplayRadiusUnitMinLength ? "%1 cm" : "%1"; QString radiusText = QString(format).arg(radiusInCentimeters, 0, 'f', 1); diff --git a/src/tools/UBGraphicsCompass.h b/src/tools/UBGraphicsCompass.h index 7f56cb12..cf5db119 100644 --- a/src/tools/UBGraphicsCompass.h +++ b/src/tools/UBGraphicsCompass.h @@ -123,7 +123,6 @@ class UBGraphicsCompass: public QObject, public QGraphicsRectItem, public UBItem QGraphicsSvgItem* mResizeSvgItem; qreal mAntiScaleRatio; bool mDrewCenterCross; - int mPixelsPerMillimeter; // Constants static const int sNeedleLength = 12; diff --git a/src/tools/UBGraphicsRuler.cpp b/src/tools/UBGraphicsRuler.cpp index cb95cc88..66f287b7 100644 --- a/src/tools/UBGraphicsRuler.cpp +++ b/src/tools/UBGraphicsRuler.cpp @@ -176,20 +176,44 @@ void UBGraphicsRuler::paintGraduations(QPainter *painter) painter->save(); painter->setFont(font()); QFontMetricsF fontMetrics(painter->font()); - for (int millimeters = 0; millimeters < (rect().width() - sLeftEdgeMargin - sRoundingRadius) / sPixelsPerMillimeter; millimeters++) - { - int graduationX = rotationCenter().x() + sPixelsPerMillimeter * millimeters; - int graduationHeight = (0 == millimeters % UBGeometryUtils::millimetersPerCentimeter) ? - UBGeometryUtils::centimeterGraduationHeight : - ((0 == millimeters % UBGeometryUtils::millimetersPerHalfCentimeter) ? - UBGeometryUtils::halfCentimeterGraduationHeight : UBGeometryUtils::millimeterGraduationHeight); - painter->drawLine(QLine(graduationX, rotationCenter().y(), graduationX, rotationCenter().y() + graduationHeight)); - painter->drawLine(QLine(graduationX, rotationCenter().y() + rect().height(), graduationX, rotationCenter().y() + rect().height() - graduationHeight)); - if (0 == millimeters % UBGeometryUtils::millimetersPerCentimeter) + + // Update the width of one "centimeter" to correspond to the width of the background grid (whether it is displayed or not) + sPixelsPerCentimeter = UBApplication::boardController->activeScene()->backgroundGridSize(); + + qreal pixelsPerMillimeter = sPixelsPerCentimeter/10.0; + int rulerLengthInMillimeters = (rect().width() - sLeftEdgeMargin - sRoundingRadius)/pixelsPerMillimeter; + + // When a "centimeter" is too narrow, we only display every 5th number, and every 5th millimeter mark + double numbersWidth = fontMetrics.width("00"); + bool shouldDisplayAllNumbers = (numbersWidth <= (sPixelsPerCentimeter - 5)); + + for (int millimeters(0); millimeters < rulerLengthInMillimeters; millimeters++) { + + double graduationX = rotationCenter().x() + pixelsPerMillimeter * millimeters; + double graduationHeight = 0; + + if (millimeters % UBGeometryUtils::millimetersPerCentimeter == 0) + graduationHeight = UBGeometryUtils::centimeterGraduationHeight; + + else if (millimeters % UBGeometryUtils::millimetersPerHalfCentimeter == 0) + graduationHeight = UBGeometryUtils::halfCentimeterGraduationHeight; + + else + graduationHeight = UBGeometryUtils::millimeterGraduationHeight; + + + if (shouldDisplayAllNumbers || millimeters % UBGeometryUtils::millimetersPerHalfCentimeter == 0) { + painter->drawLine(QLineF(graduationX, rotationCenter().y(), graduationX, rotationCenter().y() + graduationHeight)); + painter->drawLine(QLineF(graduationX, rotationCenter().y() + rect().height(), graduationX, rotationCenter().y() + rect().height() - graduationHeight)); + } + + + if ((shouldDisplayAllNumbers && millimeters % UBGeometryUtils::millimetersPerCentimeter == 0) + || millimeters % (UBGeometryUtils::millimetersPerCentimeter*5) == 0) { QString text = QString("%1").arg((int)(millimeters / UBGeometryUtils::millimetersPerCentimeter)); - if (graduationX + fontMetrics.width(text) / 2 < rect().right()) - { + + if (graduationX + fontMetrics.width(text) / 2 < rect().right()) { qreal textWidth = fontMetrics.width(text); qreal textHeight = fontMetrics.tightBoundingRect(text).height() + 5; painter->drawText( @@ -201,7 +225,10 @@ void UBGraphicsRuler::paintGraduations(QPainter *painter) } } } + + painter->restore(); + } void UBGraphicsRuler::paintRotationCenter(QPainter *painter) @@ -252,7 +279,7 @@ QRectF UBGraphicsRuler::closeButtonRect() const closePixmap.height() * mAntiScaleRatio); QPointF closeRectCenter( - rect().left() + sLeftEdgeMargin + sPixelsPerMillimeter * 5, + rect().left() + sLeftEdgeMargin + sPixelsPerCentimeter/2, rect().center().y()); QPointF closeRectTopLeft( @@ -270,9 +297,9 @@ QRectF UBGraphicsRuler::rotateButtonRect() const rotatePixmap.width() * mAntiScaleRatio, rotatePixmap.height() * mAntiScaleRatio); - int centimeters = (int)(rect().width() - sLeftEdgeMargin - resizeButtonRect().width()) / (int)(10 * sPixelsPerMillimeter); + int centimeters = (int)(rect().width() - sLeftEdgeMargin - resizeButtonRect().width()) / (sPixelsPerCentimeter); QPointF rotateRectCenter( - rect().left() + sLeftEdgeMargin + (centimeters - 0.5) * 10 * sPixelsPerMillimeter, + rect().left() + sLeftEdgeMargin + (centimeters - 0.5) * sPixelsPerCentimeter, rect().center().y()); QPointF rotateRectTopLeft( diff --git a/src/tools/UBGraphicsTriangle.cpp b/src/tools/UBGraphicsTriangle.cpp index 0e2b2136..17a0a05f 100644 --- a/src/tools/UBGraphicsTriangle.cpp +++ b/src/tools/UBGraphicsTriangle.cpp @@ -389,14 +389,27 @@ void UBGraphicsTriangle::paintGraduations(QPainter *painter) painter->setFont(font()); QFontMetricsF fontMetrics(painter->font()); - for (int millimeters = 0; millimeters < (rect().width() - sLeftEdgeMargin - sRoundingRadius) / sPixelsPerMillimeter; millimeters++) + // Update the width of one "centimeter" to correspond to the width of the background grid (whether it is displayed or not) + sPixelsPerCentimeter = UBApplication::boardController->activeScene()->backgroundGridSize(); + double pixelsPerMillimeter = sPixelsPerCentimeter/10.0; + + // When a "centimeter" is too narrow, we only display every 5th number, and every 5th millimeter mark + double numbersWidth = fontMetrics.width("00"); + bool shouldDisplayAllNumbers = (numbersWidth <= (sPixelsPerCentimeter - 5)); + + for (int millimeters = 0; millimeters < (rect().width() - sLeftEdgeMargin - sRoundingRadius) / pixelsPerMillimeter; millimeters++) { - int graduationX = rotationCenter().x() + kx * sPixelsPerMillimeter * millimeters; + double graduationX = rotationCenter().x() + kx * pixelsPerMillimeter * millimeters; + double graduationHeight = 0; - int graduationHeight = (0 == millimeters % UBGeometryUtils::millimetersPerCentimeter) ? - UBGeometryUtils::centimeterGraduationHeight : - ((0 == millimeters % UBGeometryUtils::millimetersPerHalfCentimeter) ? - UBGeometryUtils::halfCentimeterGraduationHeight : UBGeometryUtils::millimeterGraduationHeight); + if (millimeters % UBGeometryUtils::millimetersPerCentimeter == 0) + graduationHeight = UBGeometryUtils::centimeterGraduationHeight; + + else if (millimeters % UBGeometryUtils::millimetersPerHalfCentimeter == 0) + graduationHeight = UBGeometryUtils::halfCentimeterGraduationHeight; + + else + graduationHeight = UBGeometryUtils::millimeterGraduationHeight; qreal requiredSpace = graduationHeight + SEPARATOR ; /* B____C @@ -427,12 +440,14 @@ void UBGraphicsTriangle::paintGraduations(QPainter *painter) qreal BC = rect().height(); qreal DE = AD * BC / AB, availableSpace = DE; - if (requiredSpace <= availableSpace) - painter->drawLine(QLine(graduationX, rotationCenter().y(), graduationX, rotationCenter().y() - ky * graduationHeight)); - else + if (availableSpace < requiredSpace) break; - if (0 == millimeters % UBGeometryUtils::millimetersPerCentimeter) + if (shouldDisplayAllNumbers || millimeters % UBGeometryUtils::millimetersPerHalfCentimeter == 0) + painter->drawLine(QLineF(graduationX, rotationCenter().y(), graduationX, rotationCenter().y() - ky * graduationHeight)); + + if ((shouldDisplayAllNumbers && millimeters % UBGeometryUtils::millimetersPerCentimeter == 0) + || millimeters % (UBGeometryUtils::millimetersPerCentimeter*5) == 0) { QString text = QString("%1").arg((int)(millimeters / UBGeometryUtils::millimetersPerCentimeter)); qreal textWidth = fontMetrics.width(text);