Hi folks,
we need to decide on the schedule of the next Etoys release.
I see two valid alternatives:
1) "Summer" release in time for Squeakfest (end of July).
That would mean we need to feature-freeze very soon, e.g. June 7th (one week from now).
2) Follow the Sugar release schedule ( http://wiki.sugarlabs.org/go/0.90/Roadmap ).
That would give us more time, with feature freeze at the end of July, and the release in September.
"Feature freeze" would mean that by that date, code for a new feature was at least submitted to the inbox. It does not have to be bug-free yet, but it should be complete enough for testing.
Opinions? (we can also discuss in today's IRC chat)
- Bert -
Hi, Tim, and all,
Attached is a fileout providing changes to the project-info dialog as
requested for the benefit of the "showcase" on Squeakland.org.
Basically, the "project info" dialog now contains three "enumerated"
items, "Subject", "Age", and "Region". These three are all governed
by pop-ups (in local language) rather than by type-ins. The results
are included in the project manifest.
Important notes:
(1) It is essential that this be filed in to an image updated at
least through update 2246PolygonFix-kfr. If filed in to an earlier
image, subsequently loading updates will clobber some of the changes
provided here.
(2) Yoshiki is also modifying code in the EToyProjectDetailsMorph
area in this same time-frame, so integration is likely to be necessary
before our two fileouts are published.
(3) There are a few obvious rough edges which someone may wish to
tweak, though I don't know of any show-stoppers. For example, this
has always been an English-only dialog, but now that the field names
are localized, there may be layout issues in some languages (once
translations are available.) Also, for the pop-up fields, if they've
never been set they show as blank, whereas once they've been set to
"(none)" (equivalent to blank) they show the text "(none)". Probably
we should always show "(none)" when values for these three popups have
not been supplied. Also, since some of the fields are now type-in and
some are pop-ups, perhaps some UI convention (slight color
difference?) should be used to hint at whether a field functions as a
type-in or a pop-up.
(4) This turned out to involve quite a bit of code, most of it
written with a fever and at very late hours. So there's the distinct
possibility of errors. I did test it briefly and it seemed to work as
I expected. HOWEVER: it really needs verification by someone else.
(5) The Preamble (please read if planning to test or use):
-=------
Change Set: projectInfoPopUps-sw
Date: 8 August 2009
Author: Scott Wallace
Changes to the project-info dialog, in support of new data desired for
the 'showcase' on squeakland.org:
- 'Sub-Category' removed.
- Subject, Age, and Region are added as pop-ups.
- Choices for Subject, Age, Region popups, and corresponding codes,
obtainable from web-site.
- Project manifest now includes Age, Subject (category,) and Region
info. The codes are strings of numbers, e.g. '554' as a Subject code
means 'Language Arts'
(look in #defaultAgeTriplets, #defaultSubjectTriplets,
#defaultRegionTriplets on class-side of EToyProjectDetailsMorph.)
- Names of fields are presented to the user in localized form.
- Choices for values of pop-up fields are presented to the user in
localized form.
Notes:
- There is support provided for obtaining up-to-date lists of the
subject, age, and region alternatives from the web site (see
EToyProjectDetailsMorph class updateTripletsFromWebSite) but it is not
actually called at this point, out of concern for potential for long
delay if connection to web site is slow.
- The *region* codes are at present *not* obtained from the web-site
(even when the user explicitly calls #updateTripletsFromWebSite,) but
rather a 'fake' set of regions, basically the continents, is
provided. This is probably temporary. We have no reasonable way to
confront the user with a pop-up showing 250 choices.
However, as per Tim's request, I have made it a point to include
Antarctica in the region list. (Tim: look at method
#defaultRegionTriplets for the current point of departure, if you want
to adopt that, temporarily at least, on the web site. And/or of
course change any defaults as needed.
-----------
Cheers,
-- Scott
Ricardo Moran uploaded a new version of TrueType to project Etoys:
http://source.squeak.org/etoys/TrueType-Richo.3.mcz
==================== Summary ====================
Name: TrueType-Richo.3
Author: Richo
Time: 30 May 2010, 5:11:08 pm
UUID: 87c0ca6c-4fa5-5e45-85e5-aaf9937d2a07
Ancestors: TrueType-Richo.2
* Integrating true type font support by Andreas Raab.
=============== Diff against TrueType-Richo.2 ===============
Item was changed:
----- Method: TTFileDescription>>on:offset: (in category 'initialize') -----
on: aFileName offset: fontOffset
"Initialize the receiver from a file name"
fileName := aFileName.
fileOffset := fontOffset.
self withFileDo:[:fontFile|
+ "Some bitmap fonts are called .ttf; skip anything that doesn't have a header"
+ (self findTable: 'head' in: fontFile) ifFalse:[^nil].
- (self findTable: 'head' in: fontFile)
- ifFalse:[^self error: 'File does not have a header table'].
self processFontHeaderTable: fontFile.
(self findTable: 'maxp' in: fontFile)
ifFalse:[^self error: 'File does not have a profile table'].
self processMaximumProfileTable: fontFile.
(self findTable: 'name' in: fontFile)
ifFalse:[^self error: 'File does not have a naming table'].
self processNamingTable: fontFile.
(self findTable: 'hhea' in: fontFile)
ifFalse:[^self error: 'File does not have a horizontal header table'].
self processHorizontalHeaderTable: fontFile.
(self findTable: 'hmtx' in: fontFile)
ifFalse:[^self error: 'File does not have a horizontal header table'].
hmtxTableOffset := fontFile position.
(self findTable: 'loca' in: fontFile)
ifFalse:[^self error: 'File does not have a naming table'].
indexToLocOffset := fontFile position.
(self findTable: 'glyf' in: fontFile)
ifFalse:[^self error: 'File does not have a naming table'].
glyphTableOffset := fontFile position.
(self findTable: 'cmap' in: fontFile)
ifFalse:[^self error: 'File does not have a header table'].
self processCharacterMappingTable: fontFile.
].!
Item was changed:
----- Method: TTFileDescription class>>fontOffsetsInFile: (in category 'instance creation') -----
fontOffsetsInFile: file
"Answer a collection of font offsets in the given file"
| tag version nFonts |
file position: 0.
tag := file next: 4.
tag caseOf:{
+ ['true' asByteArray] -> ["Version 1.0 TTF file"
+ "http://developer.apple.com/textfonts/TTRefMan/RM06/Chap6.html
+ The values 'true' (0x74727565) and 0x00010000 are recognized by the Mac OS
+ as referring to TrueType fonts."
+ ^Array with: 0 "only one font"
+ ].
[#(0 1 0 0) asByteArray] -> ["Version 1.0 TTF file"
^Array with: 0 "only one font"
].
['ttcf' asByteArray] -> ["TTC file"
version := file next: 4.
version = #(0 1 0 0) asByteArray ifFalse:[^self error: 'Unsupported TTC version'].
nFonts := file nextNumber: 4.
^(1 to: nFonts) collect:[:i| file nextNumber: 4].
].
} otherwise:[
self error: 'This is not a valid Truetype file'.
].!
Item was changed:
----- Method: TTFileDescription class>>readFontsFrom: (in category 'instance creation') -----
readFontsFrom: aFilename
"Reads and returns all the fonts in the given file"
"
TTFileDescription readFontsFrom: 'batang.ttc'.
"
^self openFontFile: aFilename do:[:file|
(self fontOffsetsInFile: file)
+ collect:[:offset| self new on: aFilename offset: offset]
+ thenSelect:[:font| font notNil]].
- collect:[:offset| self new on: aFilename offset: offset]].
!
Ricardo Moran uploaded a new version of Graphics to project Etoys:
http://source.squeak.org/etoys/Graphics-Richo.3.mcz
==================== Summary ====================
Name: Graphics-Richo.3
Author: Richo
Time: 30 May 2010, 5:10:09 pm
UUID: 0ec495e4-b9ef-d84b-84eb-e68266c01585
Ancestors: Graphics-bf.2
* Integrating true type font support by Andreas Raab.
=============== Diff against Graphics-bf.2 ===============
Item was changed:
SystemOrganization addCategory: #'Graphics-Display Objects'!
+ SystemOrganization addCategory: #'Graphics-External'!
SystemOrganization addCategory: #'Graphics-Files'!
+ SystemOrganization addCategory: #'Graphics-Fonts'!
SystemOrganization addCategory: #'Graphics-Primitives'!
SystemOrganization addCategory: #'Graphics-Text'!
- SystemOrganization addCategory: #'Graphics-Transformations'!
SystemOrganization addCategory: #'Graphics-Tools-Intersection'!
SystemOrganization addCategory: #'Graphics-Tools-Simplification'!
SystemOrganization addCategory: #'Graphics-Tools-Triangulation'!
+ SystemOrganization addCategory: #'Graphics-Transformations'!
- SystemOrganization addCategory: #'Graphics-External'!
- SystemOrganization addCategory: #'Graphics-Fonts'!
Item was changed:
----- Method: DisplayScanner>>displayLine:offset:leftInRun: (in category 'scanning') -----
displayLine: textLine offset: offset leftInRun: leftInRun
"The call on the primitive (scanCharactersFrom:to:in:rightX:) will be interrupted according to an array of stop conditions passed to the scanner at which time the code to handle the stop condition is run and the call on the primitive continued until a stop condition returns true (which means the line has terminated). leftInRun is the # of characters left to scan in the current run; when 0, it is time to call setStopConditions."
| done stopCondition nowLeftInRun startIndex string lastPos |
+ line := textLine.
+ morphicOffset := offset.
+ lineY := line top + offset y.
+ lineHeight := line lineHeight.
+ rightMargin := line rightMargin + offset x.
+ lastIndex := line first.
- line _ textLine.
- morphicOffset _ offset.
- lineY _ line top + offset y.
- lineHeight _ line lineHeight.
- rightMargin _ line rightMargin + offset x.
- lastIndex _ line first.
leftInRun <= 0 ifTrue: [self setStopConditions].
+ leftMargin := (line leftMarginForAlignment: alignment) + offset x.
+ destX := runX := leftMargin.
- leftMargin _ (line leftMarginForAlignment: alignment) + offset x.
- destX _ runX _ leftMargin.
fillBlt == nil ifFalse:
["Not right"
fillBlt destX: line left destY: lineY
width: line width left height: lineHeight; copyBits].
+ lastIndex := line first.
- lastIndex _ line first.
leftInRun <= 0
+ ifTrue: [nowLeftInRun := text runLengthFor: lastIndex]
+ ifFalse: [nowLeftInRun := leftInRun].
+ destY := lineY + line baseline - font ascent.
+ runStopIndex := lastIndex + (nowLeftInRun - 1) min: line last.
+ spaceCount := 0.
+ done := false.
+ string := text string.
- ifTrue: [nowLeftInRun _ text runLengthFor: lastIndex]
- ifFalse: [nowLeftInRun _ leftInRun].
- destY _ lineY + line baseline - font ascent.
- runStopIndex _ lastIndex + (nowLeftInRun - 1) min: line last.
- spaceCount _ 0.
- done _ false.
- string _ text string.
[done] whileFalse:[
+ startIndex := lastIndex.
+ lastPos := destX@destY.
+ stopCondition := self scanCharactersFrom: lastIndex to: runStopIndex
- startIndex _ lastIndex.
- lastPos _ destX@destY.
- stopCondition _ self scanCharactersFrom: lastIndex to: runStopIndex
in: string rightX: rightMargin stopConditions: stopConditions
kern: kern.
lastIndex >= startIndex ifTrue:[
font displayString: string on: bitBlt
+ from: startIndex
+ "XXXX: The following is an interesting bug. All stopConditions exept #endOfRun
+ have lastIndex past the last character displayed. #endOfRun sets it *on* the character.
+ If we display up until lastIndex then we will also display invisible characters like
+ CR and tab. This problem should be fixed in the scanner (i.e., position lastIndex
+ consistently) but I don't want to deal with the fallout right now so we keep the
+ fix minimally invasive."
+ to: (stopCondition == #endOfRun ifTrue:[lastIndex] ifFalse:[lastIndex-1])
+ at: lastPos kern: kern].
- from: startIndex to: lastIndex at: lastPos kern: kern].
"see setStopConditions for stopping conditions for displaying."
+ done := self perform: stopCondition.
+ lastIndex > runStopIndex ifTrue: [done := true].
- done _ self perform: stopCondition.
- lastIndex > runStopIndex ifTrue: [done _ true].
].
^ runStopIndex - lastIndex "Number of characters remaining in the current run"!
Ricardo Moran uploaded a new version of Multilingual to project Etoys:
http://source.squeak.org/etoys/Multilingual-Richo.9.mcz
==================== Summary ====================
Name: Multilingual-Richo.9
Author: Richo
Time: 30 May 2010, 5:09:38 pm
UUID: 73d74df2-e8db-8f4f-b1ca-bea53533f8ed
Ancestors: Multilingual-Richo.8
* Integrating true type font support by Andreas Raab
=============== Diff against Multilingual-Richo.8 ===============
Item was changed:
----- Method: MultiDisplayScanner>>displayLine:offset:leftInRun: (in category 'scanning') -----
displayLine: textLine offset: offset leftInRun: leftInRun
"The call on the primitive (scanCharactersFrom:to:in:rightX:) will be interrupted according to an array of stop conditions passed to the scanner at which time the code to handle the stop condition is run and the call on the primitive continued until a stop condition returns true (which means the line has terminated). leftInRun is the # of characters left to scan in the current run; when 0, it is time to call setStopConditions."
| done stopCondition nowLeftInRun startIndex string lastPos |
+ line := textLine.
+ morphicOffset := offset.
+ lineY := line top + offset y.
+ lineHeight := line lineHeight.
+ rightMargin := line rightMargin + offset x.
+ lastIndex := line first.
- line _ textLine.
- morphicOffset _ offset.
- lineY _ line top + offset y.
- lineHeight _ line lineHeight.
- rightMargin _ line rightMargin + offset x.
- lastIndex _ line first.
leftInRun <= 0 ifTrue: [self setStopConditions].
+ leftMargin := (line leftMarginForAlignment: alignment) + offset x.
+ destX := runX := leftMargin.
- leftMargin _ (line leftMarginForAlignment: alignment) + offset x.
- destX _ runX _ leftMargin.
fillBlt == nil ifFalse:
["Not right"
fillBlt destX: line left destY: lineY
width: line width left height: lineHeight; copyBits].
+ lastIndex := line first.
- lastIndex _ line first.
leftInRun <= 0
+ ifTrue: [nowLeftInRun := text runLengthFor: lastIndex]
+ ifFalse: [nowLeftInRun := leftInRun].
+ baselineY := lineY + line baseline.
+ destY := baselineY - font ascent.
+ runStopIndex := lastIndex + (nowLeftInRun - 1) min: line last.
+ spaceCount := 0.
+ done := false.
+ string := text string.
- ifTrue: [nowLeftInRun _ text runLengthFor: lastIndex]
- ifFalse: [nowLeftInRun _ leftInRun].
- baselineY _ lineY + line baseline.
- destY _ baselineY - font ascent.
- runStopIndex _ lastIndex + (nowLeftInRun - 1) min: line last.
- spaceCount _ 0.
- done _ false.
- string _ text string.
[done] whileFalse:[
+ startIndex := lastIndex.
+ lastPos := destX@destY.
+ stopCondition := self scanCharactersFrom: lastIndex to: runStopIndex
- startIndex _ lastIndex.
- lastPos _ destX@destY.
- stopCondition _ self scanCharactersFrom: lastIndex to: runStopIndex
in: string rightX: rightMargin stopConditions: stopConditions
kern: kern.
lastIndex >= startIndex ifTrue:[
font displayString: string on: bitBlt
+ from: startIndex
+ "XXXX: The following is an interesting bug. All stopConditions exept #endOfRun
+ have lastIndex past the last character displayed. #endOfRun sets it *on* the character.
+ If we display up until lastIndex then we will also display invisible characters like
+ CR and tab. This problem should be fixed in the scanner (i.e., position lastIndex
+ consistently) but I don't want to deal with the fallout right now so we keep the
+ fix minimally invasive."
+ to: (stopCondition == #endOfRun ifTrue:[lastIndex] ifFalse:[lastIndex-1])
+ at: lastPos kern: kern baselineY: baselineY].
- from: startIndex to: lastIndex at: lastPos kern: kern baselineY: baselineY].
"see setStopConditions for stopping conditions for displaying."
+ done := self perform: stopCondition.
+ "lastIndex > runStopIndex ifTrue: [done := true]."
- done _ self perform: stopCondition.
- "lastIndex > runStopIndex ifTrue: [done _ true]."
].
^ runStopIndex - lastIndex "Number of characters remaining in the current run"!