diff options
88 files changed, 2126 insertions, 641 deletions
@@ -688,10 +688,10 @@ CFG_XRANDR=runtime CFG_XRENDER=auto CFG_MITSHM=auto CFG_OPENGL=auto -CFG_OPENVG=no +CFG_OPENVG=auto CFG_OPENVG_LC_INCLUDES=no -CFG_OPENVG_SHIVA=no -CFG_OPENVG_ON_OPENGL=no +CFG_OPENVG_SHIVA=auto +CFG_OPENVG_ON_OPENGL=auto CFG_EGL=no CFG_EGL_GLES_INCLUDES=no CFG_SSE=auto @@ -7505,7 +7505,6 @@ EOF canBuildQtConcurrent="no" ;; symbian-gcce) - canBuildWebKit="no" canBuildQtConcurrent="no" ;; symbian-armcc) diff --git a/examples/declarative/touchinteraction/pincharea/pincharea.qmlproject b/examples/declarative/touchinteraction/pincharea/pincharea.qmlproject new file mode 100644 index 0000000..e526217 --- /dev/null +++ b/examples/declarative/touchinteraction/pincharea/pincharea.qmlproject @@ -0,0 +1,18 @@ +/* File generated by QtCreator */ + +import QmlProject 1.0 + +Project { + /* Include .qml, .js, and image files from current directory and subdirectories */ + QmlFiles { + directory: "." + } + JavaScriptFiles { + directory: "." + } + ImageFiles { + directory: "." + } + /* List of plugin directories passed to QML runtime */ + // importPaths: [ " ../exampleplugin " ] +} diff --git a/mkspecs/common/symbian/symbian.conf b/mkspecs/common/symbian/symbian.conf index 1468e08..5bf8728 100644 --- a/mkspecs/common/symbian/symbian.conf +++ b/mkspecs/common/symbian/symbian.conf @@ -57,7 +57,8 @@ QMAKE_INCDIR = QMAKE_INCDIR_QT = $$[QT_INSTALL_HEADERS] QMAKE_LFLAGS = -QMAKE_LFLAGS.ARMCC = +QMAKE_LFLAGS.ARMCC = +QMAKE_LFLAGS.GCCE = QMAKE_LFLAGS_EXCEPTIONS_ON = QMAKE_LFLAGS_EXCEPTIONS_OFF = QMAKE_LFLAGS_RELEASE = @@ -83,7 +84,7 @@ QMAKE_LIBS_OPENGL_ES2_QT = $$QMAKE_LIBS_OPENGL_ES2 $$QMAKE_LIBS_CFBSBITMAP -lcon QMAKE_LIBS_OPENVG = $$QMAKE_LIBS_CFBSBITMAP -llibOpenVG QMAKE_LIBS_THREAD = -llibpthread QMAKE_LIBS_COMPAT = -QMAKE_LIBS_S60 = -lavkon -leikcoctl +QMAKE_LIBS_S60 = -lavkon -leikcoctl -lgfxtrans exists($${EPOCROOT}epoc32/include/platform/sgresource/sgimage.h) { QMAKE_LIBS_OPENVG += -lsgresource @@ -163,34 +164,39 @@ exists($${EPOCROOT}epoc32/tools/qt/mkspecs/features/environment.prf) { # Try to detect SDK version if it wasn't set by environment.prf isEmpty(SYMBIAN_VERSION)|isEmpty(S60_VERSION) { - exists($${EPOCROOT}epoc32/release/winscw/udeb/z/system/install/series60v5.3.sis)|exists($${EPOCROOT}epoc32/data/z/system/install/series60v5.3.sis) { - isEmpty(SYMBIAN_VERSION): SYMBIAN_VERSION = Symbian3 - isEmpty(S60_VERSION): S60_VERSION = 5.3 + exists($${EPOCROOT}epoc32/release/winscw/udeb/z/system/install/series60v5.4.sis)|exists($${EPOCROOT}epoc32/data/z/system/install/series60v5.4.sis) { + isEmpty(SYMBIAN_VERSION): SYMBIAN_VERSION = 5.4 + isEmpty(S60_VERSION): S60_VERSION = 5.4 } else { - # The Symbian^3 PDK does not necessarily contain the required sis files. - # However, libstdcppv5 first appeared in Symbian^3 (S60 5.2), so check for that too. - exists($${EPOCROOT}epoc32/release/winscw/udeb/z/system/install/series60v5.2.sis)|exists($${EPOCROOT}epoc32/data/z/system/install/series60v5.2.sis)|exists($${EPOCROOT}epoc32/release/armv5/lib/libstdcppv5.dso) { - isEmpty(SYMBIAN_VERSION): SYMBIAN_VERSION = Symbian3 - isEmpty(S60_VERSION): S60_VERSION = 5.2 + exists($${EPOCROOT}epoc32/release/winscw/udeb/z/system/install/series60v5.3.sis)|exists($${EPOCROOT}epoc32/data/z/system/install/series60v5.3.sis) { + isEmpty(SYMBIAN_VERSION): SYMBIAN_VERSION = 5.3 + isEmpty(S60_VERSION): S60_VERSION = 5.3 } else { - exists($${EPOCROOT}epoc32/release/winscw/udeb/z/system/install/series60v5.1.sis)|exists($${EPOCROOT}epoc32/data/z/system/install/series60v5.1.sis) { - isEmpty(SYMBIAN_VERSION): SYMBIAN_VERSION = Symbian2 - isEmpty(S60_VERSION): S60_VERSION = 5.1 + # The Symbian^3 PDK does not necessarily contain the required sis files. + # However, libstdcppv5 first appeared in Symbian^3 (S60 5.2), so check for that too. + exists($${EPOCROOT}epoc32/release/winscw/udeb/z/system/install/series60v5.2.sis)|exists($${EPOCROOT}epoc32/data/z/system/install/series60v5.2.sis)|exists($${EPOCROOT}epoc32/release/armv5/lib/libstdcppv5.dso) { + isEmpty(SYMBIAN_VERSION): SYMBIAN_VERSION = Symbian3 + isEmpty(S60_VERSION): S60_VERSION = 5.2 } else { - exists($${EPOCROOT}epoc32/release/winscw/udeb/z/system/install/series60v5.0.sis)|exists($${EPOCROOT}epoc32/data/z/system/install/series60v5.0.sis) { - isEmpty(SYMBIAN_VERSION): SYMBIAN_VERSION = 9.4 - isEmpty(S60_VERSION): S60_VERSION = 5.0 + exists($${EPOCROOT}epoc32/release/winscw/udeb/z/system/install/series60v5.1.sis)|exists($${EPOCROOT}epoc32/data/z/system/install/series60v5.1.sis) { + isEmpty(SYMBIAN_VERSION): SYMBIAN_VERSION = Symbian2 + isEmpty(S60_VERSION): S60_VERSION = 5.1 } else { - exists($${EPOCROOT}epoc32/release/winscw/udeb/z/system/install/series60v3.2.sis)|exists($${EPOCROOT}epoc32/data/z/system/install/series60v3.2.sis) { - isEmpty(SYMBIAN_VERSION): SYMBIAN_VERSION = 9.3 - isEmpty(S60_VERSION): S60_VERSION = 3.2 + exists($${EPOCROOT}epoc32/release/winscw/udeb/z/system/install/series60v5.0.sis)|exists($${EPOCROOT}epoc32/data/z/system/install/series60v5.0.sis) { + isEmpty(SYMBIAN_VERSION): SYMBIAN_VERSION = 9.4 + isEmpty(S60_VERSION): S60_VERSION = 5.0 } else { - exists($${EPOCROOT}epoc32/release/winscw/udeb/z/system/install/series60v3.1.sis)|exists($${EPOCROOT}epoc32/data/z/system/install/series60v3.1.sis) { - isEmpty(SYMBIAN_VERSION): SYMBIAN_VERSION = 9.2 - isEmpty(S60_VERSION): S60_VERSION = 3.1 + exists($${EPOCROOT}epoc32/release/winscw/udeb/z/system/install/series60v3.2.sis)|exists($${EPOCROOT}epoc32/data/z/system/install/series60v3.2.sis) { + isEmpty(SYMBIAN_VERSION): SYMBIAN_VERSION = 9.3 + isEmpty(S60_VERSION): S60_VERSION = 3.2 } else { - isEmpty(SYMBIAN_VERSION): SYMBIAN_VERSION = Unknown - isEmpty(S60_VERSION): S60_VERSION = Unknown + exists($${EPOCROOT}epoc32/release/winscw/udeb/z/system/install/series60v3.1.sis)|exists($${EPOCROOT}epoc32/data/z/system/install/series60v3.1.sis) { + isEmpty(SYMBIAN_VERSION): SYMBIAN_VERSION = 9.2 + isEmpty(S60_VERSION): S60_VERSION = 3.1 + } else { + isEmpty(SYMBIAN_VERSION): SYMBIAN_VERSION = Unknown + isEmpty(S60_VERSION): S60_VERSION = Unknown + } } } } diff --git a/mkspecs/features/incredibuild_xge.prf b/mkspecs/features/incredibuild_xge.prf index a81a0cc..97ccc44 100644 --- a/mkspecs/features/incredibuild_xge.prf +++ b/mkspecs/features/incredibuild_xge.prf @@ -1,4 +1,4 @@ -contains(TEMPLATE, "vc.*")|contains(TEMPLATE_PREFIX, "vc") { +contains(TEMPLATE, "vc.*") { EOC = $$escape_expand(\\n\\t) # The VCPROJ generator will replace the \r\h with the coded \r\n: 
 diff --git a/mkspecs/features/moc.prf b/mkspecs/features/moc.prf index 89e9b40..d0b36e4 100644 --- a/mkspecs/features/moc.prf +++ b/mkspecs/features/moc.prf @@ -16,7 +16,7 @@ win32:count($$list($$INCLUDEPATH), 40, >) { EOC = $$escape_expand(\\n\\t) - if(contains(TEMPLATE, "vc.*")|contains(TEMPLATE_PREFIX, "vc")) { + contains(TEMPLATE, "vc.*") { # the VCPROJ generator will replace the \r\h with the coded \r\n: 
 # No other generator understands the \h if(win32-msvc2*|wince*msvc*): EOC = $$escape_expand(\\r\\h) @@ -42,7 +42,7 @@ win32:count($$list($$INCLUDEPATH), 40, >) { defineReplace(mocCmdBase) { !isEmpty(WIN_INCLUDETEMP) { RET = - if(contains(TEMPLATE, "vc.*")|contains(TEMPLATE_PREFIX, "vc")) { + contains(TEMPLATE, "vc.*") { RET += $$mocinclude.commands } RET += $$QMAKE_MOC $(DEFINES) @$$WIN_INCLUDETEMP $$join(QMAKE_COMPILER_DEFINES, " -D", -D) @@ -59,7 +59,7 @@ moc_header.output = $$MOC_DIR/$${QMAKE_H_MOD_MOC}${QMAKE_FILE_BASE}$${first(QMAK moc_header.input = HEADERS moc_header.variable_out = SOURCES moc_header.name = MOC ${QMAKE_FILE_IN} -if(!contains(TEMPLATE, "vc.*"):!contains(TEMPLATE_PREFIX, "vc")) { +!contains(TEMPLATE, "vc.*") { !isEmpty(INCLUDETEMP):moc_header.depends += $$INCLUDETEMP } silent:moc_header.commands = @echo moc ${QMAKE_FILE_IN} && $$moc_header.commands @@ -73,7 +73,7 @@ moc_source.commands = ${QMAKE_FUNC_mocCmdBase} ${QMAKE_FILE_IN} -o ${QMAKE_FILE_ moc_source.output = $$MOC_DIR/$${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}$${QMAKE_EXT_CPP_MOC} moc_source.input = SOURCES OBJECTIVE_SOURCES moc_source.name = MOC ${QMAKE_FILE_IN} -if(!contains(TEMPLATE, "vc.*"):!contains(TEMPLATE_PREFIX, "vc")) { +!contains(TEMPLATE, "vc.*") { !isEmpty(INCLUDETEMP):moc_source.depends += $$INCLUDETEMP } silent:moc_source.commands = @echo moc ${QMAKE_FILE_IN} && $$moc_source.commands diff --git a/mkspecs/features/symbian/do_not_build_as_thumb.prf b/mkspecs/features/symbian/do_not_build_as_thumb.prf index 0f1fd9f..91a63c2 100644 --- a/mkspecs/features/symbian/do_not_build_as_thumb.prf +++ b/mkspecs/features/symbian/do_not_build_as_thumb.prf @@ -5,4 +5,9 @@ symbian-abld|symbian-sbsv2 { QMAKE_CFLAGS += --arm QMAKE_CXXFLAGS -= --thumb QMAKE_CXXFLAGS += --arm +} else:symbian-gcce { + QMAKE_CFLAGS -= --thumb + QMAKE_CFLAGS += -marm -mthumb-interwork -mapcs + QMAKE_CXXFLAGS -= --thumb + QMAKE_CXXFLAGS += -marm -mthumb-interwork -mapcs } diff --git a/mkspecs/features/symbian/symbian_building.prf b/mkspecs/features/symbian/symbian_building.prf index 28046b4..8c75707 100644 --- a/mkspecs/features/symbian/symbian_building.prf +++ b/mkspecs/features/symbian/symbian_building.prf @@ -1,6 +1,7 @@ symbian-armcc { QMAKE_CFLAGS += $$QMAKE_CFLAGS.ARMCC QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS.ARMCC + QMAKE_LFLAGS += $$QMAKE_LFLAGS.ARMCC # This is to prevent inclusion of the shipped RVCT headers, which are often in the # environment variable RVCTxxINC by default. -J prevents the searching of that location, # but needs a path, so just specify somewhere guaranteed not to contain header files. @@ -9,6 +10,7 @@ symbian-armcc { } else:symbian-gcce { QMAKE_CFLAGS += $$QMAKE_CFLAGS.GCCE QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS.GCCE + QMAKE_LFLAGS += $$QMAKE_LFLAGS.GCCE } # We need a target name without the INFIX'ed part, since flags are not infixed. diff --git a/mkspecs/features/uic.prf b/mkspecs/features/uic.prf index 0a18b47..74a2683 100644 --- a/mkspecs/features/uic.prf +++ b/mkspecs/features/uic.prf @@ -77,6 +77,7 @@ uic3 { uic3_moc.input = UIC3_HEADERS uic3_moc.variable_out = GENERATED_SOURCES uic3_moc.name = $$moc_header.name + !contains(TEMPLATE, "vc.*"):!isEmpty(INCLUDETEMP):uic3_moc.depends += $$INCLUDETEMP QMAKE_EXTRA_COMPILERS += uic3_moc } diff --git a/mkspecs/features/win32/embed_manifest_dll.prf b/mkspecs/features/win32/embed_manifest_dll.prf index 013668d..cf96ee7 100644 --- a/mkspecs/features/win32/embed_manifest_dll.prf +++ b/mkspecs/features/win32/embed_manifest_dll.prf @@ -1,4 +1,4 @@ -!if(plugin:no_plugin_manifest):if(win32-msvc2005*|win32-msvc2008*|win32-msvc2010*):!static:!equals(TEMPLATE_PREFIX, "vc"):equals(TEMPLATE, "lib") { +!if(plugin:no_plugin_manifest):if(win32-msvc2005*|win32-msvc2008*|win32-msvc2010*):!static:equals(TEMPLATE, "lib") { MANIFEST_DIR = $$OBJECTS_DIR isEmpty(MANIFEST_DIR):MANIFEST_DIR = . NOPATH_TARGET = $$TARGET diff --git a/mkspecs/features/win32/embed_manifest_exe.prf b/mkspecs/features/win32/embed_manifest_exe.prf index 872949e..9bc7702 100644 --- a/mkspecs/features/win32/embed_manifest_exe.prf +++ b/mkspecs/features/win32/embed_manifest_exe.prf @@ -1,4 +1,4 @@ -if(win32-msvc2005*|win32-msvc2008*|win32-msvc2010*):!equals(TEMPLATE_PREFIX, "vc"):equals(TEMPLATE, "app") { +if(win32-msvc2005*|win32-msvc2008*|win32-msvc2010*):equals(TEMPLATE, "app") { MANIFEST_DIR = $$OBJECTS_DIR isEmpty(MANIFEST_DIR):MANIFEST_DIR = . NOPATH_TARGET = $$TARGET diff --git a/mkspecs/features/win32/qaxserver.prf b/mkspecs/features/win32/qaxserver.prf index 2899976..a6c0869 100644 --- a/mkspecs/features/win32/qaxserver.prf +++ b/mkspecs/features/win32/qaxserver.prf @@ -8,12 +8,7 @@ isEmpty(ACTIVEQT_VERSION):ACTIVEQT_VERSION = 1.0 DEFINES += QAXSERVER -ACTIVEQT_IDE = makefile -equals(TEMPLATE_PREFIX, "vc"):ACTIVEQT_IDE = VisualStudio -equals(TEMPLATE, "vcapp"):ACTIVEQT_IDE = VisualStudio -equals(TEMPLATE, "vclib"):ACTIVEQT_IDE = VisualStudio - -equals(ACTIVEQT_IDE, "VisualStudio") { +contains(TEMPLATE, "vc.*") { ACTIVEQT_IDC = $${QMAKE_IDC} ### Qt5: remove me qtPrepareTool(ACTIVEQT_IDC, idc) ACTIVEQT_IDL = $${QMAKE_IDL} @@ -27,8 +22,7 @@ equals(ACTIVEQT_IDE, "VisualStudio") { } ACTIVEQT_TLBOUT = "$(TargetDir)/$${TARGET}.tlb" GENERATED += $${OBJECTS_DIR}/$${TARGET}.idl $${ACTIVEQT_TLBOUT} -} -equals(ACTIVEQT_IDE, "makefile") { +} else { ACTIVEQT_IDC = -$(IDC) ACTIVEQT_IDL = -$(IDL) ACTIVEQT_NEWLINE = $$escape_expand(\\n\\t) diff --git a/mkspecs/symbian-armcc/qmake.conf b/mkspecs/symbian-armcc/qmake.conf index 77a1966..2de3218 100644 --- a/mkspecs/symbian-armcc/qmake.conf +++ b/mkspecs/symbian-armcc/qmake.conf @@ -12,7 +12,7 @@ QMAKE_RVCT_LINKSTYLE = 1 #QMAKE_qtmain_CXXFLAGS = --arm #QMAKE_QtCore_CXXFLAGS = -QMAKE_QtGui_LFLAGS = "--rw-base 0x800000" +#QMAKE_QtGui_LFLAGS = "--rw-base 0x800000" #QMAKE_QtDBus_CXXFLAGS = #QMAKE_QtDeclarative_CXXFLAGS = #QMAKE_QtMultimedia_CXXFLAGS = @@ -27,9 +27,9 @@ QMAKE_QtGui_LFLAGS = "--rw-base 0x800000" #QMAKE_QtTest_CXXFLAGS = #QMAKE_QtXmlPatterns_CXXFLAGS = #QMAKE_QtXml_CXXFLAGS = -QMAKE_QtWebKit_CXXFLAGS = --arm +#QMAKE_QtWebKit_CXXFLAGS = --arm # Move RW-section base address to start from 0xE00000 instead of the toolchain default 0x400000. -QMAKE_QtWebKit_LFLAGS = --rw-base 0xE00000 +#QMAKE_QtWebKit_LFLAGS = --rw-base 0xE00000 QMAKE_CFLAGS += --dllimport_runtime --diag_suppress 186,611,654,1300 --thumb --fpu softvfp --cpu 5T --enum_is_int -Ono_known_library --fpmode ieee_no_fenv --no_vfe --apcs /inter QMAKE_CXXFLAGS += $$QMAKE_CFLAGS diff --git a/mkspecs/symbian-gcce/qmake.conf b/mkspecs/symbian-gcce/qmake.conf index f550751a..17b1c5f 100644 --- a/mkspecs/symbian-gcce/qmake.conf +++ b/mkspecs/symbian-gcce/qmake.conf @@ -20,7 +20,7 @@ QMAKE_AR = arm-none-symbianelf-ar cqs QMAKE_qtmain_CXXFLAGS = -mthumb QMAKE_QtCore_CXXFLAGS = -mthumb -QMAKE_QtGui_LFLAGS = -Ttext 0x8000 -Tdata 0xE00000 +#QMAKE_QtGui_LFLAGS = -Ttext 0x8000 -Tdata 0xE00000 QMAKE_QtDBus_CXXFLAGS = -mthumb QMAKE_QtDeclarative_CXXFLAGS = -mthumb QMAKE_QtMultimedia_CXXFLAGS = -mthumb @@ -35,8 +35,7 @@ QMAKE_QtSvg_CXXFLAGS = -mthumb QMAKE_QtTest_CXXFLAGS = -mthumb QMAKE_QtXmlPatterns_CXXFLAGS = -mthumb QMAKE_QtXml_CXXFLAGS = -mthumb -#TODO fails with; arm-none-symbianelf-ld: section .data loaded at [00e00000,00e05973] overlaps section .text loaded at [00008000,00fe748b] -QMAKE_QtWebKit_LFLAGS = -Ttext 0x8000 -Tdata 0xE00000 +#QMAKE_QtWebKit_LFLAGS = -Ttext 0x8000 -Tdata 0xE00000 # never use -fPIC, gcce-linker doesn't like it. # g++ conf above adds it if the host platform is 64 bit, so we remove it again @@ -59,7 +58,7 @@ QMAKE_LFLAGS_PLUGIN += $$QMAKE_LFLAGS_SHLIB gcceExtraFlags = --include=$${EPOCROOT}epoc32/include/gcce/gcce.h -march=armv5t -mapcs -mthumb-interwork -nostdinc -c -msoft-float -T script QMAKE_CFLAGS += $${gcceExtraFlags} -QMAKE_CXXFLAGS += $${gcceExtraFlags} -x c++ -fexceptions -fno-unit-at-a-time -fvisibility-inlines-hidden +QMAKE_CXXFLAGS += $${gcceExtraFlags} -x c++ -fexceptions -fno-unit-at-a-time -fvisibility-inlines-hidden -Os #If we are not going to link to Qt or qtmain.lib, we need to include this at least once. isEmpty(QT):contains(TEMPLATE, app) { QMAKE_CXXFLAGS += --include=$${EPOCROOT}epoc32/include/stdapis/staticlibinit_gcce.h diff --git a/mkspecs/wince50standard-armv4i-msvc2005/default_post.prf b/mkspecs/wince50standard-armv4i-msvc2005/default_post.prf index 3dab72a..900d758 100644 --- a/mkspecs/wince50standard-armv4i-msvc2005/default_post.prf +++ b/mkspecs/wince50standard-armv4i-msvc2005/default_post.prf @@ -1,6 +1,6 @@ # Visual Studio has some definitions set internally. # Thus we do not need to redefine these. -if(equals(TEMPLATE_PREFIX, "vc") | equals(TEMPLATE, "vc*")) { +equals(TEMPLATE, "vc.*") { DEFINES -= _M_ARM QMAKE_CXXFLAGS += -fp:precise } diff --git a/mkspecs/wince50standard-mipsii-msvc2005/default_post.prf b/mkspecs/wince50standard-mipsii-msvc2005/default_post.prf index d3e49ab..4dbcf35 100644 --- a/mkspecs/wince50standard-mipsii-msvc2005/default_post.prf +++ b/mkspecs/wince50standard-mipsii-msvc2005/default_post.prf @@ -1,6 +1,6 @@ # Visual Studio has some definitions set internally. # Thus we do not need to redefine these. -if(equals(TEMPLATE_PREFIX, "vc") | equals(TEMPLATE, "vc*")) { +contains(TEMPLATE, "vc.*") { DEFINES -= _M_MRX000=3000 QMAKE_CXXFLAGS += -fp:precise } diff --git a/mkspecs/wince50standard-x86-msvc2005/default_post.prf b/mkspecs/wince50standard-x86-msvc2005/default_post.prf index 6790c60..2436efb 100644 --- a/mkspecs/wince50standard-x86-msvc2005/default_post.prf +++ b/mkspecs/wince50standard-x86-msvc2005/default_post.prf @@ -1,6 +1,6 @@ # Visual Studio has some definitions set internally. # Thus we do not need to redefine these. -if(equals(TEMPLATE_PREFIX, "vc") | equals(TEMPLATE, "vc*")) { +equals(TEMPLATE, "vc.*") { QMAKE_CXXFLAGS += -fp:precise } diff --git a/mkspecs/wincewm50pocket-msvc2005/default_post.prf b/mkspecs/wincewm50pocket-msvc2005/default_post.prf index 3dab72a..84ea15e 100644 --- a/mkspecs/wincewm50pocket-msvc2005/default_post.prf +++ b/mkspecs/wincewm50pocket-msvc2005/default_post.prf @@ -1,6 +1,6 @@ # Visual Studio has some definitions set internally. # Thus we do not need to redefine these. -if(equals(TEMPLATE_PREFIX, "vc") | equals(TEMPLATE, "vc*")) { +contains(TEMPLATE, "vc.*") { DEFINES -= _M_ARM QMAKE_CXXFLAGS += -fp:precise } diff --git a/mkspecs/wincewm50smart-msvc2005/default_post.prf b/mkspecs/wincewm50smart-msvc2005/default_post.prf index 3dab72a..84ea15e 100644 --- a/mkspecs/wincewm50smart-msvc2005/default_post.prf +++ b/mkspecs/wincewm50smart-msvc2005/default_post.prf @@ -1,6 +1,6 @@ # Visual Studio has some definitions set internally. # Thus we do not need to redefine these. -if(equals(TEMPLATE_PREFIX, "vc") | equals(TEMPLATE, "vc*")) { +contains(TEMPLATE, "vc.*") { DEFINES -= _M_ARM QMAKE_CXXFLAGS += -fp:precise } diff --git a/mkspecs/wincewm60professional-msvc2005/default_post.prf b/mkspecs/wincewm60professional-msvc2005/default_post.prf index 3dab72a..84ea15e 100644 --- a/mkspecs/wincewm60professional-msvc2005/default_post.prf +++ b/mkspecs/wincewm60professional-msvc2005/default_post.prf @@ -1,6 +1,6 @@ # Visual Studio has some definitions set internally. # Thus we do not need to redefine these. -if(equals(TEMPLATE_PREFIX, "vc") | equals(TEMPLATE, "vc*")) { +contains(TEMPLATE, "vc.*") { DEFINES -= _M_ARM QMAKE_CXXFLAGS += -fp:precise } diff --git a/mkspecs/wincewm60standard-msvc2005/default_post.prf b/mkspecs/wincewm60standard-msvc2005/default_post.prf index 3dab72a..84ea15e 100644 --- a/mkspecs/wincewm60standard-msvc2005/default_post.prf +++ b/mkspecs/wincewm60standard-msvc2005/default_post.prf @@ -1,6 +1,6 @@ # Visual Studio has some definitions set internally. # Thus we do not need to redefine these. -if(equals(TEMPLATE_PREFIX, "vc") | equals(TEMPLATE, "vc*")) { +contains(TEMPLATE, "vc.*") { DEFINES -= _M_ARM QMAKE_CXXFLAGS += -fp:precise } diff --git a/qmake/generators/makefile.cpp b/qmake/generators/makefile.cpp index 9e2be31..4f3b113 100644 --- a/qmake/generators/makefile.cpp +++ b/qmake/generators/makefile.cpp @@ -364,7 +364,7 @@ MakefileGenerator::findFilesInVPATH(QStringList l, uchar flags, const QString &v dir = regex.left(regex.lastIndexOf(Option::dir_sep) + 1); real_dir = dir; if(!(flags & VPATH_NoFixify)) - real_dir = fileFixify(real_dir, qmake_getpwd(), Option::output_dir); + real_dir = fileFixify(real_dir, qmake_getpwd(), Option::output_dir) + '/'; regex.remove(0, dir.length()); } if(real_dir.isEmpty() || exists(real_dir)) { @@ -383,16 +383,15 @@ MakefileGenerator::findFilesInVPATH(QStringList l, uchar flags, const QString &v for(int i = (int)files.count()-1; i >= 0; i--) { if(files[i] == "." || files[i] == "..") continue; - a = dir + files[i]; + a = real_dir + files[i]; if(!(flags & VPATH_NoFixify)) a = fileFixify(a); l.insert(val_it, a); } } } else { - debug_msg(1, "%s:%d Cannot match %s%c%s, as %s does not exist.", + debug_msg(1, "%s:%d Cannot match %s%s, as %s does not exist.", __FILE__, __LINE__, real_dir.toLatin1().constData(), - QDir::separator().toLatin1(), regex.toLatin1().constData(), real_dir.toLatin1().constData()); if(flags & VPATH_RemoveMissingFiles) remove_file = true; @@ -484,19 +483,22 @@ MakefileGenerator::init() subs.at(i).toLatin1().constData()); continue; } - inn = tinn.first(); - outn = toutn.first(); + inn = fileFixify(tinn.first(), qmake_getpwd()); + outn = fileFixify(toutn.first(), qmake_getpwd(), Option::output_dir); } else { - inn = subs.at(i); + inn = fileFixify(subs.at(i), qmake_getpwd()); + if (!QFile::exists(inn)) { + // random insanity for backwards compat: .in file specified with absolute out dir + inn = fileFixify(subs.at(i)); + } if(!inn.endsWith(".in")) { warn_msg(WarnLogic, "Substitute '%s' does not end with '.in'", inn.toLatin1().constData()); continue; } - outn = inn.left(inn.length()-3); + outn = fileFixify(inn.left(inn.length()-3), qmake_getpwd(), Option::output_dir); } - QFile in(fileFixify(inn)); - QFile out(fileFixify(outn, qmake_getpwd(), Option::output_dir)); + QFile in(inn); if(in.open(QFile::ReadOnly)) { QString contents; QStack<int> state; @@ -545,9 +547,10 @@ MakefileGenerator::init() else state.pop(); } else if(state.isEmpty() || state.top() == IN_CONDITION) { - contents += project->expand(line).join(QString(Option::field_sep)); + contents += project->expand(line, in.fileName(), count); } } + QFile out(outn); if(out.exists() && out.open(QFile::ReadOnly)) { QString old = QString::fromUtf8(out.readAll()); if(contents == old) { @@ -782,10 +785,8 @@ MakefileGenerator::init() } { //get the output_dir into the pwd - if(fileFixify(Option::output_dir) != fileFixify(qmake_getpwd())) - project->values("INCLUDEPATH").append(fileFixify(Option::output_dir, - Option::output_dir, - Option::output_dir)); + if(Option::output_dir != qmake_getpwd()) + project->values("INCLUDEPATH").append("."); } //fix up the target deps @@ -1748,7 +1749,7 @@ MakefileGenerator::writeExtraTargets(QTextStream &t) deps += " " + escapeDependencyPath(dep); } if(project->values((*it) + ".CONFIG").indexOf("fix_target") != -1) - targ = fileFixify(targ); + targ = fileFixify(targ, Option::output_dir, Option::output_dir); if(project->isEmpty("QMAKE_NOFORCE") && project->values((*it) + ".CONFIG").indexOf("phony") != -1) deps += QString(" ") + "FORCE"; @@ -2464,7 +2465,7 @@ MakefileGenerator::writeSubTargets(QTextStream &t, QList<MakefileGenerator::SubT //qmake it if(!subtarget->profile.isEmpty()) { QString out = subtarget->makefile; - QString in = fileFixify(in_directory + subtarget->profile, out_directory, QString(), FileFixifyAbsolute); + QString in = fileFixify(in_directory + subtarget->profile, FileFixifyAbsolute); if(out.startsWith(in_directory)) out = out.mid(in_directory.length()); t << mkfile << ": " << "\n\t"; @@ -2816,9 +2817,6 @@ MakefileGenerator::fileFixify(const QString& file, const QString &out_d, const Q QString ret = unescapeFilePath(file); //do the fixin' - QString pwd = qmake_getpwd(); - if (!pwd.endsWith('/')) - pwd += '/'; QString orig_file = ret; if(ret.startsWith(QLatin1Char('~'))) { if(ret.startsWith(QLatin1String("~/"))) @@ -2827,12 +2825,16 @@ MakefileGenerator::fileFixify(const QString& file, const QString &out_d, const Q warn_msg(WarnLogic, "Unable to expand ~ in %s", ret.toLatin1().constData()); } if(fix == FileFixifyAbsolute || (fix == FileFixifyDefault && project->isActiveConfig("no_fixpath"))) { - if(fix == FileFixifyAbsolute && QDir::isRelativePath(ret)) //already absolute + if(fix == FileFixifyAbsolute && QDir::isRelativePath(ret)) { //already absolute + QString pwd = qmake_getpwd(); + if (!pwd.endsWith(QLatin1Char('/'))) + pwd += QLatin1Char('/'); ret.prepend(pwd); + } ret = Option::fixPathToTargetOS(ret, false, canon); } else { //fix it.. QString out_dir = QDir(Option::output_dir).absoluteFilePath(out_d); - QString in_dir = QDir(pwd).absoluteFilePath(in_d); + QString in_dir = QDir(qmake_getpwd()).absoluteFilePath(in_d); { QFileInfo in_fi(fileInfo(in_dir)); if(in_fi.exists()) @@ -2886,6 +2888,7 @@ MakefileGenerator::fileFixify(const QString& file, const QString &out_d, const Q //prepend for(int o = 0; o < i; o++) dot_prefix += ".." + Option::dir_sep; + break; } } ret.prepend(dot_prefix); @@ -2898,7 +2901,7 @@ MakefileGenerator::fileFixify(const QString& file, const QString &out_d, const Q ret = "."; debug_msg(3, "Fixed[%d,%d] %s :: to :: %s [%s::%s] [%s::%s]", fix, canon, orig_file.toLatin1().constData(), ret.toLatin1().constData(), in_d.toLatin1().constData(), out_d.toLatin1().constData(), - pwd.toLatin1().constData(), Option::output_dir.toLatin1().constData()); + qmake_getpwd().toLatin1().constData(), Option::output_dir.toLatin1().constData()); return ret; } diff --git a/qmake/generators/unix/unixmake2.cpp b/qmake/generators/unix/unixmake2.cpp index 212f8bd..9f14492 100644 --- a/qmake/generators/unix/unixmake2.cpp +++ b/qmake/generators/unix/unixmake2.cpp @@ -795,7 +795,8 @@ UnixMakefileGenerator::writeMakeParts(QTextStream &t) ddir = project->first("QMAKE_DISTDIR"); QString ddir_c = escapeFilePath(fileFixify((project->isEmpty("OBJECTS_DIR") ? QString(".tmp/") : - project->first("OBJECTS_DIR")) + ddir)); + project->first("OBJECTS_DIR")) + ddir, + Option::output_dir, Option::output_dir)); t << "dist: " << "\n\t" << mkdir_p_asstring(ddir_c) << "\n\t" << "$(COPY_FILE) --parents $(SOURCES) $(DIST) " << ddir_c << Option::dir_sep << " && "; diff --git a/qmake/generators/win32/msvc_objectmodel.cpp b/qmake/generators/win32/msvc_objectmodel.cpp index 815a476..88a5043 100644 --- a/qmake/generators/win32/msvc_objectmodel.cpp +++ b/qmake/generators/win32/msvc_objectmodel.cpp @@ -2219,6 +2219,9 @@ bool VCFilter::addExtraCompiler(const VCFilterFile &info) Option::fixPathToLocalOS(inFile, true, false), out); if(Project->canExecute(dep_cmd)) { + dep_cmd.prepend(QLatin1String("cd ") + + Project->escapeFilePath(Option::fixPathToLocalOS(Option::output_dir, false)) + + QLatin1String(" && ")); if(FILE *proc = QT_POPEN(dep_cmd.toLatin1().constData(), "r")) { QString indeps; while(!feof(proc)) { @@ -2233,7 +2236,7 @@ bool VCFilter::addExtraCompiler(const VCFilterFile &info) for (int i = 0; i < extradeps.count(); ++i) { QString dd = extradeps.at(i).simplified(); if (!dd.isEmpty()) - deps += Project->fileFixify(dd); + deps += Project->fileFixify(dd, QString(), Option::output_dir); } } } diff --git a/qmake/generators/win32/msvc_vcproj.cpp b/qmake/generators/win32/msvc_vcproj.cpp index 80f5bde..56f3bfd 100644 --- a/qmake/generators/win32/msvc_vcproj.cpp +++ b/qmake/generators/win32/msvc_vcproj.cpp @@ -360,6 +360,25 @@ QUuid VcprojGenerator::increaseUUID(const QUuid &id) return result; } +QStringList VcprojGenerator::collectSubDirs(QMakeProject *proj) +{ + QStringList subdirs; + QStringList tmp_proj_subdirs = proj->variables()["SUBDIRS"]; + for(int x = 0; x < tmp_proj_subdirs.size(); ++x) { + QString tmpdir = tmp_proj_subdirs.at(x); + if(!proj->isEmpty(tmpdir + ".file")) { + if(!proj->isEmpty(tmpdir + ".subdir")) + warn_msg(WarnLogic, "Cannot assign both file and subdir for subdir %s", + tmpdir.toLatin1().constData()); + tmpdir = proj->first(tmpdir + ".file"); + } else if(!proj->isEmpty(tmpdir + ".subdir")) { + tmpdir = proj->first(tmpdir + ".subdir"); + } + subdirs += tmpdir; + } + return subdirs; +} + void VcprojGenerator::writeSubDirs(QTextStream &t) { // Check if all requirements are fulfilled @@ -394,7 +413,6 @@ void VcprojGenerator::writeSubDirs(QTextStream &t) QHash<QString, VcsolutionDepend*> solution_depends; QList<VcsolutionDepend*> solution_cleanup; - QStringList subdirs = project->values("SUBDIRS"); QString oldpwd = qmake_getpwd(); // Make sure that all temp projects are configured @@ -403,16 +421,9 @@ void VcprojGenerator::writeSubDirs(QTextStream &t) QStringList old_after_vars = Option::after_user_vars; Option::after_user_vars.append("CONFIG+=release"); + QStringList subdirs = collectSubDirs(project); for(int i = 0; i < subdirs.size(); ++i) { QString tmp = subdirs.at(i); - if(!project->isEmpty(tmp + ".file")) { - if(!project->isEmpty(tmp + ".subdir")) - warn_msg(WarnLogic, "Cannot assign both file and subdir for subdir %s", - tmp.toLatin1().constData()); - tmp = project->first(tmp + ".file"); - } else if(!project->isEmpty(tmp + ".subdir")) { - tmp = project->first(tmp + ".subdir"); - } QFileInfo fi(fileInfo(Option::fixPathToLocalOS(tmp, true))); if(fi.exists()) { if(fi.isDir()) { @@ -436,19 +447,8 @@ void VcprojGenerator::writeSubDirs(QTextStream &t) continue; } if(tmp_proj.first("TEMPLATE") == "vcsubdirs") { - QStringList tmp_proj_subdirs = tmp_proj.variables()["SUBDIRS"]; - for(int x = 0; x < tmp_proj_subdirs.size(); ++x) { - QString tmpdir = tmp_proj_subdirs.at(x); - if(!tmp_proj.isEmpty(tmpdir + ".file")) { - if(!tmp_proj.isEmpty(tmpdir + ".subdir")) - warn_msg(WarnLogic, "Cannot assign both file and subdir for subdir %s", - tmpdir.toLatin1().constData()); - tmpdir = tmp_proj.first(tmpdir + ".file"); - } else if(!tmp_proj.isEmpty(tmpdir + ".subdir")) { - tmpdir = tmp_proj.first(tmpdir + ".subdir"); - } + foreach(const QString &tmpdir, collectSubDirs(&tmp_proj)) subdirs += fileFixify(tmpdir); - } } else if(tmp_proj.first("TEMPLATE") == "vcapp" || tmp_proj.first("TEMPLATE") == "vclib") { // Initialize a 'fake' project to get the correct variables // and to be able to extract all the dependencies @@ -1319,6 +1319,9 @@ void VcprojGenerator::initResourceFiles() dep_cmd = Option::fixPathToLocalOS(dep_cmd, true, false); if(canExecute(dep_cmd)) { + dep_cmd.prepend(QLatin1String("cd ") + + escapeFilePath(Option::fixPathToLocalOS(Option::output_dir, false)) + + QLatin1String(" && ")); if(FILE *proc = QT_POPEN(dep_cmd.toLatin1().constData(), "r")) { QString indeps; while(!feof(proc)) { @@ -1329,7 +1332,8 @@ void VcprojGenerator::initResourceFiles() } QT_PCLOSE(proc); if(!indeps.isEmpty()) - deps += fileFixify(indeps.replace('\n', ' ').simplified().split(' ')); + deps += fileFixify(indeps.replace('\n', ' ').simplified().split(' '), + QString(), Option::output_dir); } } } diff --git a/qmake/generators/win32/msvc_vcproj.h b/qmake/generators/win32/msvc_vcproj.h index fdcd73f..afe8f9f 100644 --- a/qmake/generators/win32/msvc_vcproj.h +++ b/qmake/generators/win32/msvc_vcproj.h @@ -131,6 +131,7 @@ protected: QList<VcprojGenerator*> mergedProjects; private: + QStringList collectSubDirs(QMakeProject *proj); QUuid increaseUUID(const QUuid &id); friend class VCFilter; }; diff --git a/qmake/project.cpp b/qmake/project.cpp index 815f210..d4fa786 100644 --- a/qmake/project.cpp +++ b/qmake/project.cpp @@ -1342,10 +1342,10 @@ QMakeProject::read(uchar cmd) } if(QDir::isRelativePath(qmakespec)) { - if (QFile::exists(qmakespec+"/qmake.conf")) { - Option::mkfile::qmakespec = QFileInfo(Option::mkfile::qmakespec).absoluteFilePath(); - } else if (QFile::exists(Option::output_dir+"/"+qmakespec+"/qmake.conf")) { + if (QFile::exists(Option::output_dir+"/"+qmakespec+"/qmake.conf")) { qmakespec = Option::mkfile::qmakespec = QFileInfo(Option::output_dir+"/"+qmakespec).absoluteFilePath(); + } else if (QFile::exists(qmakespec+"/qmake.conf")) { + Option::mkfile::qmakespec = QFileInfo(Option::mkfile::qmakespec).absoluteFilePath(); } else { bool found_mkspec = false; for(QStringList::ConstIterator it = mkspec_roots.begin(); it != mkspec_roots.end(); ++it) { @@ -2770,6 +2770,20 @@ QMakeProject::expand(const QString &str) return QStringList(); } +QString +QMakeProject::expand(const QString &str, const QString &file, int line) +{ + bool ok; + parser_info pi = parser; + parser.file = file; + parser.line_no = line; + parser.from_file = false; + QMap<QString, QStringList> tmp = vars; + const QStringList ret = doVariableReplaceExpand(str, tmp, &ok); + parser = pi; + return ok ? ret.join(QString(Option::field_sep)) : QString(); +} + QStringList QMakeProject::expand(const QString &func, const QList<QStringList> &args) { @@ -3025,17 +3039,17 @@ QStringList &QMakeProject::values(const QString &_var, QMap<QString, QStringList if(!Option::user_template.isEmpty()) { var = ".BUILTIN.USER." + var; place[var] = QStringList(Option::user_template); - } else if(!place[var].isEmpty()) { - QString orig_template = place["TEMPLATE"].first(), real_template; + } else { + QString orig_template, real_template; + if(!place[var].isEmpty()) + orig_template = place[var].first(); + real_template = orig_template.isEmpty() ? "app" : orig_template; if(!Option::user_template_prefix.isEmpty() && !orig_template.startsWith(Option::user_template_prefix)) - real_template = Option::user_template_prefix + orig_template; - if(!real_template.isEmpty()) { + real_template.prepend(Option::user_template_prefix); + if(real_template != orig_template) { var = ".BUILTIN." + var; place[var] = QStringList(real_template); } - } else { - var = ".BUILTIN." + var; - place[var] = QStringList("app"); } } else if(var.startsWith(QLatin1String("QMAKE_HOST."))) { QString ret, type = var.mid(11); diff --git a/qmake/project.h b/qmake/project.h index 09aa45e..0e6131d 100644 --- a/qmake/project.h +++ b/qmake/project.h @@ -144,6 +144,7 @@ public: QMap<QString, QStringList> &place); QStringList expand(const QString &v); + QString expand(const QString &v, const QString &file, int line); QStringList expand(const QString &func, const QList<QStringList> &args); bool test(const QString &v); bool test(const QString &func, const QList<QStringList> &args); diff --git a/src/3rdparty/webkit/JavaScriptCore/wtf/MathExtras.h b/src/3rdparty/webkit/JavaScriptCore/wtf/MathExtras.h index f8bace4..9349b48 100644 --- a/src/3rdparty/webkit/JavaScriptCore/wtf/MathExtras.h +++ b/src/3rdparty/webkit/JavaScriptCore/wtf/MathExtras.h @@ -190,7 +190,7 @@ inline float deg2turn(float d) { return d / 360.0f; } inline float rad2grad(float r) { return r * 200.0f / piFloat; } inline float grad2rad(float g) { return g * piFloat / 200.0f; } -#if !COMPILER(MSVC) && !COMPILER(RVCT) && !OS(ANDROID) && !COMPILER(WINSCW) +#if !COMPILER(MSVC) && !OS(ANDROID) && !OS(SYMBIAN) using std::isfinite; using std::isinf; using std::isnan; diff --git a/src/3rdparty/webkit/WebCore/WebCore.pro b/src/3rdparty/webkit/WebCore/WebCore.pro index 2de6961..ccb6707 100644 --- a/src/3rdparty/webkit/WebCore/WebCore.pro +++ b/src/3rdparty/webkit/WebCore/WebCore.pro @@ -37,15 +37,14 @@ symbian: { # Need to guarantee that these come before system includes of /epoc32/include MMP_RULES += "USERINCLUDE rendering" MMP_RULES += "USERINCLUDE platform/text" - symbian-abld|symbian-sbsv2 { - # RO text (code) section in qtwebkit.dll exceeds allocated space for gcce udeb target. - # Move RW-section base address to start from 0xE00000 instead of the toolchain default 0x400000. - QMAKE_LFLAGS.ARMCC += --rw-base 0xE00000 - MMP_RULES += ALWAYS_BUILD_AS_ARM - } else { - QMAKE_CFLAGS -= --thumb - QMAKE_CXXFLAGS -= --thumb - } + + # RO text (code) section in qtwebkit.dll exceeds allocated space for gcce udeb target. + # Move RW-section base address to start from 0xE00000 instead of the toolchain default 0x400000. + QMAKE_LFLAGS.ARMCC += --rw-base 0xE00000 + QMAKE_LFLAGS.GCCE += -Tdata 0x1000000 + + CONFIG += do_not_build_as_thumb + CONFIG(release, debug|release): QMAKE_CXXFLAGS.ARMCC += -OTime -O3 } diff --git a/src/corelib/global/qglobal.cpp b/src/corelib/global/qglobal.cpp index 97b4407..a6b9bdd 100644 --- a/src/corelib/global/qglobal.cpp +++ b/src/corelib/global/qglobal.cpp @@ -1199,10 +1199,12 @@ bool qSharedBuild() \value SV_9_2 Symbian OS v9.2 \value SV_9_3 Symbian OS v9.3 \value SV_9_4 Symbian OS v9.4 - \value SV_SF_1 Symbian^1 + \value SV_SF_1 S60 5th Edition (Symbian^1) \value SV_SF_2 Symbian^2 - \value SV_SF_3 Symbian^3 + \value SV_SF_3 Symbian^3 or Symbian Anna \value SV_SF_4 \e{This enum value is deprecated.} + \value SV_API_5_3 Symbian/S60 API version 5.3 release + \value SV_API_5_4 Symbian/S60 API version 5.4 release \value SV_Unknown An unknown and currently unsupported platform \sa S60Version, WinVersion, MacVersion @@ -1219,9 +1221,10 @@ bool qSharedBuild() \value SV_S60_3_1 S60 3rd Edition Feature Pack 1 \value SV_S60_3_2 S60 3rd Edition Feature Pack 2 \value SV_S60_5_0 S60 5th Edition - \value SV_S60_5_1 S60 5th Edition Feature Pack 1 - \value SV_S60_5_2 Symbian^3 - \value SV_S60_5_3 To be determined - FIXME + \value SV_S60_5_1 \e{This enum value is deprecated.} + \value SV_S60_5_2 Symbian^3 and Symbian Anna + \value SV_S60_5_3 Symbian/S60 API version 5.3 release + \value SV_S60_5_4 Symbian/S60 API version 5.4 release \value SV_S60_Unknown An unknown and currently unsupported platform \omitvalue SV_S60_None @@ -1866,9 +1869,12 @@ static void symbianInitVersions() } else if (minor == 2) { cachedS60Version = QSysInfo::SV_S60_5_2; cachedSymbianVersion = QSysInfo::SV_SF_3; - } else if (minor >= 3) { + } else if (minor == 3) { cachedS60Version = QSysInfo::SV_S60_5_3; - cachedSymbianVersion = QSysInfo::SV_SF_3; + cachedSymbianVersion = QSysInfo::SV_API_5_3; + } else if (minor >= 4) { + cachedS60Version = QSysInfo::SV_S60_5_4; + cachedSymbianVersion = QSysInfo::SV_API_5_4; } } } @@ -1894,7 +1900,10 @@ static void symbianInitVersions() cachedSymbianVersion = QSysInfo::SV_SF_3; # elif defined(S60_VERSION_5_3) cachedS60Version = QSysInfo::SV_S60_5_3; - cachedSymbianVersion = QSysInfo::SV_SF_3; + cachedSymbianVersion = QSysInfo::SV_API_5_3; +# elif defined(S60_VERSION_5_4) + cachedS60Version = QSysInfo::SV_S60_5_4; + cachedSymbianVersion = QSysInfo::SV_API_5_4; # endif } # endif diff --git a/src/corelib/global/qglobal.h b/src/corelib/global/qglobal.h index c2244cd..9434eb2 100644 --- a/src/corelib/global/qglobal.h +++ b/src/corelib/global/qglobal.h @@ -1617,7 +1617,9 @@ public: SV_SF_1 = SV_9_4, SV_SF_2 = 40, SV_SF_3 = 50, - SV_SF_4 = 60 // Deprecated + SV_SF_4 = 60, // Deprecated + SV_API_5_3 = 70, + SV_API_5_4 = 80 }; static SymbianVersion symbianVersion(); enum S60Version { @@ -1626,9 +1628,10 @@ public: SV_S60_3_1 = SV_9_2, SV_S60_3_2 = SV_9_3, SV_S60_5_0 = SV_9_4, - SV_S60_5_1 = SV_SF_2, + SV_S60_5_1 = SV_SF_2, // Deprecated SV_S60_5_2 = SV_SF_3, - SV_S60_5_3 = 70 + SV_S60_5_3 = SV_API_5_3, + SV_S60_5_4 = SV_API_5_4 }; static S60Version s60Version(); #endif diff --git a/src/corelib/global/qnamespace.h b/src/corelib/global/qnamespace.h index f015ed0..75ce68a 100644 --- a/src/corelib/global/qnamespace.h +++ b/src/corelib/global/qnamespace.h @@ -525,8 +525,8 @@ public: #endif WA_X11DoNotAcceptFocus = 132, - - WA_MacNoShadow = 133, + WA_SymbianNoSystemRotation = 133, + WA_MacNoShadow = 134, // Add new attributes before this line WA_AttributeCount diff --git a/src/corelib/global/qnamespace.qdoc b/src/corelib/global/qnamespace.qdoc index 07a9503..7cc0814 100644 --- a/src/corelib/global/qnamespace.qdoc +++ b/src/corelib/global/qnamespace.qdoc @@ -1251,6 +1251,7 @@ \omitvalue WA_SetWindowModality \omitvalue WA_WState_WindowOpacitySet \omitvalue WA_WState_AcceptedTouchBeginEvent + \omitvalue WA_SymbianNoSystemRotation */ /*! \typedef Qt::HANDLE diff --git a/src/declarative/debugger/qdeclarativedebugserver.cpp b/src/declarative/debugger/qdeclarativedebugserver.cpp index e43b90d..75e9a09 100644 --- a/src/declarative/debugger/qdeclarativedebugserver.cpp +++ b/src/declarative/debugger/qdeclarativedebugserver.cpp @@ -91,7 +91,7 @@ public: QStringList clientPlugins; bool gotHello; - static QDeclarativeDebugServerConnection *loadConnectionPlugin(); + static QDeclarativeDebugServerConnection *loadConnectionPlugin(const QString &pluginName); }; QDeclarativeDebugServerPrivate::QDeclarativeDebugServerPrivate() : @@ -113,7 +113,8 @@ void QDeclarativeDebugServerPrivate::advertisePlugins() connection->send(message); } -QDeclarativeDebugServerConnection *QDeclarativeDebugServerPrivate::loadConnectionPlugin() +QDeclarativeDebugServerConnection *QDeclarativeDebugServerPrivate::loadConnectionPlugin( + const QString &pluginName) { QStringList pluginCandidates; const QStringList paths = QCoreApplication::libraryPaths(); @@ -122,7 +123,8 @@ QDeclarativeDebugServerConnection *QDeclarativeDebugServerPrivate::loadConnectio if (dir.exists()) { QStringList plugins(dir.entryList(QDir::Files)); foreach (const QString &pluginPath, plugins) { - pluginCandidates << dir.absoluteFilePath(pluginPath); + if (QFileInfo(pluginPath).fileName().contains(pluginName)) + pluginCandidates << dir.absoluteFilePath(pluginPath); } } } @@ -166,7 +168,7 @@ QDeclarativeDebugServer *QDeclarativeDebugServer::instance() bool block = false; bool ok = false; - // format: qmljsdebugger=port:3768[,block] + // format: qmljsdebugger=port:3768[,block] OR qmljsdebugger=ost[,block] if (!appD->qmljsDebugArgumentsString().isEmpty()) { if (!QDeclarativeEnginePrivate::qml_debugging_enabled) { const QString message = @@ -177,17 +179,23 @@ QDeclarativeDebugServer *QDeclarativeDebugServer::instance() return 0; } + QString pluginName; if (appD->qmljsDebugArgumentsString().indexOf(QLatin1String("port:")) == 0) { int separatorIndex = appD->qmljsDebugArgumentsString().indexOf(QLatin1Char(',')); port = appD->qmljsDebugArgumentsString().mid(5, separatorIndex - 5).toInt(&ok); + pluginName = QLatin1String("qmldbg_tcp"); + } else if (appD->qmljsDebugArgumentsString().contains("ost")) { + pluginName = QLatin1String("qmldbg_ost"); + ok = true; } + block = appD->qmljsDebugArgumentsString().contains(QLatin1String("block")); if (ok) { server = new QDeclarativeDebugServer(); QDeclarativeDebugServerConnection *connection - = QDeclarativeDebugServerPrivate::loadConnectionPlugin(); + = QDeclarativeDebugServerPrivate::loadConnectionPlugin(pluginName); if (connection) { server->d_func()->connection = connection; diff --git a/src/declarative/graphicsitems/qdeclarativegridview.cpp b/src/declarative/graphicsitems/qdeclarativegridview.cpp index 174114f..f30831d 100644 --- a/src/declarative/graphicsitems/qdeclarativegridview.cpp +++ b/src/declarative/graphicsitems/qdeclarativegridview.cpp @@ -584,6 +584,26 @@ void QDeclarativeGridViewPrivate::refill(qreal from, qreal to, bool doBuffer) --i; modelIndex = visibleItems.at(i)->index + 1; } + + if (visibleItems.count() && (fillFrom > rowPos + rowSize()*2 + || fillTo < rowPosAt(visibleIndex) - rowSize())) { + // We've jumped more than a page. Estimate which items are now + // visible and fill from there. + int count = (fillFrom - (rowPos + rowSize())) / (rowSize()) * columns; + for (int i = 0; i < visibleItems.count(); ++i) + releaseItem(visibleItems.at(i)); + visibleItems.clear(); + modelIndex += count; + if (modelIndex >= model->count()) + modelIndex = model->count() - 1; + else if (modelIndex < 0) + modelIndex = 0; + modelIndex = modelIndex / columns * columns; + visibleIndex = modelIndex; + colPos = colPosAt(visibleIndex); + rowPos = rowPosAt(visibleIndex); + } + int colNum = colPos / colSize(); FxGridItem *item = 0; @@ -2230,7 +2250,7 @@ qreal QDeclarativeGridView::maxXExtent() const qreal extent; qreal highlightStart; qreal highlightEnd; - qreal lastItemPosition; + qreal lastItemPosition = 0; if (d->isRightToLeftTopToBottom()){ highlightStart = d->highlightRangeStartValid ? d->highlightRangeEnd : d->size(); highlightEnd = d->highlightRangeEndValid ? d->highlightRangeStart : d->size(); diff --git a/src/declarative/graphicsitems/qdeclarativelistview.cpp b/src/declarative/graphicsitems/qdeclarativelistview.cpp index 9dbbb74..c5fad9d 100644 --- a/src/declarative/graphicsitems/qdeclarativelistview.cpp +++ b/src/declarative/graphicsitems/qdeclarativelistview.cpp @@ -744,6 +744,28 @@ void QDeclarativeListViewPrivate::refill(qreal from, qreal to, bool doBuffer) if (visibleItems.at(i)->index != -1) modelIndex = visibleItems.at(i)->index + 1; } + + if (visibleItems.count() && (fillFrom > itemEnd+averageSize+spacing + || fillTo < visiblePos - averageSize - spacing)) { + // We've jumped more than a page. Estimate which items are now + // visible and fill from there. + int count = (fillFrom - itemEnd) / (averageSize + spacing); + for (int i = 0; i < visibleItems.count(); ++i) + releaseItem(visibleItems.at(i)); + visibleItems.clear(); + modelIndex += count; + if (modelIndex >= model->count()) { + count -= modelIndex - model->count() + 1; + modelIndex = model->count() - 1; + } else if (modelIndex < 0) { + count -= modelIndex; + modelIndex = 0; + } + visibleIndex = modelIndex; + visiblePos = itemEnd + count * (averageSize + spacing) + 1; + itemEnd = visiblePos-1; + } + bool changed = false; FxListItem *item = 0; qreal pos = itemEnd + 1; @@ -2119,9 +2141,11 @@ void QDeclarativeListView::setOrientation(QDeclarativeListView::Orientation orie if (d->orient == QDeclarativeListView::Vertical) { setContentWidth(-1); setFlickableDirection(VerticalFlick); + setContentX(0); } else { setContentHeight(-1); setFlickableDirection(HorizontalFlick); + setContentY(0); } d->regenerate(); emit orientationChanged(); @@ -2768,7 +2792,7 @@ void QDeclarativeListView::keyPressEvent(QKeyEvent *event) return; if (d->model && d->model->count() && d->interactive) { - if ((!d->isRightToLeft() && event->key() == Qt::Key_Left) + if ((d->orient == QDeclarativeListView::Horizontal && !d->isRightToLeft() && event->key() == Qt::Key_Left) || (d->orient == QDeclarativeListView::Horizontal && d->isRightToLeft() && event->key() == Qt::Key_Right) || (d->orient == QDeclarativeListView::Vertical && event->key() == Qt::Key_Up)) { if (currentIndex() > 0 || (d->wrap && !event->isAutoRepeat())) { @@ -2779,7 +2803,7 @@ void QDeclarativeListView::keyPressEvent(QKeyEvent *event) event->accept(); return; } - } else if ((!d->isRightToLeft() && event->key() == Qt::Key_Right) + } else if ((d->orient == QDeclarativeListView::Horizontal && !d->isRightToLeft() && event->key() == Qt::Key_Right) || (d->orient == QDeclarativeListView::Horizontal && d->isRightToLeft() && event->key() == Qt::Key_Left) || (d->orient == QDeclarativeListView::Vertical && event->key() == Qt::Key_Down)) { if (currentIndex() < d->model->count() - 1 || (d->wrap && !event->isAutoRepeat())) { diff --git a/src/declarative/graphicsitems/qdeclarativetextedit.cpp b/src/declarative/graphicsitems/qdeclarativetextedit.cpp index 2cb1c94..af2c8f3 100644 --- a/src/declarative/graphicsitems/qdeclarativetextedit.cpp +++ b/src/declarative/graphicsitems/qdeclarativetextedit.cpp @@ -582,6 +582,7 @@ void QDeclarativeTextEdit::setVAlign(QDeclarativeTextEdit::VAlignment alignment) d->vAlign = alignment; d->updateDefaultTextOption(); updateSize(); + moveCursorDelegate(); emit verticalAlignmentChanged(d->vAlign); } @@ -870,8 +871,6 @@ void QDeclarativeTextEdit::setCursorDelegate(QDeclarativeComponent* c) Q_D(QDeclarativeTextEdit); if(d->cursorComponent){ if(d->cursor){ - disconnect(d->control, SIGNAL(cursorPositionChanged()), - this, SLOT(moveCursorDelegate())); d->control->setCursorWidth(-1); dirtyCache(cursorRectangle()); delete d->cursor; @@ -897,8 +896,6 @@ void QDeclarativeTextEdit::loadCursorDelegate() return; d->cursor = qobject_cast<QDeclarativeItem*>(d->cursorComponent->create(qmlContext(this))); if(d->cursor){ - connect(d->control, SIGNAL(cursorPositionChanged()), - this, SLOT(moveCursorDelegate())); d->control->setCursorWidth(0); dirtyCache(cursorRectangle()); QDeclarative_setParent_noEvent(d->cursor, this); @@ -1173,7 +1170,7 @@ Qt::TextInteractionFlags QDeclarativeTextEdit::textInteractionFlags() const QRect QDeclarativeTextEdit::cursorRectangle() const { Q_D(const QDeclarativeTextEdit); - return d->control->cursorRect().toRect().translated(0,-d->yoff); + return d->control->cursorRect().toRect().translated(0,d->yoff); } @@ -1558,7 +1555,7 @@ void QDeclarativeTextEditPrivate::init() QObject::connect(control, SIGNAL(selectionChanged()), q, SLOT(updateSelectionMarkers())); QObject::connect(control, SIGNAL(cursorPositionChanged()), q, SLOT(updateSelectionMarkers())); QObject::connect(control, SIGNAL(cursorPositionChanged()), q, SIGNAL(cursorPositionChanged())); - QObject::connect(control, SIGNAL(cursorPositionChanged()), q, SIGNAL(cursorRectangleChanged())); + QObject::connect(control, SIGNAL(microFocusChanged()), q, SLOT(moveCursorDelegate())); QObject::connect(control, SIGNAL(linkActivated(QString)), q, SIGNAL(linkActivated(QString))); #ifndef QT_NO_CLIPBOARD QObject::connect(q, SIGNAL(readOnlyChanged(bool)), q, SLOT(q_canPasteChanged())); @@ -1583,16 +1580,17 @@ void QDeclarativeTextEdit::q_textChanged() d->updateDefaultTextOption(); updateSize(); updateTotalLines(); - updateMicroFocus(); emit textChanged(d->text); } void QDeclarativeTextEdit::moveCursorDelegate() { Q_D(QDeclarativeTextEdit); + updateMicroFocus(); + emit cursorRectangleChanged(); if(!d->cursor) return; - QRectF cursorRect = d->control->cursorRect(); + QRectF cursorRect = cursorRectangle(); d->cursor->setX(cursorRect.x()); d->cursor->setY(cursorRect.y()); } @@ -1625,7 +1623,6 @@ void QDeclarativeTextEdit::updateSelectionMarkers() d->lastSelectionEnd = d->control->textCursor().selectionEnd(); emit selectionEndChanged(); } - updateMicroFocus(); } QRectF QDeclarativeTextEdit::boundingRect() const diff --git a/src/declarative/qml/qdeclarativecomponent.cpp b/src/declarative/qml/qdeclarativecomponent.cpp index 276f790..8238252 100644 --- a/src/declarative/qml/qdeclarativecomponent.cpp +++ b/src/declarative/qml/qdeclarativecomponent.cpp @@ -880,6 +880,7 @@ QObject * QDeclarativeComponentPrivate::begin(QDeclarativeContextData *parentCon state->bindValues = enginePriv->bindValues; state->parserStatus = enginePriv->parserStatus; + state->finalizedParserStatus = enginePriv->finalizedParserStatus; state->componentAttached = enginePriv->componentAttached; if (state->componentAttached) state->componentAttached->prev = &state->componentAttached; @@ -887,6 +888,7 @@ QObject * QDeclarativeComponentPrivate::begin(QDeclarativeContextData *parentCon enginePriv->componentAttached = 0; enginePriv->bindValues.clear(); enginePriv->parserStatus.clear(); + enginePriv->finalizedParserStatus.clear(); state->completePending = true; enginePriv->inProgressCreations++; } @@ -917,6 +919,7 @@ void QDeclarativeComponentPrivate::beginDeferred(QDeclarativeEnginePrivate *engi state->bindValues = enginePriv->bindValues; state->parserStatus = enginePriv->parserStatus; + state->finalizedParserStatus = enginePriv->finalizedParserStatus; state->componentAttached = enginePriv->componentAttached; if (state->componentAttached) state->componentAttached->prev = &state->componentAttached; @@ -924,6 +927,7 @@ void QDeclarativeComponentPrivate::beginDeferred(QDeclarativeEnginePrivate *engi enginePriv->componentAttached = 0; enginePriv->bindValues.clear(); enginePriv->parserStatus.clear(); + enginePriv->finalizedParserStatus.clear(); state->completePending = true; enginePriv->inProgressCreations++; } @@ -961,6 +965,18 @@ void QDeclarativeComponentPrivate::complete(QDeclarativeEnginePrivate *enginePri QDeclarativeEnginePrivate::clear(ps); } + for (int ii = 0; ii < state->finalizedParserStatus.count(); ++ii) { + QPair<QDeclarativeGuard<QObject>, int> status = state->finalizedParserStatus.at(ii); + QObject *obj = status.first; + if (obj) { + void *args[] = { 0 }; + QMetaObject::metacall(obj, QMetaObject::InvokeMetaMethod, + status.second, args); + } + } + + //componentComplete() can register additional finalization objects + //that are then never handled. Handle them manually here. if (1 == enginePriv->inProgressCreations) { for (int ii = 0; ii < enginePriv->finalizedParserStatus.count(); ++ii) { QPair<QDeclarativeGuard<QObject>, int> status = enginePriv->finalizedParserStatus.at(ii); @@ -986,6 +1002,7 @@ void QDeclarativeComponentPrivate::complete(QDeclarativeEnginePrivate *enginePri state->bindValues.clear(); state->parserStatus.clear(); + state->finalizedParserStatus.clear(); state->completePending = false; enginePriv->inProgressCreations--; diff --git a/src/declarative/qml/qdeclarativecomponent_p.h b/src/declarative/qml/qdeclarativecomponent_p.h index 020c5e0..f8bec2b 100644 --- a/src/declarative/qml/qdeclarativecomponent_p.h +++ b/src/declarative/qml/qdeclarativecomponent_p.h @@ -101,6 +101,7 @@ public: ConstructionState() : componentAttached(0), completePending(false) {} QList<QDeclarativeEnginePrivate::SimpleList<QDeclarativeAbstractBinding> > bindValues; QList<QDeclarativeEnginePrivate::SimpleList<QDeclarativeParserStatus> > parserStatus; + QList<QPair<QDeclarativeGuard<QObject>, int> > finalizedParserStatus; QDeclarativeComponentAttached *componentAttached; QList<QDeclarativeError> errors; bool completePending; diff --git a/src/declarative/qml/qdeclarativecontextscriptclass.cpp b/src/declarative/qml/qdeclarativecontextscriptclass.cpp index bb4ece4..3abd787 100644 --- a/src/declarative/qml/qdeclarativecontextscriptclass.cpp +++ b/src/declarative/qml/qdeclarativecontextscriptclass.cpp @@ -227,6 +227,7 @@ QDeclarativeContextScriptClass::queryProperty(QDeclarativeContextData *bindConte if (data) { lastData = data; lastContext = bindContext; + lastScopeObject = scopeObject; return QScriptClass::HandlesReadAccess; } } @@ -268,17 +269,12 @@ QDeclarativeContextScriptClass::property(Object *object, const Identifier &name) QDeclarativeEnginePrivate *ep = QDeclarativeEnginePrivate::get(engine); QScriptEngine *scriptEngine = QDeclarativeEnginePrivate::getScriptEngine(engine); - if (lastScopeObject) { - - return ep->objectClass->property(lastScopeObject, name); - - } else if (lastData) { + if (lastData) { if (lastData->type) { - return Value(scriptEngine, ep->typeNameClass->newObject(bindContext->contextObject, lastData->type)); + return Value(scriptEngine, ep->typeNameClass->newObject(lastScopeObject, lastData->type)); } else if (lastData->typeNamespace) { - return Value(scriptEngine, ep->typeNameClass->newObject(bindContext->contextObject, - lastData->typeNamespace)); + return Value(scriptEngine, ep->typeNameClass->newObject(lastScopeObject, lastData->typeNamespace)); } else { int index = lastData->importedScriptIndex; if (index < bindContext->importedScripts.count()) { @@ -288,6 +284,10 @@ QDeclarativeContextScriptClass::property(Object *object, const Identifier &name) } } + } else if (lastScopeObject) { + + return ep->objectClass->property(lastScopeObject, name); + } else if (lastPropertyIndex != -1) { QScriptValue rv; diff --git a/src/declarative/util/qdeclarativexmllistmodel.cpp b/src/declarative/util/qdeclarativexmllistmodel.cpp index 4424490..0a39ca8 100644 --- a/src/declarative/util/qdeclarativexmllistmodel.cpp +++ b/src/declarative/util/qdeclarativexmllistmodel.cpp @@ -144,6 +144,7 @@ struct XmlQueryJob QList<void*> roleQueryErrorId; // the ptr to send back if there is an error QStringList keyRoleQueries; QStringList keyRoleResultsCache; + QString prefix; }; class QDeclarativeXmlQuery : public QObject @@ -172,6 +173,12 @@ public: } int doQuery(QString query, QString namespaces, QByteArray data, QList<QDeclarativeXmlListModelRole *>* roleObjects, QStringList keyRoleResultsCache) { + { + QMutexLocker m1(&m_mutex); + m_queryIds.ref(); + if (m_queryIds <= 0) + m_queryIds = 1; + } XmlQueryJob job; job.queryId = m_queryIds; @@ -194,9 +201,6 @@ public: { QMutexLocker ml(&m_mutex); m_jobs.insert(m_queryIds, job); - m_queryIds++; - if (m_queryIds <= 0) - m_queryIds = 1; } QMetaObject::invokeMethod(this, "processQuery", Qt::QueuedConnection, Q_ARG(int, job.queryId)); @@ -214,20 +218,15 @@ private slots: job = m_jobs.value(queryId); } - QDeclarativeXmlQueryResult r; - doQueryJob(&job); - doSubQueryJob(&job); - r.queryId = job.queryId; - r.size = m_size; - r.data = m_modelData; - r.inserted = m_insertedItemRanges; - r.removed = m_removedItemRanges; - r.keyRoleResultsCache = job.keyRoleResultsCache; + QDeclarativeXmlQueryResult result; + result.queryId = job.queryId; + doQueryJob(&job, &result); + doSubQueryJob(&job, &result); { QMutexLocker ml(&m_mutex); if (m_jobs.contains(queryId)) { - emit queryCompleted(r); + emit queryCompleted(result); m_jobs.remove(queryId); } } @@ -241,8 +240,8 @@ protected: private: - void doQueryJob(XmlQueryJob* job); - void doSubQueryJob(XmlQueryJob* job); + void doQueryJob(XmlQueryJob *job, QDeclarativeXmlQueryResult *currentResult); + void doSubQueryJob(XmlQueryJob *job, QDeclarativeXmlQueryResult *currentResult); void getValuesOfKeyRoles(const XmlQueryJob& currentJob, QStringList *values, QXmlQuery *query) const; void addIndexToRangeList(QList<QDeclarativeXmlListRange> *ranges, int index) const; @@ -250,17 +249,12 @@ private: QMutex m_mutex; QThread m_thread; QMap<int, XmlQueryJob> m_jobs; - int m_queryIds; - QString m_prefix; - int m_size; - QList<QList<QVariant> > m_modelData; - QList<QDeclarativeXmlListRange> m_insertedItemRanges; - QList<QDeclarativeXmlListRange> m_removedItemRanges; + QAtomicInt m_queryIds; }; Q_GLOBAL_STATIC(QDeclarativeXmlQuery, globalXmlQuery) -void QDeclarativeXmlQuery::doQueryJob(XmlQueryJob* currentJob) +void QDeclarativeXmlQuery::doQueryJob(XmlQueryJob *currentJob, QDeclarativeXmlQueryResult *currentResult) { Q_ASSERT(currentJob->queryId != -1); @@ -295,10 +289,8 @@ void QDeclarativeXmlQuery::doQueryJob(XmlQueryJob* currentJob) } currentJob->data = xml; - m_prefix = namespaces + prefix + QLatin1Char('/'); - m_size = 0; - if (count > 0) - m_size = count; + currentJob->prefix = namespaces + prefix + QLatin1Char('/'); + currentResult->size = (count > 0 ? count : 0); } void QDeclarativeXmlQuery::getValuesOfKeyRoles(const XmlQueryJob& currentJob, QStringList *values, QXmlQuery *query) const @@ -306,9 +298,9 @@ void QDeclarativeXmlQuery::getValuesOfKeyRoles(const XmlQueryJob& currentJob, QS const QStringList &keysQueries = currentJob.keyRoleQueries; QString keysQuery; if (keysQueries.count() == 1) - keysQuery = m_prefix + keysQueries[0]; + keysQuery = currentJob.prefix + keysQueries[0]; else if (keysQueries.count() > 1) - keysQuery = m_prefix + QLatin1String("concat(") + keysQueries.join(QLatin1String(",")) + QLatin1String(")"); + keysQuery = currentJob.prefix + QLatin1String("concat(") + keysQueries.join(QLatin1String(",")) + QLatin1String(")"); if (!keysQuery.isEmpty()) { query->setQuery(keysQuery); @@ -331,10 +323,9 @@ void QDeclarativeXmlQuery::addIndexToRangeList(QList<QDeclarativeXmlListRange> * ranges->append(qMakePair(index, 1)); } -void QDeclarativeXmlQuery::doSubQueryJob(XmlQueryJob* currentJob) +void QDeclarativeXmlQuery::doSubQueryJob(XmlQueryJob *currentJob, QDeclarativeXmlQueryResult *currentResult) { Q_ASSERT(currentJob->queryId != -1); - m_modelData.clear(); QBuffer b(¤tJob->data); b.open(QIODevice::ReadOnly); @@ -347,16 +338,14 @@ void QDeclarativeXmlQuery::doSubQueryJob(XmlQueryJob* currentJob) // See if any values of key roles have been inserted or removed. - m_insertedItemRanges.clear(); - m_removedItemRanges.clear(); if (currentJob->keyRoleResultsCache.isEmpty()) { - m_insertedItemRanges << qMakePair(0, m_size); + currentResult->inserted << qMakePair(0, currentResult->size); } else { if (keyRoleResults != currentJob->keyRoleResultsCache) { QStringList temp; for (int i=0; i<currentJob->keyRoleResultsCache.count(); i++) { if (!keyRoleResults.contains(currentJob->keyRoleResultsCache[i])) - addIndexToRangeList(&m_removedItemRanges, i); + addIndexToRangeList(¤tResult->removed, i); else temp << currentJob->keyRoleResultsCache[i]; } @@ -364,12 +353,12 @@ void QDeclarativeXmlQuery::doSubQueryJob(XmlQueryJob* currentJob) for (int i=0; i<keyRoleResults.count(); i++) { if (temp.count() == i || keyRoleResults[i] != temp[i]) { temp.insert(i, keyRoleResults[i]); - addIndexToRangeList(&m_insertedItemRanges, i); + addIndexToRangeList(¤tResult->inserted, i); } } } } - currentJob->keyRoleResultsCache = keyRoleResults; + currentResult->keyRoleResultsCache = keyRoleResults; // Get the new values for each role. //### we might be able to condense even further (query for everything in one go) @@ -377,7 +366,7 @@ void QDeclarativeXmlQuery::doSubQueryJob(XmlQueryJob* currentJob) for (int i = 0; i < queries.size(); ++i) { QList<QVariant> resultList; if (!queries[i].isEmpty()) { - subquery.setQuery(m_prefix + QLatin1String("(let $v := string(") + queries[i] + QLatin1String(") return if ($v) then ") + queries[i] + QLatin1String(" else \"\")")); + subquery.setQuery(currentJob->prefix + QLatin1String("(let $v := string(") + queries[i] + QLatin1String(") return if ($v) then ") + queries[i] + QLatin1String(" else \"\")")); if (subquery.isValid()) { QXmlResultItems resultItems; subquery.evaluateTo(&resultItems); @@ -391,9 +380,9 @@ void QDeclarativeXmlQuery::doSubQueryJob(XmlQueryJob* currentJob) } } //### should warn here if things have gone wrong. - while (resultList.count() < m_size) + while (resultList.count() < currentResult->size) resultList << QVariant(); - m_modelData << resultList; + currentResult->data << resultList; b.seek(0); } diff --git a/src/gui/egl/qegl_symbian.cpp b/src/gui/egl/qegl_symbian.cpp index 6533d11..fabf9d1 100644 --- a/src/gui/egl/qegl_symbian.cpp +++ b/src/gui/egl/qegl_symbian.cpp @@ -42,6 +42,7 @@ #include <QtGui/qpaintdevice.h> #include <QtGui/qpixmap.h> #include <QtGui/qwidget.h> +#include <QtGui/private/qapplication_p.h> #include "qegl_p.h" #include "qeglcontext_p.h" @@ -73,10 +74,14 @@ void QEglProperties::setPaintDeviceFormat(QPaintDevice *dev) return; int devType = dev->devType(); - if (devType == QInternal::Image) + if (devType == QInternal::Image) { setPixelFormat(static_cast<QImage *>(dev)->format()); - else - setPixelFormat(QImage::Format_RGB32); + } else { + QImage::Format format = QImage::Format_RGB32; + if (QApplicationPrivate::instance() && QApplicationPrivate::instance()->useTranslucentEGLSurfaces) + format = QImage::Format_ARGB32_Premultiplied; + setPixelFormat(format); + } } diff --git a/src/gui/gui.pro b/src/gui/gui.pro index fda76a2..8f72fea 100644 --- a/src/gui/gui.pro +++ b/src/gui/gui.pro @@ -55,11 +55,9 @@ DEFINES += Q_INTERNAL_QAPP_SRC symbian { TARGET.UID3=0x2001B2DD - symbian-abld|symbian-sbsv2 { - # ro-section in gui can exceed default allocated space, so move rw-section a little further - QMAKE_LFLAGS.ARMCC += --rw-base 0x800000 - QMAKE_LFLAGS.GCCE += -Tdata 0xC00000 - } + # ro-section in gui can exceed default allocated space, so move rw-section a little further + QMAKE_LFLAGS.ARMCC += --rw-base 0x800000 + QMAKE_LFLAGS.GCCE += -Tdata 0x800000 } neon:*-g++* { diff --git a/src/gui/inputmethod/qcoefepinputcontext_s60.cpp b/src/gui/inputmethod/qcoefepinputcontext_s60.cpp index 3b5290c..92f8384 100644 --- a/src/gui/inputmethod/qcoefepinputcontext_s60.cpp +++ b/src/gui/inputmethod/qcoefepinputcontext_s60.cpp @@ -77,6 +77,15 @@ QT_BEGIN_NAMESPACE Q_GUI_EXPORT void qt_s60_setPartialScreenInputMode(bool enable) { S60->partial_keyboard = enable; + + QInputContext *ic = 0; + if (QApplication::focusWidget()) { + ic = QApplication::focusWidget()->inputContext(); + } else if (qApp && qApp->inputContext()) { + ic = qApp->inputContext(); + } + if (ic) + ic->update(); } QCoeFepInputContext::QCoeFepInputContext(QObject *parent) @@ -108,7 +117,7 @@ QCoeFepInputContext::QCoeFepInputContext(QObject *parent) m_fepState->SetDefaultCase( EAknEditorTextCase ); m_fepState->SetPermittedCases( EAknEditorAllCaseModes ); m_fepState->SetSpecialCharacterTableResourceId(R_AVKON_SPECIAL_CHARACTER_TABLE_DIALOG); - m_fepState->SetNumericKeymap( EAknEditorStandardNumberModeKeymap ); + m_fepState->SetNumericKeymap(EAknEditorAlphanumericNumberModeKeymap); } QCoeFepInputContext::~QCoeFepInputContext() @@ -231,7 +240,7 @@ bool QCoeFepInputContext::filterEvent(const QEvent *event) // It ignores the mouse event, so we need to commit and send a selection event (which will get triggered // after the commit) if (!m_preeditString.isEmpty()) { - commitCurrentString(false); + commitCurrentString(true); int pos = focusWidget()->inputMethodQuery(Qt::ImCursorPosition).toInt(); @@ -410,12 +419,14 @@ void QCoeFepInputContext::resetSplitViewWidget(bool keepInputWidget) windowToMove->setUpdatesEnabled(false); if (!alwaysResize) { - if (gv->scene() && gv->scene()->focusItem()) { - // Check if the widget contains cursorPositionChanged signal and disconnect from it. - QByteArray signal = QMetaObject::normalizedSignature(SIGNAL(cursorPositionChanged())); - int index = gv->scene()->focusItem()->toGraphicsObject()->metaObject()->indexOfSignal(signal.right(signal.length() - 1)); - if (index != -1) - disconnect(gv->scene()->focusItem()->toGraphicsObject(), SIGNAL(cursorPositionChanged()), this, SLOT(translateInputWidget())); + if (gv->scene()) { + if (gv->scene()->focusItem()) { + // Check if the widget contains cursorPositionChanged signal and disconnect from it. + QByteArray signal = QMetaObject::normalizedSignature(SIGNAL(cursorPositionChanged())); + int index = gv->scene()->focusItem()->toGraphicsObject()->metaObject()->indexOfSignal(signal.right(signal.length() - 1)); + if (index != -1) + disconnect(gv->scene()->focusItem()->toGraphicsObject(), SIGNAL(cursorPositionChanged()), this, SLOT(translateInputWidget())); + } QGraphicsItem *rootItem = 0; foreach (QGraphicsItem *item, gv->scene()->items()) { @@ -529,28 +540,32 @@ void QCoeFepInputContext::ensureFocusWidgetVisible(QWidget *widget) // and greatly reduces event passing in orientation switch cases, // as the statuspane size is not changing. + if (alwaysResize) + windowToMove->setUpdatesEnabled(false); + if (!(windowToMove->windowState() & Qt::WindowFullScreen)) { windowToMove->setWindowState( (windowToMove->windowState() & ~(Qt::WindowMinimized | Qt::WindowFullScreen)) | Qt::WindowFullScreen); } if (alwaysResize) { - windowToMove->setUpdatesEnabled(false); - if (!moveWithinVisibleArea) + if (!moveWithinVisibleArea) { m_splitViewResizeBy = widget->height(); - - windowTop = widget->geometry().top(); - widget->resize(widget->width(), splitViewRect.height() - windowTop); + windowTop = widget->geometry().top(); + widget->resize(widget->width(), splitViewRect.height() - windowTop); + } if (gv->scene()) { const QRectF microFocusRect = gv->scene()->inputMethodQuery(Qt::ImMicroFocus).toRectF(); gv->ensureVisible(microFocusRect); } - windowToMove->setUpdatesEnabled(true); } else { translateInputWidget(); } + if (alwaysResize) + windowToMove->setUpdatesEnabled(true); + widget->setAttribute(Qt::WA_Resized, userResize); //not a user resize } @@ -574,6 +589,19 @@ void QCoeFepInputContext::updateHints(bool mustUpdateInputCapabilities) QWidget *w = focusWidget(); if (w) { Qt::InputMethodHints hints = w->inputMethodHints(); + + // Since splitview support works like an input method hint, yet it is private flag, + // we need to update its state separately. + if (QSysInfo::s60Version() > QSysInfo::SV_S60_5_0) { + TInt currentFlags = m_fepState->Flags(); + if (S60->partial_keyboard) + currentFlags |= QT_EAknEditorFlagEnablePartialScreen; + else + currentFlags &= ~QT_EAknEditorFlagEnablePartialScreen; + if (currentFlags != m_fepState->Flags()) + m_fepState->SetFlags(currentFlags); + } + if (hints != m_lastImHints) { m_lastImHints = hints; applyHints(hints); diff --git a/src/gui/kernel/kernel.pri b/src/gui/kernel/kernel.pri index 3aa28a4..3c57368 100644 --- a/src/gui/kernel/kernel.pri +++ b/src/gui/kernel/kernel.pri @@ -108,6 +108,8 @@ win32 { } symbian { + exists($${EPOCROOT}epoc32/include/platform/mw/akntranseffect.h): DEFINES += QT_SYMBIAN_HAVE_AKNTRANSEFFECT_H + SOURCES += \ kernel/qapplication_s60.cpp \ kernel/qeventdispatcher_s60.cpp \ diff --git a/src/gui/kernel/qapplication.cpp b/src/gui/kernel/qapplication.cpp index e91fe04..4096bf3 100644 --- a/src/gui/kernel/qapplication.cpp +++ b/src/gui/kernel/qapplication.cpp @@ -128,6 +128,10 @@ extern bool qt_wince_is_pocket_pc(); //qguifunctions_wince.cpp //#define ALIEN_DEBUG +#if defined(Q_OS_SYMBIAN) +#include "qt_s60_p.h" +#endif + static void initResources() { #if defined(Q_WS_WINCE) @@ -2438,6 +2442,11 @@ bool QApplication::event(QEvent *e) { Q_D(QApplication); if(e->type() == QEvent::Close) { +#if defined(Q_OS_SYMBIAN) + // In order to have proper application-exit effects on Symbian, certain + // native APIs have to be called _before_ closing/destroying the widgets. + bool effectStarted = qt_beginFullScreenEffect(); +#endif QCloseEvent *ce = static_cast<QCloseEvent*>(e); ce->accept(); closeAllWindows(); @@ -2451,8 +2460,14 @@ bool QApplication::event(QEvent *e) break; } } - if(ce->isAccepted()) + if (ce->isAccepted()) { return true; + } else { +#if defined(Q_OS_SYMBIAN) + if (effectStarted) + qt_abortFullScreenEffect(); +#endif + } } else if(e->type() == QEvent::LanguageChange) { #ifndef QT_NO_TRANSLATION setLayoutDirection(qt_detectRTLLanguage()?Qt::RightToLeft:Qt::LeftToRight); diff --git a/src/gui/kernel/qapplication_s60.cpp b/src/gui/kernel/qapplication_s60.cpp index 0688061..408c3b5 100644 --- a/src/gui/kernel/qapplication_s60.cpp +++ b/src/gui/kernel/qapplication_s60.cpp @@ -215,6 +215,12 @@ void QS60Data::controlVisibilityChanged(CCoeControl *control, bool visible) widget->repaint(); } } else { + // In certain special scenarios we may get an ENotVisible event + // without a previous EPartiallyVisible. The backingstore must + // still be destroyed, hence the registerWidget() call below. + if (backingStore.data() && widget->internalWinId() + && qt_widget_private(widget)->maybeBackingStore() == backingStore.data()) + backingStore.registerWidget(widget); backingStore.unregisterWidget(widget); // In order to ensure that any resources used by the window surface // are immediately freed, we flush the WSERV command buffer. @@ -459,6 +465,7 @@ QSymbianControl::QSymbianControl(QWidget *w) , m_ignoreFocusChanged(0) , m_symbianPopupIsOpen(0) , m_inExternalScreenOverride(false) + , m_lastStatusPaneVisibility(0) { } @@ -545,11 +552,52 @@ void QSymbianControl::setWidget(QWidget *w) { qwidget = w; } + +QPoint QSymbianControl::translatePointForFixedNativeOrientation(const TPoint &pointerEventPos) const +{ + QPoint pos(pointerEventPos.iX, pointerEventPos.iY); + if (qwidget->d_func()->fixNativeOrientationCalled) { + QSize wsize = qwidget->size(); + TSize size = Size(); + if (size.iWidth == wsize.height() && size.iHeight == wsize.width()) { + qreal x = pos.x(); + qreal y = pos.y(); + pos.setX(size.iHeight - y); + pos.setY(x); + } + } + return pos; +} + +TRect QSymbianControl::translateRectForFixedNativeOrientation(const TRect &controlRect) const +{ + TRect rect = controlRect; + if (qwidget->d_func()->fixNativeOrientationCalled) { + QPoint a = translatePointForFixedNativeOrientation(rect.iTl); + QPoint b = translatePointForFixedNativeOrientation(rect.iBr); + if (a.x() < b.x()) { + rect.iTl.iX = a.x(); + rect.iBr.iX = b.x(); + } else { + rect.iTl.iX = b.x(); + rect.iBr.iX = a.x(); + } + if (a.y() < b.y()) { + rect.iTl.iY = a.y(); + rect.iBr.iY = b.y(); + } else { + rect.iTl.iY = b.y(); + rect.iBr.iY = a.y(); + } + } + return rect; +} + void QSymbianControl::HandleLongTapEventL( const TPoint& aPenEventLocation, const TPoint& aPenEventScreenLocation ) { QWidget *alienWidget; - QPoint widgetPos = QPoint(aPenEventLocation.iX, aPenEventLocation.iY); - QPoint globalPos = QPoint(aPenEventScreenLocation.iX,aPenEventScreenLocation.iY); + QPoint widgetPos = translatePointForFixedNativeOrientation(aPenEventLocation); + QPoint globalPos = translatePointForFixedNativeOrientation(aPenEventScreenLocation); alienWidget = qwidget->childAt(widgetPos); if (!alienWidget) alienWidget = qwidget; @@ -564,7 +612,7 @@ void QSymbianControl::HandleLongTapEventL( const TPoint& aPenEventLocation, cons void QSymbianControl::translateAdvancedPointerEvent(const TAdvancedPointerEvent *event) { QApplicationPrivate *d = QApplicationPrivate::instance(); - QPointF screenPos = qwidget->mapToGlobal(QPoint(event->iPosition.iX, event->iPosition.iY)); + QPointF screenPos = qwidget->mapToGlobal(translatePointForFixedNativeOrientation(event->iPosition)); qreal pressure; if(d->pressureSupported && event->Pressure() > 0) //workaround for misconfigured HAL @@ -665,7 +713,7 @@ void QSymbianControl::HandlePointerEvent(const TPointerEvent& pEvent) mapS60MouseEventTypeToQt(&type, &button, &pEvent); Qt::KeyboardModifiers modifiers = mapToQtModifiers(pEvent.iModifiers); - QPoint widgetPos = QPoint(pEvent.iPosition.iX, pEvent.iPosition.iY); + QPoint widgetPos = translatePointForFixedNativeOrientation(pEvent.iPosition); TPoint controlScreenPos = PositionRelativeToScreen(); QPoint globalPos = QPoint(controlScreenPos.iX, controlScreenPos.iY) + widgetPos; S60->lastCursorPos = globalPos; @@ -1131,6 +1179,9 @@ void QSymbianControl::Draw(const TRect& controlRect) const Q_ASSERT(window); QTLWExtra *topExtra = window->d_func()->maybeTopData(); Q_ASSERT(topExtra); + + TRect wcontrolRect = translateRectForFixedNativeOrientation(controlRect); + if (!topExtra->inExpose) { topExtra->inExpose = true; if (!qwidget->isWindow()) { @@ -1141,7 +1192,7 @@ void QSymbianControl::Draw(const TRect& controlRect) const gc.SetBrushColor(TRgb(0, 0, 0, 0)); gc.Clear(controlRect); } - QRect exposeRect = qt_TRect2QRect(controlRect); + QRect exposeRect = qt_TRect2QRect(wcontrolRect); qwidget->d_func()->syncBackingStore(exposeRect); topExtra->inExpose = false; } @@ -1154,7 +1205,7 @@ void QSymbianControl::Draw(const TRect& controlRect) const const bool sendNativePaintEvents = qwidget->d_func()->extraData()->receiveNativePaintEvents; if (sendNativePaintEvents) { - const QRect r = qt_TRect2QRect(controlRect); + const QRect r = qt_TRect2QRect(wcontrolRect); QMetaObject::invokeMethod(qwidget, "beginNativePaintEvent", Qt::DirectConnection, Q_ARG(QRect, r)); } @@ -1209,7 +1260,7 @@ void QSymbianControl::Draw(const TRect& controlRect) const } if (sendNativePaintEvents) { - const QRect r = qt_TRect2QRect(controlRect); + const QRect r = qt_TRect2QRect(wcontrolRect); // The draw ops aren't actually sent to WSERV until the graphics // context is deactivated, which happens in the function calling // this one. We therefore delay the delivery of endNativePaintEvent, @@ -1222,14 +1273,45 @@ void QSymbianControl::Draw(const TRect& controlRect) const } } +void QSymbianControl::qwidgetResize_helper(const QSize &newSize) +{ + QRect cr = qwidget->geometry(); + QSize oldSize(cr.size()); + cr.setSize(newSize); + qwidget->data->crect = cr; + if (qwidget->isVisible()) { + QTLWExtra *tlwExtra = qwidget->d_func()->maybeTopData(); + bool slowResize = qgetenv("QT_SLOW_TOPLEVEL_RESIZE").toInt(); + if (!slowResize && tlwExtra) + tlwExtra->inTopLevelResize = true; + QResizeEvent e(newSize, oldSize); + qt_sendSpontaneousEvent(qwidget, &e); + if (!qwidget->testAttribute(Qt::WA_StaticContents)) + qwidget->d_func()->syncBackingStore(); + if (!slowResize && tlwExtra) + tlwExtra->inTopLevelResize = false; + } else { + if (!qwidget->testAttribute(Qt::WA_PendingResizeEvent)) { + QResizeEvent *e = new QResizeEvent(newSize, oldSize); + QApplication::postEvent(qwidget, e); + } + } +} + void QSymbianControl::SizeChanged() { CCoeControl::SizeChanged(); + // When FixNativeOrientation had been called, the RWindow/CCoeControl size + // and the surface/QWidget size have nothing to do with each other. + if (qwidget->d_func()->fixNativeOrientationCalled) + return; + QSize oldSize = qwidget->size(); QSize newSize(Size().iWidth, Size().iHeight); if (oldSize != newSize) { + // Enforce the proper size for fullscreen widgets on the secondary screen. const bool isFullscreen = qwidget->windowState() & Qt::WindowFullScreen; const int screenNumber = S60->screenNumberForWidget(qwidget); if (!m_inExternalScreenOverride && isFullscreen && screenNumber > 0) { @@ -1242,26 +1324,8 @@ void QSymbianControl::SizeChanged() return; } } - QRect cr = qwidget->geometry(); - cr.setSize(newSize); - qwidget->data->crect = cr; - if (qwidget->isVisible()) { - QTLWExtra *tlwExtra = qwidget->d_func()->maybeTopData(); - bool slowResize = qgetenv("QT_SLOW_TOPLEVEL_RESIZE").toInt(); - if (!slowResize && tlwExtra) - tlwExtra->inTopLevelResize = true; - QResizeEvent e(newSize, oldSize); - qt_sendSpontaneousEvent(qwidget, &e); - if (!qwidget->testAttribute(Qt::WA_StaticContents)) - qwidget->d_func()->syncBackingStore(); - if (!slowResize && tlwExtra) - tlwExtra->inTopLevelResize = false; - } else { - if (!qwidget->testAttribute(Qt::WA_PendingResizeEvent)) { - QResizeEvent *e = new QResizeEvent(newSize, oldSize); - QApplication::postEvent(qwidget, e); - } - } + + qwidgetResize_helper(newSize); } m_inExternalScreenOverride = false; @@ -1427,7 +1491,13 @@ void QSymbianControl::HandleResourceChange(int resourceType) } break; case KInternalStatusPaneChange: - handleClientAreaChange(); + // When status pane is not visible, only handle client area change if status pane was + // previously visible, as size changes to hidden status pane should not affect + // client area. + if (S60->statusPane() && (S60->statusPane()->IsVisible() || m_lastStatusPaneVisibility)) { + m_lastStatusPaneVisibility = S60->statusPane()->IsVisible(); + handleClientAreaChange(); + } if (IsFocused() && IsVisible()) { qwidget->d_func()->setWindowIcon_sys(true); qwidget->d_func()->setWindowTitle_sys(qwidget->windowTitle()); @@ -1441,8 +1511,10 @@ void QSymbianControl::HandleResourceChange(int resourceType) { handleClientAreaChange(); // Send resize event to trigger desktopwidget workAreaResized signal - QResizeEvent e(qt_desktopWidget->size(), qt_desktopWidget->size()); - QApplication::sendEvent(qt_desktopWidget, &e); + if (qt_desktopWidget) { + QResizeEvent e(qt_desktopWidget->size(), qt_desktopWidget->size()); + QApplication::sendEvent(qt_desktopWidget, &e); + } break; } #endif @@ -1504,29 +1576,49 @@ bool QSymbianControl::isControlActive() void QSymbianControl::ensureFixNativeOrientation() { #if defined(Q_SYMBIAN_SUPPORTS_FIXNATIVEORIENTATION) - // Call FixNativeOrientation() for fullscreen QDeclarativeViews that - // have a locked orientation matching the native orientation of the device. - // This avoids unnecessary window rotation on wserv level. - if (!qwidget->isWindow() || qwidget->windowType() == Qt::Desktop - || !qwidget->inherits("QDeclarativeView") - || S60->screenNumberForWidget(qwidget) > 0) + if (!qwidget->isWindow() || qwidget->windowType() == Qt::Desktop) + return; + if (S60->screenNumberForWidget(qwidget) > 0) return; - const bool isFullScreen = qwidget->windowState().testFlag(Qt::WindowFullScreen); const bool isFixed = qwidget->d_func()->fixNativeOrientationCalled; - const bool matchesNative = qwidget->testAttribute( - S60->nativeOrientationIsPortrait ? Qt::WA_LockPortraitOrientation - : Qt::WA_LockLandscapeOrientation); - if (isFullScreen && matchesNative) { - if (!isFixed) { - Window().FixNativeOrientation(); - qwidget->d_func()->fixNativeOrientationCalled = true; + const bool isFixEnabled = qwidget->testAttribute(Qt::WA_SymbianNoSystemRotation); + const bool isFullScreen = qwidget->windowState().testFlag(Qt::WindowFullScreen); + if (isFullScreen && isFixEnabled) { + const bool surfaceBasedGs = + QApplicationPrivate::graphics_system_name == QLatin1String("openvg") + || QApplicationPrivate::graphics_system_name == QLatin1String("opengl"); + if (!surfaceBasedGs) + qwidget->setAttribute(Qt::WA_SymbianNoSystemRotation, false); + if (!isFixed && surfaceBasedGs) { + if (Window().FixNativeOrientation() == KErrNone) { + qwidget->d_func()->fixNativeOrientationCalled = true; + // The EGL window surface is now fixed to the native orientation + // of the device, no matter what size we pass when creating it. + // Enforce the same size for the QWidget too. For the underlying + // CCoeControl and RWindow it is up to the system to resize them + // when the standard auto-rotation mechanism is in use, we must not + // change that behavior by forcing any size for those. In practice + // this means that the QWidget and the underlying native control + // dimensions will be out of sync when FixNativeOrientation was + // called and the device is turned to the non-native (typically + // landscape) orientation. The pointer event handling and certain + // functions like Draw() will need to compensate for this. + QSize newSize(S60->nativeScreenWidthInPixels, S60->nativeScreenHeightInPixels); + if (qwidget->size() != newSize) + qwidgetResize_helper(newSize); + } else { + qwidget->setAttribute(Qt::WA_SymbianNoSystemRotation, false); + } } } else if (isFixed) { + qwidget->setAttribute(Qt::WA_SymbianNoSystemRotation, false); qwidget->d_func()->fixNativeOrientationCalled = false; qwidget->hide(); qwidget->d_func()->create_sys(0, false, true); qwidget->show(); } +#else + qwidget->setAttribute(Qt::WA_SymbianNoSystemRotation, false); #endif } @@ -1738,9 +1830,7 @@ void qt_init(QApplicationPrivate * /* priv */, int) systemFont.setFamily(systemFont.defaultFamily()); QApplicationPrivate::setSystemFont(systemFont); -#ifdef Q_SYMBIAN_TRANSITION_EFFECTS QObject::connect(qApp, SIGNAL(aboutToQuit()), qApp, SLOT(_q_aboutToQuit())); -#endif #ifdef Q_SYMBIAN_SEMITRANSPARENT_BG_SURFACE QApplicationPrivate::instance()->useTranslucentEGLSurfaces = true; @@ -1765,6 +1855,8 @@ void qt_init(QApplicationPrivate * /* priv */, int) } else { QApplicationPrivate::instance()->useTranslucentEGLSurfaces = false; } + if (QApplicationPrivate::graphics_system_name == QLatin1String("raster")) + QApplicationPrivate::instance()->useTranslucentEGLSurfaces = false; #else QApplicationPrivate::instance()->useTranslucentEGLSurfaces = false; #endif @@ -1836,6 +1928,9 @@ void qt_cleanup() S60->setButtonGroupContainer(0); #endif + // Call EndFullScreen() to prevent confusing the system effect state machine. + qt_endFullScreenEffect(); + if (S60->qtOwnsS60Environment) { // Restore the S60 framework trap handler. See qt_init(). User::SetTrapHandler(S60->s60InstalledTrapHandler); @@ -2581,6 +2676,8 @@ void QApplication::restoreOverrideCursor() void QApplicationPrivate::_q_aboutToQuit() { + qt_beginFullScreenEffect(); + #ifdef Q_SYMBIAN_TRANSITION_EFFECTS // Send the shutdown tfx command S60->wsSession().SendEffectCommand(ETfxCmdAppShutDown); diff --git a/src/gui/kernel/qt_s60_p.h b/src/gui/kernel/qt_s60_p.h index ee0b862..8aba53a 100644 --- a/src/gui/kernel/qt_s60_p.h +++ b/src/gui/kernel/qt_s60_p.h @@ -77,6 +77,10 @@ #include <akncontext.h> // CAknContextPane #include <eikspane.h> // CEikStatusPane #include <AknPopupFader.h> // MAknFadedComponent and TAknPopupFader +#include <gfxtranseffect/gfxtranseffect.h> // BeginFullScreen +#ifdef QT_SYMBIAN_HAVE_AKNTRANSEFFECT_H +#include <akntranseffect.h> // BeginFullScreen +#endif #endif QT_BEGIN_NAMESPACE @@ -85,6 +89,9 @@ QT_BEGIN_NAMESPACE // system events seems to start with 0x10 const TInt KInternalStatusPaneChange = 0x50000000; +// For BeginFullScreen(). +const TUint KQtAppExitFlag = 0x400; + static const int qt_symbian_max_screens = 4; //this macro exists because EColor16MAP enum value doesn't exist in Symbian OS 9.2 @@ -191,7 +198,11 @@ public: int screenWidthInTwipsForScreen[qt_symbian_max_screens]; int screenHeightInTwipsForScreen[qt_symbian_max_screens]; - bool nativeOrientationIsPortrait; + int nativeScreenWidthInPixels; + int nativeScreenHeightInPixels; + + int beginFullScreenCalled : 1; + int endFullScreenCalled : 1; }; Q_AUTOTEST_EXPORT QS60Data* qGlobalS60Data(); @@ -237,6 +248,8 @@ public: bool isControlActive(); void ensureFixNativeOrientation(); + QPoint translatePointForFixedNativeOrientation(const TPoint &pointerEventPos) const; + TRect translateRectForFixedNativeOrientation(const TRect &controlRect) const; #ifdef Q_WS_S60 void FadeBehindPopup(bool fade){ popupFader.FadeBehindPopup( this, this, fade); } @@ -256,6 +269,9 @@ protected: void PositionChanged(); void FocusChanged(TDrawNow aDrawNow); +protected: + void qwidgetResize_helper(const QSize &newSize); + private: void HandlePointerEvent(const TPointerEvent& aPointerEvent); TKeyResponse OfferKeyEvent(const TKeyEvent& aKeyEvent,TEventCode aType); @@ -295,6 +311,7 @@ private: #endif bool m_inExternalScreenOverride : 1; + bool m_lastStatusPaneVisibility : 1; }; inline QS60Data::QS60Data() @@ -327,6 +344,8 @@ inline QS60Data::QS60Data() #ifdef Q_OS_SYMBIAN ,s60InstalledTrapHandler(0) #endif + ,beginFullScreenCalled(0), + endFullScreenCalled(0) { } @@ -362,18 +381,15 @@ inline void QS60Data::updateScreenSize() // Look for a screen mode with rotation 0 // in order to decide what the native orientation is. - int nativeScreenWidthInPixels = 0; - int nativeScreenHeightInPixels = 0; for (mode = 0; mode < screenModeCount; ++mode) { TPixelsAndRotation sizeAndRotation; dev->GetScreenModeSizeAndRotation(mode, sizeAndRotation); if (sizeAndRotation.iRotation == CFbsBitGc::EGraphicsOrientationNormal) { - nativeScreenWidthInPixels = sizeAndRotation.iPixelSize.iWidth; - nativeScreenHeightInPixels = sizeAndRotation.iPixelSize.iHeight; + S60->nativeScreenWidthInPixels = sizeAndRotation.iPixelSize.iWidth; + S60->nativeScreenHeightInPixels = sizeAndRotation.iPixelSize.iHeight; break; } } - S60->nativeOrientationIsPortrait = nativeScreenWidthInPixels <= nativeScreenHeightInPixels; } inline RWsSession& QS60Data::wsSession() @@ -561,6 +577,49 @@ void qt_symbian_set_cursor_visible(bool visible); bool qt_symbian_is_cursor_visible(); #endif +static inline bool qt_beginFullScreenEffect() +{ +#if defined(Q_WS_S60) && defined(QT_SYMBIAN_HAVE_AKNTRANSEFFECT_H) + // Only for post-S^3. On earlier versions the system transition effects + // may not be able to capture the non-Avkon content, leading to confusing + // looking effects, so just skip the whole thing. + if (S60->beginFullScreenCalled || QSysInfo::s60Version() <= QSysInfo::SV_S60_5_2) + return false; + S60->beginFullScreenCalled = true; + // For Avkon apps the app-exit effect is triggered from CAknAppUi::PrepareToExit(). + // That is good for Avkon apps, but in case of Qt the RWindows are destroyed earlier. + // Therefore we call BeginFullScreen() ourselves. + GfxTransEffect::BeginFullScreen(AknTransEffect::EApplicationExit, + TRect(0, 0, 0, 0), + AknTransEffect::EParameterType, + AknTransEffect::GfxTransParam(S60->uid, + AknTransEffect::TParameter::EAvkonCheck | KQtAppExitFlag)); + return true; +#else + return false; +#endif +} + +static inline void qt_abortFullScreenEffect() +{ +#if defined(Q_WS_S60) && defined(QT_SYMBIAN_HAVE_AKNTRANSEFFECT_H) + if (!S60->beginFullScreenCalled || QSysInfo::s60Version() <= QSysInfo::SV_S60_5_2) + return; + GfxTransEffect::AbortFullScreen(); + S60->beginFullScreenCalled = S60->endFullScreenCalled = false; +#endif +} + +static inline void qt_endFullScreenEffect() +{ +#if defined(Q_WS_S60) && defined(QT_SYMBIAN_HAVE_AKNTRANSEFFECT_H) + if (S60->endFullScreenCalled || QSysInfo::s60Version() <= QSysInfo::SV_S60_5_2) + return; + S60->endFullScreenCalled = true; + GfxTransEffect::EndFullScreen(); +#endif +} + QT_END_NAMESPACE #endif // QT_S60_P_H diff --git a/src/gui/kernel/qwidget_s60.cpp b/src/gui/kernel/qwidget_s60.cpp index 83e46e5..e28a75a 100644 --- a/src/gui/kernel/qwidget_s60.cpp +++ b/src/gui/kernel/qwidget_s60.cpp @@ -842,6 +842,8 @@ void QWidgetPrivate::s60UpdateIsOpaque() // recreate backing store to get translucent surface (raster surface). extra->topextra->backingStore.create(q); extra->topextra->backingStore.registerWidget(q); + // FixNativeOrientation() will not work without an EGL surface. + q->setAttribute(Qt::WA_SymbianNoSystemRotation, false); } } } else if (extra->topextra->nativeWindowTransparencyEnabled) { diff --git a/src/gui/styles/qs60style.cpp b/src/gui/styles/qs60style.cpp index 680e007..3a7672f 100644 --- a/src/gui/styles/qs60style.cpp +++ b/src/gui/styles/qs60style.cpp @@ -72,6 +72,7 @@ #include "qcheckbox.h" #include "qdesktopwidget.h" #include "qprogressbar.h" +#include "qlabel.h" #include "private/qtoolbarextension_p.h" #include "private/qcombobox_p.h" @@ -681,6 +682,13 @@ void QS60StylePrivate::setThemePalette(QWidget *widget) if (header->viewport()) header->viewport()->setPalette(widgetPalette); QApplication::setPalette(widgetPalette, "QHeaderView"); + } else if (qobject_cast<QLabel *>(widget)) { + if (widget->window() && widget->window()->windowType() == Qt::Dialog) { + QPalette widgetPalette = widget->palette(); + widgetPalette.setColor(QPalette::WindowText, + s60Color(QS60StyleEnums::CL_QsnTextColors, 19, 0)); + widget->setPalette(widgetPalette); + } } } @@ -1540,8 +1548,10 @@ void QS60Style::drawControl(ControlElement element, const QStyleOption *option, skinElement==QS60StylePrivate::SE_TabBarTabWestActive) { const int borderThickness = QS60StylePrivate::pixelMetric(PM_DefaultFrameWidth); - const int tabOverlap = - QS60StylePrivate::pixelMetric(PM_TabBarTabOverlap) - borderThickness; + int tabOverlap = pixelMetric(PM_TabBarTabOverlap); + if (tabOverlap > borderThickness) + tabOverlap -= borderThickness; + const bool usesScrollButtons = (widget) ? (qobject_cast<const QTabBar*>(widget))->usesScrollButtons() : false; const int roomForScrollButton = @@ -1580,9 +1590,11 @@ void QS60Style::drawControl(ControlElement element, const QStyleOption *option, QStyleOptionTabV3 optionTab = *tab; QRect tr = optionTab.rect; const bool directionMirrored = (optionTab.direction == Qt::RightToLeft); - const int borderThickness = QS60StylePrivate::pixelMetric(PM_DefaultFrameWidth); - const int tabOverlap = - QS60StylePrivate::pixelMetric(PM_TabBarTabOverlap) - borderThickness; + const int borderThickness = + QS60StylePrivate::pixelMetric(PM_DefaultFrameWidth); + int tabOverlap = pixelMetric(PM_TabBarTabOverlap); + if (tabOverlap > borderThickness) + tabOverlap -= borderThickness; const bool usesScrollButtons = (widget) ? (qobject_cast<const QTabBar*>(widget))->usesScrollButtons() : false; const int roomForScrollButton = @@ -2531,6 +2543,11 @@ int QS60Style::pixelMetric(PixelMetric metric, const QStyleOption *option, const //without having to define custom pixel metric metricValue *= 2; +#if defined(Q_WS_S60) + if (metric == PM_TabBarTabOverlap && (QSysInfo::s60Version() > QSysInfo::SV_S60_5_2)) + metricValue = 0; +#endif + return metricValue; } @@ -2645,8 +2662,6 @@ QSize QS60Style::sizeFromContents(ContentsType ct, const QStyleOption *opt, } } sz = QCommonStyle::sizeFromContents( ct, opt, csz, widget); - //native items have small empty areas at the beginning and end of menu item - sz.setWidth(sz.width() + 2 * pixelMetric(PM_MenuHMargin) + 2 * QS60StylePrivate::pixelMetric(PM_FrameCornerWidth)); if (QS60StylePrivate::isTouchSupported()) { //Make itemview easier to use in touch devices sz.setHeight(sz.height() + 2 * pixelMetric(PM_FocusFrameVMargin)); @@ -3005,10 +3020,11 @@ QRect QS60Style::subElementRect(SubElement element, const QStyleOption *opt, con ret = QCommonStyle::subElementRect(element, opt, widget); if (const QStyleOptionTabWidgetFrame *twf = qstyleoption_cast<const QStyleOptionTabWidgetFrame *>(opt)) { - const int tabOverlapNoBorder = - QS60StylePrivate::pixelMetric(PM_TabBarTabOverlap); - const int tabOverlap = - tabOverlapNoBorder - QS60StylePrivate::pixelMetric(PM_DefaultFrameWidth); + const int borderThickness = + QS60StylePrivate::pixelMetric(PM_DefaultFrameWidth); + int tabOverlap = pixelMetric(PM_TabBarTabOverlap); + if (tabOverlap > borderThickness) + tabOverlap -= borderThickness; const QTabWidget *tab = qobject_cast<const QTabWidget *>(widget); int gain = (tab) ? tabOverlap * tab->count() : 0; switch (twf->shape) { @@ -3026,7 +3042,7 @@ QRect QS60Style::subElementRect(SubElement element, const QStyleOption *opt, con if ((ret.right() + gain) > widget->rect().right()) gain = widget->rect().right() - ret.right(); ret.adjust(0, 0, gain, 0); - } + } } break; } @@ -3114,7 +3130,7 @@ QRect QS60Style::subElementRect(SubElement element, const QStyleOption *opt, con } break; case SE_ItemViewItemCheckIndicator: - if (const QStyleOptionViewItemV2 *vopt = qstyleoption_cast<const QStyleOptionViewItemV2 *>(opt)) { + if (const QStyleOptionViewItemV4 *vopt = qstyleoption_cast<const QStyleOptionViewItemV4 *>(opt)) { const QAbstractItemView *listItem = qobject_cast<const QAbstractItemView *>(widget); const bool singleSelection = listItem && @@ -3122,7 +3138,7 @@ QRect QS60Style::subElementRect(SubElement element, const QStyleOption *opt, con listItem->selectionMode() == QAbstractItemView::NoSelection); const bool checkBoxOnly = (vopt->features & QStyleOptionViewItemV2::HasCheckIndicator) && listItem && - singleSelection; + singleSelection && vopt->text.isEmpty() && vopt->icon.isNull(); // Selection check mark rect. const int indicatorWidth = QS60StylePrivate::pixelMetric(PM_IndicatorWidth); diff --git a/src/gui/styles/qs60style_s60.cpp b/src/gui/styles/qs60style_s60.cpp index 6b79874..60e20cd 100644 --- a/src/gui/styles/qs60style_s60.cpp +++ b/src/gui/styles/qs60style_s60.cpp @@ -89,17 +89,25 @@ enum TSupportRelease { ES60_5_0 = 0x0004, ES60_5_1 = 0x0008, ES60_5_2 = 0x0010, + ES60_5_3 = 0x0020, ES60_3_X = ES60_3_1 | ES60_3_2, // Releases before Symbian Foundation ES60_PreSF = ES60_3_1 | ES60_3_2 | ES60_5_0, + // Releases before the S60 5.2 + ES60_Pre52 = ES60_3_1 | ES60_3_2 | ES60_5_0 | ES60_5_1, + // Releases before S60 5.3 + ES60_Pre53 = ES60_3_1 | ES60_3_2 | ES60_5_0 | ES60_5_1 | ES60_5_2, // Add all new releases here - ES60_All = ES60_3_1 | ES60_3_2 | ES60_5_0 | ES60_5_1 | ES60_5_2 + ES60_All = ES60_3_1 | ES60_3_2 | ES60_5_0 | ES60_5_1 | ES60_5_2 | ES60_5_3 }; typedef struct { - const TAknsItemID &skinID; - TDrawType drawType; - int supportInfo; + const TAknsItemID &skinID; // Determines default theme graphics ID. + TDrawType drawType; // Determines which native drawing routine is used to draw this item. + int supportInfo; // Defines the S60 versions that use the default graphics. + // These two, define new graphics that are used in releases other than partMapEntry.supportInfo defined releases. + // In general, these are given in numeric form to allow style compilation in earlier + // native releases that do not contain the new graphics. int newMajorSkinId; int newMinorSkinId; } partMapEntry; @@ -188,12 +196,14 @@ const partMapEntry QS60StyleModeSpecifics::m_partMap[] = { /* SP_QgnGrafScrollArrowLeft */ {KAknsIIDQgnGrafScrollArrowLeft, EDrawGulIcon, ES60_All, -1,-1}, /* SP_QgnGrafScrollArrowRight */ {KAknsIIDQgnGrafScrollArrowRight, EDrawGulIcon, ES60_All, -1,-1}, /* SP_QgnGrafScrollArrowUp */ {KAknsIIDQgnGrafScrollArrowUp, EDrawGulIcon, ES60_All, -1,-1}, - /* SP_QgnGrafTabActiveL */ {KAknsIIDQgnGrafTabActiveL, EDrawIcon, ES60_All, -1,-1}, - /* SP_QgnGrafTabActiveM */ {KAknsIIDQgnGrafTabActiveM, EDrawIcon, ES60_All, -1,-1}, - /* SP_QgnGrafTabActiveR */ {KAknsIIDQgnGrafTabActiveR, EDrawIcon, ES60_All, -1,-1}, - /* SP_QgnGrafTabPassiveL */ {KAknsIIDQgnGrafTabPassiveL, EDrawIcon, ES60_All, -1,-1}, - /* SP_QgnGrafTabPassiveM */ {KAknsIIDQgnGrafTabPassiveM, EDrawIcon, ES60_All, -1,-1}, - /* SP_QgnGrafTabPassiveR */ {KAknsIIDQgnGrafTabPassiveR, EDrawIcon, ES60_All, -1,-1}, + + // In S60 5.3 there is a new tab graphic + /* SP_QgnGrafTabActiveL */ {KAknsIIDQgnGrafTabActiveL, EDrawIcon, ES60_Pre53, EAknsMajorSkin, 0x2219}, //KAknsIIDQtgFrTabActiveNormalL + /* SP_QgnGrafTabActiveM */ {KAknsIIDQgnGrafTabActiveM, EDrawIcon, ES60_Pre53, EAknsMajorSkin, 0x221b}, //KAknsIIDQtgFrTabActiveNormalC + /* SP_QgnGrafTabActiveR */ {KAknsIIDQgnGrafTabActiveR, EDrawIcon, ES60_Pre53, EAknsMajorSkin, 0x221a}, //KAknsIIDQtgFrTabActiveNormalR + /* SP_QgnGrafTabPassiveL */ {KAknsIIDQgnGrafTabPassiveL, EDrawIcon, ES60_Pre53, EAknsMajorSkin, 0x2221}, //KAknsIIDQtgFrTabPassiveNormalL + /* SP_QgnGrafTabPassiveM */ {KAknsIIDQgnGrafTabPassiveM, EDrawIcon, ES60_Pre53, EAknsMajorSkin, 0x2223}, //KAknsIIDQtgFrTabPassiveNormalC + /* SP_QgnGrafTabPassiveR */ {KAknsIIDQgnGrafTabPassiveR, EDrawIcon, ES60_Pre53, EAknsMajorSkin, 0x2222}, //KAknsIIDQtgFrTabPassiveNormalR // In 3.1 there is no slider groove. /* SP_QgnGrafNsliderEndLeft */ {KAknsIIDNone, EDrawIcon, ES60_3_1, EAknsMajorGeneric, 0x19cf /* KAknsIIDQgnGrafNsliderEndLeft */}, @@ -1132,7 +1142,8 @@ bool QS60StyleModeSpecifics::checkSupport(const int supportedRelease) (currentRelease == QSysInfo::SV_S60_3_2 && supportedRelease & ES60_3_2) || (currentRelease == QSysInfo::SV_S60_5_0 && supportedRelease & ES60_5_0) || (currentRelease == QSysInfo::SV_S60_5_1 && supportedRelease & ES60_5_1) || - (currentRelease == QSysInfo::SV_S60_5_2 && supportedRelease & ES60_5_2)); + (currentRelease == QSysInfo::SV_S60_5_2 && supportedRelease & ES60_5_2) || + (currentRelease == QSysInfo::SV_S60_5_3 && supportedRelease & ES60_5_3) ); } TAknsItemID QS60StyleModeSpecifics::partSpecificThemeId(int part) diff --git a/src/gui/styles/qstylesheetstyle.cpp b/src/gui/styles/qstylesheetstyle.cpp index ecf924c..faa929e 100644 --- a/src/gui/styles/qstylesheetstyle.cpp +++ b/src/gui/styles/qstylesheetstyle.cpp @@ -3323,6 +3323,13 @@ void QStyleSheetStyle::drawControl(ControlElement ce, const QStyleOption *opt, Q } break; + case CE_FocusFrame: + if (!rule.hasNativeBorder()) { + rule.drawBorder(p, opt->rect); + return; + } + break; + case CE_PushButton: if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(opt)) { if (rule.hasDrawable() || rule.hasBox() || rule.hasPosition() || rule.hasPalette() || diff --git a/src/gui/text/qtextcontrol.cpp b/src/gui/text/qtextcontrol.cpp index 66ce64b..faf4e77 100644 --- a/src/gui/text/qtextcontrol.cpp +++ b/src/gui/text/qtextcontrol.cpp @@ -1951,6 +1951,7 @@ void QTextControlPrivate::inputMethodEvent(QInputMethodEvent *e) if (isGettingInput) layout->setPreeditArea(cursor.position() - block.position(), e->preeditString()); QList<QTextLayout::FormatRange> overrides; + const int oldPreeditCursor = preeditCursor; preeditCursor = e->preeditString().length(); hideCursor = false; for (int i = 0; i < e->attributes().size(); ++i) { @@ -1973,6 +1974,8 @@ void QTextControlPrivate::inputMethodEvent(QInputMethodEvent *e) cursor.endEditBlock(); if (cursor.d) cursor.d->setX(); + if (oldPreeditCursor != preeditCursor) + emit q->microFocusChanged(); } QVariant QTextControl::inputMethodQuery(Qt::InputMethodQuery property) const diff --git a/src/gui/util/qdesktopservices_s60.cpp b/src/gui/util/qdesktopservices_s60.cpp index 96860df..8caeb74 100644 --- a/src/gui/util/qdesktopservices_s60.cpp +++ b/src/gui/util/qdesktopservices_s60.cpp @@ -314,7 +314,7 @@ static bool handleUrl(const QUrl &url) if (!url.isValid()) return false; - QString urlString(url.toString()); + QString urlString(url.toEncoded()); TPtrC urlPtr(qt_QString2TPtrC(urlString)); TRAPD( err, handleUrlL(urlPtr)); return err ? false : true; diff --git a/src/openvg/qpaintengine_vg.cpp b/src/openvg/qpaintengine_vg.cpp index 3c2b5fd..588c35a 100644 --- a/src/openvg/qpaintengine_vg.cpp +++ b/src/openvg/qpaintengine_vg.cpp @@ -1021,9 +1021,11 @@ static VGImage toVGImage switch (img.format()) { case QImage::Format_Mono: img = image.convertToFormat(QImage::Format_MonoLSB, flags); + img.invertPixels(); format = VG_BW_1; break; case QImage::Format_MonoLSB: + img.invertPixels(); format = VG_BW_1; break; case QImage::Format_RGB32: @@ -3186,6 +3188,19 @@ void qt_vg_drawVGImageStencil bool QVGPaintEngine::canVgWritePixels(const QImage &image) const { Q_D(const QVGPaintEngine); + + // qt_vg_image_to_vg_format returns VG_sARGB_8888 as + // fallback case if no matching VG format is found. + // If given image format is not Format_ARGB32 and returned + // format is VG_sARGB_8888, it means that no match was + // found. In that case vgWritePixels cannot be used. + // Also 1-bit formats cannot be used directly either. + if ((image.format() != QImage::Format_ARGB32 + && qt_vg_image_to_vg_format(image.format()) == VG_sARGB_8888) + || image.depth() == 1) { + return false; + } + // vgWritePixels ignores masking, blending and xforms so we can only use it if // ALL of the following conditions are true: // - It is a simple translate, or a scale of -1 on the y-axis (inverted) diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.cpp index 3d8cf50..9a94c30 100644 --- a/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.cpp +++ b/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.cpp @@ -365,10 +365,12 @@ void QDirectFBWindowSurface::flush(QWidget *widget, const QRegion ®ion, if (!win) return; -#ifndef QT_NO_QWS_PROXYSCREEN +#if !defined(QT_NO_QWS_PROXYSCREEN) && !defined(QT_NO_GRAPHICSVIEW) QWExtra *extra = qt_widget_private(widget)->extraData(); if (extra && extra->proxyWidget) return; +#else + Q_UNUSED(widget); #endif const quint8 windowOpacity = quint8(win->windowOpacity() * 0xff); diff --git a/src/plugins/qmltooling/qmldbg_ost/qmldbg_ost.pro b/src/plugins/qmltooling/qmldbg_ost/qmldbg_ost.pro new file mode 100644 index 0000000..2748889 --- /dev/null +++ b/src/plugins/qmltooling/qmldbg_ost/qmldbg_ost.pro @@ -0,0 +1,21 @@ +TARGET = qmldbg_ost +QT += declarative network + +include(../../qpluginbase.pri) + +QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/qmltooling +QTDIR_build:REQUIRES += "contains(QT_CONFIG, declarative)" + +SOURCES += \ + qmlostplugin.cpp \ + qostdevice.cpp + +HEADERS += \ + qmlostplugin.h \ + qostdevice.h \ + usbostcomm.h + +target.path += $$[QT_INSTALL_PLUGINS]/qmltooling +INSTALLS += target + +symbian:TARGET.UID3=0x20031E92 diff --git a/src/plugins/qmltooling/qmldbg_ost/qmlostplugin.cpp b/src/plugins/qmltooling/qmldbg_ost/qmlostplugin.cpp new file mode 100644 index 0000000..1c91c34 --- /dev/null +++ b/src/plugins/qmltooling/qmldbg_ost/qmlostplugin.cpp @@ -0,0 +1,143 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtDeclarative module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qmlostplugin.h" +#include "qostdevice.h" + +#include <private/qdeclarativedebugserver_p.h> +#include <private/qpacketprotocol_p.h> + +QT_BEGIN_NAMESPACE + +static const TInt KQmlOstProtocolId = 0x94; + +class QmlOstPluginPrivate { +public: + QmlOstPluginPrivate(); + + QOstDevice *ost; + QPacketProtocol *protocol; + QDeclarativeDebugServer *debugServer; +}; + +QmlOstPluginPrivate::QmlOstPluginPrivate() : + ost(0), + protocol(0), + debugServer(0) +{ +} + +QmlOstPlugin::QmlOstPlugin() : + d_ptr(new QmlOstPluginPrivate) +{ +} + +QmlOstPlugin::~QmlOstPlugin() +{ + delete d_ptr; +} + +void QmlOstPlugin::setServer(QDeclarativeDebugServer *server) +{ + Q_D(QmlOstPlugin); + d->debugServer = server; +} + +bool QmlOstPlugin::isConnected() const +{ + Q_D(const QmlOstPlugin); + return d->ost && d->ost->isOpen(); +} + +void QmlOstPlugin::send(const QByteArray &message) +{ + Q_D(QmlOstPlugin); + + if (!isConnected()) + return; + + QPacket pack; + pack.writeRawData(message.data(), message.length()); + + d->protocol->send(pack); + //d->socket->flush(); +} + +void QmlOstPlugin::disconnect() +{ + Q_D(QmlOstPlugin); + + delete d->protocol; + d->protocol = 0; +} + +void QmlOstPlugin::setPort(int port, bool block) +{ + Q_UNUSED(port); + Q_UNUSED(block); + + Q_D(QmlOstPlugin); + + d->ost = new QOstDevice(this); + bool ok = d->ost->open(KQmlOstProtocolId); + if (!ok) { + if (d->ost->errorString().length()) + qDebug("Error from QOstDevice: %s", qPrintable(d->ost->errorString())); + qWarning("QDeclarativeDebugServer: Unable to listen on OST"); // This message is part of the signalling - do not change the format! + return; + } + d->protocol = new QPacketProtocol(d->ost, this); + QObject::connect(d->protocol, SIGNAL(readyRead()), this, SLOT(readyRead())); + qWarning("QDeclarativeDebugServer: Waiting for connection via OST"); // This message is part of the signalling - do not change the format! +} + +void QmlOstPlugin::readyRead() +{ + Q_D(QmlOstPlugin); + QPacket packet = d->protocol->read(); + + QByteArray content = packet.data(); + d->debugServer->receiveMessage(content); +} + +Q_EXPORT_PLUGIN2(qmlostplugin, QmlOstPlugin) + +QT_END_NAMESPACE diff --git a/src/plugins/qmltooling/qmldbg_ost/qmlostplugin.h b/src/plugins/qmltooling/qmldbg_ost/qmlostplugin.h new file mode 100644 index 0000000..eee6ee1 --- /dev/null +++ b/src/plugins/qmltooling/qmldbg_ost/qmlostplugin.h @@ -0,0 +1,81 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtDeclarative module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QMLOSTPLUGIN_H +#define QMLOSTPLUGIN_H + +#include <QtGui/QStylePlugin> +#include <QtDeclarative/private/qdeclarativedebugserverconnection_p.h> + +QT_BEGIN_NAMESPACE + +class QDeclarativeDebugServer; +class QmlOstPluginPrivate; + +class QmlOstPlugin : public QObject, public QDeclarativeDebugServerConnection +{ + Q_OBJECT + Q_DECLARE_PRIVATE(QmlOstPlugin) + Q_DISABLE_COPY(QmlOstPlugin) + Q_INTERFACES(QDeclarativeDebugServerConnection) + + +public: + QmlOstPlugin(); + ~QmlOstPlugin(); + + void setServer(QDeclarativeDebugServer *server); + void setPort(int port, bool bock); + + bool isConnected() const; + void send(const QByteArray &message); + void disconnect(); + +private Q_SLOTS: + void readyRead(); + +private: + QmlOstPluginPrivate *d_ptr; +}; + +QT_END_NAMESPACE + +#endif // QMLOSTPLUGIN_H diff --git a/src/plugins/qmltooling/qmldbg_ost/qostdevice.cpp b/src/plugins/qmltooling/qmldbg_ost/qostdevice.cpp new file mode 100644 index 0000000..21b0169 --- /dev/null +++ b/src/plugins/qmltooling/qmldbg_ost/qostdevice.cpp @@ -0,0 +1,180 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtDeclarative module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qostdevice.h" +#include <e32base.h> + +#include "usbostcomm.h" + +class QOstDevicePrivate : public CActive +{ + QOstDevice* q_ptr; + Q_DECLARE_PUBLIC(QOstDevice) + +public: + QOstDevicePrivate() : CActive(CActive::EPriorityStandard) { + CActiveScheduler::Add(this); + } + ~QOstDevicePrivate() { + Cancel(); + } + +private: + void RunL(); + void DoCancel(); + +private: + RUsbOstComm ost; + TBuf8<4096> readBuf; + QByteArray dataBuf; +}; + +QOstDevice::QOstDevice(QObject *parent) : + QIODevice(parent), d_ptr(new QOstDevicePrivate) +{ + d_ptr->q_ptr = this; +} + +QOstDevice::~QOstDevice() +{ + close(); + delete d_ptr; +} + +bool QOstDevice::open(int ostProtocolId) +{ + if (isOpen()) + return false; + + Q_D(QOstDevice); + TInt err = d->ost.Connect(); + if (!err) err = d->ost.Open(); + const TVersion KRequiredVersion(1,1,0); + TVersion version = d->ost.Version(); + if (version.iMajor < KRequiredVersion.iMajor || + (version.iMajor == KRequiredVersion.iMajor && version.iMinor < KRequiredVersion.iMinor)) { + setErrorString("CODA version too old. At least version 4.0.18 (without TRK) is required."); + return false; + } + + if (!err) err = d->ost.RegisterProtocolID((TOstProtIds)ostProtocolId, EFalse); + if (!err) { + d->ost.ReadMessage(d->iStatus, d->readBuf); + d->SetActive(); + return QIODevice::open(ReadWrite | Unbuffered); + } + return false; +} + +void QOstDevicePrivate::RunL() +{ + Q_Q(QOstDevice); + //qDebug("QOstDevice received %d bytes q=%x", readBuf.Size(), q); + if (iStatus == KErrNone) { + QByteArray data = QByteArray::fromRawData((const char*)readBuf.Ptr(), readBuf.Size()); + dataBuf.append(data); + + readBuf.Zero(); + ost.ReadMessage(iStatus, readBuf); + SetActive(); + + emit q->readyRead(); + } else { + q->setErrorString(QString("Error %1 from RUsbOstComm::ReadMessage()").arg(iStatus.Int())); + } + //qDebug("-QOstDevicePrivate RunL"); +} + +void QOstDevicePrivate::DoCancel() +{ + ost.ReadCancel(); +} + +void QOstDevice::close() +{ + Q_D(QOstDevice); + QIODevice::close(); + d->Cancel(); + // RDbgTrcComm::Close isn't safe to call when not open, sigh + if (d->ost.Handle()) { + d->ost.Close(); + } +} + +qint64 QOstDevice::readData(char *data, qint64 maxSize) +{ + Q_D(QOstDevice); + if (d->dataBuf.length() == 0 && !d->IsActive()) + return -1; + qint64 available = qMin(maxSize, (qint64)d->dataBuf.length()); + memcpy(data, d->dataBuf.constData(), available); + d->dataBuf.remove(0, available); + return available; +} + +static const TInt KMaxOstPacketLen = 4096; + +qint64 QOstDevice::writeData(const char *data, qint64 maxSize) +{ + Q_D(QOstDevice); + TPtrC8 ptr((const TUint8*)data, (TInt)maxSize); + while (ptr.Length()) { + TPtrC8 fragment = ptr.Left(qMin(ptr.Length(), KMaxOstPacketLen)); + //qDebug("QOstDevice writing %d bytes", fragment.Length()); + TRequestStatus stat; + d->ost.WriteMessage(stat, fragment); + User::WaitForRequest(stat); + if (stat.Int() != KErrNone) { + setErrorString(QString("Error %1 from RUsbOstComm::WriteMessage()").arg(stat.Int())); + return -1; + } + ptr.Set(ptr.Mid(fragment.Length())); + } + emit bytesWritten(maxSize); //TODO does it matter this is emitted synchronously? + //qDebug("QOstDevice wrote %d bytes", ptr.Size()); + return maxSize; +} + +qint64 QOstDevice::bytesAvailable() const +{ + Q_D(const QOstDevice); + return d->dataBuf.length(); +} diff --git a/src/plugins/qmltooling/qmldbg_ost/qostdevice.h b/src/plugins/qmltooling/qmldbg_ost/qostdevice.h new file mode 100644 index 0000000..e33cf2d --- /dev/null +++ b/src/plugins/qmltooling/qmldbg_ost/qostdevice.h @@ -0,0 +1,75 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtDeclarative module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QOSTDEVICE_H +#define QOSTDEVICE_H + +#include <qiodevice.h> + +QT_BEGIN_NAMESPACE + +class QOstDevicePrivate; + +class QOstDevice : public QIODevice +{ + Q_OBJECT + Q_DECLARE_PRIVATE(QOstDevice) + Q_DISABLE_COPY(QOstDevice) + +public: + explicit QOstDevice(QObject *parent=0); + ~QOstDevice(); + + bool open(int ostProtocolId); + void close(); + +protected: + qint64 readData(char *data, qint64 maxSize); + qint64 writeData(const char *data, qint64 maxSize); + qint64 bytesAvailable() const; + +private: + QOstDevicePrivate* d_ptr; +}; + +QT_END_NAMESPACE + +#endif // QOSTDEVICE_H diff --git a/src/plugins/qmltooling/qmldbg_ost/usbostcomm.h b/src/plugins/qmltooling/qmldbg_ost/usbostcomm.h new file mode 100644 index 0000000..48ff7bf --- /dev/null +++ b/src/plugins/qmltooling/qmldbg_ost/usbostcomm.h @@ -0,0 +1,191 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtDeclarative module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef USBHOSTCOMM_H +#define USBHOSTCOMM_H + +// Based on the official usbostrouter header, modified to remove dependancy on +// the client DLL + +#include <e32base.h> + +typedef int TOstProtIds; + +class RUsbOstComm : public RSessionBase +{ +public: + RUsbOstComm(); + TInt Connect(); + TInt Disconnect(); + TInt Open(); + TInt Close(); + TInt RegisterProtocolID(TOstProtIds aId, TBool aNeedHeader); + void ReadMessage(TRequestStatus& aStatus, TDes8& aDes); + TInt ReadCancel(); + void WriteMessage(TRequestStatus& aStatus, const TDesC8& aDes, TBool aHasHeader=EFalse); + TVersion Version() const; + +private: + enum TUsbOstCmdCode + { + EUsbOstCmdCodeFirst, + EUsbOstCmdConnect, + EUsbOstCmdDisconnect, + EUsbOstCmdCodeGetAcmConfig, + EUsbOstCmdCodeSetAcmConfig, + EUsbOstCmdCodeOpen, + EUsbOstCmdCodeClose, + EUsbOstCmdCodeRegisterId, + EUsbOstCmdCodeRegisterIds, + EUsbOstCmdCodeUnRegisterId, + EUsbOstCmdCodeUnRegisterIds, + EUsbOstCmdCodeReadMsg, + EUsbOstCmdCodeReadCancel, + EUsbOstCmdCodeWriteMsg, + EUsbOstCmdCodeWriteCancel, + EUsbOstCmdCodeLast + }; +}; + +RUsbOstComm::RUsbOstComm() +{ +} + +TInt RUsbOstComm::Connect() +{ + _LIT(KUsbOstServerName, "!UsbOstRouter"); + _LIT(KUsbOstServerImageName, "usbostrouter"); + const TUid KUsbOstServerUid = { 0x200170BE }; + TInt startupAttempts = 2; + for(;;) { + TInt ret = CreateSession(KUsbOstServerName, TVersion(1,0,0)); + if (ret != KErrNotFound && ret != KErrServerTerminated) { + return ret; + } + + if (startupAttempts-- == 0) { + return ret; + } + + RProcess server; + ret = server.Create(KUsbOstServerImageName, KNullDesC, KUsbOstServerUid); + if (ret != KErrNone) + return ret; + + TRequestStatus serverDiedRequestStatus; + server.Rendezvous(serverDiedRequestStatus); + + if (serverDiedRequestStatus != KRequestPending) { + // Abort startup + server.Kill(KErrNone); + } else { + // Logon OK - start the server + server.Resume(); + } + User::WaitForRequest(serverDiedRequestStatus); + ret = (server.ExitType() == EExitPanic) ? KErrGeneral : serverDiedRequestStatus.Int(); + server.Close(); + + if (ret != KErrNone && ret != KErrAlreadyExists) { + return ret; + } + } +} + +TInt RUsbOstComm::Disconnect() +{ + return SendReceive(EUsbOstCmdDisconnect); +} + +TInt RUsbOstComm::Open() +{ + return SendReceive(EUsbOstCmdCodeOpen); +} + +TInt RUsbOstComm::Close() +{ + TInt err = SendReceive(EUsbOstCmdCodeClose); + RHandleBase::Close(); + return err; +} + +TInt RUsbOstComm::RegisterProtocolID(const TOstProtIds aId, TBool aNeedHeader) +{ + TIpcArgs args(aId, aNeedHeader); + return SendReceive(EUsbOstCmdCodeRegisterId, args); +} + +void RUsbOstComm::ReadMessage(TRequestStatus& aStatus, TDes8& aDes) +{ + TIpcArgs args(aDes.MaxLength(), &aDes); + SendReceive(EUsbOstCmdCodeReadMsg, args, aStatus); +} + +TInt RUsbOstComm::ReadCancel() +{ + return SendReceive(EUsbOstCmdCodeReadCancel); +} + +void RUsbOstComm::WriteMessage(TRequestStatus& aStatus, const TDesC8& aDes, TBool aHasHeader) +{ + TIpcArgs args(aHasHeader, aDes.Length(), &aDes); + SendReceive(EUsbOstCmdCodeWriteMsg, args, aStatus); +} + +typedef TVersion (*TVersionFunction)(const RUsbOstComm*); +const TInt KVersionOrdinal = 17; + +TVersion RUsbOstComm::Version() const +{ + // This function has to go to the DLL, unfortunately + TVersion result; // Return 0.0.0 on any error + RLibrary lib; + TInt err = lib.Load(_L("usbostcomm")); + if (err) return result; + + TLibraryFunction fn = lib.Lookup(KVersionOrdinal); + if (fn) + result = ((TVersionFunction)fn)(this); + lib.Close(); + return result; +} + +#endif //USBHOSTCOMM_H diff --git a/src/plugins/qmltooling/tcpserver/tcpserver.pro b/src/plugins/qmltooling/qmldbg_tcp/qmldbg_tcp.pro index f4f2666..e8ab962 100644 --- a/src/plugins/qmltooling/tcpserver/tcpserver.pro +++ b/src/plugins/qmltooling/qmldbg_tcp/qmldbg_tcp.pro @@ -1,4 +1,4 @@ -TARGET = tcpserver +TARGET = qmldbg_tcp QT += declarative network include(../../qpluginbase.pri) @@ -15,4 +15,4 @@ HEADERS += \ target.path += $$[QT_INSTALL_PLUGINS]/qmltooling INSTALLS += target -symbian:TARGET.UID3=0x20031E90
\ No newline at end of file +symbian:TARGET.UID3=0x20031E90 diff --git a/src/plugins/qmltooling/tcpserver/qtcpserverconnection.cpp b/src/plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.cpp index e1298e8..85c43e3 100644 --- a/src/plugins/qmltooling/tcpserver/qtcpserverconnection.cpp +++ b/src/plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.cpp @@ -97,7 +97,8 @@ void QTcpServerConnection::send(const QByteArray &message) { Q_D(QTcpServerConnection); - if (!isConnected()) + if (!isConnected() + || !d->protocol || !d->socket) return; QPacket pack; @@ -111,9 +112,10 @@ void QTcpServerConnection::disconnect() { Q_D(QTcpServerConnection); - delete d->protocol; + // protocol might still be processing packages at this point + d->protocol->deleteLater(); d->protocol = 0; - delete d->socket; + d->socket->deleteLater(); d->socket = 0; } @@ -143,6 +145,9 @@ void QTcpServerConnection::listen() void QTcpServerConnection::readyRead() { Q_D(QTcpServerConnection); + if (!d->protocol) + return; + QPacket packet = d->protocol->read(); QByteArray content = packet.data(); diff --git a/src/plugins/qmltooling/tcpserver/qtcpserverconnection.h b/src/plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.h index 66a10e1..66a10e1 100644 --- a/src/plugins/qmltooling/tcpserver/qtcpserverconnection.h +++ b/src/plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.h diff --git a/src/plugins/qmltooling/qmltooling.pro b/src/plugins/qmltooling/qmltooling.pro index 01cf1a9..9b3346f 100644 --- a/src/plugins/qmltooling/qmltooling.pro +++ b/src/plugins/qmltooling/qmltooling.pro @@ -1,4 +1,4 @@ TEMPLATE = subdirs -SUBDIRS = tcpserver - +SUBDIRS = qmldbg_tcp +symbian:SUBDIRS += qmldbg_ost diff --git a/tests/auto/declarative/qdeclarativeanimations/data/attached.qml b/tests/auto/declarative/qdeclarativeanimations/data/attached.qml index 5da4a69..c5d5535 100644 --- a/tests/auto/declarative/qdeclarativeanimations/data/attached.qml +++ b/tests/auto/declarative/qdeclarativeanimations/data/attached.qml @@ -17,7 +17,7 @@ Rectangle { transitions: Transition { PropertyAction { target: wrapper; property: "ListView.delayRemove"; value: true } - ScriptAction { script: console.log(ListView.delayRemove ? "on" : "off") } + ScriptAction { script: console.log(wrapper.ListView.delayRemove ? "on" : "off") } } Component.onCompleted: { diff --git a/tests/auto/declarative/qdeclarativebehaviors/data/delayedRegistration.qml b/tests/auto/declarative/qdeclarativebehaviors/data/delayedRegistration.qml new file mode 100644 index 0000000..aa384c3 --- /dev/null +++ b/tests/auto/declarative/qdeclarativebehaviors/data/delayedRegistration.qml @@ -0,0 +1,25 @@ +import QtQuick 1.0 + +Rectangle { + id: container + + width: 400; height: 400; + property Item myItem + + function doCreate() { + myItem = myComponent.createObject(container) + myItem.x = 100 + } + + Component { + id: myComponent + Rectangle { + width: 100 + height: 100 + color: "green" + Behavior on x { NumberAnimation { duration: 500 } } + } + } + + Component.onCompleted: doCreate() +} diff --git a/tests/auto/declarative/qdeclarativebehaviors/tst_qdeclarativebehaviors.cpp b/tests/auto/declarative/qdeclarativebehaviors/tst_qdeclarativebehaviors.cpp index 80ba907..4536d9e 100644 --- a/tests/auto/declarative/qdeclarativebehaviors/tst_qdeclarativebehaviors.cpp +++ b/tests/auto/declarative/qdeclarativebehaviors/tst_qdeclarativebehaviors.cpp @@ -81,6 +81,7 @@ private slots: void groupedPropertyCrash(); void runningTrue(); void sameValue(); + void delayedRegistration(); }; void tst_qdeclarativebehaviors::simpleBehavior() @@ -412,6 +413,23 @@ void tst_qdeclarativebehaviors::sameValue() QTRY_VERIFY(target->x() != qreal(0) && target->x() != qreal(100)); } +//QTBUG-18362 +void tst_qdeclarativebehaviors::delayedRegistration() +{ + QDeclarativeEngine engine; + + QDeclarativeComponent c(&engine, SRCDIR "/data/delayedRegistration.qml"); + QDeclarativeRectangle *rect = qobject_cast<QDeclarativeRectangle*>(c.create()); + QVERIFY(rect != 0); + + QDeclarativeItem *innerRect = rect->property("myItem").value<QDeclarativeItem*>(); + QVERIFY(innerRect != 0); + + QCOMPARE(innerRect->property("x").toInt(), int(0)); + + QTRY_COMPARE(innerRect->property("x").toInt(), int(100)); +} + QTEST_MAIN(tst_qdeclarativebehaviors) #include "tst_qdeclarativebehaviors.moc" diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/attachedProperty.2.qml b/tests/auto/declarative/qdeclarativeecmascript/data/attachedProperty.2.qml new file mode 100644 index 0000000..a7184c9 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/attachedProperty.2.qml @@ -0,0 +1,22 @@ +import Qt.test 1.0 +import Qt.test 1.0 as Namespace + +MyQmlObject { + property alias a: me.a + property alias b: me.a + property alias c: me.a + property alias d: me.a + + property MyQmlObject obj + obj: MyQmlObject { + MyQmlObject.value2: 13 + + id: me + property int a: MyQmlObject.value2 * 2 + property int b: Namespace.MyQmlObject.value2 * 2 + property int c: me.Namespace.MyQmlObject.value * 2 + property int d: me.Namespace.MyQmlObject.value * 2 + } +} + + diff --git a/tests/auto/declarative/qdeclarativeecmascript/testtypes.h b/tests/auto/declarative/qdeclarativeecmascript/testtypes.h index 94cec3f..ad38d27 100644 --- a/tests/auto/declarative/qdeclarativeecmascript/testtypes.h +++ b/tests/auto/declarative/qdeclarativeecmascript/testtypes.h @@ -60,17 +60,18 @@ class MyQmlAttachedObject : public QObject { Q_OBJECT Q_PROPERTY(int value READ value CONSTANT) - Q_PROPERTY(int value2 READ value2 WRITE setValue2) + Q_PROPERTY(int value2 READ value2 WRITE setValue2 NOTIFY value2Changed) public: MyQmlAttachedObject(QObject *parent) : QObject(parent), m_value2(0) {} int value() const { return 19; } int value2() const { return m_value2; } - void setValue2(int v) { m_value2 = v; } + void setValue2(int v) { if (m_value2 == v) return; m_value2 = v; emit value2Changed(); } void emitMySignal() { emit mySignal(); } signals: + void value2Changed(); void mySignal(); private: diff --git a/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp b/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp index 7876671..1ec12fe 100644 --- a/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp +++ b/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp @@ -650,6 +650,16 @@ void tst_qdeclarativeecmascript::attachedProperties() } { + QDeclarativeComponent component(&engine, TEST_FILE("attachedProperty.2.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + QCOMPARE(object->property("a").toInt(), 26); + QCOMPARE(object->property("b").toInt(), 26); + QCOMPARE(object->property("c").toInt(), 26); + QCOMPARE(object->property("d").toInt(), 26); + } + + { QDeclarativeComponent component(&engine, TEST_FILE("writeAttachedProperty.qml")); QObject *object = component.create(); QVERIFY(object != 0); diff --git a/tests/auto/declarative/qdeclarativegridview/tst_qdeclarativegridview.cpp b/tests/auto/declarative/qdeclarativegridview/tst_qdeclarativegridview.cpp index c183934..c8e7817 100644 --- a/tests/auto/declarative/qdeclarativegridview/tst_qdeclarativegridview.cpp +++ b/tests/auto/declarative/qdeclarativegridview/tst_qdeclarativegridview.cpp @@ -97,6 +97,7 @@ private slots: void onRemove_data(); void testQtQuick11Attributes(); void testQtQuick11Attributes_data(); + void contentPosJump(); private: QDeclarativeView *createView(); @@ -2077,6 +2078,56 @@ void tst_QDeclarativeGridView::testQtQuick11Attributes_data() << ""; } +void tst_QDeclarativeGridView::contentPosJump() +{ + QDeclarativeView *canvas = createView(); + + TestModel model; + for (int i = 0; i < 100; i++) + model.addItem("Item" + QString::number(i), ""); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + ctxt->setContextProperty("testRightToLeft", QVariant(false)); + ctxt->setContextProperty("testTopToBottom", QVariant(false)); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/gridview1.qml")); + qApp->processEvents(); + + QDeclarativeGridView *gridview = findItem<QDeclarativeGridView>(canvas->rootObject(), "grid"); + QVERIFY(gridview != 0); + + QDeclarativeItem *contentItem = gridview->contentItem(); + QVERIFY(contentItem != 0); + + // Test jumping more than a page of items. + gridview->setContentY(500); + + // Confirm items positioned correctly + int itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count(); + for (int i = 24; i < model.count() && i < itemCount; ++i) { + QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QVERIFY(item); + QVERIFY(item->x() == (i%3)*80); + QVERIFY(item->y() == (i/3)*60); + } + + gridview->setContentY(-100); + itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count(); + QVERIFY(itemCount < 15); + // Confirm items positioned correctly + for (int i = 0; i < model.count() && i < itemCount; ++i) { + QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QVERIFY(item); + QVERIFY(item->x() == (i%3)*80); + QVERIFY(item->y() == (i/3)*60); + } + + delete canvas; +} + QDeclarativeView *tst_QDeclarativeGridView::createView() { QDeclarativeView *canvas = new QDeclarativeView(0); diff --git a/tests/auto/declarative/qdeclarativelistview/data/orientchange.qml b/tests/auto/declarative/qdeclarativelistview/data/orientchange.qml new file mode 100644 index 0000000..c7aa0cd --- /dev/null +++ b/tests/auto/declarative/qdeclarativelistview/data/orientchange.qml @@ -0,0 +1,7 @@ +import QtQuick 1.0 + +ListView { + width: 240; height: 320 + delegate: Rectangle { objectName: "wrapper"; width: 80; height: 80 } + model: 100 +} diff --git a/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp b/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp index 2267a89..0c96587 100644 --- a/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp +++ b/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp @@ -119,6 +119,8 @@ private slots: void testQtQuick11Attributes_data(); void rightToLeft(); void test_mirroring(); + void orientationChange(); + void contentPosJump(); private: template <class T> void items(); @@ -2583,6 +2585,107 @@ void tst_QDeclarativeListView::test_mirroring() delete canvasB; } +void tst_QDeclarativeListView::orientationChange() +{ + QDeclarativeView *canvas = createView(); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/orientchange.qml")); + qApp->processEvents(); + + QDeclarativeListView *listview = qobject_cast<QDeclarativeListView*>(canvas->rootObject()); + QVERIFY(listview != 0); + + QDeclarativeItem *contentItem = listview->contentItem(); + QVERIFY(contentItem != 0); + + listview->positionViewAtIndex(50, QDeclarativeListView::Beginning); + + // Confirm items positioned correctly + for (int i = 50; i < 54; ++i) { + QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i); + QVERIFY(item); + QCOMPARE(item->y(), i*80.0); + } + + listview->setOrientation(QDeclarativeListView::Horizontal); + QCOMPARE(listview->contentY(), 0.); + + // Confirm items positioned correctly + for (int i = 0; i < 3; ++i) { + QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i); + QVERIFY(item); + QCOMPARE(item->x(), i*80.0); + } + + listview->positionViewAtIndex(50, QDeclarativeListView::Beginning); + listview->setOrientation(QDeclarativeListView::Vertical); + QCOMPARE(listview->contentX(), 0.); + // + // Confirm items positioned correctly + for (int i = 0; i < 4; ++i) { + QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i); + QVERIFY(item); + QCOMPARE(item->y(), i*80.0); + } + + delete canvas; +} + +void tst_QDeclarativeListView::contentPosJump() +{ + QDeclarativeView *canvas = createView(); + + TestModel model; + for (int i = 0; i < 50; i++) + model.addItem("Item" + QString::number(i), ""); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + + TestObject *testObject = new TestObject; + ctxt->setContextProperty("testObject", testObject); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/listviewtest.qml")); + qApp->processEvents(); + + QDeclarativeListView *listview = findItem<QDeclarativeListView>(canvas->rootObject(), "list"); + QTRY_VERIFY(listview != 0); + + QDeclarativeItem *contentItem = listview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + // Confirm items positioned correctly + int itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count(); + for (int i = 0; i < model.count() && i < itemCount; ++i) { + QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_VERIFY(item->y() == i*20); + } + + // Test jumping more than a page of items. + listview->setContentY(500); + itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count(); + for (int i = 25; i < model.count() && i < itemCount; ++i) { + QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_VERIFY(item->y() == i*20); + } + + listview->setContentY(-100); + itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count(); + QVERIFY(itemCount < 20); + for (int i = 0; i < model.count() && i < itemCount; ++i) { + QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_VERIFY(item->y() == i*20); + } + + delete canvas; +} + void tst_QDeclarativeListView::qListModelInterface_items() { items<TestModel>(); diff --git a/tests/auto/declarative/qdeclarativetextedit/data/cursorTest.qml b/tests/auto/declarative/qdeclarativetextedit/data/cursorTest.qml index c7c21fc..f7fb3e7 100644 --- a/tests/auto/declarative/qdeclarativetextedit/data/cursorTest.qml +++ b/tests/auto/declarative/qdeclarativetextedit/data/cursorTest.qml @@ -2,6 +2,7 @@ import QtQuick 1.0 Rectangle { width: 300; height: 300; color: "white" TextEdit { text: "Hello world!"; id: textEditObject; objectName: "textEditObject" + anchors.fill: parent resources: [ Component { id:cursor; Item { id:cursorInstance; objectName: "cursorInstance" } } ] cursorDelegate: cursor } diff --git a/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp b/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp index 8f1be6f..574d2d5 100644 --- a/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp +++ b/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp @@ -1539,6 +1539,19 @@ void tst_qdeclarativetextedit::cursorDelegate() textEditObject->setCursorPosition(0); QCOMPARE(textEditObject->cursorRectangle().x(), qRound(delegateObject->x())); QCOMPARE(textEditObject->cursorRectangle().y(), qRound(delegateObject->y())); + QVERIFY(textEditObject->cursorRectangle().y() >= 0); + QVERIFY(textEditObject->cursorRectangle().y() < textEditObject->cursorRectangle().height()); + textEditObject->setVAlign(QDeclarativeTextEdit::AlignVCenter); + QCOMPARE(textEditObject->cursorRectangle().x(), qRound(delegateObject->x())); + QCOMPARE(textEditObject->cursorRectangle().y(), qRound(delegateObject->y())); + QVERIFY(textEditObject->cursorRectangle().y() > (textEditObject->height() / 2) - textEditObject->cursorRectangle().height()); + QVERIFY(textEditObject->cursorRectangle().y() < (textEditObject->height() / 2) + textEditObject->cursorRectangle().height()); + textEditObject->setVAlign(QDeclarativeTextEdit::AlignBottom); + QCOMPARE(textEditObject->cursorRectangle().x(), qRound(delegateObject->x())); + QCOMPARE(textEditObject->cursorRectangle().y(), qRound(delegateObject->y())); + QVERIFY(textEditObject->cursorRectangle().y() > textEditObject->height() - (textEditObject->cursorRectangle().height() * 2)); + QVERIFY(textEditObject->cursorRectangle().y() < textEditObject->height()); + //Test Delegate gets deleted textEditObject->setCursorDelegate(0); QVERIFY(!textEditObject->findChild<QDeclarativeItem*>("cursorInstance")); @@ -2227,6 +2240,8 @@ void tst_qdeclarativetextedit::preeditMicroFocus() QTest::qWaitForWindowShown(&view); QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&view)); + QSignalSpy cursorRectangleSpy(&edit, SIGNAL(cursorRectangleChanged())); + QRect currentRect; QRect previousRect = edit.inputMethodQuery(Qt::ImMicroFocus).toRect(); @@ -2237,8 +2252,9 @@ void tst_qdeclarativetextedit::preeditMicroFocus() currentRect = edit.inputMethodQuery(Qt::ImMicroFocus).toRect(); QCOMPARE(currentRect, previousRect); #if defined(Q_WS_X11) || defined(Q_WS_QWS) || defined(Q_OS_SYMBIAN) - QCOMPARE(ic.updateReceived, true); + QCOMPARE(ic.updateReceived, false); // The cursor position hasn't changed. #endif + QCOMPARE(cursorRectangleSpy.count(), 0); // Verify that the micro focus rect moves to the left as the cursor position // is incremented. @@ -2250,6 +2266,8 @@ void tst_qdeclarativetextedit::preeditMicroFocus() #if defined(Q_WS_X11) || defined(Q_WS_QWS) || defined(Q_OS_SYMBIAN) QCOMPARE(ic.updateReceived, true); #endif + QVERIFY(cursorRectangleSpy.count() > 0); + cursorRectangleSpy.clear(); previousRect = currentRect; } @@ -2263,6 +2281,7 @@ void tst_qdeclarativetextedit::preeditMicroFocus() #if defined(Q_WS_X11) || defined(Q_WS_QWS) || defined(Q_OS_SYMBIAN) QCOMPARE(ic.updateReceived, true); #endif + QVERIFY(cursorRectangleSpy.count() > 0); } void tst_qdeclarativetextedit::inputContextMouseHandler() diff --git a/tests/auto/qlistview/tst_qlistview.cpp b/tests/auto/qlistview/tst_qlistview.cpp index b6e69a0..ee03386 100644 --- a/tests/auto/qlistview/tst_qlistview.cpp +++ b/tests/auto/qlistview/tst_qlistview.cpp @@ -1893,7 +1893,8 @@ void tst_QListView::taskQTBUG_435_deselectOnViewportClick() QCOMPARE(view.selectionModel()->selectedIndexes().count(), model.rowCount()); - QPoint p = view.visualRect(model.index(model.rowCount() - 1)).center() + QPoint(0, 20); + const QRect itemRect = view.visualRect(model.index(model.rowCount() - 1)); + QPoint p = view.visualRect(model.index(model.rowCount() - 1)).center() + QPoint(0, itemRect.height()); //first the left button QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, p); QVERIFY(!view.selectionModel()->hasSelection()); diff --git a/tests/auto/qstyle/tst_qstyle.cpp b/tests/auto/qstyle/tst_qstyle.cpp index ad5d7ff..5c319f0 100644 --- a/tests/auto/qstyle/tst_qstyle.cpp +++ b/tests/auto/qstyle/tst_qstyle.cpp @@ -272,6 +272,18 @@ void tst_QStyle::drawItemPixmap() QPixmap p(QString(SRCDIR) + "/task_25863.png", "PNG"); QPixmap actualPix = QPixmap::grabWidget(testWidget); + +#ifdef Q_OS_SYMBIAN + // QPixmap cannot be assumed to be exactly same, unless it is created from exactly same content. + // In Symbian, pixmap format might get "optimized" depending on how QPixmap is created. + // Therefore, force the content to specific format and compare QImages. + // Then re-create the QPixmaps and compare those. + QImage i1 = p.toImage().convertToFormat(QImage::Format_ARGB32_Premultiplied); + p = QPixmap::fromImage(i1); + QImage i2 = actualPix.toImage().convertToFormat(QImage::Format_ARGB32_Premultiplied); + actualPix = QPixmap::fromImage(i2); + QVERIFY(i1 == i2); +#endif QVERIFY(pixmapsAreEqual(&actualPix,&p)); testWidget->hide(); } diff --git a/tools/linguist/shared/ts.cpp b/tools/linguist/shared/ts.cpp index 85be5c6..4523bc5 100644 --- a/tools/linguist/shared/ts.cpp +++ b/tools/linguist/shared/ts.cpp @@ -264,6 +264,7 @@ bool TSReader::read(Translator &translator) //qDebug() << "TS " << attributes(); QHash<QString, int> currentLine; QString currentFile; + bool maybeRelative = false, maybeAbsolute = false; QXmlStreamAttributes atts = attributes(); //QString version = atts.value(strversion).toString(); @@ -342,10 +343,12 @@ bool TSReader::read(Translator &translator) msg.setTranslatorComment(readContents()); } else if (elementStarts(strlocation)) { // <location/> + maybeAbsolute = true; QXmlStreamAttributes atts = attributes(); QString fileName = atts.value(strfilename).toString(); if (fileName.isEmpty()) { fileName = currentMsgFile; + maybeRelative = true; } else { if (refs.isEmpty()) currentFile = fileName; @@ -353,7 +356,6 @@ bool TSReader::read(Translator &translator) } const QString lin = atts.value(strline).toString(); if (lin.isEmpty()) { - translator.setLocationsType(Translator::RelativeLocations); refs.append(TranslatorMessage::Reference(fileName, -1)); } else { bool bOK; @@ -361,9 +363,7 @@ bool TSReader::read(Translator &translator) if (bOK) { if (lin.startsWith(QLatin1Char('+')) || lin.startsWith(QLatin1Char('-'))) { lineNo = (currentLine[fileName] += lineNo); - translator.setLocationsType(Translator::RelativeLocations); - } else { - translator.setLocationsType(Translator::AbsoluteLocations); + maybeRelative = true; } refs.append(TranslatorMessage::Reference(fileName, lineNo)); } @@ -422,6 +422,9 @@ bool TSReader::read(Translator &translator) } else { handleError(); } + translator.setLocationsType(maybeRelative ? Translator::RelativeLocations : + maybeAbsolute ? Translator::AbsoluteLocations : + Translator::NoLocations); } // </TS> } else { handleError(); @@ -727,7 +730,6 @@ bool saveTS(const Translator &translator, QIODevice &dev, ConversionData &cd, in bool loadTS(Translator &translator, QIODevice &dev, ConversionData &cd) { - translator.setLocationsType(Translator::NoLocations); TSReader reader(dev, cd); return reader.read(translator); } diff --git a/tools/qml/qml.pro b/tools/qml/qml.pro index b1d56ea..84ebba8 100644 --- a/tools/qml/qml.pro +++ b/tools/qml/qml.pro @@ -39,7 +39,7 @@ symbian { TARGET.CAPABILITY = NetworkServices ReadUserData # Deploy plugin for remote debugging - qmldebuggingplugin.sources = $$QT_BUILD_TREE/plugins/qmltooling/tcpserver$${QT_LIBINFIX}.dll + qmldebuggingplugin.sources = $$QT_BUILD_TREE/plugins/qmltooling/qmldbg_tcp$${QT_LIBINFIX}.dll $$QT_BUILD_TREE/plugins/qmltooling/qmldbg_ost$${QT_LIBINFIX}.dll qmldebuggingplugin.path = c:$$QT_PLUGINS_BASE_DIR/qmltooling DEPLOYMENT += qmldebuggingplugin } diff --git a/translations/assistant_ru.ts b/translations/assistant_ru.ts index 6743986..b16f940 100644 --- a/translations/assistant_ru.ts +++ b/translations/assistant_ru.ts @@ -372,14 +372,14 @@ Reason: вместо стандартного -showUrl ссылка Отобразить документ по ссылке. -enableRemoteControl Включение удалённого управления Assistant. --show виджет Отображение указанного прикрепляемого виджета, - который может быть "contents", "index", +-show панель Отображение указанной панели, + которая может быть "contents", "index", "bookmarks" или "search". --activate виджет Включение указанного прикрепляемого виджета, - который может быть "contents", "index", +-activate панель Включение указанной панели, + которая может быть "contents", "index", "bookmarks" или "search". --hide виджет Скрытие указанного прикрепляемого виджета, - который может быть "contents", "index", +-hide панель Скрытие указанной панели, + которая может быть "contents", "index", "bookmarks" или "search". -register файлСправки Регистрация указанного файла справки (.qch) в данном файле коллекции. diff --git a/translations/designer_ru.ts b/translations/designer_ru.ts index 1b0b939..fec098c 100644 --- a/translations/designer_ru.ts +++ b/translations/designer_ru.ts @@ -439,7 +439,7 @@ </message> <message> <source>Add Dock Window</source> - <translation>Добавить прикрепляемое окно</translation> + <translation>Добавить панель</translation> </message> <message> <source>Adjust Size of '%1'</source> @@ -2699,7 +2699,7 @@ Do you want to replace it?</source> </message> <message> <source>newPrefix</source> - <translation type="unfinished"></translation> + <translation></translation> </message> <message> <source><p><b>Warning:</b> The file</p><p>%1</p><p>is outside of the current resource file's parent directory.</p></source> @@ -3222,7 +3222,7 @@ Do you want overwrite the template?</source> </message> <message> <source>Dock views</source> - <translation>Прикрепляемые панели</translation> + <translation>Панели</translation> </message> <message> <source>File</source> diff --git a/translations/linguist_ru.ts b/translations/linguist_ru.ts index dfda98e..e5f57de 100644 --- a/translations/linguist_ru.ts +++ b/translations/linguist_ru.ts @@ -86,6 +86,10 @@ <context> <name>DataModel</name> <message> + <source>The translation file '%1' will not be loaded because it is empty.</source> + <translation>Невозможно загрузить файл перевода "%1", так как он пуст.</translation> + </message> + <message> <source><qt>Duplicate messages found in '%1':</source> <translation><qt>В '%1' обнаружены повторяющиеся сообщения:</translation> </message> @@ -1268,7 +1272,7 @@ lupdate - это один из инструментов Qt Linguist. Он изв </message> <message> <source>Phrases and guesses</source> - <translation>Фразы и похожие переводы</translation> + <translation>Похожие переводы</translation> </message> <message> <source>Sources and Forms</source> @@ -1633,7 +1637,7 @@ All files (*)</source> </message> <message> <source>&Phrases</source> - <translation>Фра&зы</translation> + <translation>&Глоссарии</translation> </message> <message> <source>&Close Phrase Book</source> @@ -1657,7 +1661,7 @@ All files (*)</source> </message> <message> <source>Vie&ws</source> - <translation>Вид&ы</translation> + <translation>&Панели</translation> </message> <message> <source>&Toolbars</source> @@ -1977,7 +1981,7 @@ All files (*)</source> </message> <message> <source>&Display guesses</source> - <translation>&Предлагать похожие</translation> + <translation>П&охожие переводы</translation> </message> <message> <source>Set whether or not to display translation guesses.</source> diff --git a/translations/linguist_uk.ts b/translations/linguist_uk.ts index 56db6ba..a503475 100644 --- a/translations/linguist_uk.ts +++ b/translations/linguist_uk.ts @@ -86,6 +86,10 @@ <context> <name>DataModel</name> <message> + <source>The translation file '%1' will not be loaded because it is empty.</source> + <translation>Файл перекладу '%1' не буде завантажено, бо він порожній.</translation> + </message> + <message> <source><qt>Duplicate messages found in '%1':</source> <translation><qt>Повідомлення-дублікати знайдено в '%1':</translation> </message> diff --git a/translations/qt_ru.ts b/translations/qt_ru.ts index e20fc0c..d399b6d 100644 --- a/translations/qt_ru.ts +++ b/translations/qt_ru.ts @@ -89,7 +89,7 @@ </message> <message> <source>Revert back to device '%1'</source> - <translation>Возвращение к устройству "%1"</translation> + <translation>Возвращение к устройству «%1»</translation> </message> <message> <source><html>Switching to the audio playback device <b>%1</b><br/>which has higher preference or is specifically configured for this stream.</html></source> @@ -188,7 +188,7 @@ have libgstreamer-plugins-base installed.</source> </message> <message> <source>Underflow</source> - <translation type="unfinished">Переполнение</translation> + <translation>Ниже границы</translation> </message> <message> <source>Already exists</source> @@ -240,7 +240,7 @@ have libgstreamer-plugins-base installed.</source> </message> <message> <source>Server alert</source> - <translation type="unfinished">Сигнал сервера</translation> + <translation>Сигнал сервера</translation> </message> <message> <source>Invalid protocol</source> @@ -444,6 +444,10 @@ have libgstreamer-plugins-base installed.</source> <source>Error opening source: media type could not be determined</source> <translation>Ошибка открытия источника: не удалось определить тип медиа-данных</translation> </message> + <message> + <source>Failed to set requested IAP</source> + <translation>Не удалось задать указанную точку доступа</translation> + </message> </context> <context> <name>Phonon::MMF::StereoWidening</name> @@ -482,7 +486,7 @@ have libgstreamer-plugins-base installed.</source> </message> <message> <source>Ambiguous %1 not handled</source> - <translation type="unfinished"></translation> + <translation>Неоднозначная комбинация %1 не обработана</translation> </message> </context> <context> @@ -704,7 +708,7 @@ have libgstreamer-plugins-base installed.</source> </message> <message> <source><qt>Are you sure you wish to delete %1 "%2"?</qt></source> - <translation><qt>Вы действительно хотите удалить %1 "%2"?</qt></translation> + <translation><qt>Вы действительно хотите удалить %1 «%2»?</qt></translation> </message> <message> <source>&Yes</source> @@ -951,35 +955,35 @@ to <name>Q3UrlOperator</name> <message> <source>The protocol `%1' is not supported</source> - <translation>Протокол "%1" не поддерживается</translation> + <translation>Протокол «%1» не поддерживается</translation> </message> <message> <source>The protocol `%1' does not support listing directories</source> - <translation>Протокол "%1" не поддерживает просмотр каталогов</translation> + <translation>Протокол «%1» не поддерживает просмотр каталогов</translation> </message> <message> <source>The protocol `%1' does not support creating new directories</source> - <translation>Протокол "%1" не поддерживает создание каталогов</translation> + <translation>Протокол «%1» не поддерживает создание каталогов</translation> </message> <message> <source>The protocol `%1' does not support removing files or directories</source> - <translation>Протокол "%1" не поддерживает удаление файлов или каталогов</translation> + <translation>Протокол «%1» не поддерживает удаление файлов или каталогов</translation> </message> <message> <source>The protocol `%1' does not support renaming files or directories</source> - <translation>Протокол "%1" не поддерживает переименование файлов или каталогов</translation> + <translation>Протокол «%1» не поддерживает переименование файлов или каталогов</translation> </message> <message> <source>The protocol `%1' does not support getting files</source> - <translation>Протокол "%1" не поддерживает доставку файлов</translation> + <translation>Протокол «%1» не поддерживает передачу файлов</translation> </message> <message> <source>The protocol `%1' does not support putting files</source> - <translation>Протокол "%1" не поддерживает отправку файлов</translation> + <translation>Протокол «%1» не поддерживает отправку файлов</translation> </message> <message> <source>The protocol `%1' does not support copying or moving files or directories</source> - <translation>Протокол "%1" не поддерживает копирование или перемещение файлов или каталогов</translation> + <translation>Протокол «%1» не поддерживает копирование или перемещение файлов или каталогов</translation> </message> <message> <source>(unknown)</source> @@ -1066,7 +1070,7 @@ to <name>QApplication</name> <message> <source>Executable '%1' requires Qt %2, found Qt %3.</source> - <translation>Программный модуль "%1" требует Qt %2, найдена версия %3.</translation> + <translation>Программный модуль «%1» требует Qt %2, найдена версия %3.</translation> </message> <message> <source>Incompatible Qt Library Error</source> @@ -1219,6 +1223,11 @@ to <translation>%1: недостаточно ресурсов</translation> </message> <message> + <source>%1: permission denied</source> + <comment>QSystemSemaphore</comment> + <translation>%1: доступ запрещён</translation> + </message> + <message> <source>%1: unknown error %2</source> <comment>QSystemSemaphore</comment> <translation>%1: неизвестная ошибка %2</translation> @@ -1293,11 +1302,11 @@ to <name>QDeclarativeAbstractAnimation</name> <message> <source>Cannot animate non-existent property "%1"</source> - <translation>Невозможно анимировать несуществуещее свойство "%1"</translation> + <translation>Невозможно анимировать несуществуещее свойство «%1»</translation> </message> <message> <source>Cannot animate read-only property "%1"</source> - <translation>Невозможно анимировать свойство только для чтения "%1"</translation> + <translation>Невозможно анимировать свойство только для чтения «%1»</translation> </message> <message> <source>Animation is an abstract class</source> @@ -1315,51 +1324,51 @@ to <name>QDeclarativeAnchors</name> <message> <source>Possible anchor loop detected on fill.</source> - <translation type="unfinished">Обнаружена возможная цикличная привязка на fill.</translation> + <translation>Обнаружена возможная цикличная привязка на fill.</translation> </message> <message> <source>Possible anchor loop detected on centerIn.</source> - <translation type="unfinished">Обнаружена возможная цикличная привязка на centerIn.</translation> + <translation>Обнаружена возможная цикличная привязка на centerIn.</translation> </message> <message> <source>Cannot anchor to an item that isn't a parent or sibling.</source> - <translation type="unfinished">Невозможно установить привязку к элементу, не являющемуся родителем или соседом.</translation> + <translation>Невозможно установить привязку к элементу, не являющемуся родителем или соседом.</translation> </message> <message> <source>Possible anchor loop detected on vertical anchor.</source> - <translation type="unfinished">Обнаружена возможная цикличная привязка к вертикальной привязке.</translation> + <translation>Обнаружена возможная цикличная привязка к вертикальной привязке.</translation> </message> <message> <source>Possible anchor loop detected on horizontal anchor.</source> - <translation type="unfinished">Обнаружена возможная цикличная привязка к горизонтальной привязке.</translation> + <translation>Обнаружена возможная цикличная привязка к горизонтальной привязке.</translation> </message> <message> <source>Cannot specify left, right, and hcenter anchors.</source> - <translation type="unfinished">Невозможно задать левую, правую и среднюю привязки.</translation> + <translation>Невозможно задать левую, правую и среднюю привязки.</translation> </message> <message> <source>Cannot anchor to a null item.</source> - <translation type="unfinished">Невозможно привязаться к нулевому элементу.</translation> + <translation>Невозможно привязаться к нулевому элементу.</translation> </message> <message> <source>Cannot anchor a horizontal edge to a vertical edge.</source> - <translation type="unfinished">Невозможно привязать горизонтальный край к вертикальному.</translation> + <translation>Невозможно привязать горизонтальный край к вертикальному.</translation> </message> <message> <source>Cannot anchor item to self.</source> - <translation type="unfinished">Невозможно привязать элемент к самому себе.</translation> + <translation>Невозможно привязать элемент к самому себе.</translation> </message> <message> <source>Cannot specify top, bottom, and vcenter anchors.</source> - <translation type="unfinished">Невозможно задать верхнюю, нижнюю и среднюю привязки.</translation> + <translation>Невозможно задать верхнюю, нижнюю и среднюю привязки.</translation> </message> <message> <source>Baseline anchor cannot be used in conjunction with top, bottom, or vcenter anchors.</source> - <translation type="unfinished">Невозможно использовать базовую привязку вместе с верхней, нижней и центральной по вертикали.</translation> + <translation>Невозможно использовать базовую привязку вместе с верхней, нижней и центральной по вертикали.</translation> </message> <message> <source>Cannot anchor a vertical edge to a horizontal edge.</source> - <translation type="unfinished">Невозможно привязать вертикальный край к горизонтальному.</translation> + <translation>Невозможно привязать вертикальный край к горизонтальному.</translation> </message> </context> <context> @@ -1370,31 +1379,38 @@ to </message> </context> <context> + <name>QDeclarativeApplication</name> + <message> + <source>Application is an abstract class</source> + <translation>Класс Application - абстрактный</translation> + </message> +</context> +<context> <name>QDeclarativeBehavior</name> <message> <source>Cannot change the animation assigned to a Behavior.</source> - <translation type="unfinished">Невозможно изменить анимацию, назначенную поведению.</translation> + <translation>Невозможно изменить анимацию, назначенную поведению.</translation> </message> </context> <context> <name>QDeclarativeBinding</name> <message> <source>Binding loop detected for property "%1"</source> - <translation type="unfinished">Обнаружено зацикливание привязки для свойства "%1"</translation> + <translation>Обнаружено зацикливание привязки для свойства «%1»</translation> </message> </context> <context> <name>QDeclarativeCompiledBindings</name> <message> <source>Binding loop detected for property "%1"</source> - <translation type="unfinished">Обнаружена цикличная привязка для свойства "%1"</translation> + <translation>Обнаружена цикличная привязка для свойства «%1»</translation> </message> </context> <context> <name>QDeclarativeCompiler</name> <message> <source>Invalid property assignment: "%1" is a read-only property</source> - <translation>Некорректное присваивание свойства: "%1" свойство только для чтения</translation> + <translation>Некорректное присваивание свойства: «%1» свойство только для чтения</translation> </message> <message> <source>Invalid property assignment: unknown enumeration</source> @@ -1402,19 +1418,19 @@ to </message> <message> <source>Invalid property assignment: string expected</source> - <translation>Некорректное присваивание свойства: ожидается значение типа "string"</translation> + <translation>Некорректное присваивание свойства: ожидается значение типа «string»</translation> </message> <message> <source>Invalid property assignment: url expected</source> - <translation>Некорректное присваивание свойства: ожидается значение типа "url"</translation> + <translation>Некорректное присваивание свойства: ожидается значение типа «url»</translation> </message> <message> <source>Invalid property assignment: unsigned int expected</source> - <translation>Некорректное присваивание свойства: ожидается значение типа "unsigned int"</translation> + <translation>Некорректное присваивание свойства: ожидается значение типа «unsigned int»</translation> </message> <message> <source>Invalid property assignment: int expected</source> - <translation>Некорректное присваивание свойства: ожидается значение типа "int"</translation> + <translation>Некорректное присваивание свойства: ожидается значение типа «int»</translation> </message> <message> <source>Invalid property assignment: number expected</source> @@ -1422,31 +1438,31 @@ to </message> <message> <source>Invalid property assignment: color expected</source> - <translation>Некорректное присваивание свойства: ожидается значение типа "color"</translation> + <translation>Некорректное присваивание свойства: ожидается значение типа «color»</translation> </message> <message> <source>Invalid property assignment: date expected</source> - <translation>Некорректное присваивание свойства: ожидается значение типа "date"</translation> + <translation>Некорректное присваивание свойства: ожидается значение типа «date»</translation> </message> <message> <source>Invalid property assignment: time expected</source> - <translation>Некорректное присваивание свойства: ожидается значение типа "time"</translation> + <translation>Некорректное присваивание свойства: ожидается значение типа «time»</translation> </message> <message> <source>Invalid property assignment: datetime expected</source> - <translation>Некорректное присваивание свойства: ожидается значение типа "datetime"</translation> + <translation>Некорректное присваивание свойства: ожидается значение типа «datetime»</translation> </message> <message> <source>Invalid property assignment: point expected</source> - <translation>Некорректное присваивание свойства: ожидается значение типа "point"</translation> + <translation>Некорректное присваивание свойства: ожидается значение типа «point»</translation> </message> <message> <source>Invalid property assignment: size expected</source> - <translation>Некорректное присваивание свойства: ожидается значение типа "size"</translation> + <translation>Некорректное присваивание свойства: ожидается значение типа «size»</translation> </message> <message> <source>Invalid property assignment: rect expected</source> - <translation>Некорректное присваивание свойства: ожидается значение типа "rect"</translation> + <translation>Некорректное присваивание свойства: ожидается значение типа «rect»</translation> </message> <message> <source>Invalid property assignment: boolean expected</source> @@ -1454,11 +1470,11 @@ to </message> <message> <source>Invalid property assignment: 3D vector expected</source> - <translation>Некорректное присваивание свойства: ожидается значение типа "трёхмерный вектор"</translation> + <translation>Некорректное присваивание свойства: ожидается значение типа «трёхмерный вектор»</translation> </message> <message> <source>Invalid property assignment: unsupported type "%1"</source> - <translation>Некорректное присваивание свойства: неподдерживаемый тип "%1"</translation> + <translation>Некорректное присваивание свойства: неподдерживаемый тип «%1»</translation> </message> <message> <source>Element is not creatable.</source> @@ -1466,11 +1482,11 @@ to </message> <message> <source>Component elements may not contain properties other than id</source> - <translation type="unfinished">Элементы Component не могут содержать свойств кроме id</translation> + <translation>Элементы Component не могут содержать свойств кроме id</translation> </message> <message> <source>Invalid component id specification</source> - <translation type="unfinished">Некорректная спецификация id компонента</translation> + <translation>Некорректная спецификация id компонента</translation> </message> <message> <source>id is not unique</source> @@ -1478,60 +1494,68 @@ to </message> <message> <source>Invalid component body specification</source> - <translation type="unfinished">Некорректная спецификация тела компонента</translation> + <translation>Некорректная спецификация тела компонента</translation> </message> <message> <source>Component objects cannot declare new properties.</source> - <translation type="unfinished">Объекты Component не могут объявлять новые свойства.</translation> + <translation>Объекты Component не могут объявлять новые свойства.</translation> </message> <message> <source>Component objects cannot declare new signals.</source> - <translation type="unfinished">Объекты Component не могут объявлять новые сигналы.</translation> + <translation>Объекты Component не могут объявлять новые сигналы.</translation> </message> <message> <source>Component objects cannot declare new functions.</source> - <translation type="unfinished">Объекты Component не могут объявлять новые функции.</translation> + <translation>Объекты Component не могут объявлять новые функции.</translation> </message> <message> <source>Cannot create empty component specification</source> - <translation type="unfinished">Невозможно создать пустую спецификацю компонента</translation> + <translation>Невозможно создать пустую спецификацю компонента</translation> + </message> + <message> + <source>"%1.%2" is not available in %3 %4.%5.</source> + <translation>«%1.%2» не доступно в %3 %4.%5.</translation> + </message> + <message> + <source>"%1.%2" is not available due to component versioning.</source> + <translation>«%1.%2» не доступно из-за версии компоненты.</translation> </message> <message> <source>Incorrectly specified signal assignment</source> - <translation type="unfinished">Неверно указано назначение сигнала</translation> + <translation>Неверно указано назначение сигнала</translation> </message> <message> <source>Cannot assign a value to a signal (expecting a script to be run)</source> - <translation type="unfinished">Невозможно назначить значение сигналу (сценарий должен быть запущен)</translation> + <translation>Невозможно назначить значение сигналу (сценарий должен быть запущен)</translation> </message> <message> <source>Empty signal assignment</source> - <translation type="unfinished">Пустое назначение сигнала</translation> + <translation>Пустое назначение сигнала</translation> </message> <message> <source>Empty property assignment</source> - <translation type="unfinished">Пустое назначение свойства</translation> + <translation>Пустое назначение свойства</translation> </message> <message> <source>Attached properties cannot be used here</source> <translatorcomment>здесь - в данном контексте?</translatorcomment> - <translation type="unfinished">Прикреплённые свойства не могут быть использованы здесь</translation> + <translation>Прикреплённые свойства не могут быть использованы здесь</translation> </message> <message> <source>Non-existent attached object</source> - <translation type="unfinished">Несуществующий прикреплённый объект</translation> + <translation>Несуществующий прикреплённый объект</translation> </message> <message> <source>Invalid attached object assignment</source> - <translation type="unfinished">Некорректное назначение прикреплённого объекта</translation> + <translation>Некорректное назначение прикреплённого объекта</translation> </message> <message> <source>Cannot assign to non-existent default property</source> - <translation type="unfinished">Невозможно назначить несуществующему свойству по умолчанию</translation> + <translation>Невозможно назначить несуществующему свойству по умолчанию</translation> </message> <message> <source>Cannot assign to non-existent property "%1"</source> - <translation type="unfinished">Невозможно назначить несуществующему свойству "%1"</translation> + <translation>Невозможно назначить несуществующему свойству «%1»</translation> </message> <message> <source>Invalid use of namespace</source> @@ -1539,23 +1563,23 @@ to </message> <message> <source>Not an attached property name</source> - <translation type="unfinished">Не является именем привязанного свойства</translation> + <translation>Не является именем привязанного свойства</translation> </message> <message> <source>Invalid use of id property</source> - <translation type="unfinished">Некорректное использование свойства id</translation> + <translation>Некорректное использование свойства id</translation> </message> <message> <source>Property has already been assigned a value</source> - <translation type="unfinished">Свойству уже назначено значение</translation> + <translation>Свойству уже назначено значение</translation> </message> <message> <source>Invalid grouped property access</source> - <translation type="unfinished">Некорректный доступ к сгруппированному свойству</translation> + <translation>Некорректный доступ к сгруппированному свойству</translation> </message> <message> <source>Cannot assign a value directly to a grouped property</source> - <translation type="unfinished">Невозможно присвоить значение непосредственно сгруппированному свойству</translation> + <translation>Невозможно присвоить значение непосредственно сгруппированному свойству</translation> </message> <message> <source>Invalid property use</source> @@ -1563,55 +1587,55 @@ to </message> <message> <source>Property assignment expected</source> - <translation type="unfinished">Ожидается назначение свойства</translation> + <translation>Ожидается назначение свойства</translation> </message> <message> <source>Single property assignment expected</source> - <translation type="unfinished">Ожидается одиночное назначение свойства</translation> + <translation>Ожидается одиночное назначение свойства</translation> </message> <message> <source>Unexpected object assignment</source> - <translation type="unfinished">Неожиданное назначение объекта</translation> + <translation>Неожиданное назначение объекта</translation> </message> <message> <source>Cannot assign object to list</source> - <translation type="unfinished">Невозможно назначить объект списку</translation> + <translation>Невозможно назначить объект списку</translation> </message> <message> <source>Can only assign one binding to lists</source> - <translation type="unfinished">Можно назначить только одну связь для списка</translation> + <translation>Можно назначить только одну связь для списка</translation> </message> <message> <source>Cannot assign primitives to lists</source> - <translation type="unfinished">Невозможно назначить примитивы списку</translation> + <translation>Невозможно назначить примитивы списку</translation> </message> <message> <source>Cannot assign multiple values to a script property</source> - <translation type="unfinished">Невозможно назначить множественное значение свойству сценария</translation> + <translation>Невозможно назначить множественное значение свойству сценария</translation> </message> <message> <source>Invalid property assignment: script expected</source> - <translation type="unfinished">Некорректное присваивание свойства: ожидается сценарий</translation> + <translation>Некорректное присваивание свойства: ожидается сценарий</translation> </message> <message> <source>Cannot assign multiple values to a singular property</source> - <translation type="unfinished">Невозможно присвоить множество значений свойству, принимающему только одно</translation> + <translation>Невозможно присвоить множество значений свойству, принимающему только одно</translation> </message> <message> <source>Cannot assign object to property</source> - <translation type="unfinished">Невозможно назначить объектсвойству</translation> + <translation>Невозможно назначить объектсвойству</translation> </message> <message> <source>"%1" cannot operate on "%2"</source> - <translation>"%1" не может воздействовать на "%2"</translation> + <translation>«%1» не может воздействовать на «%2»</translation> </message> <message> <source>Duplicate default property</source> - <translation type="unfinished">Дублирование свойства по умолчанию</translation> + <translation>Дублирование свойства по умолчанию</translation> </message> <message> <source>Duplicate property name</source> - <translation type="unfinished">Дублирование названия свойства</translation> + <translation>Дублирование названия свойства</translation> </message> <message> <source>Property names cannot begin with an upper case letter</source> @@ -1623,7 +1647,7 @@ to </message> <message> <source>Duplicate signal name</source> - <translation type="unfinished">Дублирование названия сигнала</translation> + <translation>Дублирование названия сигнала</translation> </message> <message> <source>Signal names cannot begin with an upper case letter</source> @@ -1635,7 +1659,7 @@ to </message> <message> <source>Duplicate method name</source> - <translation type="unfinished">Дублирование название метода</translation> + <translation>Дублирование название метода</translation> </message> <message> <source>Method names cannot begin with an upper case letter</source> @@ -1647,11 +1671,11 @@ to </message> <message> <source>Property value set multiple times</source> - <translation type="unfinished">Значение свойства задано несколько раз</translation> + <translation>Значение свойства задано несколько раз</translation> </message> <message> <source>Invalid property nesting</source> - <translation type="unfinished">Некорректное вложенность свойств</translation> + <translation>Некорректное вложенность свойств</translation> </message> <message> <source>Cannot override FINAL property</source> @@ -1679,23 +1703,23 @@ to </message> <message> <source>ID illegally masks global JavaScript property</source> - <translation type="unfinished">Идентификатор неверно маскирует глобальное свойство JavaScript</translation> + <translation>Идентификатор неверно маскирует глобальное свойство JavaScript</translation> </message> <message> <source>No property alias location</source> - <translation type="unfinished">Отсутствует размещение псевдонима свойства</translation> + <translation>Отсутствует размещение псевдонима свойства</translation> </message> <message> <source>Invalid alias location</source> - <translation type="unfinished">Некорректное размещение псевдонима</translation> + <translation>Некорректное размещение псевдонима</translation> </message> <message> <source>Invalid alias reference. An alias reference must be specified as <id>, <id>.<property> or <id>.<value property>.<property></source> - <translation type="unfinished">Некорректная ссылка на псевдоним. Ссылка на псевдоним должна быть указана, как <id>, <id>.<свойство> или <id>.<свойство значения>.<свойство></translation> + <translation>Некорректная ссылка на псевдоним. Ссылка на псевдоним должна быть указана, как <id>, <id>.<свойство> или <id>.<свойство значения>.<свойство></translation> </message> <message> <source>Alias property exceeds alias bounds</source> - <translation type="unfinished">Свойство псевдонима выходит за границы</translation> + <translation>Свойство псевдонима выходит за границы</translation> </message> <message> <source>Invalid alias reference. An alias reference must be specified as <id> or <id>.<property></source> @@ -1703,7 +1727,7 @@ to </message> <message> <source>Invalid alias reference. Unable to find id "%1"</source> - <translation type="unfinished">Некорректная ссылка на псевдоним. Не удалось найти id "%1"</translation> + <translation>Некорректная ссылка на псевдоним. Не удалось найти id «%1»</translation> </message> </context> <context> @@ -1712,12 +1736,16 @@ to <source>Invalid empty URL</source> <translation>Пустой адрес URL</translation> </message> + <message> + <source>createObject: value is not an object</source> + <translation>createObject: значение не является объектом</translation> + </message> </context> <context> <name>QDeclarativeConnections</name> <message> <source>Cannot assign to non-existent property "%1"</source> - <translation>Невозможно назначить несуществующему свойству "%1"</translation> + <translation>Невозможно назначить несуществующему свойству «%1»</translation> </message> <message> <source>Connections: nested objects not allowed</source> @@ -1774,35 +1802,35 @@ to <name>QDeclarativeImportDatabase</name> <message> <source>cannot load module "%1": File name case mismatch for "%2"</source> - <translation type="unfinished">невозможно загрузить модуль "%1": Регистр имени файла не соответствует "%2"</translation> + <translation>невозможно загрузить модуль «%1»: Регистр имени файла не соответствует «%2»</translation> </message> <message> <source>module "%1" definition "%2" not readable</source> - <translation type="unfinished">невозможно прочитать определение "%2" модуля "%1"</translation> + <translation>невозможно прочитать определение «%2» модуля «%1»</translation> </message> <message> <source>plugin cannot be loaded for module "%1": %2</source> - <translation type="unfinished">модуль не может быть загружен для подмодуля "%1": %2</translation> + <translation>не удалось загрузить плагин для модуля «%1»: %2</translation> </message> <message> <source>module "%1" plugin "%2" not found</source> - <translation type="unfinished">подмодуль "%1" модуля "%2" не найден</translation> + <translation>модуль «%1» плагина «%2» не найден</translation> </message> <message> <source>module "%1" version %2.%3 is not installed</source> - <translation>модуль "%1" версии %2.%3 не установлен</translation> + <translation>модуль «%1» версии %2.%3 не установлен</translation> </message> <message> <source>module "%1" is not installed</source> - <translation>модуль "%1" не установлен</translation> + <translation>модуль «%1» не установлен</translation> </message> <message> <source>"%1": no such directory</source> - <translation>"%1": каталог не существует</translation> + <translation>«%1»: каталог не существует</translation> </message> <message> <source>import "%1" has no qmldir and no namespace</source> - <translation type="unfinished">каталог "%1" не содержит ни qmldir, ни namespace</translation> + <translation>каталог «%1» не содержит ни qmldir, ни namespace</translation> </message> <message> <source>- %1 is not a namespace</source> @@ -1834,21 +1862,32 @@ to </message> <message> <source>File name case mismatch for "%2"</source> - <translation type="unfinished">Регистр имени файла не соответствует "%2"</translation> + <translation>Регистр имени файла не соответствует «%2»</translation> </message> </context> <context> <name>QDeclarativeKeyNavigationAttached</name> <message> <source>KeyNavigation is only available via attached properties</source> - <translation type="unfinished">KeyNavigation доступна только через прикреплённые свойства</translation> + <translation>KeyNavigation доступна только через прикреплённые свойства</translation> </message> </context> <context> <name>QDeclarativeKeysAttached</name> <message> <source>Keys is only available via attached properties</source> - <translation type="unfinished">Keys доступны только через прикреплённые свойства</translation> + <translation>Keys доступны только через прикреплённые свойства</translation> + </message> +</context> +<context> + <name>QDeclarativeLayoutMirroringAttached</name> + <message> + <source>LayoutDirection attached property only works with Items</source> + <translation>Подключённое свойство LayoutDirection работает только с элементами</translation> + </message> + <message> + <source>LayoutMirroring is only available via attached properties</source> + <translation>LayoutMirroring доступно только через подключаемые свойства</translation> </message> </context> <context> @@ -1887,7 +1926,7 @@ to </message> <message> <source>ListElement: cannot use reserved "id" property</source> - <translation>ListElement: невозможно использовать зарезервированное свойство "id"</translation> + <translation>ListElement: невозможно использовать зарезервированное свойство «id»</translation> </message> <message> <source>ListElement: cannot use script for property value</source> @@ -1895,7 +1934,7 @@ to </message> <message> <source>ListModel: undefined property '%1'</source> - <translation>ListModel: неопределённое свойство "%1"</translation> + <translation>ListModel: неопределённое свойство «%1»</translation> </message> </context> <context> @@ -1971,7 +2010,7 @@ to </message> <message> <source>Invalid regular expression flag '%0'</source> - <translation>Некорректный флаг "%0" в регулярном выражении</translation> + <translation>Некорректный флаг «%0» в регулярном выражении</translation> </message> <message> <source>Unterminated regular expression backslash sequence</source> @@ -1987,15 +2026,15 @@ to </message> <message> <source>Unexpected token `%1'</source> - <translation>Неожиданный символ "%1"</translation> + <translation>Неожиданный символ «%1»</translation> </message> <message> <source>Expected token `%1'</source> - <translation>Ожидается символ "%1"</translation> + <translation>Ожидается символ «%1»</translation> </message> <message> <source>Property value set multiple times</source> - <translation type="unfinished">Значение свойства установлено несколько раз</translation> + <translation>Значение свойства установлено несколько раз</translation> </message> <message> <source>Expected type name</source> @@ -2003,11 +2042,11 @@ to </message> <message> <source>Invalid import qualifier ID</source> - <translation type="unfinished">Некорректный ID спецификатора импорта</translation> + <translation>Некорректный ID спецификатора импорта</translation> </message> <message> <source>Reserved name "Qt" cannot be used as an qualifier</source> - <translation>Зарезервированное имя "Qt" не может быть использовано в качестве спецификатора</translation> + <translation>Зарезервированное имя «Qt» не может быть использовано в качестве спецификатора</translation> </message> <message> <source>Script import qualifiers must be unique.</source> @@ -2019,7 +2058,7 @@ to </message> <message> <source>Library import requires a version</source> - <translation type="unfinished">Импорт библиотеки требует версию</translation> + <translation>Импорт библиотеки требует версию</translation> </message> <message> <source>Expected parameter type</source> @@ -2039,7 +2078,7 @@ to </message> <message> <source>Readonly not yet supported</source> - <translation type="unfinished">Readonly ещё не поддерживается</translation> + <translation>Readonly ещё не поддерживается</translation> </message> <message> <source>JavaScript declaration outside Script element</source> @@ -2079,26 +2118,26 @@ to <name>QDeclarativePropertyChanges</name> <message> <source>PropertyChanges does not support creating state-specific objects.</source> - <translation type="unfinished">PropertyChanges не поддерживают создание объектов, зависимых от состояния.</translation> + <translation>PropertyChanges не поддерживают создание объектов, зависимых от состояния.</translation> </message> <message> <source>Cannot assign to non-existent property "%1"</source> - <translation type="unfinished">Невозможно назначить несуществующему свойству "%1"</translation> + <translation>Невозможно назначить несуществующему свойству «%1»</translation> </message> <message> <source>Cannot assign to read-only property "%1"</source> - <translation type="unfinished">Невозможно назначить свойству только для чтения "%1"</translation> + <translation>Невозможно назначить свойству только для чтения «%1»</translation> </message> </context> <context> <name>QDeclarativeTextInput</name> <message> <source>Could not load cursor delegate</source> - <translation type="unfinished">Не удалось загрузить делегат курсора</translation> + <translation>Не удалось загрузить делегат курсора</translation> </message> <message> <source>Could not instantiate cursor delegate</source> - <translation type="unfinished">Не удалось инстанциировать делегат курсора</translation> + <translation>Не удалось инстанциировать делегат курсора</translation> </message> </context> <context> @@ -2109,11 +2148,11 @@ to </message> <message> <source>Type %1 unavailable</source> - <translation>Тип "%1" недоступен</translation> + <translation>Тип «%1» недоступен</translation> </message> <message> <source>Namespace %1 cannot be used as a type</source> - <translation>Пространство имён "%1" не может быть использовано в качестве типа</translation> + <translation>Пространство имён «%1» не может быть использовано в качестве типа</translation> </message> <message> <source>%1 %2</source> @@ -2124,46 +2163,46 @@ to <name>QDeclarativeVME</name> <message> <source>Unable to create object of type %1</source> - <translation>Невозможно создать объект типа "%1"</translation> + <translation>Невозможно создать объект типа «%1»</translation> </message> <message> <source>Cannot assign value %1 to property %2</source> - <translation>Невозможно установить значение "%1" свойству "%2"</translation> + <translation>Невозможно присвоить значение «%1» свойству «%2»</translation> </message> <message> <source>Cannot assign object type %1 with no default method</source> - <translation type="unfinished">Невозможно назначить объект типа %1 без метода по умолчанию</translation> + <translation>Невозможно присвоить объект типа «%1» без метода по умолчанию</translation> </message> <message> <source>Cannot connect mismatched signal/slot %1 %vs. %2</source> - <translation type="unfinished">Невозможно подключить отсутствующий сигнал/слот %1 к %2</translation> + <translation>Невозможно подключить отсутствующий сигнал/слот %1 к %2</translation> </message> <message> <source>Cannot assign an object to signal property %1</source> - <translation type="unfinished">Невозможно назначить объект к свойству сигнала %1</translation> + <translation>Невозможно назначить объект к свойству сигнала %1</translation> </message> <message> <source>Cannot assign object to list</source> - <translation type="unfinished">Невозможно назначить объект списку</translation> + <translation>Невозможно назначить объект списку</translation> </message> <message> <source>Cannot assign object to interface property</source> - <translation type="unfinished">Невозможно назначить объект свойству интерфейса</translation> + <translation>Невозможно назначить объект свойству интерфейса</translation> </message> <message> <source>Unable to create attached object</source> - <translation type="unfinished">Не удалось создать вложенный объект</translation> + <translation>Не удалось создать вложенный объект</translation> </message> <message> <source>Cannot set properties on %1 as it is null</source> - <translation type="unfinished">Невозможно установить свойства для %1, так как он нулевой</translation> + <translation>Невозможно установить свойства для %1, так как он нулевой</translation> </message> </context> <context> <name>QDeclarativeVisualDataModel</name> <message> <source>Delegate component must be Item type.</source> - <translation type="unfinished">Компинент делегата должен быть типа Item.</translation> + <translation>Компонента делегата должен быть типа Item.</translation> </message> </context> <context> @@ -2177,14 +2216,14 @@ to <name>QDeclarativeXmlListModelRole</name> <message> <source>An XmlRole query must not start with '/'</source> - <translation type="unfinished">Запрос XmlRole не должен начинаться с '/'</translation> + <translation>Запрос XmlRole не должен начинаться с «/»</translation> </message> </context> <context> <name>QDeclarativeXmlRoleList</name> <message> <source>An XmlListModel query must start with '/' or "//"</source> - <translation type="unfinished">Запрос XmlListModel должен начинаться с '/' или "//"</translation> + <translation>Запрос XmlListModel должен начинаться с «/» или «//»</translation> </message> </context> <context> @@ -2345,11 +2384,11 @@ to </message> <message> <source>Dock</source> - <translation type="unfinished">Прикрепить</translation> + <translation>Прикрепить</translation> </message> <message> <source>Float</source> - <translation type="unfinished">Открепить</translation> + <translation>Открепить</translation> </message> </context> <context> @@ -2478,7 +2517,7 @@ to <message> <source>'%1' is write protected. Do you want to delete it anyway?</source> - <translation>"%1" защищён от записи. + <translation>«%1» защищён от записи. Действительно желаете удалить?</translation> </message> <message> @@ -2553,7 +2592,7 @@ Please verify the correct directory name was given.</source> </message> <message> <source>Are sure you want to delete '%1'?</source> - <translation>Вы действительно хотите удалить "%1"?</translation> + <translation>Вы действительно хотите удалить «%1»?</translation> </message> <message> <source>Could not delete directory.</source> @@ -2652,7 +2691,7 @@ Please verify the correct directory name was given.</source> </message> <message> <source><b>The name "%1" can not be used.</b><p>Try using another name, with fewer characters or no punctuations marks.</source> - <translation><b>Имя "%1" не может быть использовано.</b><p>Попробуйте использовать имя меньшей длины и/или без символов пунктуации.</translation> + <translation><b>Имя «%1» не может быть использовано.</b><p>Попробуйте использовать имя меньшей длины и/или без символов пунктуации.</translation> </message> <message> <source>Name</source> @@ -3339,15 +3378,15 @@ Please verify the correct directory name was given.</source> <name>QLibrary</name> <message> <source>Plugin verification data mismatch in '%1'</source> - <translation>Проверочная информация для модуля "%1" не совпадает</translation> + <translation>Проверочная информация для модуля «%1» не совпадает</translation> </message> <message> <source>The plugin '%1' uses incompatible Qt library. (%2.%3.%4) [%5]</source> - <translation>Модуль "%1" использует несоместимую библиотеку Qt. (%2.%3.%4) [%5]</translation> + <translation>Модуль «%1» использует несоместимую библиотеку Qt. (%2.%3.%4) [%5]</translation> </message> <message> <source>The plugin '%1' uses incompatible Qt library. Expected build key "%2", got "%3"</source> - <translation>Модуль "%1" использует несоместимую библиотеку Qt. Ожидается ключ "%2", но получен ключ "%3"</translation> + <translation>Модуль «%1» использует несоместимую библиотеку Qt. Ожидается ключ «%2», но получен ключ «%3»</translation> </message> <message> <source>Unknown error</source> @@ -3359,11 +3398,11 @@ Please verify the correct directory name was given.</source> </message> <message> <source>The file '%1' is not a valid Qt plugin.</source> - <translation>Файл "%1" - не является корректным модулем Qt.</translation> + <translation>Файл «%1» - не является корректным модулем Qt.</translation> </message> <message> <source>The plugin '%1' uses incompatible Qt library. (Cannot mix debug and release libraries.)</source> - <translation>Модуль "%1" использует несоместимую библиотеку Qt. (Невозможно совместить релизные и отладочные библиотеки.)</translation> + <translation>Модуль «%1» использует несоместимую библиотеку Qt. (Невозможно совместить релизные и отладочные библиотеки.)</translation> </message> <message> <source>Cannot load library %1: %2</source> @@ -3375,7 +3414,7 @@ Please verify the correct directory name was given.</source> </message> <message> <source>Cannot resolve symbol "%1" in %2: %3</source> - <translation>Невозможно разрешить символ "%1" в %2: %3</translation> + <translation>Невозможно разрешить символ «%1» в %2: %3</translation> </message> </context> <context> @@ -3906,7 +3945,7 @@ Please verify the correct directory name was given.</source> </message> <message> <source>Protocol "%1" is unknown</source> - <translation>Неизвестный протокол "%1"</translation> + <translation>Неизвестный протокол «%1»</translation> </message> <message> <source>Network session error.</source> @@ -3936,7 +3975,7 @@ Please verify the correct directory name was given.</source> <message> <source>Roaming error</source> <translatorcomment>или перемещения?</translatorcomment> - <translation type="unfinished">Ошибка роуминга</translation> + <translation>Ошибка роуминга</translation> </message> <message> <source>Session aborted by user or system</source> @@ -3964,7 +4003,7 @@ Please verify the correct directory name was given.</source> </message> <message> <source>Roaming was aborted or is not possible.</source> - <translation type="unfinished">Роуминг прерван или невозможен.</translation> + <translation>Роуминг прерван или невозможен.</translation> </message> </context> <context> @@ -4057,7 +4096,7 @@ Please verify the correct directory name was given.</source> <name>QODBCResult</name> <message> <source>QODBCResult::reset: Unable to set 'SQL_CURSOR_STATIC' as statement attribute. Please check your ODBC driver configuration</source> - <translation>QODBCResult::reset: Невозможно установить "SQL_CURSOR_STATIC" атрибутом выражение. Проверьте настройки драйвера ODBC</translation> + <translation>QODBCResult::reset: Невозможно установить «SQL_CURSOR_STATIC» атрибутом выражение. Проверьте настройки драйвера ODBC</translation> </message> <message> <source>Unable to execute statement</source> @@ -4096,11 +4135,11 @@ Please verify the correct directory name was given.</source> <name>QObject</name> <message> <source>"%1" duplicates a previous role name and will be disabled.</source> - <translation>"%1" повторяет имя предыдущей роли и не будет использовано.</translation> + <translation>«%1» повторяет имя предыдущей роли и не будет использовано.</translation> </message> <message> <source>invalid query: "%1"</source> - <translation>Некорректный запрос: "%1"</translation> + <translation>Некорректный запрос: «%1»</translation> </message> <message> <source>PulseAudio Sound Server</source> @@ -4440,7 +4479,7 @@ Please choose a different file name.</source> </message> <message> <source>The 'From' value cannot be greater than the 'To' value.</source> - <translation>Значение "с" не может быть больше значения "по".</translation> + <translation>Значение «с» не может быть больше значения «по».</translation> </message> <message> <source>A0</source> @@ -6187,15 +6226,15 @@ Please choose a different file name.</source> </message> <message> <source>Code input</source> - <translation type="unfinished"></translation> + <translation type="unfinished">Ввод кода</translation> </message> <message> <source>Multiple Candidate</source> - <translation type="unfinished"></translation> + <translation type="unfinished">Несколько вариантов</translation> </message> <message> <source>Previous Candidate</source> - <translation type="unfinished"></translation> + <translation type="unfinished">Предыдущий вариант</translation> </message> <message> <source>Hangul</source> @@ -6285,23 +6324,23 @@ Please choose a different file name.</source> </message> <message> <source>Ctrl</source> - <translation type="unfinished">Ctrl</translation> + <translation></translation> </message> <message> <source>Shift</source> - <translation type="unfinished">Shift</translation> + <translation></translation> </message> <message> <source>Alt</source> - <translation type="unfinished">Alt</translation> + <translation></translation> </message> <message> <source>Meta</source> - <translation type="unfinished">Meta</translation> + <translation></translation> </message> <message> <source>+</source> - <translation type="unfinished">+</translation> + <translation></translation> </message> <message> <source>F%1</source> @@ -6514,6 +6553,10 @@ Please choose a different file name.</source> <translation>Ошибка создания сессии SSL: %1</translation> </message> <message> + <source>The peer certificate is blacklisted</source> + <translation>Сертификат узла в чёрном списке</translation> + </message> + <message> <source>Cannot provide a certificate with no key, %1</source> <translation>Невозможно предоставить сертификат без ключа, %1</translation> </message> @@ -6622,15 +6665,15 @@ Please choose a different file name.</source> <name>QStateMachine</name> <message> <source>Missing initial state in compound state '%1'</source> - <translation>Отсутствует исходное состояние в составном состоянии "%1"</translation> + <translation>Отсутствует исходное состояние в составном состоянии «%1»</translation> </message> <message> <source>Missing default state in history state '%1'</source> - <translation>Отсутствует состояние по умолчанию в историческом состоянии "%1"</translation> + <translation>Отсутствует состояние по умолчанию в историческом состоянии «%1»</translation> </message> <message> <source>No common ancestor for targets and source of transition from state '%1'</source> - <translation>Нет общего предка у источника и цели перехода из состояния "%1"</translation> + <translation>Нет общего предка у источника и цели перехода из состояния «%1»</translation> </message> <message> <source>Unknown error</source> @@ -7122,7 +7165,7 @@ Please choose a different file name.</source> <message> <source>Choose File</source> <comment>title for file button used in HTML forms</comment> - <translation>Обзор...</translation> + <translation>Выбрать файл</translation> </message> <message> <source>No file selected</source> @@ -7202,13 +7245,13 @@ Please choose a different file name.</source> <message> <source>No Guesses Found</source> <comment>No Guesses Found context menu item</comment> - <translation type="unfinished">Совпадений не найдено</translation> + <translation>Совпадений не найдено</translation> </message> <message> <source>Ignore</source> <comment>Ignore Spelling context menu item</comment> <translatorcomment>?Пропускать</translatorcomment> - <translation type="unfinished">Пропустить</translation> + <translation>Пропустить</translation> </message> <message> <source>Add To Dictionary</source> @@ -7218,12 +7261,12 @@ Please choose a different file name.</source> <message> <source>Search The Web</source> <comment>Search The Web context menu item</comment> - <translation type="unfinished">Искать в Интернет</translation> + <translation>Искать в Интернет</translation> </message> <message> <source>Look Up In Dictionary</source> <comment>Look Up in Dictionary context menu item</comment> - <translation type="unfinished">Искать в словаре</translation> + <translation>Искать в словаре</translation> </message> <message> <source>Open Link</source> @@ -7234,7 +7277,7 @@ Please choose a different file name.</source> <source>Ignore</source> <comment>Ignore Grammar context menu item</comment> <translatorcomment>?Пропускать</translatorcomment> - <translation type="unfinished">Пропустить</translation> + <translation>Пропустить</translation> </message> <message> <source>Spelling</source> @@ -7244,12 +7287,12 @@ Please choose a different file name.</source> <message> <source>Show Spelling and Grammar</source> <comment>menu item title</comment> - <translation type="unfinished">Показать панель проверки правописания</translation> + <translation>Показать панель проверки правописания</translation> </message> <message> <source>Hide Spelling and Grammar</source> <comment>menu item title</comment> - <translation type="unfinished">Скрыть панель проверки правописания</translation> + <translation>Скрыть панель проверки правописания</translation> </message> <message> <source>Check Spelling</source> @@ -7374,22 +7417,22 @@ Please choose a different file name.</source> <message> <source>Mute Button</source> <comment>Media controller element</comment> - <translation>Кнопка "Отключить звук"</translation> + <translation>Кнопка «Отключить звук»</translation> </message> <message> <source>Unmute Button</source> <comment>Media controller element</comment> - <translation>Кнопка "Включить звук"</translation> + <translation>Кнопка «Включить звук»</translation> </message> <message> <source>Play Button</source> <comment>Media controller element</comment> - <translation>Кнопка "Воспроизведение"</translation> + <translation>Кнопка «Воспроизведение»</translation> </message> <message> <source>Pause Button</source> <comment>Media controller element</comment> - <translation>Кнопка "Пауза"</translation> + <translation>Кнопка «Пауза»</translation> </message> <message> <source>Slider</source> @@ -7404,12 +7447,12 @@ Please choose a different file name.</source> <message> <source>Rewind Button</source> <comment>Media controller element</comment> - <translation>Кнопка "Перемотка назад"</translation> + <translation>Кнопка «Перемотка назад»</translation> </message> <message> <source>Return to Real-time Button</source> <comment>Media controller element</comment> - <translation type="unfinished">Кнопка "Вернуть в реальное время"</translation> + <translation>Кнопка «Вернуть в реальное время»</translation> </message> <message> <source>Elapsed Time</source> @@ -7429,17 +7472,17 @@ Please choose a different file name.</source> <message> <source>Fullscreen Button</source> <comment>Media controller element</comment> - <translation>Кнопка "На весь экран"</translation> + <translation>Кнопка «На весь экран»</translation> </message> <message> <source>Seek Forward Button</source> <comment>Media controller element</comment> - <translation>Кнопка "Перемотка вперёд"</translation> + <translation>Кнопка «Перемотка вперёд»</translation> </message> <message> <source>Seek Back Button</source> <comment>Media controller element</comment> - <translation>Кнопка "Перемотка назад"</translation> + <translation>Кнопка «Перемотка назад»</translation> </message> <message> <source>Audio element playback controls and status display</source> @@ -7474,12 +7517,12 @@ Please choose a different file name.</source> <message> <source>Movie time scrubber</source> <comment>Media controller element</comment> - <translation type="unfinished">Перемотка</translation> + <translation>Перемотка</translation> </message> <message> <source>Movie time scrubber thumb</source> <comment>Media controller element</comment> - <translation type="unfinished">Позиция перемотки</translation> + <translation>Позиция перемотки</translation> </message> <message> <source>Rewind movie</source> @@ -7489,7 +7532,7 @@ Please choose a different file name.</source> <message> <source>Return streaming movie to real-time</source> <comment>Media controller element</comment> - <translation type="unfinished">Возвращает потоковое видео к воспроизведению в реальном времени</translation> + <translation>Возвращает потоковое видео к воспроизведению в реальном времени</translation> </message> <message> <source>Current movie time</source> @@ -7602,7 +7645,7 @@ Please choose a different file name.</source> </message> <message> <source>Commit</source> - <translation>Передать</translation> + <translation>Подтвердить</translation> </message> <message> <source>Done</source> @@ -7806,11 +7849,11 @@ Please choose a different file name.</source> </message> <message> <source>Sequence ']]>' not allowed in content.</source> - <translation>Последовательность "]]>" недопустима в содержимом.</translation> + <translation>Последовательность «]]>» недопустима в содержимом.</translation> </message> <message> <source>Namespace prefix '%1' not declared</source> - <translation>Префикс пространства имён "%1" не объявлен</translation> + <translation>Префикс пространства имён «%1» не объявлен</translation> </message> <message> <source>Attribute redefined.</source> @@ -7818,7 +7861,7 @@ Please choose a different file name.</source> </message> <message> <source>Unexpected character '%1' in public id literal.</source> - <translation>Неожиданный символ "%1" в литерале открытого идентификатора.</translation> + <translation>Неожиданный символ «%1» в литерале открытого идентификатора.</translation> </message> <message> <source>Invalid XML version string.</source> @@ -7838,7 +7881,7 @@ Please choose a different file name.</source> </message> <message> <source>Standalone accepts only yes or no.</source> - <translation>Псевдоатрибут "standalone" может принимать только значения "yes" или "no".</translation> + <translation>Псевдоатрибут «standalone» может принимать только значения «yes» или «no».</translation> </message> <message> <source>Invalid attribute in XML declaration.</source> @@ -7906,15 +7949,15 @@ Please choose a different file name.</source> </message> <message> <source>Reference to unparsed entity '%1'.</source> - <translation>Ссылка на необработанный объект "%1".</translation> + <translation>Ссылка на необработанный объект «%1».</translation> </message> <message> <source>Entity '%1' not declared.</source> - <translation>Объект "%1" не объявлен.</translation> + <translation>Объект «%1» не объявлен.</translation> </message> <message> <source>Reference to external entity '%1' in attribute value.</source> - <translation>Ссылка на внешний объект "%1" в значении атрибута.</translation> + <translation>Ссылка на внешний объект «%1» в значении атрибута.</translation> </message> <message> <source>Invalid character reference.</source> @@ -7926,7 +7969,7 @@ Please choose a different file name.</source> </message> <message> <source>The standalone pseudo attribute must appear after the encoding.</source> - <translation>Псевдоатрибут "standalone" должен находиться после указания кодировки.</translation> + <translation>Псевдоатрибут «standalone» должен находиться после указания кодировки.</translation> </message> <message> <source>%1 is an invalid PUBLIC identifier.</source> @@ -7953,7 +7996,7 @@ Please choose a different file name.</source> </message> <message> <source>The data of a processing instruction cannot contain the string %1</source> - <translation>Данные обрабатываемой инструкции не могут содержать строку "%1"</translation> + <translation>Данные обрабатываемой инструкции не могут содержать строку «%1»</translation> </message> <message> <source>%1 is an invalid %2</source> @@ -7969,11 +8012,11 @@ Please choose a different file name.</source> </message> <message> <source>In the replacement string, %1 must be followed by at least one digit when not escaped.</source> - <translation>В замещаемой строке "%1" должно сопровождаться как минимум одной цифрой, если неэкранировано.</translation> + <translation>В замещаемой строке «%1» должно сопровождаться как минимум одной цифрой, если неэкранировано.</translation> </message> <message> <source>In the replacement string, %1 can only be used to escape itself or %2, not %3</source> - <translation>В замещаемой строке символ "%1" может использоваться только для экранирования самого себя или "%2", но не "%3"</translation> + <translation>В замещаемой строке символ «%1» может использоваться только для экранирования самого себя или «%2», но не «%3»</translation> </message> <message> <source>%1 matches newline characters</source> @@ -8165,7 +8208,7 @@ Please choose a different file name.</source> </message> <message> <source>At least one time component must appear after the %1-delimiter.</source> - <translation>Как минимум одна компонента времени должна следовать за разделителем '%1'.</translation> + <translation>Как минимум одна компонента времени должна следовать за разделителем «%1».</translation> </message> <message> <source>Dividing a value of type %1 by %2 (not-a-number) is not allowed.</source> @@ -8289,7 +8332,7 @@ Please choose a different file name.</source> </message> <message> <source>%1 must be followed by %2 or %3, not at the end of the replacement string.</source> - <translation>"%1" должно сопровождаться "%2" или "%3", но не в конце замещаемой строки.</translation> + <translation>«%1» должно сопровождаться «%2» или «%3», но не в конце замещаемой строки.</translation> </message> <message> <source>%1 and %2 match the start and end of a line.</source> @@ -8689,15 +8732,15 @@ Please choose a different file name.</source> </message> <message> <source>%1 has inheritance loop in its base type %2.</source> - <translation type="unfinished"></translation> + <translation type="unfinished">У %1 зациклено наследование в его базовом типе %2.</translation> </message> <message> <source>Circular inheritance of base type %1.</source> - <translation type="unfinished"></translation> + <translation>Цикличное наследование базового типа %1.</translation> </message> <message> <source>Circular inheritance of union %1.</source> - <translation type="unfinished"></translation> + <translation type="unfinished">Цикличное наследование базового объединения %1.</translation> </message> <message> <source>%1 is not allowed to derive from %2 by restriction as the latter defines it as final.</source> @@ -8709,19 +8752,19 @@ Please choose a different file name.</source> </message> <message> <source>Base type of simple type %1 cannot be complex type %2.</source> - <translation type="unfinished"></translation> + <translation>Базовым простого типа %1 не может быть сложный %2.</translation> </message> <message> <source>Simple type %1 cannot have direct base type %2.</source> - <translation type="unfinished"></translation> + <translation>У простого типа %1 %2 не может быть непосредственным базовым типом.</translation> </message> <message> <source>Simple type %1 is not allowed to have base type %2.</source> - <translation type="unfinished"></translation> + <translation>Недопустимо, чтобы простой тип %1 имел базовым %2.</translation> </message> <message> <source>Simple type %1 can only have simple atomic type as base type.</source> - <translation type="unfinished"></translation> + <translation>У простого типа %1 может быть только простой атомарный базовый тип.</translation> </message> <message> <source>Simple type %1 cannot derive from %2 as the latter defines restriction as final.</source> @@ -8729,11 +8772,11 @@ Please choose a different file name.</source> </message> <message> <source>Variety of item type of %1 must be either atomic or union.</source> - <translation type="unfinished"></translation> + <translation type="unfinished">Виды типов элементов %1 должны быть или атомарными, или объединениями.</translation> </message> <message> <source>Variety of member types of %1 must be atomic.</source> - <translation type="unfinished"></translation> + <translation type="unfinished">Виды внутренних типов %1 должны быть атомарными.</translation> </message> <message> <source>%1 is not allowed to derive from %2 by list as the latter defines it as final.</source> @@ -8741,11 +8784,11 @@ Please choose a different file name.</source> </message> <message> <source>Simple type %1 is only allowed to have %2 facet.</source> - <translation type="unfinished"></translation> + <translation>Простой тип %1 может иметь только фасет %2.</translation> </message> <message> <source>Base type of simple type %1 must have variety of type list.</source> - <translation type="unfinished"></translation> + <translation type="unfinished">Базовый тип простого типа %1 должен содержать какой-нибудь список.</translation> </message> <message> <source>Base type of simple type %1 has defined derivation by restriction as final.</source> @@ -8753,11 +8796,11 @@ Please choose a different file name.</source> </message> <message> <source>Item type of base type does not match item type of %1.</source> - <translation type="unfinished"></translation> + <translation>Тип элемента базового типа не совпадает с типом элемента %1.</translation> </message> <message> <source>Simple type %1 contains not allowed facet type %2.</source> - <translation type="unfinished"></translation> + <translation>Простой тип %1 содержит недопустимый фасет типа %2.</translation> </message> <message> <source>%1 is not allowed to derive from %2 by union as the latter defines it as final.</source> @@ -8765,11 +8808,11 @@ Please choose a different file name.</source> </message> <message> <source>%1 is not allowed to have any facets.</source> - <translation type="unfinished"></translation> + <translation>%1 не может имет никаких фасетов.</translation> </message> <message> <source>Base type %1 of simple type %2 must have variety of union.</source> - <translation type="unfinished"></translation> + <translation type="unfinished">Базовый тип %1 простого типа %2 должен содержать какое-то объединение.</translation> </message> <message> <source>Base type %1 of simple type %2 is not allowed to have restriction in %3 attribute.</source> @@ -8777,171 +8820,171 @@ Please choose a different file name.</source> </message> <message> <source>Member type %1 cannot be derived from member type %2 of %3's base type %4.</source> - <translation type="unfinished"></translation> + <translation type="unfinished">Внутренний тип %1 не может быть производным от типа %2, определённого в базовом типе типа %3 - %4.</translation> </message> <message> <source>Derivation method of %1 must be extension because the base type %2 is a simple type.</source> - <translation type="unfinished"></translation> + <translation>Метод наследования %1 должен быть «расширение», так как базовый тип %2 является простым.</translation> </message> <message> <source>Complex type %1 has duplicated element %2 in its content model.</source> - <translation type="unfinished"></translation> + <translation>Сложный тип %1 имеет повторяющийся элемент %2 в своей модели содержимого.</translation> </message> <message> <source>Complex type %1 has non-deterministic content.</source> - <translation type="unfinished"></translation> + <translation>Сложный тип %1 имеет недетерминированное содержимое.</translation> </message> <message> <source>Attributes of complex type %1 are not a valid extension of the attributes of base type %2: %3.</source> - <translation type="unfinished"></translation> + <translation>Атрибуты сложного типа %1 неверно дополняют атрибуты базового типа %2: %3.</translation> </message> <message> <source>Content model of complex type %1 is not a valid extension of content model of %2.</source> - <translation type="unfinished"></translation> + <translation>Модель содержимого сложного типа %1 неверно дополняет модель содержимого %2.</translation> </message> <message> <source>Complex type %1 must have simple content.</source> - <translation type="unfinished"></translation> + <translation>Сложный тип %1 должен иметь простое содержимое.</translation> </message> <message> <source>Complex type %1 must have the same simple type as its base class %2.</source> - <translation type="unfinished"></translation> + <translation>Сложный тип %1 должен содержать такой же простой тип, как и его базовый класс %2.</translation> </message> <message> <source>Complex type %1 cannot be derived from base type %2%3.</source> - <translation type="unfinished"></translation> + <translation>Сложный тип %1 не может быть производным от %2%3.</translation> </message> <message> <source>Attributes of complex type %1 are not a valid restriction from the attributes of base type %2: %3.</source> - <translation type="unfinished"></translation> + <translation>Атрибуты сложного типа %1 не являются верным ограничением атрибутов базового типа %2: %3.</translation> </message> <message> <source>Complex type %1 with simple content cannot be derived from complex base type %2.</source> - <translation type="unfinished"></translation> + <translation>Сложный тип %1 с простым содержимым не может быть производным от сложного типа %2.</translation> </message> <message> <source>Item type of simple type %1 cannot be a complex type.</source> - <translation type="unfinished"></translation> + <translation>Простой тип %1 не может содержать элементов сложных типов.</translation> </message> <message> <source>Member type of simple type %1 cannot be a complex type.</source> - <translation type="unfinished"></translation> + <translation>Простой тип %1 не может определять сложные типы.</translation> </message> <message> <source>%1 is not allowed to have a member type with the same name as itself.</source> - <translation type="unfinished"></translation> + <translation>Не допустимо, чтобы %1 определял внутренний тип с таким же именем.</translation> </message> <message> <source>%1 facet collides with %2 facet.</source> - <translation type="unfinished"></translation> + <translation>Фасет %1 противоречит %2.</translation> </message> <message> <source>%1 facet must have the same value as %2 facet of base type.</source> - <translation type="unfinished"></translation> + <translation>Фасет %1 должен иметь такое же значение, как и фасет %2 базового типа.</translation> </message> <message> <source>%1 facet must be equal or greater than %2 facet of base type.</source> - <translation type="unfinished"></translation> + <translation>Фасет %1 должен быть не менее фасета %2 базового типа.</translation> </message> <message> <source>%1 facet must be less than or equal to %2 facet of base type.</source> - <translation type="unfinished"></translation> + <translation>Фасет %1 должен быть не более фасета %2 базового типа.</translation> </message> <message> <source>%1 facet contains invalid regular expression</source> - <translation type="unfinished"></translation> + <translation>Фасет %1 содержит неверное регулярное выражение</translation> </message> <message> <source>Unknown notation %1 used in %2 facet.</source> - <translation type="unfinished"></translation> + <translation>В фасете %2 используется неизвестное обозначение %1.</translation> </message> <message> <source>%1 facet contains invalid value %2: %3.</source> - <translation type="unfinished"></translation> + <translation>Фасет %1 содержит неверное значение %2: %3.</translation> </message> <message> <source>%1 facet cannot be %2 or %3 if %4 facet of base type is %5.</source> - <translation type="unfinished"></translation> + <translation type="unfinished">Фасет %1 не может быть %2 или %3, если фасет %4 базового типа равен %5.</translation> </message> <message> <source>%1 facet cannot be %2 if %3 facet of base type is %4.</source> - <translation type="unfinished"></translation> + <translation type="unfinished">Фасет %1 не может быть %2, если фасет %3 базового типа равен %4.</translation> </message> <message> <source>%1 facet must be less than or equal to %2 facet.</source> - <translation type="unfinished"></translation> + <translation>Фасет %1 должен быть не более фасета %2.</translation> </message> <message> <source>%1 facet must be less than %2 facet of base type.</source> - <translation type="unfinished"></translation> + <translation>Фасет %1 должен быть менее фасета %2 базового типа.</translation> </message> <message> <source>%1 facet and %2 facet cannot appear together.</source> - <translation type="unfinished"></translation> + <translation>Фасеты %1 и %2 не могут быть одновременно.</translation> </message> <message> <source>%1 facet must be greater than %2 facet of base type.</source> - <translation type="unfinished"></translation> + <translation>Фасет %1 должен быть более фасета %2 базового типа.</translation> </message> <message> <source>%1 facet must be less than %2 facet.</source> - <translation type="unfinished"></translation> + <translation>Фасет %1 должен быть менее фасета %2.</translation> </message> <message> <source>%1 facet must be greater than or equal to %2 facet of base type.</source> - <translation type="unfinished"></translation> + <translation>Фасет %1 должен быть не менее фасета %2 базового типа.</translation> </message> <message> <source>Simple type contains not allowed facet %1.</source> - <translation type="unfinished"></translation> + <translation>Простой тип содержит недопустимый фасет %1.</translation> </message> <message> <source>%1, %2, %3, %4, %5 and %6 facets are not allowed when derived by list.</source> - <translation type="unfinished"></translation> + <translation type="unfinished">Недопустимы фасеты %1, %2, %3, %4, %5 и %6 при наследовании списком.</translation> </message> <message> <source>Only %1 and %2 facets are allowed when derived by union.</source> - <translation type="unfinished"></translation> + <translation>При наследовании объединением доступны только фасеты %1 и %2.</translation> </message> <message> <source>%1 contains %2 facet with invalid data: %3.</source> - <translation type="unfinished"></translation> + <translation>%1 содержит фасет %2 с неверными данными: %3.</translation> </message> <message> <source>Attribute group %1 contains attribute %2 twice.</source> - <translation type="unfinished"></translation> + <translation>Группа атрибутов %1 содержит два атрибута %2.</translation> </message> <message> <source>Attribute group %1 contains two different attributes that both have types derived from %2.</source> - <translation type="unfinished"></translation> + <translation>Группа атрибутов %1 содержит два разных атрибута, производных от %2.</translation> </message> <message> <source>Attribute group %1 contains attribute %2 that has value constraint but type that inherits from %3.</source> - <translation type="unfinished"></translation> + <translation type="unfinished">Группа атрибутов %1 содержит атрибут %2, на значение которого наложено ограничение, но тип наследован от %3.</translation> </message> <message> <source>Complex type %1 contains attribute %2 twice.</source> - <translation type="unfinished"></translation> + <translation>Сложный тип %1 содержит два атрибута %2.</translation> </message> <message> <source>Complex type %1 contains two different attributes that both have types derived from %2.</source> - <translation type="unfinished"></translation> + <translation>Сложный тип %1 содержит два разных атрибута, производных от %2.</translation> </message> <message> <source>Complex type %1 contains attribute %2 that has value constraint but type that inherits from %3.</source> - <translation type="unfinished"></translation> + <translation type="unfinished">Сложный тип %1 содержит атрибут %2, на значение которого наложено ограничение, но тип наследован от %3.</translation> </message> <message> <source>Element %1 is not allowed to have a value constraint if its base type is complex.</source> - <translation type="unfinished"></translation> + <translation type="unfinished">Элементу %1 недопустимо иметь ограничение на значения, если у его базовый тип сложный.</translation> </message> <message> <source>Element %1 is not allowed to have a value constraint if its type is derived from %2.</source> - <translation type="unfinished"></translation> + <translation type="unfinished">Элементу %1 недопустимо иметь ограничение на значения, если его тип производный от %2.</translation> </message> <message> <source>Value constraint of element %1 is not of elements type: %2.</source> - <translation type="unfinished"></translation> + <translation type="unfinished">Ограничение значения элемента %1 не типа элемента: %2.</translation> </message> <message> <source>Element %1 is not allowed to have substitution group affiliation as it is no global element.</source> @@ -8953,7 +8996,7 @@ Please choose a different file name.</source> </message> <message> <source>Value constraint of attribute %1 is not of attributes type: %2.</source> - <translation type="unfinished"></translation> + <translation>Ограничение значения атрибута %1 не типа атрибута: %2.</translation> </message> <message> <source>Attribute %1 has value constraint but has type derived from %2.</source> @@ -9369,179 +9412,179 @@ Please choose a different file name.</source> </message> <message> <source>String content does not match the length facet.</source> - <translation type="unfinished"></translation> + <translation>Содержимое строки не соответствует фасету length.</translation> </message> <message> <source>String content does not match the minLength facet.</source> - <translation type="unfinished"></translation> + <translation>Содержимое строки не соответствует фасету minLength.</translation> </message> <message> <source>String content does not match the maxLength facet.</source> - <translation type="unfinished"></translation> + <translation>Содержимое строки не соответствует фасету maxLength.</translation> </message> <message> <source>String content does not match pattern facet.</source> - <translation type="unfinished"></translation> + <translation>Содержимое строки не соответствует фасету pattern.</translation> </message> <message> <source>String content is not listed in the enumeration facet.</source> - <translation type="unfinished"></translation> + <translation>Содержимое строки отсутствует в фасете enumeration.</translation> </message> <message> <source>Signed integer content does not match the maxInclusive facet.</source> - <translation type="unfinished"></translation> + <translation>Знаковое целое не соответствует фасету maxInclusive.</translation> </message> <message> <source>Signed integer content does not match the maxExclusive facet.</source> - <translation type="unfinished"></translation> + <translation>Знаковое целое не соответствует фасету maxExclusive.</translation> </message> <message> <source>Signed integer content does not match the minInclusive facet.</source> - <translation type="unfinished"></translation> + <translation>Знаковое целое не соответствует фасету minInclusive.</translation> </message> <message> <source>Signed integer content does not match the minExclusive facet.</source> - <translation type="unfinished"></translation> + <translation>Знаковое целое не соответствует фасету minExclusive.</translation> </message> <message> <source>Signed integer content is not listed in the enumeration facet.</source> - <translation type="unfinished"></translation> + <translation>Знаковое целое отсутствует в фасете enumeration.</translation> </message> <message> <source>Signed integer content does not match pattern facet.</source> - <translation type="unfinished"></translation> + <translation>Знаковое целое не соответствует фасету pattern.</translation> </message> <message> <source>Signed integer content does not match in the totalDigits facet.</source> - <translation type="unfinished"></translation> + <translation>Знаковое целое не соответствует фасету totalDigits.</translation> </message> <message> <source>Unsigned integer content does not match the maxInclusive facet.</source> - <translation type="unfinished"></translation> + <translation>Беззнаковое целое не соответствует фасету maxInclusive.</translation> </message> <message> <source>Unsigned integer content does not match the maxExclusive facet.</source> - <translation type="unfinished"></translation> + <translation>Беззнаковое целое не соответствует фасету maxExclusive.</translation> </message> <message> <source>Unsigned integer content does not match the minInclusive facet.</source> - <translation type="unfinished"></translation> + <translation>Беззнаковое целое не соответствует фасету minInclusive.</translation> </message> <message> <source>Unsigned integer content does not match the minExclusive facet.</source> - <translation type="unfinished"></translation> + <translation>Беззнаковое целое не соответствует фасету minExclusive.</translation> </message> <message> <source>Unsigned integer content is not listed in the enumeration facet.</source> - <translation type="unfinished"></translation> + <translation>Беззнаковое целое отсутствует в фасете enumeration.</translation> </message> <message> <source>Unsigned integer content does not match pattern facet.</source> - <translation type="unfinished"></translation> + <translation>Беззнаковое целое не соответствует фасету pattern.</translation> </message> <message> <source>Unsigned integer content does not match in the totalDigits facet.</source> - <translation type="unfinished"></translation> + <translation>Беззнаковое целое не соответствует фасету totalDigits.</translation> </message> <message> <source>Double content does not match the maxInclusive facet.</source> - <translation type="unfinished"></translation> + <translation>Действительное число не соответствует фасету maxInclusive.</translation> </message> <message> <source>Double content does not match the maxExclusive facet.</source> - <translation type="unfinished"></translation> + <translation>Действительное число не соответствует фасету maxExclusive.</translation> </message> <message> <source>Double content does not match the minInclusive facet.</source> - <translation type="unfinished"></translation> + <translation>Действительное число не соответствует фасету minInclusive.</translation> </message> <message> <source>Double content does not match the minExclusive facet.</source> - <translation type="unfinished"></translation> + <translation>Действительное число не соответствует фасету minExclusive.</translation> </message> <message> <source>Double content is not listed in the enumeration facet.</source> - <translation type="unfinished"></translation> + <translation>Действительное число отсутствует в фасете enumeration.</translation> </message> <message> <source>Double content does not match pattern facet.</source> - <translation type="unfinished"></translation> + <translation>Действительное число не соответствует фасету pattern.</translation> </message> <message> <source>Decimal content does not match in the fractionDigits facet.</source> - <translation type="unfinished"></translation> + <translation>Десятичное не соответствует фасету fractionDigits.</translation> </message> <message> <source>Decimal content does not match in the totalDigits facet.</source> - <translation type="unfinished"></translation> + <translation>Десятичное не соответствует фасету totalDigits.</translation> </message> <message> <source>Date time content does not match the maxInclusive facet.</source> - <translation type="unfinished"></translation> + <translation>Дата-время не соответствует фасету maxInclusive.</translation> </message> <message> <source>Date time content does not match the maxExclusive facet.</source> - <translation type="unfinished"></translation> + <translation>Дата-время не соответствует фасету maxExclusive.</translation> </message> <message> <source>Date time content does not match the minInclusive facet.</source> - <translation type="unfinished"></translation> + <translation>Дата-время не соответствует фасету minInclusive.</translation> </message> <message> <source>Date time content does not match the minExclusive facet.</source> - <translation type="unfinished"></translation> + <translation>Дата-время не соответствует фасету minExclusive.</translation> </message> <message> <source>Date time content is not listed in the enumeration facet.</source> - <translation type="unfinished"></translation> + <translation>Дата-время отсутствует в фасете enumeration.</translation> </message> <message> <source>Date time content does not match pattern facet.</source> - <translation type="unfinished"></translation> + <translation>Дата-время не соответствует фасету pattern.</translation> </message> <message> <source>Duration content does not match the maxInclusive facet.</source> - <translation type="unfinished"></translation> + <translation>Длительность не соответствует фасету maxInclusive.</translation> </message> <message> <source>Duration content does not match the maxExclusive facet.</source> - <translation type="unfinished"></translation> + <translation>Длительность не соответствует фасету maxExclusive.</translation> </message> <message> <source>Duration content does not match the minInclusive facet.</source> - <translation type="unfinished"></translation> + <translation>Длительность не соответствует фасету minInclusive.</translation> </message> <message> <source>Duration content does not match the minExclusive facet.</source> - <translation type="unfinished"></translation> + <translation>Длительность не соответствует фасету minExclusive.</translation> </message> <message> <source>Duration content is not listed in the enumeration facet.</source> - <translation type="unfinished"></translation> + <translation>Длительность отсутствует в фасете enumeration.</translation> </message> <message> <source>Duration content does not match pattern facet.</source> - <translation type="unfinished"></translation> + <translation>Длительность не соответствует фасету pattern.</translation> </message> <message> <source>Boolean content does not match pattern facet.</source> - <translation type="unfinished"></translation> + <translation>Булевое число не соответствует фасету pattern.</translation> </message> <message> <source>Binary content does not match the length facet.</source> - <translation type="unfinished"></translation> + <translation>Двоичные данные не соответствуют фасету length.</translation> </message> <message> <source>Binary content does not match the minLength facet.</source> - <translation type="unfinished"></translation> + <translation>Двоичные данные не соответствуют фасету minLength.</translation> </message> <message> <source>Binary content does not match the maxLength facet.</source> - <translation type="unfinished"></translation> + <translation>Двоичные данные не соответствуют фасету maxLength.</translation> </message> <message> <source>Binary content is not listed in the enumeration facet.</source> - <translation type="unfinished"></translation> + <translation>Двоичные данные отсутствуют в фасете enumeration.</translation> </message> <message> <source>Invalid QName content: %1.</source> @@ -9549,43 +9592,43 @@ Please choose a different file name.</source> </message> <message> <source>QName content is not listed in the enumeration facet.</source> - <translation type="unfinished"></translation> + <translation>Содержимое QName отсутствует в фасете enumeration.</translation> </message> <message> <source>QName content does not match pattern facet.</source> - <translation type="unfinished"></translation> + <translation>Содержимое QName не соответствует фасету pattern.</translation> </message> <message> <source>Notation content is not listed in the enumeration facet.</source> - <translation type="unfinished"></translation> + <translation>Содержимое Notation не перечислено в фасете enumeration.</translation> </message> <message> <source>List content does not match length facet.</source> - <translation type="unfinished"></translation> + <translation>Список не соответствует фасету length.</translation> </message> <message> <source>List content does not match minLength facet.</source> - <translation type="unfinished"></translation> + <translation>Список не соответствует фасету minLength.</translation> </message> <message> <source>List content does not match maxLength facet.</source> - <translation type="unfinished"></translation> + <translation>Список не соответствует фасету maxLength.</translation> </message> <message> <source>List content is not listed in the enumeration facet.</source> - <translation type="unfinished"></translation> + <translation>Содержимое списка не перечислено в фасете enumeration.</translation> </message> <message> <source>List content does not match pattern facet.</source> - <translation type="unfinished"></translation> + <translation>Содержимое списка не соответствует фасету pattern.</translation> </message> <message> <source>Union content is not listed in the enumeration facet.</source> - <translation type="unfinished"></translation> + <translation>Объединение не перечислено в фасете enumeration.</translation> </message> <message> <source>Union content does not match pattern facet.</source> - <translation type="unfinished"></translation> + <translation>Объединение не соответствует фасету pattern.</translation> </message> <message> <source>Data of type %1 are not allowed to be empty.</source> @@ -9753,7 +9796,7 @@ Please choose a different file name.</source> </message> <message> <source>ID value '%1' is not unique.</source> - <translation>Значение ID "%1" неуникально.</translation> + <translation>Значение ID «%1» не уникально.</translation> </message> <message> <source>'%1' attribute contains invalid QName content: %2.</source> diff --git a/translations/qt_uk.ts b/translations/qt_uk.ts index 7f396ad..52e70a2 100644 --- a/translations/qt_uk.ts +++ b/translations/qt_uk.ts @@ -321,6 +321,10 @@ have libgstreamer-plugins-base installed.</source> <source>Playback complete</source> <translation>Відтворення завершене</translation> </message> + <message> + <source>Download error</source> + <translation>Помилка звантаження</translation> + </message> </context> <context> <name>Phonon::MMF::AbstractVideoPlayer</name> @@ -440,6 +444,10 @@ have libgstreamer-plugins-base installed.</source> <source>Error opening source: media type could not be determined</source> <translation>Помилка відкриття джерела: не вдалося визначити тип медіа-даних</translation> </message> + <message> + <source>Failed to set requested IAP</source> + <translation>Збій встановлення точки доступу до Інтернет</translation> + </message> </context> <context> <name>Phonon::MMF::StereoWidening</name> @@ -1200,6 +1208,11 @@ to <translation>%1: недостатньо ресурсів</translation> </message> <message> + <source>%1: permission denied</source> + <comment>QSystemSemaphore</comment> + <translation>%1: доступ заборонено</translation> + </message> + <message> <source>%1: unknown error %2</source> <comment>QSystemSemaphore</comment> <translation>%1: невідома помилка %2</translation> @@ -1366,6 +1379,13 @@ to </message> </context> <context> + <name>QDeclarativeApplication</name> + <message> + <source>Application is an abstract class</source> + <translation>Application - це абстрактний клас</translation> + </message> +</context> +<context> <name>QDeclarativeBehavior</name> <message> <source>Cannot change the animation assigned to a Behavior.</source> @@ -1493,6 +1513,14 @@ to <translation>Неможливо створити порожню специфікацію компоненти</translation> </message> <message> + <source>"%1.%2" is not available in %3 %4.%5.</source> + <translation>"%1.%2" не доступно в %3 %4.%5.</translation> + </message> + <message> + <source>"%1.%2" is not available due to component versioning.</source> + <translation>"%1.%2" не доступно через версіювання компонента.</translation> + </message> + <message> <source>Incorrectly specified signal assignment</source> <translation>Неправильно вказане призначення сигналу</translation> </message> @@ -1589,6 +1617,10 @@ to <translation>Неправильне присвоєння властивості: очікувався скрипт</translation> </message> <message> + <source>Cannot assign multiple values to a singular property</source> + <translation>Неможливо присвоїти декілька значенть до одиничної властивості</translation> + </message> + <message> <source>Cannot assign object to property</source> <translation>Неможливо призначити об'єкт властивості</translation> </message> @@ -1681,8 +1713,16 @@ to <translation>Непраильна позиція псевдоніму</translation> </message> <message> + <source>Invalid alias reference. An alias reference must be specified as <id>, <id>.<property> or <id>.<value property>.<property></source> + <translation>Неправильне посилання на псевдонім. Посилання на псевдонім повинно бути вказане як <id>, <id>.<властивість> або <id>.<властивість-значення>.<властивість></translation> + </message> + <message> + <source>Alias property exceeds alias bounds</source> + <translation>Властивість-псевдонім виходить за межі псевдоніму</translation> + </message> + <message> <source>Invalid alias reference. An alias reference must be specified as <id> or <id>.<property></source> - <translation>Неправильне посилання на псевдонім. Посилання на псевдонім має бути вказане, як <id> або <id>.<property></translation> + <translation type="obsolete">Неправильне посилання на псевдонім. Посилання на псевдонім має бути вказане, як <id> або <id>.<property></translation> </message> <message> <source>Invalid alias reference. Unable to find id "%1"</source> @@ -1695,6 +1735,10 @@ to <source>Invalid empty URL</source> <translation>Неправильний порожній URL</translation> </message> + <message> + <source>createObject: value is not an object</source> + <translation>createObject: значення не є об’єктом</translation> + </message> </context> <context> <name>QDeclarativeConnections</name> @@ -1756,6 +1800,10 @@ to <context> <name>QDeclarativeImportDatabase</name> <message> + <source>cannot load module "%1": File name case mismatch for "%2"</source> + <translation>неможливо завантажити модуль "%1": Регістр імені файлу не збігається для "%2"</translation> + </message> + <message> <source>module "%1" definition "%2" not readable</source> <translation>неможливо прочитати визначення "%2" модуля "%1"</translation> </message> @@ -1811,6 +1859,10 @@ to <source>is not a type</source> <translation>не є типом</translation> </message> + <message> + <source>File name case mismatch for "%2"</source> + <translation>Регістр імені файлу не збігається для "%2"</translation> + </message> </context> <context> <name>QDeclarativeKeyNavigationAttached</name> @@ -1827,6 +1879,17 @@ to </message> </context> <context> + <name>QDeclarativeLayoutMirroringAttached</name> + <message> + <source>LayoutDirection attached property only works with Items</source> + <translation>Прикріплена властивість LayoutDirection працює лише з Item</translation> + </message> + <message> + <source>LayoutMirroring is only available via attached properties</source> + <translation>LayoutMirroring доступна лише через прикріплені властивості</translation> + </message> +</context> +<context> <name>QDeclarativeListModel</name> <message> <source>remove: index %1 out of range</source> @@ -6591,6 +6654,10 @@ Do you want to overwrite it?</source> <source>Error during SSL handshake: %1</source> <translation>Помилка рукостискання SSL: %1</translation> </message> + <message> + <source>The peer certificate is blacklisted</source> + <translation>Сертифікат іншої сторони в чорному списку</translation> + </message> </context> <context> <name>QStateMachine</name> diff --git a/translations/qtconfig_uk.ts b/translations/qtconfig_uk.ts index 3b1e2e5..24a9b7d 100644 --- a/translations/qtconfig_uk.ts +++ b/translations/qtconfig_uk.ts @@ -4,6 +4,26 @@ <context> <name>MainWindow</name> <message> + <source><p><b><font size+=2>Appearance</font></b></p><hr><p>Use this tab to customize the appearance of your Qt applications.</p><p>You can select the default GUI Style from the drop down list and customize the colors.</p><p>Any GUI Style plugins in your plugin path will automatically be added to the list of built-in Qt styles. (See the Library Paths tab for information on adding new plugin paths.)</p><p>When you choose 3-D Effects and Window Background colors, the Qt Configuration program will automatically generate a palette for you. To customize colors further, press the Tune Palette button to open the advanced palette editor.<p>The Preview Window shows what the selected Style and colors look like.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><p><b><font size+=2>Fonts</font></b></p><hr><p>Use this tab to select the default font for your Qt applications. The selected font is shown (initially as 'Sample Text') in the line edit below the Family, Style and Point Size drop down lists.</p><p>Qt has a powerful font substitution feature that allows you to specify a list of substitute fonts. Substitute fonts are used when a font cannot be loaded, or if the specified font doesn't have a particular character.<p>For example, if you select the font Lucida, which doesn't have Korean characters, but need to show some Korean text using the Mincho font family you can do so by adding Mincho to the list. Once Mincho is added, any Korean characters that are not found in the Lucida font will be taken from the Mincho font. Because the font substitutions are lists, you can also select multiple families, such as Song Ti (for use with Chinese text).</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><p><b><font size+=2>Interface</font></b></p><hr><p>Use this tab to customize the feel of your Qt applications.</p><p>If the Resolve Symlinks checkbox is checked Qt will follow symlinks when handling URLs. For example, in the file dialog, if this setting is turned on and /usr/tmp is a symlink to /var/tmp, entering the /usr/tmp directory will cause the file dialog to change to /var/tmp. With this setting turned off, symlinks are not resolved or followed.</p><p>The Global Strut setting is useful for people who require a minimum size for all widgets (e.g. when using a touch panel or for users who are visually impaired). Leaving the Global Strut width and height at 0 will disable the Global Strut feature</p><p>XIM (Extended Input Methods) are used for entering characters in languages that have large character sets, for example, Chinese and Japanese.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><p><b><font size+=2>Printer</font></b></p><hr><p>Use this tab to configure the way Qt generates output for the printer.You can specify if Qt should try to embed fonts into its generated output.If you enable font embedding, the resulting postscript will be more portable and will more accurately reflect the visual output on the screen; however the resulting postscript file size will be bigger.<p>When using font embedding you can select additional directories where Qt should search for embeddable font files. By default, the X server font path is used.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><p><b><font size+=2>Phonon</font></b></p><hr><p>Use this tab to configure the Phonon GStreamer multimedia backend. <p>It is reccommended to leave all settings on "Auto" to let Phonon determine your settings automatically.</source> + <translation type="unfinished"></translation> + </message> + <message> <source>Desktop Settings (Default)</source> <translation>Налаштування стільниці (Типово)</translation> </message> |