From 35062bb2001e80a12b70984223c53a9be26947cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Minisini?= Date: Sun, 19 Jan 2014 20:25:16 +0000 Subject: [PATCH] [DEVELOPMENT ENVIRONMENT] * BUG: Fix background of CoordBox controls. * BUG: Image editor: Fix text tool. * NEW: Image editor: Text alignment. * BUG: Image editor: Scaling selection is done from the top left corner by default, and from the selection center only if you press the SHIFT key. * NEW: Image editor: The mouse wheel now zooms the image. * BUG: Project property dialog: Fix component list layout. * NEW: Some new backgrounds. [GB.FORM] * NEW: TabPanel: Now there are a left and a right arrow to navigate through the tabs. git-svn-id: svn://localhost/gambas/trunk@6088 867c0c6c-44f3-4631-809d-bfa615b0a4ec --- app/src/gambas3/.lang/fr.mo | Bin 111613 -> 111819 bytes app/src/gambas3/.lang/fr.po | 146 ++++++----- .../gambas3/.src/Dialog/Report/CoordBox.class | 10 +- .../.src/Editor/Image/CImageSelection.class | 77 +++--- .../.src/Editor/Image/FImageEditor.class | 48 +++- .../.src/Editor/Image/FImageEditor.form | 120 ++++----- .../.src/Editor/Image/FImageProperty.class | 31 ++- .../.src/Editor/Image/FImageProperty.form | 42 +++- app/src/gambas3/.src/FMain.form | 2 +- .../.src/Project/FProjectProperty.class | 3 +- app/src/gambas3/img/background/cross.png | Bin 0 -> 147 bytes app/src/gambas3/img/background/list | 4 +- app/src/gambas3/img/background/square.png | Bin 0 -> 333 bytes app/src/gambas3/img/draw/hide.png | Bin 177 -> 172 bytes app/src/gambas3/img/draw/line.png | Bin 215 -> 390 bytes app/src/gambas3/img/draw/resize.png | Bin 0 -> 325 bytes app/src/gambas3/img/draw/rotate.png | Bin 0 -> 458 bytes comp/src/gb.form/.info | 72 +++--- comp/src/gb.form/.project | 4 +- comp/src/gb.form/.src/TabPanel/TabPanel.class | 235 ++++++++++-------- .../.src/TabPanel/_TabPanelButton.class | 29 ++- comp/src/gb.form/.src/Test/FTabPanel.class | 6 + comp/src/gb.form/.src/Test/FTabPanel.form | 16 +- examples/examples/Games/BeastScroll/.project | 2 +- .../Games/BeastScroll/.src/MMain.module | 6 +- examples/examples/OpenGL/GambasGears/.project | 2 +- examples/examples/OpenGL/Md2Model/.settings | 2 +- examples/examples/OpenGL/TunnelSDL/.project | 2 +- examples/examples/OpenGL/TunnelSDL/.startup | 2 +- 29 files changed, 528 insertions(+), 333 deletions(-) create mode 100644 app/src/gambas3/img/background/cross.png create mode 100644 app/src/gambas3/img/background/square.png create mode 100644 app/src/gambas3/img/draw/resize.png create mode 100644 app/src/gambas3/img/draw/rotate.png diff --git a/app/src/gambas3/.lang/fr.mo b/app/src/gambas3/.lang/fr.mo index 44478ff188d849363dbea6f78b0ce59b9fab3567..50363865315454422555d733dfba3e3036c1119c 100644 GIT binary patch delta 33330 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�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 delta 33103 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 Qjers Color.Default Then Draw.FillRect(FW, FW, Draw.W - FW * 2, Draw.H - FW * 2, Me.Background) + iCol = Me.Background + If iCol = Color.Default Then iCol = Color.TextBackground - If $bBorder Then - Draw.Style.Box(0, 0, $hBackground.W, $hBackground.H) - Endif + Draw.FillRect(FW, FW, Draw.W - FW * 2, Draw.H - FW * 2, iCol) + + If $bBorder Then Draw.Style.Box(0, 0, $hBackground.W, $hBackground.H) End diff --git a/app/src/gambas3/.src/Editor/Image/CImageSelection.class b/app/src/gambas3/.src/Editor/Image/CImageSelection.class index 8c5d68a43..4c5cf5343 100644 --- a/app/src/gambas3/.src/Editor/Image/CImageSelection.class +++ b/app/src/gambas3/.src/Editor/Image/CImageSelection.class @@ -46,8 +46,7 @@ Public Sub Paint(hImage As Image, iAction As Integer, Optional bAll As Boolean) Dim I As Integer Dim iMode As Integer Dim fDashOffset As Float - Dim hExtent As RectF - + 'Dim hExtent As RectF fDashOffset = Paint.DashOffset @@ -118,33 +117,33 @@ Public Sub Paint(hImage As Image, iAction As Integer, Optional bAll As Boolean) Endif - If iAction = ACTION_SELECT Then - - For I = 0 To Shapes.Max - If Current < 0 Or If Current = I Or If bAll Then - If Shapes[I].IsText Then - hExtent = Shapes[I].GetExtents() - Paint.Rectangle(hExtent.X, hExtent.Y, hExtent.Width, hExtent.Height) - - Paint.AntiAlias = False - Paint.LineJoin = Paint.LineJoinMiter - - Paint.Background = Color.Yellow - Paint.Dash = Null - - Paint.Stroke(True) - - Paint.Background = Color.Black 'Color.SetAlpha(Color.Black, 128) - Paint.Dash = [2.0, 2.0] - Paint.DashOffset = 0 - - Paint.Stroke() - - Endif - Endif - Next - - Endif + ' If iAction = ACTION_SELECT Then + ' + ' For I = 0 To Shapes.Max + ' If Current < 0 Or If Current = I Or If bAll Then + ' If Shapes[I].IsText Then + ' hExtent = Shapes[I].GetExtents() + ' Paint.Rectangle(hExtent.X, hExtent.Y, hExtent.Width, hExtent.Height) + ' + ' Paint.AntiAlias = False + ' Paint.LineJoin = Paint.LineJoinMiter + ' + ' Paint.Background = Color.Yellow + ' Paint.Dash = Null + ' + ' Paint.Stroke(True) + ' + ' Paint.Background = Color.Black 'Color.SetAlpha(Color.Black, 128) + ' Paint.Dash = [2.0, 2.0] + ' Paint.DashOffset = 0 + ' + ' Paint.Stroke() + ' + ' Endif + ' Endif + ' Next + ' + ' Endif If iAction = ACTION_HANDLE Then @@ -245,7 +244,7 @@ Public Sub Paint(hImage As Image, iAction As Integer, Optional bAll As Boolean) Paint.Stroke(True) Paint.Background = Color.Black 'Color.SetAlpha(Color.Black, 128) - Paint.Dash = [2.0, 2.0] + Paint.Dash = [4.0, 4.0] Paint.DashOffset = fDashOffset ' ' If _Invert Then @@ -392,6 +391,7 @@ Public Sub Text(X As Integer, Y As Integer, sText As String, sFont As String, iA Dim hPoly As PointF[] Dim hShape As CImageShape Dim hPoint As PointF + Dim hExtents As PaintExtents 'If W = 0 Or If H = 0 Then Return @@ -400,7 +400,8 @@ Public Sub Text(X As Integer, Y As Integer, sText As String, sFont As String, iA hImage = New Image(1, 1) Paint.Begin(hImage) Paint.Font = Font[sFont] - Paint.Text(sText, X, Y) ', W, H, iAlign) + hExtents = Paint.TextExtents(sText) + Paint.Text(sText, X, Y, hExtents.Width, hExtents.Height, Align.TopNormal + iAlign) ', W, H, iAlign) hOutline = Paint.PathOutline For Each hPoly In hOutline @@ -654,14 +655,22 @@ Public Sub Rotate(fAngle As Float) End -Public Sub Scale(SX As Float, SY As Float) +Public Sub Scale(SX As Float, SY As Float, Optional bTopLeft As Boolean) Dim hMatrix As New PaintMatrix Dim hExt As RectF = GetExtents() - hMatrix.Translate(hExt.X + hExt.W / 2, hExt.Y + hExt.H / 2) + If bTopLeft Then + hMatrix.Translate(hExt.X, hExt.Y) + Else + hMatrix.Translate(hExt.X + hExt.W / 2, hExt.Y + hExt.H / 2) + Endif hMatrix.Scale(SX, SY) - hMatrix.Translate(- (hExt.X + hExt.W / 2), - (hExt.Y + hExt.H / 2)) + If bTopLeft Then + hMatrix.Translate(- hExt.X, - hExt.Y) + Else + hMatrix.Translate(- (hExt.X + hExt.W / 2), - (hExt.Y + hExt.H / 2)) + Endif Apply(hMatrix) End diff --git a/app/src/gambas3/.src/Editor/Image/FImageEditor.class b/app/src/gambas3/.src/Editor/Image/FImageEditor.class index 61d86a937..c9473d68b 100644 --- a/app/src/gambas3/.src/Editor/Image/FImageEditor.class +++ b/app/src/gambas3/.src/Editor/Image/FImageEditor.class @@ -1009,7 +1009,7 @@ Public Sub imvImage_MouseMove() Case "text" - $hLastPoint = $hCurrentPoint + $hLastPoint = GetImagePos() '$hCurrentPoint FImageProperty.RefreshTextOption Case "ellipse" @@ -1052,9 +1052,6 @@ Public Sub imvImage_MouseMove() Else If $iChangeAction Then - XC = $hChangeRect.X + $hChangeRect.W / 2 - YC = $hChangeRect.Y + $hChangeRect.H / 2 - If $sTool = "change" Then $hSelect = $aUndo[$aUndo.Max].Copy() hSelect = $hSelect @@ -1066,13 +1063,26 @@ Public Sub imvImage_MouseMove() Select Case $iChangeAction Case CHANGE_RESIZE - If $bCtrl Then - hSelect.Scale(($hCurrentPoint.X - XC) / ($hLastPoint.X - XC), ($hCurrentPoint.X - XC) / ($hLastPoint.X - XC)) + + If $bShift Then + XC = $hChangeRect.X + $hChangeRect.W / 2 + YC = $hChangeRect.Y + $hChangeRect.H / 2 Else - hSelect.Scale(($hCurrentPoint.X - XC) / ($hLastPoint.X - XC), ($hCurrentPoint.Y - YC) / ($hLastPoint.Y - YC)) + XC = $hChangeRect.X + YC = $hChangeRect.Y + Endif + + If $bCtrl Then + hSelect.Scale(($hCurrentPoint.X - XC) / ($hLastPoint.X - XC), ($hCurrentPoint.X - XC) / ($hLastPoint.X - XC), Not $bShift) + Else + hSelect.Scale(($hCurrentPoint.X - XC) / ($hLastPoint.X - XC), ($hCurrentPoint.Y - YC) / ($hLastPoint.Y - YC), Not $bShift) Endif Case CHANGE_ROTATE + + XC = $hChangeRect.X + $hChangeRect.W / 2 + YC = $hChangeRect.Y + $hChangeRect.H / 2 + A = ($hLastPoint.X - XC) * ($hCurrentPoint.X - XC) + ($hLastPoint.Y - YC) * ($hCurrentPoint.Y - YC) Try A /= Hyp($hLastPoint.X - XC, $hLastPoint.Y - YC) * Hyp($hCurrentPoint.X - XC, $hCurrentPoint.Y - YC) If Not Error Then @@ -1252,7 +1262,7 @@ Public Sub imvImage_MouseUp() Endif Case "change" - If $iChangeAction = CHANGE_NOTHING Then $hSelect.SelectAll + If $iChangeAction = CHANGE_NOTHING And If $hSelect Then $hSelect.SelectAll If $hLastPoint <> $hCurrentPoint Then RefreshSelection Else If $iChangeAction <> CHANGE_SELECT Then @@ -1458,8 +1468,9 @@ Public Sub imvImage_Draw(hZoom As Image) Endif - Paint.LineWidth = 2 / imvImage.Zoom + Paint.LineWidth = 1 / imvImage.Zoom Paint.DashOffset = - $fDashOffset + $hSelect.Paint($hImage, CImageSelection.ACTION_SELECT, True) ' CImageSelection.PaintingSelection = True @@ -1711,8 +1722,8 @@ End Public Sub timSelect_Timer() - $fDashOffset += 0.5 - If $fDashOffset >= 4 Then $fDashOffset = 0 + Inc $fDashOffset + If $fDashOffset >= 8 Then $fDashOffset = 0 imvImage.Refresh End @@ -2752,10 +2763,21 @@ Public Sub btnHide_Click() End -Public Sub UpdateText(sText As String, sFont As String) +Public Sub UpdateText(sText As String, sFont As String, iAlign As Integer) $hSelect = $hTextSelect.Copy() - $hSelect.Text($hLastPoint.X, $hLastPoint.Y, sText, sFont, Align.Left) + $hSelect.Text($hLastPoint.X, $hLastPoint.Y, sText, sFont, iAlign) imvImage.Refresh End + +Public Sub imvImage_MouseWheel() + + If Mouse.Forward Then + btnZoomIn_Click + Else + btnZoomOut_Click + Endif + Stop Event + +End diff --git a/app/src/gambas3/.src/Editor/Image/FImageEditor.form b/app/src/gambas3/.src/Editor/Image/FImageEditor.form index d43431480..259ced7b0 100644 --- a/app/src/gambas3/.src/Editor/Image/FImageEditor.form +++ b/app/src/gambas3/.src/Editor/Image/FImageEditor.form @@ -51,6 +51,7 @@ { mnuHideSelection Menu Action = ".hide-selection" Text = ("Hide selection") + Picture = Picture["img/draw/hide.png"] Shortcut = "Esc" } { mnuSelection Menu @@ -148,17 +149,19 @@ Picture = Picture["img/draw/rotate-right.png"] Shortcut = "Ctrl+>" } + { Menu3 Menu + } { mnuResize Menu btnResize Name = "mnuResize" Action = ".resize" Text = ("Resize") & "..." - Picture = Picture["icon:/small/zoom-fit"] + Picture = Picture["img/draw/resize.png"] } { mnuRotate Menu btnRotate Name = "mnuRotate" Action = ".rotate" Text = ("Rotate") & "..." - Picture = Picture["icon:/small/rotate-right"] + Picture = Picture["img/draw/rotate.png"] } } { mnuZoom Menu @@ -302,31 +305,49 @@ Picture = Picture["icon:/small/zoom-fit"] } { btnGrid ToolButton - MoveScaled(38,0,4,4) + MoveScaled(37,0,4,4) ToolTip = ("Drawing grid") Action = ".draw-grid" AutoResize = True Picture = Picture["img/draw/grid.png"] Toggle = True } + { btnResize ToolButton + MoveScaled(40,0,11,4) + Visible = False + ToolTip = ("Resize or stretch image") + Action = ".resize" + AutoResize = True + Text = ("Resize") & "..." + Picture = Picture["img/draw/resize.png"] + } + { btnRotate ToolButton + MoveScaled(50,0,11,4) + Visible = False + ToolTip = ("Rotate image") + Action = ".rotate" + AutoResize = True + Text = ("Rotate") & "..." + Picture = Picture["img/draw/rotate.png"] + } { Separator4 Separator - MoveScaled(41,0,1.1429,4) + MoveScaled(61,0,1.1429,4) } { btnCopy ToolButton - MoveScaled(42,0,4,4) + MoveScaled(62,0,4,4) ToolTip = ("Copy") Action = ".copy" Picture = Picture["icon:/small/copy"] } { btnCut ToolButton - MoveScaled(45,0,4,4) + MoveScaled(65,0,4,4) ToolTip = ("Cut") Action = ".cut" Picture = Picture["icon:/small/cut"] } { btnPaste ToolButton btnTool Name = "btnPaste" - MoveScaled(48,0,4,4) + MoveScaled(68,0,4,4) Tag = "paste" ToolTip = ("Paste") Action = ".tool-paste" @@ -334,11 +355,11 @@ Toggle = True } { Separator2 Separator - MoveScaled(52,0,1.1429,4) + MoveScaled(72,0,1.1429,4) } { btnMove ToolButton btnTool Name = "btnMove" - MoveScaled(54,0,4,4) + MoveScaled(74,0,4,4) Tag = "move" ToolTip = ("Move") Action = ".tool-move" @@ -348,7 +369,7 @@ } { btnDraw ToolButton btnTool Name = "btnDraw" - MoveScaled(57,0,4,4) + MoveScaled(77,0,4,4) Tag = "draw" ToolTip = ("Draw") Action = ".tool-draw" @@ -357,19 +378,16 @@ } { btnErase ToolButton btnTool Name = "btnErase" - MoveScaled(60,0,4,4) + MoveScaled(80,0,4,4) Tag = "erase" ToolTip = ("Erase") Action = ".tool-erase" Picture = Picture["icon:/small/erase"] Toggle = True } - { Separator6 Separator - MoveScaled(65,0,1.1429,4) - } { btnLine ToolButton btnTool Name = "btnLine" - MoveScaled(66,0,4,4) + MoveScaled(83,0,4,4) Tag = "line" ToolTip = ("Line") Action = ".tool-line" @@ -378,7 +396,7 @@ } { btnRectangle ToolButton btnTool Name = "btnRectangle" - MoveScaled(69,0,4,4) + MoveScaled(86,0,4,4) Tag = "rectangle" ToolTip = ("Rectangle") Action = ".tool-rectangle" @@ -387,7 +405,7 @@ } { btnEllipse ToolButton btnTool Name = "btnEllipse" - MoveScaled(72,0,4,4) + MoveScaled(89,0,4,4) Tag = "ellipse" ToolTip = ("Ellipse") Action = ".tool-ellipse" @@ -396,7 +414,7 @@ } { btnText ToolButton btnTool Name = "btnText" - MoveScaled(75,0,4,4) + MoveScaled(92,0,4,4) Tag = "text" ToolTip = ("Text") Action = ".tool-text" @@ -405,7 +423,7 @@ } { btnMagic ToolButton btnTool Name = "btnMagic" - MoveScaled(79,0,4,4) + MoveScaled(96,0,4,4) Tag = "magic" ToolTip = ("Magic wand") Action = ".tool-magic" @@ -414,7 +432,7 @@ } { btnEditSelection ToolButton btnTool Name = "btnEditSelection" - MoveScaled(83,0,4,4) + MoveScaled(100,0,4,4) Tag = "change" ToolTip = ("Edit selection") Action = ".tool-change" @@ -422,105 +440,86 @@ Toggle = True } { Separator8 Separator - MoveScaled(87,0,1,4) + MoveScaled(104,0,1,4) } { btnHide ToolButton - MoveScaled(89,0,4,4) + MoveScaled(106,0,4,4) ToolTip = ("Hide selection") Action = ".hide" Picture = Picture["img/draw/hide.png"] } { btnInvert ToolButton - MoveScaled(92,0,4,4) + MoveScaled(109,0,4,4) ToolTip = ("Invert selection") Action = ".invert" Picture = Picture["img/draw/invert.png"] } { btnDuplicate ToolButton - MoveScaled(95,0,4,4) + MoveScaled(112,0,4,4) ToolTip = ("Duplicate selection") Action = ".duplicate" Picture = Picture["img/draw/duplicate.png"] } { btnOffset ToolButton - MoveScaled(99,0,4,4) + MoveScaled(116,0,4,4) ToolTip = ("Offset selection") Action = ".offset" Picture = Picture["img/draw/offset.png"] } { Separator5 Separator - MoveScaled(104,0,1,4) + MoveScaled(121,0,1,4) } { btnStroke ToolButton - MoveScaled(105,0,4,4) + MoveScaled(122,0,4,4) ToolTip = ("Stroke") Action = ".stroke" Picture = Picture["img/draw/draw-brush.png"] } { btnFill ToolButton - MoveScaled(109,0,4,4) + MoveScaled(126,0,4,4) ToolTip = ("Fill") Action = ".fill" Picture = Picture["icon:/small/fill"] } { btnClear ToolButton - MoveScaled(113,0,4,4) + MoveScaled(130,0,4,4) ToolTip = ("Clear") Action = ".clear" Picture = Picture["img/draw/draw-eraser.png"] } { Separator7 Separator - MoveScaled(117,0,1.1429,4) + MoveScaled(134,0,1.1429,4) } { btnCrop ToolButton - MoveScaled(118,0,4,4) - Visible = False + MoveScaled(135,0,4,4) ToolTip = ("Crop") Action = ".crop" Picture = Picture["img/draw/crop.png"] } { btnFlipH ToolButton - MoveScaled(121,0,4,4) - Visible = False + MoveScaled(138,0,4,4) ToolTip = ("Horizontal flip") Action = ".flip-h" Picture = Picture["img/draw/hflip.png"] } { btnFlipV ToolButton - MoveScaled(124,0,4,4) - Visible = False + MoveScaled(141,0,4,4) ToolTip = ("Vertical flip") Action = ".flip-v" Picture = Picture["img/draw/vflip.png"] } { btnRotateR ToolButton - MoveScaled(127,0,4,4) + MoveScaled(144,0,4,4) ToolTip = ("Rotate clockwise") Action = ".rotate-r" Picture = Picture["img/draw/rotate-right.png"] } { btnRotateL ToolButton - MoveScaled(130,0,4,4) + MoveScaled(147,0,4,4) ToolTip = ("Rotate counter-clockwise") Action = ".rotate-l" Picture = Picture["img/draw/rotate-left.png"] } - { btnResize ToolButton - MoveScaled(134,0,11,4) - ToolTip = ("Resize or stretch image") - Action = ".resize" - AutoResize = True - Text = ("Resize") & "..." - Picture = Picture["icon:/small/zoom-fit"] - } - { btnRotate ToolButton - MoveScaled(144,0,11,4) - ToolTip = ("Rotate image") - Action = ".rotate" - AutoResize = True - Text = ("Rotate") & "..." - Picture = Picture["icon:/small/rotate-right"] - } } { Separator1 Separator MoveScaled(68,9,18,0) @@ -544,8 +543,8 @@ } } { timSelect #Timer - #MoveScaled(106,20) - Delay = 50 + #MoveScaled(108,20) + Delay = 200 } } } @@ -607,6 +606,7 @@ { Action hide-selection Text = "Hide selection" Shortcut = "Esc" + Picture = "img/draw/hide.png" } { Action invert Text = "Invert selection" @@ -636,12 +636,12 @@ { Action resize Text = "Resize" Shortcut = "" - Picture = "icon:/small/zoom-fit" + Picture = "img/draw/resize.png" } { Action rotate Text = "Rotate" Shortcut = "" - Picture = "icon:/small/rotate-right" + Picture = "img/draw/rotate.png" } { Action rotate-l Text = "Rotate counter-clockwise" @@ -752,7 +752,7 @@ { Toolbars { Toolbar image Text = "Image editor" - List = "save,reload,undo,redo,zoom-in,zoom,zoom-out,zoom-normal,zoom-fit,draw-grid,copy,cut,tool-paste,tool-move,tool-draw,tool-erase,tool-line,tool-rectangle,tool-ellipse,tool-text,tool-magic,tool-change,hide,invert,duplicate,offset,stroke,fill,clear,crop,flip-h,flip-v,rotate-r,rotate-l,resize,rotate" - Default = "save,reload,undo,redo,|,zoom-in,zoom,zoom-out,zoom-normal,zoom-fit,draw-grid,|,copy,cut,tool-paste,|,tool-move,tool-draw,tool-erase,|,tool-line,tool-rectangle,tool-ellipse,tool-text,tool-magic,tool-change,|,hide,invert,duplicate,offset,|,stroke,fill,clear,|,rotate-r,rotate-l,resize,rotate" + List = "save,reload,undo,redo,zoom-in,zoom,zoom-out,zoom-normal,zoom-fit,draw-grid,resize,rotate,copy,cut,tool-paste,tool-move,tool-draw,tool-erase,tool-line,tool-rectangle,tool-ellipse,tool-text,tool-magic,tool-change,hide,invert,duplicate,offset,stroke,fill,clear,crop,flip-h,flip-v,rotate-r,rotate-l" + Default = "save,reload,undo,redo,|,zoom-in,zoom,zoom-out,zoom-normal,zoom-fit,draw-grid,|,copy,cut,tool-paste,|,tool-move,tool-draw,tool-erase,tool-line,tool-rectangle,tool-ellipse,tool-text,tool-magic,tool-change,|,hide,invert,duplicate,offset,|,stroke,fill,clear,|,crop,flip-h,flip-v,rotate-r,rotate-l" } } diff --git a/app/src/gambas3/.src/Editor/Image/FImageProperty.class b/app/src/gambas3/.src/Editor/Image/FImageProperty.class index 0671907bc..6aeaecd70 100644 --- a/app/src/gambas3/.src/Editor/Image/FImageProperty.class +++ b/app/src/gambas3/.src/Editor/Image/FImageProperty.class @@ -1277,7 +1277,17 @@ End Public Sub RefreshTextOption() - GetCurrent().UpdateText(txtText.Text, fchText.Value) + Dim iAlign As Integer + + If btnAlignCenter.Value Then + iAlign = Align.Center + Else If btnAlignRight.Value Then + iAlign = Align.Right + Else + iAlign = Align.Left + Endif + + GetCurrent().UpdateText(txtText.Text, fchText.Value, iAlign) End @@ -1293,3 +1303,22 @@ Public Sub fchText_Change() RefreshTextOption End + +Public Sub btnAlignLeft_Click() + + RefreshTextOption + + +End + +Public Sub btnAlignCenter_Click() + + RefreshTextOption + +End + +Public Sub btnAlignRight_Click() + + RefreshTextOption + +End diff --git a/app/src/gambas3/.src/Editor/Image/FImageProperty.form b/app/src/gambas3/.src/Editor/Image/FImageProperty.form index b3dbe4146..fdf4718cc 100644 --- a/app/src/gambas3/.src/Editor/Image/FImageProperty.form +++ b/app/src/gambas3/.src/Editor/Image/FImageProperty.form @@ -431,12 +431,46 @@ MoveScaled(3,126,60,22) Visible = False Margin = True - { fchText FontChooser - MoveScaled(1,1,57,8) - Border = False + { Panel11 HBox + MoveScaled(1,1,58,8) + { HPanel11 HPanel + MoveScaled(1,0,12,8) + { Label14 Label + MoveScaled(1,0,6,4) + Expand = True + Text = ("Font") + } + { btnAlignLeft ToolButton + MoveScaled(0,4,4,4) + ToolTip = ("Left align") + Picture = Picture["icon:/small/text-left"] + Radio = True + Toggle = True + Value = True + } + { btnAlignCenter ToolButton + MoveScaled(4,4,4,4) + ToolTip = ("Center align") + Picture = Picture["icon:/small/text-center"] + Radio = True + Toggle = True + } + { btnAlignRight ToolButton + MoveScaled(8,4,4,4) + ToolTip = ("Right align") + Picture = Picture["icon:/small/text-right"] + Radio = True + Toggle = True + } + } + { fchText FontChooser + MoveScaled(19,0,38,8) + Expand = True + Border = False + } } { txtText TextArea - MoveScaled(1,11,54,7) + MoveScaled(1,15,54,7) Expand = True } } diff --git a/app/src/gambas3/.src/FMain.form b/app/src/gambas3/.src/FMain.form index 0f107d4c0..6f63c66bd 100644 --- a/app/src/gambas3/.src/FMain.form +++ b/app/src/gambas3/.src/FMain.form @@ -190,7 +190,7 @@ Name = "Menu21" #Translate = False Text = "QT4" - Tag = "gb.qt" + Tag = "gb.qt4" } { Menu27 Menu mnuSetGUI Name = "Menu27" diff --git a/app/src/gambas3/.src/Project/FProjectProperty.class b/app/src/gambas3/.src/Project/FProjectProperty.class index de33e0dee..ca7ecf215 100644 --- a/app/src/gambas3/.src/Project/FProjectProperty.class +++ b/app/src/gambas3/.src/Project/FProjectProperty.class @@ -409,7 +409,6 @@ Private Sub RefreshComponents() Endif gvwComponent.Rows.Count = $aComp.Count - gvwComponent.Columns[1].Width = -1 tabProject_Arrange @@ -1248,6 +1247,8 @@ Public Sub tabProject_Arrange() gvwLibrary.Rows[I].H = -1 Next + gvwComponent.Columns[1].Width = -1 + End Public Sub gvwComponent_MouseMove() diff --git a/app/src/gambas3/img/background/cross.png b/app/src/gambas3/img/background/cross.png new file mode 100644 index 0000000000000000000000000000000000000000..16753deecd76ab5578b08d4392e4f1e4a992420f GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8wRq z_>O=u<5X=vX`rB~r;B4qMC;p&8+n1cSsY3X)5?v-H!w+0+WqfjeFsCs!%fu*|1&Ob m?Am$#(`C&d)Bmgt2UzzQFt$w9`TZMc0E4HipUXO@geCyuz$>8u literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/background/list b/app/src/gambas3/img/background/list index bee79b96b..4fc91fd4e 100644 --- a/app/src/gambas3/img/background/list +++ b/app/src/gambas3/img/background/list @@ -14,6 +14,8 @@ smoke hose star point +cross circle vline -hline \ No newline at end of file +hline +square \ No newline at end of file diff --git a/app/src/gambas3/img/background/square.png b/app/src/gambas3/img/background/square.png new file mode 100644 index 0000000000000000000000000000000000000000..955f348f507b77002984327acc4bcbfd5fc86607 GIT binary patch literal 333 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8wRq z_>O=u<5X=vX`tYHPZ!6Kh}NSQY`Izt1RNf|kyzXjaifxze`C0?{!7s}Ixa`%zsOP4 z*z`(m!{n85KMz)mx_*qiF3QN@yIY65YF>KmT2n90?_7#31&^Y#S^Q$WI*+ky6g*}Q z*>RE4t7hKw=ge1jy#M{3J?6o7_Lzs$*<&7EHkr%6f^Z5fF2a4R4FK8@}Ew4QwDtG+j zcgE=zx3@iKUiVSOvyWM(;3hU>wr$NIlbvI1AAQP)v^Ze^PgoJh4oJh a+0Q6kHLK?SL0~vAFnGH9xvXUw literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/draw/hide.png b/app/src/gambas3/img/draw/hide.png index f06916afbaf77bddd639b629497bfd72b0e3e5bc..d46433e0c627979f5aefd35ceaf24d1dfbfe2dc4 100644 GIT binary patch delta 106 zcmV-w0G0o-0jvR#Nn=h)L_t(IjqQ^$3IHGs1FIkF*OQmUMMVS$t>EHKg^~~&ngGZu z?%qZtX(P+sXs`ypZ6z!LRW`jVb!h1#{*y5vn)OfdBvi M07*qoM6N<$f=@6luK)l5 delta 111 zcmV-#0FeKz0kHv)NoZ3^L_t(IjqQ`c3cw%?L*wwj`s>M;#f!oi$k2M&VeeFE32j0P zNuv`Hql6^fnf6F}7m~h^q}cZR*qrnRd4Z?fD@gjn30Z+Z#se|dp#yYCt(;~Zvt1TqN+`xaa5;2=5R zGYEpyLk!;XJipr8AP9mna623hkGF-2KiUljgLe^mo=&IZZ4E?Zc?M9`8t@__U)5^$ zrr+;>Z`f`kf{BZoHJRT>KKC$Lqxo@0D!PG^#i^EQc4gJ^NU?TjByF_8es+EzJUj!S(Rta zY^|Y`;@6v*yQNxdA3k&i-K=O9XS)Y?24nJ z@ErkR#;MwT(m=uIo-U3d7QIU+2lgE@;BiS;TE|qQ+rd5Ip3b?GvkDqr--JKZleAM< z5p}DBtKL=WcjY6C1JfNDCM-!4I%%03%5Qkg{9<+gy4SP#?#v13R{eRD!E<}mn>p6H zOdh{fcbaXMJ{jX>S;zC?-r+NR-U@j!F}bsEG9H-u#Ohduth1M?iw1HLSGW|8xt({hCevkNFlpS#nI- SAnXg!%M6~belF{r5}E)MHho|K literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/draw/rotate.png b/app/src/gambas3/img/draw/rotate.png new file mode 100644 index 0000000000000000000000000000000000000000..acabeb1948a769389886185193c17711075e95d1 GIT binary patch literal 458 zcmV;*0X6=KP)Dk}+$-Kp2MK?>KDx3xq)F z{dpOK`{Yb#fw?Pm90NU*~>h=0-sZ`1h9|<;_O>N)Vwrvp6T~Rn)Aq@dIgpnHf ziJ)9Ae_56V0GQ9`FvdL74gf?%9y7at3WN|Zj^h9T27>`+v)N6OBxbwan(1`v^?E%J zk(c>R;IKgNqtU3gA7+|Hqk&edbyOw2NSDmqUn~~2$z+1%atR`WWm#|>2bD_YQ%Y%P z+V>b^&YAg9DfJ%5aT3RIqLd1m`GJ|wa>M`O2M3?ta%MpBzW@LL07*qoM6N<$f|RSv Ae*gdg literal 0 HcmV?d00001 diff --git a/comp/src/gb.form/.info b/comp/src/gb.form/.info index 59d6353a8..52a02f286 100644 --- a/comp/src/gb.form/.info +++ b/comp/src/gb.form/.info @@ -2142,10 +2142,54 @@ EnsureCurrentVisible_Timer m +_GetFirstIndex +m +i + TabBar_Arrange m +Arrow_Enter +m + + +Arrow_Leave +m + + +Arrow_Draw +m + + +_GetBackground +m +i + +Arrow_MouseDown +m + + +_MoveNext +m + + +_MovePrevious +m + + +Arrow_MouseUp +m + + +TimerRepeat_Timer +m + + +Arrow_DblClick +m + + Remove m @@ -2170,22 +2214,6 @@ TabBarContainer_Draw m -TabBar_Draw -m - - -_GetBackground -m -i - -TabBar_MouseDown -m - - -TabBar_DblClick -m - - Panel_Draw m @@ -2194,22 +2222,10 @@ _SetVisible m (Index)i(bVisible)b -_MoveNext -m - - -_MovePrevious -m - - _IsVisible m b (Index)i -_GetFirstIndex -m -i - _Close m diff --git a/comp/src/gb.form/.project b/comp/src/gb.form/.project index 55bf4030b..825f0db25 100644 --- a/comp/src/gb.form/.project +++ b/comp/src/gb.form/.project @@ -1,7 +1,7 @@ # Gambas Project File 3.0 # Compiled with Gambas 3.5.90 Title=More controls for graphical components -Startup=FFont +Startup=FTabPanel Version=3.5.90 VersionFile=1 Component=gb.image @@ -9,7 +9,7 @@ Component=gb.gui Component=gb.form Component=gb.settings Authors="Benoît Minisini" -Environment="GB_GUI=gb.qt" +Environment="GB_GUI=gb.gtk" TabSize=2 Translate=1 Language=en diff --git a/comp/src/gb.form/.src/TabPanel/TabPanel.class b/comp/src/gb.form/.src/TabPanel/TabPanel.class index e440c52b4..bfada08a2 100644 --- a/comp/src/gb.form/.src/TabPanel/TabPanel.class +++ b/comp/src/gb.form/.src/TabPanel/TabPanel.class @@ -28,7 +28,7 @@ Private $hTabBarContainer As DrawingArea 'Private $hLeftArrow As DrawingArea 'Private $hRightArrow As DrawingArea Private $X As Integer -Private $bArrow As Boolean +'Private $bArrow As Boolean Private $aCont As New _TabPanelContainer[] Private $aButton As New _TabPanelButton[] @@ -40,9 +40,15 @@ Private $iCurrent As Integer = -1 Private $hPanel As DrawingArea Private $hTimerEnsureVisible As Timer +Private $hTimerRepeat As Timer +Private $iRepeatInc As Integer +Private $iRepeatStart As Integer Private Const ARROW_WIDTH As Integer = 12 +Private $hRightArrow As DrawingArea +Private $hLeftArrow As DrawingArea + Public Sub _new() $hTabBar = New DrawingArea(Me) As "TabBar" @@ -58,6 +64,13 @@ Public Sub _new() $hTabBarContainer = New DrawingArea($hTabBar) As "TabBarContainer" $hTabBarContainer.Focus = True + + $hRightArrow = New DrawingArea($hTabBar) As "Arrow" + $hRightArrow.Ignore = True + $hRightArrow.Mouse = Mouse.Pointing + $hLeftArrow = New DrawingArea($hTabBar) As "Arrow" + $hLeftArrow.Ignore = True + $hLeftArrow.Mouse = Mouse.Pointing $hPanel = New DrawingArea(Me) As "Panel" $hPanel.Expand = True @@ -83,6 +96,7 @@ End Public Sub EnsureCurrentVisible_Timer() Dim X, W As Integer + Dim iLeftIndex, iRightIndex As Integer $hTimerEnsureVisible = Null @@ -103,8 +117,8 @@ Public Sub EnsureCurrentVisible_Timer() If X < ARROW_WIDTH Then W += ARROW_WIDTH - X - Else If X >= ($hTabBar.W - .W) Then - W -= X - ($hTabBar.W - .W) + Else If X >= ($hTabBar.W - .W - ARROW_WIDTH) Then + W -= X - ($hTabBar.W - .W - ARROW_WIDTH) Endif 'M = .X + W - $hTabBar.W + ARROW_WIDTH @@ -119,20 +133,11 @@ Public Sub EnsureCurrentVisible_Timer() '$X = Max($hTabBar.W - $hTabBarContainer.W, $X) '$X = Min(ARROW_WIDTH, $X) - If $aButton.Count Then - With $aButton[$aButton.Max] - $bArrow = ($X + .X) < 0 - End With - Else - $bArrow = False - Endif - Else If Me.W <= ($aButton[$iCurrent].W + ARROW_WIDTH) Then $X = - $aButton[$iCurrent].X - $bArrow = False Else @@ -144,8 +149,8 @@ Public Sub EnsureCurrentVisible_Timer() X = $hTabBarContainer.X + .X W = .W - If X < 4 Then - $X = $X + 4 - X + If X < ARROW_WIDTH Then + $X = $X + ARROW_WIDTH - X X = $X + .X Endif @@ -155,10 +160,6 @@ Public Sub EnsureCurrentVisible_Timer() $X -= ARROW_WIDTH Endif - 'M = .X + W - $hTabBar.W + ARROW_WIDTH - 'If $iCurrent < $aButton.Max Then M += ARROW_WIDTH - '$X = Max($X, - M) - End With Endif @@ -170,22 +171,45 @@ Public Sub EnsureCurrentVisible_Timer() W = Me.W - $X - If $aButton.Count Then - With $aButton[$aButton.Max] - $bArrow = ($X + .X + .W) > $hTabBar.W - End With - Else - $bArrow = False - Endif - Endif - If $bArrow Then - W -= ARROW_WIDTH - If System.RightToLeft Then $X += ARROW_WIDTH - Endif + '$bArrow = False + + ' If $bArrow Then + ' W -= ARROW_WIDTH + ' If System.RightToLeft Then $X += ARROW_WIDTH + ' Endif $hTabBarContainer.Move($X, 0, W, $hTabBar.H) + + If $hTabBar.W >= (ARROW_WIDTH * 3) And If $aButton.Count Then + If System.RightToLeft Then + iLeftIndex = GetLastIndex() + iRightIndex = _GetFirstIndex() + Else + iLeftIndex = _GetFirstIndex() + iRightIndex = GetLastIndex() + Endif + $hLeftArrow.Visible = $X < (- $aButton[iLeftIndex].X) '+ $aButton[iIndex].X + $aButton[iIndex].W) > $hTabBar.W + $hRightArrow.Visible = ($X + $aButton[iRightIndex].X + $aButton[iRightIndex].W) > $hTabBar.W + Else + $hLeftArrow.Hide + $hRightArrow.Hide + Endif + + CheckMouse + +End + +Private Sub CheckMouse() + + Dim hButton As _TabPanelButton + + If Not $bClosable Then Return + + For Each hButton In $aButton + hButton.Update + Next End @@ -223,8 +247,88 @@ Public Sub TabBar_Arrange() _EnsureCurrentVisible + $hRightArrow.Move($hTabBar.W - ARROW_WIDTH, 0, ARROW_WIDTH, $hTabBar.H) + $hLeftArrow.Move(0, 0, ARROW_WIDTH, $hTabBar.H) + End +Public Sub Arrow_Enter() + + Last.Refresh + +End + +Public Sub Arrow_Leave() + + Last.Refresh + $hTimerRepeat = Null + +End + +Public Sub Arrow_Draw() + + Paint.FillRect(0, 0, Paint.W, Paint.H - 1, _GetBackground()) + Style.PaintArrow(0, 0, Paint.W, Paint.H, If(Last = $hLeftArrow, Align.Left, Align.Right), Style.StateOf(Last)) + +End + +Public Sub Arrow_MouseDown() + + If Mouse.Left Then + + If Last = $hRightArrow Xor System.RightToLeft Then + Try _MoveNext() + $iRepeatInc = 1 + Else + Try _MovePrevious() + $iRepeatInc = -1 + Endif + + $hTimerRepeat = New Timer As "TimerRepeat" + $hTimerRepeat.Delay = 100 + $hTimerRepeat.Start + $iRepeatStart = 0 + + Endif + +End + +Public Sub Arrow_MouseUp() + + $hTimerRepeat = Null + +End + +Public Sub TimerRepeat_Timer() + + If $iRepeatStart < 3 Then + Inc $iRepeatStart + Else + If $iRepeatInc > 0 Then + Try _MoveNext() + Else + Try _MovePrevious() + Endif + If Error Then $hTimerRepeat = Null + Endif + +End + + +Public Sub Arrow_DblClick() + + If Mouse.Left Then + If Last = $hRightArrow Then + Try Me.Index = GetLastIndex() + Else + Try Me.Index = _GetFirstIndex() + Endif + Endif + +End + + + Private Function Count_Read() As Integer Return $aCont.Count @@ -486,77 +590,6 @@ Public Sub TabBarContainer_Draw() End -Public Sub TabBar_Draw() - - Dim X As Integer - - If $bArrow Then - - If System.RightToLeft Then - - X = ARROW_WIDTH - - If $bHighlight Then - Draw.FillRect(0, 0, ARROW_WIDTH, $hTabBar.H, _GetBackground()) - Endif - - Draw.Foreground = Color.LightForeground - Draw.Style.Arrow(0, 0, 8, $hTabBar.H, Align.Left) - Select Case $iOrientation - Case Align.Top - Draw.Line(X, $hTabBarContainer.H - 1, 0, $hTabBar.H - 1) - Case Align.Bottom - Draw.Line(X, 0, 0, 0) - End Select - - Else - - X = $hTabBar.W - ARROW_WIDTH - - If $bHighlight Then - Draw.FillRect(X, 0, ARROW_WIDTH, $hTabBar.H, _GetBackground()) - Endif - - Draw.Foreground = Color.LightForeground - Draw.Style.Arrow($hTabBar.W - 8, 0, 8, $hTabBar.H, Align.Right) - Select Case $iOrientation - Case Align.Top - Draw.Line(X, $hTabBarContainer.H - 1, $hTabBar.W - 1, $hTabBar.H - 1) - Case Align.Bottom - Draw.Line(X, 0, $hTabBar.W - 1, 0) - End Select - - Endif - - Endif - -End - -Public Sub TabBar_MouseDown() - - If Mouse.Left And If $bArrow Then - If System.RightToLeft Then - If Mouse.X < 6 Then Try Inc Me.Index - Else - If Mouse.X >= ($hTabBar.W - 6) Then Try Inc Me.Index - Endif - Endif - -End - -Public Sub TabBar_DblClick() - - If Mouse.Left And If $bArrow Then - If System.RightToLeft Then - If Mouse.X < 6 Then Try Me.Index = Me.Count - 1 - Else - If Mouse.X >= ($hTabBar.W - 6) Then Try Me.Index = Me.Count - 1 - Endif - Endif - -End - - Public Sub Panel_Draw() If $bBorder Then diff --git a/comp/src/gb.form/.src/TabPanel/_TabPanelButton.class b/comp/src/gb.form/.src/TabPanel/_TabPanelButton.class index 94fcb2d9d..5f06d4ddc 100644 --- a/comp/src/gb.form/.src/TabPanel/_TabPanelButton.class +++ b/comp/src/gb.form/.src/TabPanel/_TabPanelButton.class @@ -208,6 +208,7 @@ Private Sub Selected_Write(Value As Boolean) $bSelected = Value SetMouse + DrawingArea_MouseMove $hDrawingArea.Refresh End @@ -296,21 +297,39 @@ End Public Sub DrawingArea_MouseMove() Dim bInClose As Boolean + Dim X As Integer + Dim bShowClose As Boolean - If System.RightToLeft Then - bInClose = (Mouse.ScreenX - Me.ScreenX) < BUTTON_SIZE - Else - bInClose = (Mouse.ScreenX - Me.ScreenX) > (Me.W - BUTTON_SIZE - 1) + X = Mouse.ScreenX - Me.ScreenX + + If X >= 0 And If X < Me.W Then + bShowClose = GetParent().Closable + + If bShowClose Then + If System.RightToLeft Then + bInClose = (X >= 0) And (X < BUTTON_SIZE) + Else + bInClose = (X >= (Me.W - BUTTON_SIZE)) And (X < Me.W) + Endif + Endif Endif - If bInClose <> $bInClose Then + If bInClose <> $bInClose Or If bShowClose <> $bShowClose Then $bInClose = bInClose + $bShowClose = bShowClose SetMouse $hDrawingArea.Refresh Endif End +Public Sub Update() + + DrawingArea_MouseMove + +End + + Private Function RichText_Read() As String If $bRichText Then Return $sText diff --git a/comp/src/gb.form/.src/Test/FTabPanel.class b/comp/src/gb.form/.src/Test/FTabPanel.class index b667c1d95..ab466a5b5 100644 --- a/comp/src/gb.form/.src/Test/FTabPanel.class +++ b/comp/src/gb.form/.src/Test/FTabPanel.class @@ -22,4 +22,10 @@ Public Sub Form_Open() TabPanel2[I].Text = "Tab " & (I + 1) Next +End + +Public Sub Form_DblClick() + + + End diff --git a/comp/src/gb.form/.src/Test/FTabPanel.form b/comp/src/gb.form/.src/Test/FTabPanel.form index b3fd72241..49c087f4a 100644 --- a/comp/src/gb.form/.src/Test/FTabPanel.form +++ b/comp/src/gb.form/.src/Test/FTabPanel.form @@ -11,18 +11,20 @@ MoveScaled(5,7,36,23) #Translate = False Expand = True + Closable = True Highlight = True Index = 0 Text = "" Index = 0 } { TabPanel1 TabPanel - MoveScaled(4,33,53,23) + MoveScaled(4,33,30,23) #Translate = False Background = &HFFFF00& Expand = True Border = False - Count = 3 + Count = 5 + Closable = True Highlight = True Index = 0 Text = "Tab 1" @@ -30,6 +32,10 @@ Text = "Tab 2" Index = 2 Text = "Tab 3" + Index = 3 + Text = "Tab 4" + Index = 4 + Text = "Tab 5" Index = 0 } { TabStrip1 TabStrip @@ -37,11 +43,11 @@ Background = &HFF7F7F& Count = 4 Index = 0 - Text = ("TabStrip1") + Text = ("&TabStrip1") Index = 1 - Text = ("") + Text = ("&Bonbon") Index = 2 - Text = ("") + Text = ("&Charles") Index = 3 Text = ("") Index = 0 diff --git a/examples/examples/Games/BeastScroll/.project b/examples/examples/Games/BeastScroll/.project index ad9d4b581..ef0505784 100644 --- a/examples/examples/Games/BeastScroll/.project +++ b/examples/examples/Games/BeastScroll/.project @@ -3,7 +3,7 @@ Title=BeastScroll Startup=MMain Icon=logo.png -Version=3.5.0 +Version=3.5.90 VersionFile=1 Component=gb.image Component=gb.image.io diff --git a/examples/examples/Games/BeastScroll/.src/MMain.module b/examples/examples/Games/BeastScroll/.src/MMain.module index 514be5974..1d4083efe 100644 --- a/examples/examples/Games/BeastScroll/.src/MMain.module +++ b/examples/examples/Games/BeastScroll/.src/MMain.module @@ -36,7 +36,7 @@ Public Sub Main() .Show() End With - music.Load("b-title.mod") + Music.Load("b-title.mod") ciel = image.Load("bgd1_ciel.png") nuage1 = image.Load("sprite_nuages1.png") @@ -64,13 +64,13 @@ Public Sub Main() scroll5b = Rnd(0, 640) scroll6 = 0 - music.Play(-1, 1) + Music.Play(-1, 1) End Public Sub Screen_Draw() - Dim hImage As Image + 'Dim hImage As Image 'Screen.Clear diff --git a/examples/examples/OpenGL/GambasGears/.project b/examples/examples/OpenGL/GambasGears/.project index 3a36dbe3b..734fef00b 100644 --- a/examples/examples/OpenGL/GambasGears/.project +++ b/examples/examples/OpenGL/GambasGears/.project @@ -3,7 +3,7 @@ Title=GambasGears Startup=Module1 Icon=gears.png -Version=3.5.0 +Version=3.5.90 VersionFile=1 Component=gb.image Component=gb.image.io diff --git a/examples/examples/OpenGL/Md2Model/.settings b/examples/examples/OpenGL/Md2Model/.settings index 4bf5f55c8..68c219b3a 100644 --- a/examples/examples/OpenGL/Md2Model/.settings +++ b/examples/examples/OpenGL/Md2Model/.settings @@ -98,7 +98,7 @@ SearchString=True [OpenFile] File[1]=".src/FMain.form" Active=2 -File[2]=".src/FMain.class:17.0" +File[2]=".src/FMain.class:77.15" Count=2 [Watches] diff --git a/examples/examples/OpenGL/TunnelSDL/.project b/examples/examples/OpenGL/TunnelSDL/.project index 23a9da040..46bc43b06 100644 --- a/examples/examples/OpenGL/TunnelSDL/.project +++ b/examples/examples/OpenGL/TunnelSDL/.project @@ -3,7 +3,7 @@ Title=TunnelSDL Startup=MMain Icon=tunnelsdl.png -Version=3.5.0 +Version=3.5.90 VersionFile=1 Component=gb.image Component=gb.image.io diff --git a/examples/examples/OpenGL/TunnelSDL/.startup b/examples/examples/OpenGL/TunnelSDL/.startup index dd9a726eb..422a4e6cd 100644 --- a/examples/examples/OpenGL/TunnelSDL/.startup +++ b/examples/examples/OpenGL/TunnelSDL/.startup @@ -2,7 +2,7 @@ MMain TunnelSDL 0 0 -3.5.0 +3.5.90 gb.image gb.image.io