summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xbin/syncqt232
-rw-r--r--doc/src/images/symbian-draw-pixmap-sequence.pngbin0 -> 5724 bytes
-rw-r--r--doc/src/images/symbian-qt-draw-pixmap-sequence.pngbin0 -> 9141 bytes
-rw-r--r--doc/src/images/symbian-qt-rendering-stack-non-screenplay.pngbin0 -> 52802 bytes
-rw-r--r--doc/src/images/symbian-rendering-stack-non-screenplay.pngbin0 -> 44655 bytes
-rw-r--r--doc/src/platforms/platform-notes.qdoc50
-rw-r--r--src/corelib/global/global.pri2
-rw-r--r--src/gui/graphicsview/qgraphicsitem.cpp3
-rw-r--r--src/gui/kernel/qapplication_s60.cpp8
-rw-r--r--src/gui/kernel/qwidget_s60.cpp6
-rw-r--r--src/gui/painting/qblendfunctions.cpp8
-rw-r--r--src/gui/painting/qdrawhelper.cpp1
-rw-r--r--src/gui/painting/qdrawhelper_neon.cpp98
-rw-r--r--src/gui/painting/qdrawhelper_neon_p.h5
-rw-r--r--src/gui/painting/qpainter.cpp2
-rw-r--r--src/gui/text/qfontengine.cpp4
-rw-r--r--src/gui/text/qfontengine_ft.cpp13
-rw-r--r--src/gui/text/qfontengine_qpf.cpp2
-rw-r--r--src/gui/text/qfontengine_s60.cpp7
-rw-r--r--src/gui/text/qfontengine_s60_p.h1
-rw-r--r--src/gui/widgets/qlinecontrol.cpp4
-rw-r--r--tests/auto/qgraphicsitem/tst_qgraphicsitem.cpp2
22 files changed, 300 insertions, 148 deletions
diff --git a/bin/syncqt b/bin/syncqt
index 4acb5b5..907869d 100755
--- a/bin/syncqt
+++ b/bin/syncqt
@@ -213,7 +213,7 @@ sub classNames {
}
}
return @ret if($line =~ m/^#pragma qt_sync_stop_processing/);
- push(@ret, "$1") if($line =~ m/^#pragma qt_class\(([^)]*)\)[\r\n]*$/);
+ push(@ret, $1) if($line =~ m/^#pragma qt_class\(([^)]*)\)[\r\n]*$/);
$line = 0;
}
if($line) {
@@ -297,8 +297,7 @@ sub classNames {
push @symbols, "QMutable" . $1 . "Iterator";
}
- foreach (@symbols) {
- my $symbol = $_;
+ foreach my $symbol (@symbols) {
$symbol = (join("::", @namespaces) . "::" . $symbol) if (scalar @namespaces);
push @ret, $symbol
if ($symbol =~ /^Q[^:]*$/ # no-namespace, starting with Q
@@ -310,21 +309,22 @@ sub classNames {
}
######################################################################
-# Syntax: syncHeader(header, iheader, copy)
+# Syntax: syncHeader(header, iheader, copy, timestamp)
# Params: header, string, filename to create "symlink" for
# iheader, string, destination name of symlink
# copy, forces header to be a copy of iheader
+# timestamp, the requested modification time if copying
#
# Purpose: Syncronizes header to iheader
# Returns: 1 if successful, else 0.
######################################################################
sub syncHeader {
- my ($header, $iheader, $copy) = @_;
+ my ($header, $iheader, $copy, $ts) = @_;
$iheader =~ s=\\=/=g;
$header =~ s=\\=/=g;
return copyFile($iheader, $header) if($copy);
- unless(-e "$header") {
+ unless(-e $header) {
my $header_dir = dirname($header);
mkpath $header_dir, !$quiet;
@@ -333,6 +333,7 @@ sub syncHeader {
open HEADER, ">$header" || die "Could not open $header for writing!\n";
print HEADER "#include \"$iheader_out\"\n";
close HEADER;
+ utime(time, $ts, $header) or die "$iheader, $header";
return 1;
}
return 0;
@@ -368,7 +369,7 @@ sub fixPaths {
$dir =~ s=\\=/=g;
}
$dir =~ s,/cygdrive/([a-zA-Z])/,$1:/,g;
- return basename($file) if("$file_dir" eq "$dir");
+ return basename($file) if($file_dir eq $dir);
#guts
my $match_dir = 0;
@@ -430,7 +431,7 @@ sub fileCompare {
my $file2contents = fileContents($file2);
if (! -e $file1) { return 1; }
if (! -e $file2) { return -1; }
- return $file1contents ne $file2contents ? (stat("$file2"))[9] <=> (stat("$file1"))[9] : 0;
+ return $file1contents ne $file2contents ? (stat($file2))[9] <=> (stat($file1))[9] : 0;
}
######################################################################
@@ -467,21 +468,23 @@ sub copyFile
if ( $knowdiff || ($filecontents ne $ifilecontents) ) {
if ( $copy > 0 ) {
my $file_dir = dirname($file);
- mkpath $file_dir, !$quiet unless(-e "$file_dir");
+ mkpath $file_dir, !$quiet unless(-e $file_dir);
open(O, "> " . $file) || die "Could not open $file for writing (no write permission?)";
local $/;
binmode O;
print O $ifilecontents;
close O;
+ utime time, (stat($ifile))[9], $file;
return 1;
} elsif ( $copy < 0 ) {
my $ifile_dir = dirname($ifile);
- mkpath $ifile_dir, !$quiet unless(-e "$ifile_dir");
+ mkpath $ifile_dir, !$quiet unless(-e $ifile_dir);
open(O, "> " . $ifile) || die "Could not open $ifile for writing (no write permission?)";
local $/;
binmode O;
print O $filecontents;
close O;
+ utime time, (stat($file))[9], $ifile;
return 1;
}
}
@@ -567,102 +570,102 @@ while ( @ARGV ) {
#parse
my $arg = shift @ARGV;
- if ("$arg" eq "-h" || "$arg" eq "-help" || "$arg" eq "?") {
+ if ($arg eq "-h" || $arg eq "-help" || $arg eq "?") {
$var = "show_help";
$val = "yes";
- } elsif("$arg" eq "-copy") {
+ } elsif($arg eq "-copy") {
$var = "copy";
$val = "yes";
- } elsif("$arg" eq "-o" || "$arg" eq "-outdir") {
+ } elsif($arg eq "-o" || $arg eq "-outdir") {
$var = "output";
$val = shift @ARGV;
- } elsif("$arg" eq "-showonly" || "$arg" eq "-remove-stale" || "$arg" eq "-windows" ||
- "$arg" eq "-relative" || "$arg" eq "-check-includes") {
+ } elsif($arg eq "-showonly" || $arg eq "-remove-stale" || $arg eq "-windows" ||
+ $arg eq "-relative" || $arg eq "-check-includes") {
$var = substr($arg, 1);
$val = "yes";
- } elsif("$arg" =~ /^-no-(.*)$/) {
+ } elsif($arg =~ /^-no-(.*)$/) {
$var = $1;
$val = "no";
#these are for commandline compat
- } elsif("$arg" eq "-inc") {
+ } elsif($arg eq "-inc") {
$var = "output";
$val = shift @ARGV;
- } elsif("$arg" eq "-module") {
+ } elsif($arg eq "-module") {
$var = "module";
$val = shift @ARGV;
- } elsif("$arg" eq "-separate-module") {
+ } elsif($arg eq "-separate-module") {
$var = "separate-module";
$val = shift @ARGV;
- } elsif("$arg" eq "-show") {
+ } elsif($arg eq "-show") {
$var = "showonly";
$val = "yes";
- } elsif("$arg" eq "-quiet") {
+ } elsif($arg eq "-quiet") {
$var = "quiet";
$val = "yes";
- } elsif("$arg" eq "-base-dir") {
+ } elsif($arg eq "-base-dir") {
# skip, it's been dealt with at the top of the file
shift @ARGV;
next;
}
#do something
- if(!$var || "$var" eq "show_help") {
+ if(!$var || $var eq "show_help") {
print "Unknown option: $arg\n\n" if(!$var);
showUsage();
- } elsif ("$var" eq "copy") {
- if("$val" eq "yes") {
+ } elsif ($var eq "copy") {
+ if($val eq "yes") {
$copy_headers++;
} elsif($showonly) {
$copy_headers--;
}
- } elsif ("$var" eq "showonly") {
- if("$val" eq "yes") {
+ } elsif ($var eq "showonly") {
+ if($val eq "yes") {
$showonly++;
} elsif($showonly) {
$showonly--;
}
- } elsif ("$var" eq "quiet") {
- if("$val" eq "yes") {
+ } elsif ($var eq "quiet") {
+ if($val eq "yes") {
$quiet++;
} elsif($quiet) {
$quiet--;
}
- } elsif ("$var" eq "check-includes") {
- if("$val" eq "yes") {
+ } elsif ($var eq "check-includes") {
+ if($val eq "yes") {
$check_includes++;
} elsif($check_includes) {
$check_includes--;
}
- } elsif ("$var" eq "remove-stale") {
- if("$val" eq "yes") {
+ } elsif ($var eq "remove-stale") {
+ if($val eq "yes") {
$remove_stale++;
} elsif($remove_stale) {
$remove_stale--;
}
- } elsif ("$var" eq "windows") {
- if("$val" eq "yes") {
+ } elsif ($var eq "windows") {
+ if($val eq "yes") {
$force_win++;
} elsif($force_win) {
$force_win--;
}
- } elsif ("$var" eq "relative") {
- if("$val" eq "yes") {
+ } elsif ($var eq "relative") {
+ if($val eq "yes") {
$force_relative++;
} elsif($force_relative) {
$force_relative--;
}
- } elsif ("$var" eq "module") {
+ } elsif ($var eq "module") {
print "module :$val:\n" unless $quiet;
die "No such module: $val" unless(defined $modules{$val});
push @modules_to_sync, $val;
- } elsif ("$var" eq "separate-module") {
+ } elsif ($var eq "separate-module") {
my ($module, $prodir, $headerdir) = split(/:/, $val);
$modules{$module} = $prodir;
push @modules_to_sync, $module;
$moduleheaders{$module} = $headerdir;
$create_uic_class_map = 0;
$create_private_headers = 0;
- } elsif ("$var" eq "output") {
+ } elsif ($var eq "output") {
my $outdir = $val;
if(checkRelative($outdir)) {
$out_basedir = getcwd();
@@ -696,12 +699,11 @@ my %inject_headers;
# find the header by normal means.
%inject_headers = ( "$basedir/src/corelib/global" => ( "*qconfig.h" ) ) unless (-e "$basedir/src/corelib/global/qconfig.h");
-foreach (@modules_to_sync) {
+foreach my $lib (@modules_to_sync) {
#iteration info
- my $lib = $_;
- my $dir = "$modules{$lib}";
+ my $dir = $modules{$lib};
my $pathtoheaders = "";
- $pathtoheaders = "$moduleheaders{$lib}" if ($moduleheaders{$lib});
+ $pathtoheaders = $moduleheaders{$lib} if ($moduleheaders{$lib});
#information used after the syncing
my $pri_install_classes = "";
@@ -715,24 +717,23 @@ foreach (@modules_to_sync) {
#get dependencies
if(-e "$dir/" . basename($dir) . ".pro") {
if(open(F, "<$dir/" . basename($dir) . ".pro")) {
- while(<F>) {
- my $line = $_;
+ while(my $line = <F>) {
chomp $line;
if($line =~ /^ *QT *\+?= *([^\r\n]*)/) {
- foreach(split(/ /, "$1")) {
- $master_contents .= "#include <QtCore/QtCore>\n" if("$_" eq "core");
- $master_contents .= "#include <QtGui/QtGui>\n" if("$_" eq "gui");
- $master_contents .= "#include <QtNetwork/QtNetwork>\n" if("$_" eq "network");
- $master_contents .= "#include <QtSvg/QtSvg>\n" if("$_" eq "svg");
- $master_contents .= "#include <QtDeclarative/QtDeclarative>\n" if("$_" eq "declarative");
- $master_contents .= "#include <QtScript/QtScript>\n" if("$_" eq "script");
- $master_contents .= "#include <QtScriptTools/QtScriptTools>\n" if("$_" eq "scripttools");
- $master_contents .= "#include <Qt3Support/Qt3Support>\n" if("$_" eq "qt3support");
- $master_contents .= "#include <QtSql/QtSql>\n" if("$_" eq "sql");
- $master_contents .= "#include <QtXml/QtXml>\n" if("$_" eq "xml");
- $master_contents .= "#include <QtXmlPatterns/QtXmlPatterns>\n" if("$_" eq "xmlpatterns");
- $master_contents .= "#include <QtOpenGL/QtOpenGL>\n" if("$_" eq "opengl");
- $master_contents .= "#include <QtOpenVG/QtOpenVG>\n" if("$_" eq "openvg");
+ foreach(split(/ /, $1)) {
+ $master_contents .= "#include <QtCore/QtCore>\n" if($_ eq "core");
+ $master_contents .= "#include <QtGui/QtGui>\n" if($_ eq "gui");
+ $master_contents .= "#include <QtNetwork/QtNetwork>\n" if($_ eq "network");
+ $master_contents .= "#include <QtSvg/QtSvg>\n" if($_ eq "svg");
+ $master_contents .= "#include <QtDeclarative/QtDeclarative>\n" if($_ eq "declarative");
+ $master_contents .= "#include <QtScript/QtScript>\n" if($_ eq "script");
+ $master_contents .= "#include <QtScriptTools/QtScriptTools>\n" if($_ eq "scripttools");
+ $master_contents .= "#include <Qt3Support/Qt3Support>\n" if($_ eq "qt3support");
+ $master_contents .= "#include <QtSql/QtSql>\n" if($_ eq "sql");
+ $master_contents .= "#include <QtXml/QtXml>\n" if($_ eq "xml");
+ $master_contents .= "#include <QtXmlPatterns/QtXmlPatterns>\n" if($_ eq "xmlpatterns");
+ $master_contents .= "#include <QtOpenGL/QtOpenGL>\n" if($_ eq "opengl");
+ $master_contents .= "#include <QtOpenVG/QtOpenVG>\n" if($_ eq "openvg");
}
}
}
@@ -743,34 +744,31 @@ foreach (@modules_to_sync) {
#remove the old files
if($remove_stale) {
my @subdirs = ("$out_basedir/include/$lib");
- foreach (@subdirs) {
- my $subdir = "$_";
- if (opendir DIR, "$subdir") {
+ foreach my $subdir (@subdirs) {
+ if (opendir DIR, $subdir) {
while(my $t = readdir(DIR)) {
my $file = "$subdir/$t";
- if(-d "$file") {
- push @subdirs, "$file" unless($t eq "." || $t eq "..");
+ if(-d $file) {
+ push @subdirs, $file unless($t eq "." || $t eq "..");
} else {
- my @files = ("$file");
+ my @files = ($file);
#push @files, "$out_basedir/include/Qt/$t" if(-e "$out_basedir/include/Qt/$t");
- foreach (@files) {
- my $file = $_;
+ foreach my $file (@files) {
my $remove_file = 0;
if(open(F, "<$file")) {
- while(<F>) {
- my $line = $_;
+ while(my $line = <F>) {
chomp $line;
if($line =~ /^\#include \"([^\"]*)\"$/) {
my $include = $1;
$include = $subdir . "/" . $include unless(substr($include, 0, 1) eq "/");
- $remove_file = 1 unless(-e "$include");
+ $remove_file = 1 unless(-e $include);
} else {
$remove_file = 0;
last;
}
}
close(F);
- unlink "$file" if($remove_file);
+ unlink $file if($remove_file);
}
}
}
@@ -782,15 +780,13 @@ foreach (@modules_to_sync) {
}
#create the new ones
- foreach (split(/;/, $dir)) {
- my $current_dir = "$_";
+ foreach my $current_dir (split(/;/, $dir)) {
my $headers_dir = $current_dir;
$headers_dir .= "/$pathtoheaders" if ($pathtoheaders);
#calc subdirs
my @subdirs = ($headers_dir);
- foreach (@subdirs) {
- my $subdir = "$_";
- opendir DIR, "$subdir" or next;
+ foreach my $subdir (@subdirs) {
+ opendir DIR, $subdir or next;
while(my $t = readdir(DIR)) {
push @subdirs, "$subdir/$t" if(-d "$subdir/$t" && !($t eq ".") &&
!($t eq "..") && !($t eq ".obj") &&
@@ -801,16 +797,14 @@ foreach (@modules_to_sync) {
}
#calc files and "copy" them
- foreach (@subdirs) {
- my $subdir = "$_";
- my @headers = findFiles("$subdir", "^[-a-z0-9_]*\\.h\$" , 0);
+ foreach my $subdir (@subdirs) {
+ my @headers = findFiles($subdir, "^[-a-z0-9_]*\\.h\$" , 0);
push @headers, $inject_headers{$subdir} if (defined $inject_headers{$subdir});
- foreach (@headers) {
- my $header = "$_";
+ foreach my $header (@headers) {
my $shadow = ($header =~ s/^\*//);
- $header = 0 if("$header" =~ /^ui_.*.h/);
+ $header = 0 if($header =~ /^ui_.*.h/);
foreach (@ignore_headers) {
- $header = 0 if("$header" eq "$_");
+ $header = 0 if($header eq $_);
}
if($header) {
my $header_copies = 0;
@@ -820,7 +814,7 @@ foreach (@modules_to_sync) {
$public_header = 0;
} else {
foreach (@ignore_for_master_contents) {
- $public_header = 0 if("$header" eq "$_");
+ $public_header = 0 if($header eq $_);
}
}
@@ -833,13 +827,14 @@ foreach (@modules_to_sync) {
print "SYMBOL: $_\n";
}
} else {
+ my $ts = (stat($iheader))[9];
#find out all the places it goes..
my @headers;
if ($public_header) {
@headers = ( "$out_basedir/include/$lib/$header" );
# write forwarding headers to include/Qt
- if ("$lib" ne "phonon" && "$subdir" =~ /^$basedir\/src/) {
+ if ($lib ne "phonon" && $subdir =~ /^$basedir\/src/) {
my $file_name = "$out_basedir/include/Qt/$header";
my $file_op = '>';
my $header_content = '';
@@ -862,27 +857,27 @@ foreach (@modules_to_sync) {
close HEADERFILE;
}
- foreach(@classes) {
+ foreach my $full_class (@classes) {
my $header_base = basename($header);
- my $class = $_;
# Strip namespaces:
+ my $class = $full_class;
$class =~ s/^.*:://;
# if ($class =~ m/::/) {
# class =~ s,::,/,g;
# }
- $class_lib_map_contents .= "QT_CLASS_LIB($_, $lib, $header_base)\n";
- $header_copies++ if(syncHeader("$out_basedir/include/$lib/$class", "$out_basedir/include/$lib/$header", 0));
+ $class_lib_map_contents .= "QT_CLASS_LIB($full_class, $lib, $header_base)\n";
+ $header_copies++ if(syncHeader("$out_basedir/include/$lib/$class", "$out_basedir/include/$lib/$header", 0, $ts));
# KDE-Compat headers for Phonon
if ($lib eq "phonon") {
- $header_copies++ if (syncHeader("$out_basedir/include/phonon_compat/Phonon/$class", "$out_basedir/include/$lib/$header", 0));
+ $header_copies++ if (syncHeader("$out_basedir/include/phonon_compat/Phonon/$class", "$out_basedir/include/$lib/$header", 0, $ts));
}
}
} elsif ($create_private_headers) {
@headers = ( "$out_basedir/include/$lib/private/$header" );
}
foreach(@headers) { #sync them
- $header_copies++ if(syncHeader($_, $iheader, $copy_headers));
+ $header_copies++ if(syncHeader($_, $iheader, $copy_headers, $ts));
}
if($public_header) {
@@ -892,8 +887,7 @@ foreach (@modules_to_sync) {
#deal with the install directives
if($public_header) {
my $pri_install_iheader = fixPaths($iheader, $current_dir);
- foreach(@classes) {
- my $class = $_;
+ foreach my $class (@classes) {
# Strip namespaces:
$class =~ s/^.*:://;
# if ($class =~ m/::/) {
@@ -928,8 +922,8 @@ foreach (@modules_to_sync) {
foreach my $master_include (@master_includes) {
#generate the "master" include file
my @tmp = split(/;/,$modules{$lib});
- $pri_install_files .= fixPaths($master_include, "$tmp[0]") . " "; #get the master file installed too
- if($master_include && -e "$master_include") {
+ $pri_install_files .= fixPaths($master_include, $tmp[0]) . " "; #get the master file installed too
+ if($master_include && -e $master_include) {
open MASTERINCLUDE, "<$master_include";
local $/;
binmode MASTERINCLUDE;
@@ -943,7 +937,7 @@ foreach (@modules_to_sync) {
mkpath $master_dir, !$quiet;
print "header (master) created for $lib\n" unless $quiet;
open MASTERINCLUDE, ">$master_include";
- print MASTERINCLUDE "$master_contents";
+ print MASTERINCLUDE $master_contents;
close MASTERINCLUDE;
}
}
@@ -954,7 +948,7 @@ foreach (@modules_to_sync) {
$headers_pri_contents .= "SYNCQT.HEADER_CLASSES = $pri_install_classes\n";
$headers_pri_contents .= "SYNCQT.PRIVATE_HEADER_FILES = $pri_install_pfiles\n";
my $headers_pri_file = "$out_basedir/include/$lib/headers.pri";
- if(-e "$headers_pri_file") {
+ if(-e $headers_pri_file) {
open HEADERS_PRI_FILE, "<$headers_pri_file";
local $/;
binmode HEADERS_PRI_FILE;
@@ -968,14 +962,14 @@ foreach (@modules_to_sync) {
mkpath $headers_pri_dir, !$quiet;
print "headers.pri file created for $lib\n" unless $quiet;
open HEADERS_PRI_FILE, ">$headers_pri_file";
- print HEADERS_PRI_FILE "$headers_pri_contents";
+ print HEADERS_PRI_FILE $headers_pri_contents;
close HEADERS_PRI_FILE;
}
}
}
unless($showonly || !$create_uic_class_map) {
my $class_lib_map = "$out_basedir/src/tools/uic/qclass_lib_map.h";
- if(-e "$class_lib_map") {
+ if(-e $class_lib_map) {
open CLASS_LIB_MAP, "<$class_lib_map";
local $/;
binmode CLASS_LIB_MAP;
@@ -988,21 +982,17 @@ unless($showonly || !$create_uic_class_map) {
my $class_lib_map_dir = dirname($class_lib_map);
mkpath $class_lib_map_dir, !$quiet;
open CLASS_LIB_MAP, ">$class_lib_map";
- print CLASS_LIB_MAP "$class_lib_map_contents";
+ print CLASS_LIB_MAP $class_lib_map_contents;
close CLASS_LIB_MAP;
}
}
if($check_includes) {
- for (keys(%modules)) {
- #iteration info
- my $lib = $_;
- {
+ for my $lib (keys(%modules)) {
#calc subdirs
my @subdirs = ($modules{$lib});
- foreach (@subdirs) {
- my $subdir = "$_";
- opendir DIR, "$subdir" or die "Huh, directory ".$subdir." cannot be opened.";
+ foreach my $subdir (@subdirs) {
+ opendir DIR, $subdir or die "Huh, directory ".$subdir." cannot be opened.";
while(my $t = readdir(DIR)) {
push @subdirs, "$subdir/$t" if(-d "$subdir/$t" && !($t eq ".") &&
!($t eq "..") && !($t eq ".obj") &&
@@ -1012,22 +1002,20 @@ if($check_includes) {
closedir DIR;
}
- foreach (@subdirs) {
- my $subdir = "$_";
+ foreach my $subdir (@subdirs) {
my $header_skip_qt_module_test = 0;
foreach(@ignore_for_qt_module_check) {
foreach (split(/;/, $_)) {
- $header_skip_qt_module_test = 1 if ("$subdir" =~ /^$_/);
+ $header_skip_qt_module_test = 1 if ($subdir =~ /^$_/);
}
}
- my @headers = findFiles("$subdir", "^[-a-z0-9_]*\\.h\$" , 0);
- foreach (@headers) {
- my $header = "$_";
+ my @headers = findFiles($subdir, "^[-a-z0-9_]*\\.h\$" , 0);
+ foreach my $header (@headers) {
my $header_skip_qt_begin_header_test = 0;
my $header_skip_qt_begin_namespace_test = 0;
- $header = 0 if("$header" =~ /^ui_.*.h/);
+ $header = 0 if($header =~ /^ui_.*.h/);
foreach (@ignore_headers) {
- $header = 0 if("$header" eq "$_");
+ $header = 0 if($header eq $_);
}
if($header) {
my $public_header = $header;
@@ -1035,17 +1023,17 @@ if($check_includes) {
$public_header = 0;
} else {
foreach (@ignore_for_master_contents) {
- $public_header = 0 if("$header" eq "$_");
+ $public_header = 0 if($header eq $_);
}
if($public_header) {
foreach (@ignore_for_include_check) {
- $public_header = 0 if("$header" eq "$_");
+ $public_header = 0 if($header eq $_);
}
foreach(@ignore_for_qt_begin_header_check) {
- $header_skip_qt_begin_header_test = 1 if ("$header" eq "$_");
+ $header_skip_qt_begin_header_test = 1 if ($header eq $_);
}
foreach(@ignore_for_qt_begin_namespace_check) {
- $header_skip_qt_begin_namespace_test = 1 if ("$header" eq "$_");
+ $header_skip_qt_begin_namespace_test = 1 if ($header eq $_);
}
}
}
@@ -1074,8 +1062,7 @@ if($check_includes) {
$include = 0;
}
if($include) {
- for (keys(%modules)) {
- my $trylib = $_;
+ for my $trylib (keys(%modules)) {
if(-e "$out_basedir/include/$trylib/$include") {
print "WARNING: $iheader includes $include when it should include $trylib/$include\n";
}
@@ -1124,7 +1111,6 @@ if($check_includes) {
}
}
}
- }
}
}
diff --git a/doc/src/images/symbian-draw-pixmap-sequence.png b/doc/src/images/symbian-draw-pixmap-sequence.png
new file mode 100644
index 0000000..05e3739
--- /dev/null
+++ b/doc/src/images/symbian-draw-pixmap-sequence.png
Binary files differ
diff --git a/doc/src/images/symbian-qt-draw-pixmap-sequence.png b/doc/src/images/symbian-qt-draw-pixmap-sequence.png
new file mode 100644
index 0000000..f7546f4
--- /dev/null
+++ b/doc/src/images/symbian-qt-draw-pixmap-sequence.png
Binary files differ
diff --git a/doc/src/images/symbian-qt-rendering-stack-non-screenplay.png b/doc/src/images/symbian-qt-rendering-stack-non-screenplay.png
new file mode 100644
index 0000000..9e1997d
--- /dev/null
+++ b/doc/src/images/symbian-qt-rendering-stack-non-screenplay.png
Binary files differ
diff --git a/doc/src/images/symbian-rendering-stack-non-screenplay.png b/doc/src/images/symbian-rendering-stack-non-screenplay.png
new file mode 100644
index 0000000..80cb078
--- /dev/null
+++ b/doc/src/images/symbian-rendering-stack-non-screenplay.png
Binary files differ
diff --git a/doc/src/platforms/platform-notes.qdoc b/doc/src/platforms/platform-notes.qdoc
index 94b9856..6f533ae 100644
--- a/doc/src/platforms/platform-notes.qdoc
+++ b/doc/src/platforms/platform-notes.qdoc
@@ -526,6 +526,56 @@
platform in use. If available, it is loaded in preference over the MMF
plugin. If the Helix plugin fails to load, the MMF plugin, if present on
the device, will be loaded instead.
+
+ \section1 UI Performance in devices prior to Symbian^3
+
+ Qt uses the QPainter class to perform low-level painting on widgets and
+ other paint devices. QPainter provides functions to draw complex shapes,
+ aligned text and pixmaps. It can also do vector path clipping, coordinate
+ transformations and Porter-Duff composition. If the underlying graphics
+ architecture does not support all of these operations then Qt uses the
+ raster graphics system for rendering.
+
+ Most of the Symbian devices prior to Symbian^3 use a non-ScreenPlay
+ graphics architecture which does not have native support for all functions
+ provided by QPainter. In non-ScreenPlay devices Qt uses the raster
+ graphics system by default which has a performance penalty when compared
+ to native Symbian rendering.
+
+ In order to be able to perform all functions provided by QPainter, the
+ raster graphics system needs to have pixel level framebuffer access. To
+ make this possible in non-ScreenPlay devices Qt has to create an
+ additional offscreen buffer that is the target for all Qt rendering
+ operations. Qt renders the widget tree to the offscreen buffer and the
+ offscreen buffer is blitted to the framebuffer via Symbian Window Server.
+
+ The following table shows the rendering stacks of native Symbian and Qt in
+ non-ScreenPlay devices.
+
+ \table
+ \header \o Symbian
+ \o Qt
+ \row \o \image symbian-rendering-stack-non-screenplay.png
+ \o \image symbian-qt-rendering-stack-non-screenplay.png
+ \endtable
+
+ The following diagrams show a simplified sequence of drawing a pixmap in
+ a non-ScreenPlay device.
+
+ \table
+ \header \o Symbian
+ \row \o \image symbian-draw-pixmap-sequence.png
+ \endtable
+
+ \table
+ \header \o Qt
+ \row \o \image symbian-qt-draw-pixmap-sequence.png
+ \endtable
+
+ When compared to a native Symbian application, Qt does an additional blit
+ to the offscreen buffer before drawing to the framebuffer. That is the
+ performance penalty which needs to be paid to get all functionality
+ provided by QPainter in non-ScreenPlay architecture.
*/
/*!
diff --git a/src/corelib/global/global.pri b/src/corelib/global/global.pri
index 2505e72..260ed59 100644
--- a/src/corelib/global/global.pri
+++ b/src/corelib/global/global.pri
@@ -19,7 +19,7 @@ INCLUDEPATH += $$QT_BUILD_TREE/src/corelib/global
# Only used on platforms with CONFIG += precompile_header
PRECOMPILED_HEADER = global/qt_pch.h
-linux*:!static {
+linux*:!static:!linux-armcc:!linux-gcce {
QMAKE_LFLAGS += -Wl,-e,qt_core_boilerplate
prog=$$quote(if (/program interpreter: (.*)]/) { print $1; })
DEFINES += ELF_INTERPRETER=\\\"$$system(readelf -l /bin/ls | perl -n -e \'$$prog\')\\\"
diff --git a/src/gui/graphicsview/qgraphicsitem.cpp b/src/gui/graphicsview/qgraphicsitem.cpp
index 7a622f1..fc122d2 100644
--- a/src/gui/graphicsview/qgraphicsitem.cpp
+++ b/src/gui/graphicsview/qgraphicsitem.cpp
@@ -5666,9 +5666,6 @@ void QGraphicsItem::update(const QRectF &rect)
return;
}
- if (d_ptr->discardUpdateRequest())
- return;
-
if (d_ptr->scene)
d_ptr->scene->d_func()->markDirty(this, rect);
}
diff --git a/src/gui/kernel/qapplication_s60.cpp b/src/gui/kernel/qapplication_s60.cpp
index 4ed4ba3..e937918 100644
--- a/src/gui/kernel/qapplication_s60.cpp
+++ b/src/gui/kernel/qapplication_s60.cpp
@@ -129,7 +129,13 @@ void QS60Data::setStatusPaneAndButtonGroupVisibility(bool statusPaneVisible, boo
statusPaneVisibilityChanged = (s->IsVisible() != statusPaneVisible);
s->MakeVisible(statusPaneVisible);
}
- if (buttonGroupVisibilityChanged && !statusPaneVisibilityChanged)
+ if (buttonGroupVisibilityChanged || statusPaneVisibilityChanged) {
+ const QSize size = qt_TRect2QRect(static_cast<CEikAppUi*>(S60->appUi())->ClientRect()).size();
+ const QSize oldSize; // note that QDesktopWidget::resizeEvent ignores the QResizeEvent contents
+ QResizeEvent event(size, oldSize);
+ QApplication::instance()->sendEvent(QApplication::desktop(), &event);
+ }
+ if (buttonGroupVisibilityChanged && !statusPaneVisibilityChanged && QApplication::activeWindow())
// Ensure that control rectangle is updated
static_cast<QSymbianControl *>(QApplication::activeWindow()->winId())->handleClientAreaChange();
}
diff --git a/src/gui/kernel/qwidget_s60.cpp b/src/gui/kernel/qwidget_s60.cpp
index fc13c93..c98c05a 100644
--- a/src/gui/kernel/qwidget_s60.cpp
+++ b/src/gui/kernel/qwidget_s60.cpp
@@ -503,8 +503,10 @@ void QWidgetPrivate::show_sys()
// Can't use AppUi directly because it privately inherits from MEikStatusPaneObserver.
QSymbianControl *desktopControl = static_cast<QSymbianControl *>(QApplication::desktop()->winId());
S60->statusPane()->SetObserver(desktopControl);
- if (isFullscreen)
- S60->statusPane()->MakeVisible(false);
+ if (isFullscreen) {
+ const bool cbaVisible = S60->buttonGroupContainer() && S60->buttonGroupContainer()->IsVisible();
+ S60->setStatusPaneAndButtonGroupVisibility(false, cbaVisible);
+ }
}
}
}
diff --git a/src/gui/painting/qblendfunctions.cpp b/src/gui/painting/qblendfunctions.cpp
index 24908ce..0edf256 100644
--- a/src/gui/painting/qblendfunctions.cpp
+++ b/src/gui/painting/qblendfunctions.cpp
@@ -254,10 +254,10 @@ void qt_scale_image_argb32_on_rgb16(uchar *destPixels, int dbpl,
}
}
-static void qt_blend_rgb16_on_rgb16(uchar *dst, int dbpl,
- const uchar *src, int sbpl,
- int w, int h,
- int const_alpha)
+void qt_blend_rgb16_on_rgb16(uchar *dst, int dbpl,
+ const uchar *src, int sbpl,
+ int w, int h,
+ int const_alpha)
{
#ifdef QT_DEBUG_DRAW
printf("qt_blend_rgb16_on_rgb16: dst=(%p, %d), src=(%p, %d), dim=(%d, %d) alpha=%d\n",
diff --git a/src/gui/painting/qdrawhelper.cpp b/src/gui/painting/qdrawhelper.cpp
index 5223458..5e1509d 100644
--- a/src/gui/painting/qdrawhelper.cpp
+++ b/src/gui/painting/qdrawhelper.cpp
@@ -8014,6 +8014,7 @@ void qInitDrawhelperAsm()
qBlendFunctions[QImage::Format_ARGB32_Premultiplied][QImage::Format_ARGB32_Premultiplied] = qt_blend_argb32_on_argb32_neon;
qBlendFunctions[QImage::Format_RGB16][QImage::Format_ARGB32_Premultiplied] = qt_blend_argb32_on_rgb16_neon;
qBlendFunctions[QImage::Format_ARGB32_Premultiplied][QImage::Format_RGB16] = qt_blend_rgb16_on_argb32_neon;
+ qBlendFunctions[QImage::Format_RGB16][QImage::Format_RGB16] = qt_blend_rgb16_on_rgb16_neon;
qScaleFunctions[QImage::Format_RGB16][QImage::Format_ARGB32_Premultiplied] = qt_scale_image_argb32_on_rgb16_neon;
qScaleFunctions[QImage::Format_RGB16][QImage::Format_RGB16] = qt_scale_image_rgb16_on_rgb16_neon;
diff --git a/src/gui/painting/qdrawhelper_neon.cpp b/src/gui/painting/qdrawhelper_neon.cpp
index ed15c5c..0afd077 100644
--- a/src/gui/painting/qdrawhelper_neon.cpp
+++ b/src/gui/painting/qdrawhelper_neon.cpp
@@ -167,6 +167,14 @@ pixman_composite_scanline_over_asm_neon (int32_t w,
const uint32_t *dst,
const uint32_t *src);
+extern "C" void
+pixman_composite_src_0565_0565_asm_neon (int32_t w,
+ int32_t h,
+ uint16_t *dst,
+ int32_t dst_stride,
+ uint16_t *src,
+ int32_t src_stride);
+
// qblendfunctions.cpp
void qt_blend_argb32_on_rgb16_const_alpha(uchar *destPixels, int dbpl,
const uchar *srcPixels, int sbpl,
@@ -200,6 +208,96 @@ void qt_blend_rgb16_on_argb32_neon(uchar *destPixels, int dbpl,
pixman_composite_src_0565_8888_asm_neon(w, h, dst, dbpl, src, sbpl);
}
+// qblendfunctions.cpp
+void qt_blend_rgb16_on_rgb16(uchar *dst, int dbpl,
+ const uchar *src, int sbpl,
+ int w, int h,
+ int const_alpha);
+
+template <int N>
+static inline void scanLineBlit16(quint16 *dst, quint16 *src, int dstride)
+{
+ if (N >= 2) {
+ ((quint32 *)dst)[0] = ((quint32 *)src)[0];
+ __builtin_prefetch(dst + dstride, 1, 0);
+ }
+ for (int i = 1; i < N/2; ++i)
+ ((quint32 *)dst)[i] = ((quint32 *)src)[i];
+ if (N & 1)
+ dst[N-1] = src[N-1];
+}
+
+template <int Width>
+static inline void blockBlit16(quint16 *dst, quint16 *src, int dstride, int sstride, int h)
+{
+ union {
+ quintptr address;
+ quint16 *pointer;
+ } u;
+
+ u.pointer = dst;
+
+ if (u.address & 2) {
+ while (h--) {
+ // align dst
+ dst[0] = src[0];
+ if (Width > 1)
+ scanLineBlit16<Width-1>(dst + 1, src + 1, dstride);
+ dst += dstride;
+ src += sstride;
+ }
+ } else {
+ while (h--) {
+ scanLineBlit16<Width>(dst, src, dstride);
+
+ dst += dstride;
+ src += sstride;
+ }
+ }
+}
+
+void qt_blend_rgb16_on_rgb16_neon(uchar *destPixels, int dbpl,
+ const uchar *srcPixels, int sbpl,
+ int w, int h,
+ int const_alpha)
+{
+ // testing show that the default memcpy is faster for widths 150 and up
+ if (const_alpha != 256 || w >= 150) {
+ qt_blend_rgb16_on_rgb16(destPixels, dbpl, srcPixels, sbpl, w, h, const_alpha);
+ return;
+ }
+
+ int dstride = dbpl / 2;
+ int sstride = sbpl / 2;
+
+ quint16 *dst = (quint16 *) destPixels;
+ quint16 *src = (quint16 *) srcPixels;
+
+ switch (w) {
+#define BLOCKBLIT(n) case n: blockBlit16<n>(dst, src, dstride, sstride, h); return;
+ BLOCKBLIT(1);
+ BLOCKBLIT(2);
+ BLOCKBLIT(3);
+ BLOCKBLIT(4);
+ BLOCKBLIT(5);
+ BLOCKBLIT(6);
+ BLOCKBLIT(7);
+ BLOCKBLIT(8);
+ BLOCKBLIT(9);
+ BLOCKBLIT(10);
+ BLOCKBLIT(11);
+ BLOCKBLIT(12);
+ BLOCKBLIT(13);
+ BLOCKBLIT(14);
+ BLOCKBLIT(15);
+#undef BLOCKBLIT
+ default:
+ break;
+ }
+
+ pixman_composite_src_0565_0565_asm_neon (w, h, dst, dstride, src, sstride);
+}
+
extern "C" void blend_8_pixels_argb32_on_rgb16_neon(quint16 *dst, const quint32 *src, int const_alpha);
void qt_blend_argb32_on_rgb16_neon(uchar *destPixels, int dbpl,
diff --git a/src/gui/painting/qdrawhelper_neon_p.h b/src/gui/painting/qdrawhelper_neon_p.h
index 451edbc..d25b7ec 100644
--- a/src/gui/painting/qdrawhelper_neon_p.h
+++ b/src/gui/painting/qdrawhelper_neon_p.h
@@ -84,6 +84,11 @@ void qt_blend_rgb16_on_argb32_neon(uchar *destPixels, int dbpl,
int w, int h,
int const_alpha);
+void qt_blend_rgb16_on_rgb16_neon(uchar *destPixels, int dbpl,
+ const uchar *srcPixels, int sbpl,
+ int w, int h,
+ int const_alpha);
+
void qt_alphamapblit_quint16_neon(QRasterBuffer *rasterBuffer,
int x, int y, quint32 color,
const uchar *bitmap,
diff --git a/src/gui/painting/qpainter.cpp b/src/gui/painting/qpainter.cpp
index 4e10671..c6046ac 100644
--- a/src/gui/painting/qpainter.cpp
+++ b/src/gui/painting/qpainter.cpp
@@ -9028,7 +9028,7 @@ void QPainter::drawPixmapFragments(const PixmapFragment *fragments, int fragment
{
Q_D(QPainter);
- if (!d->engine)
+ if (!d->engine || pixmap.isNull())
return;
#ifndef QT_NO_DEBUG
diff --git a/src/gui/text/qfontengine.cpp b/src/gui/text/qfontengine.cpp
index 3f758b1..1e8461f 100644
--- a/src/gui/text/qfontengine.cpp
+++ b/src/gui/text/qfontengine.cpp
@@ -874,8 +874,8 @@ const uchar *QFontEngine::getCMap(const uchar *table, uint tableSize, bool *isSy
enum {
Invalid,
- Symbol,
AppleRoman,
+ Symbol,
Unicode11,
Unicode,
MicrosoftUnicode,
@@ -939,7 +939,7 @@ const uchar *QFontEngine::getCMap(const uchar *table, uint tableSize, bool *isSy
return 0;
resolveTable:
- *isSymbolFont = (score == Symbol);
+ *isSymbolFont = (symbolTable > -1);
unsigned int unicode_table = qFromBigEndian<quint32>(maps + 8*tableToUse + 4);
diff --git a/src/gui/text/qfontengine_ft.cpp b/src/gui/text/qfontengine_ft.cpp
index 2c4fbab..a9b25f5 100644
--- a/src/gui/text/qfontengine_ft.cpp
+++ b/src/gui/text/qfontengine_ft.cpp
@@ -94,6 +94,13 @@ QT_BEGIN_NAMESPACE
#define Y_SIZE(face,i) ((face)->available_sizes[i].height << 6)
#endif
+/* FreeType 2.1.10 starts to provide FT_GlyphSlot_Embolden */
+#if (FREETYPE_MAJOR*10000+FREETYPE_MINOR*100+FREETYPE_PATCH) >= 20110
+#define Q_FT_GLYPHSLOT_EMBOLDEN(slot) FT_GlyphSlot_Embolden(slot)
+#else
+#define Q_FT_GLYPHSLOT_EMBOLDEN(slot)
+#endif
+
#define FLOOR(x) ((x) & -64)
#define CEIL(x) (((x)+63) & -64)
#define TRUNC(x) ((x) >> 6)
@@ -794,7 +801,7 @@ QFontEngineFT::Glyph *QFontEngineFT::loadGlyphMetrics(QGlyphSet *set, uint glyph
}
FT_GlyphSlot slot = face->glyph;
- if (embolden) FT_GlyphSlot_Embolden(slot);
+ if (embolden) Q_FT_GLYPHSLOT_EMBOLDEN(slot);
int left = slot->metrics.horiBearingX;
int right = slot->metrics.horiBearingX + slot->metrics.width;
int top = slot->metrics.horiBearingY;
@@ -940,7 +947,7 @@ QFontEngineFT::Glyph *QFontEngineFT::loadGlyph(QGlyphSet *set, uint glyph, Glyph
return 0;
FT_GlyphSlot slot = face->glyph;
- if (embolden) FT_GlyphSlot_Embolden(slot);
+ if (embolden) Q_FT_GLYPHSLOT_EMBOLDEN(slot);
FT_Library library = qt_getFreetype();
info.xOff = TRUNC(ROUND(slot->advance.x));
@@ -1558,8 +1565,6 @@ bool QFontEngineFT::stringToCMap(const QChar *str, int len, QGlyphLayout *glyphs
FT_Face face = freetype->face;
for ( int i = 0; i < len; ++i ) {
unsigned int uc = getChar(str, i, len);
- if (mirrored)
- uc = QChar::mirroredChar(uc);
glyphs->glyphs[glyph_pos] = uc < QFreetypeFace::cmapCacheSize ? freetype->cmapCache[uc] : 0;
if ( !glyphs->glyphs[glyph_pos] ) {
glyph_t glyph;
diff --git a/src/gui/text/qfontengine_qpf.cpp b/src/gui/text/qfontengine_qpf.cpp
index a0593cc..53b6910 100644
--- a/src/gui/text/qfontengine_qpf.cpp
+++ b/src/gui/text/qfontengine_qpf.cpp
@@ -578,8 +578,6 @@ bool QFontEngineQPF::stringToCMap(const QChar *str, int len, QGlyphLayout *glyph
if (symbol) {
for (int i = 0; i < len; ++i) {
unsigned int uc = getChar(str, i, len);
- if (mirrored)
- uc = QChar::mirroredChar(uc);
glyphs->glyphs[glyph_pos] = getTrueTypeGlyphIndex(cmap, uc);
if(!glyphs->glyphs[glyph_pos] && uc < 0x100)
glyphs->glyphs[glyph_pos] = getTrueTypeGlyphIndex(cmap, uc + 0xf000);
diff --git a/src/gui/text/qfontengine_s60.cpp b/src/gui/text/qfontengine_s60.cpp
index 2cc3f50..5980f20 100644
--- a/src/gui/text/qfontengine_s60.cpp
+++ b/src/gui/text/qfontengine_s60.cpp
@@ -166,6 +166,11 @@ const uchar *QSymbianTypeFaceExtras::cmap() const
return reinterpret_cast<const uchar *>(m_cmapTable.constData());
}
+bool QSymbianTypeFaceExtras::isSymbolCMap() const
+{
+ return m_symbolCMap;
+}
+
CFont *QSymbianTypeFaceExtras::fontOwner() const
{
return m_cFont;
@@ -256,7 +261,7 @@ bool QFontEngineS60::stringToCMap(const QChar *characters, int len, QGlyphLayout
for (int i = 0; i < len; ++i) {
const unsigned int uc = getChar(characters, i, len);
*g++ = QFontEngine::getTrueTypeGlyphIndex(cmap,
- isRtl ? QChar::mirroredChar(uc) : uc);
+ (isRtl && !m_extras->isSymbolCMap()) ? QChar::mirroredChar(uc) : uc);
}
glyphs->numGlyphs = g - glyphs->glyphs;
diff --git a/src/gui/text/qfontengine_s60_p.h b/src/gui/text/qfontengine_s60_p.h
index d65f13b..d05c23c 100644
--- a/src/gui/text/qfontengine_s60_p.h
+++ b/src/gui/text/qfontengine_s60_p.h
@@ -81,6 +81,7 @@ public:
bool getSfntTableData(uint tag, uchar *buffer, uint *length) const;
const uchar *cmap() const;
CFont *fontOwner() const;
+ bool isSymbolCMap() const;
private:
CFont* m_cFont;
diff --git a/src/gui/widgets/qlinecontrol.cpp b/src/gui/widgets/qlinecontrol.cpp
index 69e6791..b6dfd13 100644
--- a/src/gui/widgets/qlinecontrol.cpp
+++ b/src/gui/widgets/qlinecontrol.cpp
@@ -464,8 +464,6 @@ void QLineControl::processInputMethodEvent(QInputMethodEvent *event)
if (a.type == QInputMethodEvent::Cursor) {
m_preeditCursor = a.start;
m_hideCursor = !a.length;
- if (m_hideCursor)
- setCursorBlinkPeriod(0);
} else if (a.type == QInputMethodEvent::TextFormat) {
QTextCharFormat f = qvariant_cast<QTextFormat>(a.value).toCharFormat();
if (f.isValid()) {
@@ -529,7 +527,7 @@ void QLineControl::draw(QPainter *painter, const QPoint &offset, const QRect &cl
int cursor = m_cursor;
if (m_preeditCursor != -1)
cursor += m_preeditCursor;
- if (!m_hideCursor && (!m_blinkPeriod || m_blinkStatus))
+ if(!m_blinkPeriod || m_blinkStatus)
m_textLayout.drawCursor(painter, offset, cursor, m_cursorWidth);
}
}
diff --git a/tests/auto/qgraphicsitem/tst_qgraphicsitem.cpp b/tests/auto/qgraphicsitem/tst_qgraphicsitem.cpp
index 3634ce9..4476084 100644
--- a/tests/auto/qgraphicsitem/tst_qgraphicsitem.cpp
+++ b/tests/auto/qgraphicsitem/tst_qgraphicsitem.cpp
@@ -4578,7 +4578,7 @@ void tst_QGraphicsItem::itemChange()
QCOMPARE(tester.changes.at(tester.changes.size() - 1), QGraphicsItem::ItemFlagsHaveChanged);
QVariant expectedFlags = qVariantFromValue<quint32>(QGraphicsItem::GraphicsItemFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemSendsGeometryChanges));
QCOMPARE(tester.values.at(tester.values.size() - 2), expectedFlags);
- QCOMPARE(tester.values.at(tester.values.size() - 1), qVariantFromValue<quint32>(QGraphicsItem::ItemIsSelectable));
+ QCOMPARE(tester.values.at(tester.values.size() - 1), qVariantFromValue<quint32>((quint32)QGraphicsItem::ItemIsSelectable));
}
{
// ItemSelectedChange