From fd60cd1bec1c19f795dbeeea325c503d15b3b918 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Minisini?= Date: Wed, 17 Jun 2015 21:25:02 +0000 Subject: [PATCH] [DEVELOPMENT ENVIRONMENT] * NEW: Database editor: The import CSV dialog is now a wizard. [GB.DB] * BUG: Fix a crash when creating twice the same table with the same connection. [GB.FORM] * NEW: Spinner: Display the label below the rotating spinner. * NEW: Spinner.Wait() is a new method that calls the event loop, and ensures that it is not called more than every 200 milliseconds. * BUG: Wizard: Animation is correct now when the Border property is set. [GB.QT4] * BUG: Showing a window now automatically raises it. [GB.QT5] * BUG: Showing a window now automatically raises it. git-svn-id: svn://localhost/gambas/trunk@7138 867c0c6c-44f3-4631-809d-bfa615b0a4ec --- app/src/gambas3/.src/CWaitingAnimation.class | 27 ++-- .../.src/Connection/FImportTable.class | 131 ++++++++++++------ .../gambas3/.src/Connection/FImportTable.form | 54 +++----- .../gambas3/.src/Connection/FPasteTable.class | 2 +- .../Editor/Connection/FConnectionEditor.class | 9 +- .../gambas3/.src/Packager/FMakeInstall.form | 2 +- comp/src/gb.form/.info | 4 + comp/src/gb.form/.project | 2 +- comp/src/gb.form/.src/Spinner.class | 56 ++++++-- comp/src/gb.form/.src/Test/FSpinner.class | 1 + comp/src/gb.form/.src/Wizard/Wizard.class | 7 +- gb.qt4/src/CWindow.cpp | 2 +- main/lib/db/c_subcollection.c | 7 +- 13 files changed, 181 insertions(+), 123 deletions(-) diff --git a/app/src/gambas3/.src/CWaitingAnimation.class b/app/src/gambas3/.src/CWaitingAnimation.class index 4aaa0b034..bd01fb0f9 100644 --- a/app/src/gambas3/.src/CWaitingAnimation.class +++ b/app/src/gambas3/.src/CWaitingAnimation.class @@ -3,11 +3,11 @@ Property Read Cancelled As Boolean Private $hPanel As Panel -Private $hMovieBox As MovieBox Private $hLabel As Label Private $hButton As Button Private $bCancelled As Boolean Private $fLastWait As Float +Private $hSpinner As Spinner Private Sub DisableWindow(hWindow As Window, bDisable As Boolean) @@ -27,17 +27,24 @@ Public Sub _new(hWindow As Window, Optional bWithCancel As Boolean) With $hPanel .Ignore = True .Move((hWindow.ClientW - Desktop.Scale * 16) / 2, (hWindow.ClientH - Desktop.Scale * 16) / 2, Desktop.Scale * 16, Desktop.Scale * 16) - .Background = Color.LightForeground + '.Background = Color.LightForeground End With - $hMovieBox = New MovieBox($hPanel) - With $hMovieBox - .Alignment = Align.Center - .Background = Color.White - .Path = "img/waiting.gif" - .Playing = True - .Move(8, 8, $hPanel.W - 16, $hPanel.H - 16) - End With + $hSpinner = New Spinner($hPanel) + With $hSpinner + .Move(8, 8, $hPanel.W - 16, $hPanel.H - 16) + .Show + .Start + End With + + ' $hMovieBox = New MovieBox($hPanel) + ' With $hMovieBox + ' .Alignment = Align.Center + ' .Background = Color.White + ' .Path = "img/waiting.gif" + ' .Playing = True + ' .Move(8, 8, $hPanel.W - 16, $hPanel.H - 16) + ' End With $hLabel = New Label($hPanel) With $hLabel diff --git a/app/src/gambas3/.src/Connection/FImportTable.class b/app/src/gambas3/.src/Connection/FImportTable.class index 152658318..3ad5d7222 100644 --- a/app/src/gambas3/.src/Connection/FImportTable.class +++ b/app/src/gambas3/.src/Connection/FImportTable.class @@ -14,12 +14,12 @@ Private $iIgnore As Integer Private $iLine As Integer Private $bImport As Boolean +Private $bCancel As Boolean -Private Const REMOVE_ACC As String = "ÀÁÂÃÄÅàáâãäå[a]Ææ[ae]Çç[c]ÈÉÊËèéêë[e]ÌÍÎÏìíîï[i]Ññ[n]ÒÓÔÕÖòóôõö[o]ÙÚÛÜùúûü[u]Ýýÿ[y]ß[ss]°[]" +'Private Const REMOVE_ACC As String = "ÀÁÂÃÄÅàáâãäå[a]Ææ[ae]Çç[c]ÈÉÊËèéêë[e]ÌÍÎÏìíîï[i]Ññ[n]ÒÓÔÕÖòóôõö[o]ÙÚÛÜùúûü[u]Ýýÿ[y]ß[ss]°[]" -Static Public Function Run(hConn As Connection, aTable As String[], sPath As String) As Boolean +Static Public Function Run(hConn As Connection, aTable As String[]) As Boolean - $sPath = sPath $hConn = hConn $aTable = aTable Table = "" @@ -28,11 +28,9 @@ Static Public Function Run(hConn As Connection, aTable As String[], sPath As Str End -Public Sub btnOK_Click() +Public Sub wizImport_Close() DoImport - btnOK.Enabled = False - tabImport.Index = 2 End @@ -44,11 +42,12 @@ End Public Sub Form_Open() - fprImport.Path = $sPath - 'txtPath.Text = $sPath - + spnImport.Stop + + fchImport.Filter = ["*.csv", ("CSV files"), "*", ("All files")] + fchImport.Value = Settings["/Connection/ImportPath"] + cmbTable.List = $aTable - cmbTable.Text = File.BaseName($sPath) txtPreview.Font = Font[Settings["/Editor/Font", Project.DEFAULT_FONT]] @@ -57,12 +56,6 @@ Public Sub Form_Open() gvwMessage.Columns[0].Width = Desktop.Scale * 6 gvwMessage.Columns[1].Text = ("Message") - cmbCharset.Text = Project.Config["/FImportTable/Charset", "UTF-8"] - cmbEndOfLine.Text = Project.Config["/FImportTable/EndOfLine", "Unix"] - cmbDelim.Text = Project.Config["/FImportTable/Delim", ","] - cmbEscape.Text = Project.Config["/FImportTable/Escape", Chr$(34)] - chkStrip.Value = Project.Config["/FImportTable/StripSpace", False] - txtIgnore.Value = Project.Config["/FImportTable/Ignore", 0] Settings.Read(Me) End @@ -108,6 +101,8 @@ Private Sub UpdateKey() Dim iLine As Integer Dim sData As String + If wizImport.Index < 1 Then Return + UpdateDelim hFile = Open $sPath @@ -177,9 +172,13 @@ Private Sub DoMessage(sMsg As String, Optional bNoLine As Boolean) gvwMessage.Rows.Count = iRow + 1 If Not bNoLine Then gvwMessage[iRow, 0].Text = CStr($iLine) - gvwMessage[iRow, 1].Text = sMsg + If sMsg Begins "** " Then + gvwMessage[iRow, 1].Text = Mid$(sMsg, 3) + gvwMessage[iRow, 1].Foreground = Color.Red + Else + gvwMessage[iRow, 1].Text = sMsg + Endif - If tabImport.Index <> 2 Then tabImport.Index = 2 Wait End @@ -188,11 +187,6 @@ End Private Function TransformField(sName As String) As String Dim iInd As Integer - Dim sCar As String - Dim iPos As Integer - Dim iPosL As Integer - Dim iPosR As Integer - Dim sNewName As String sName = Trim(sName) @@ -202,20 +196,20 @@ Private Function TransformField(sName As String) As String Endif Next - For iInd = 1 To String.Len(sName) - sCar = String.Mid$(sName, iInd, 1) - iPos = InStr(REMOVE_ACC, sCar) - If iPos Then - iPosL = InStr(REMOVE_ACC, "[", iPos + 1) - iPosR = InStr(REMOVE_ACC, "]", iPos + 1) - If iPosL <> 0 And If iPosR <> 0 And If iPosL < iPosR Then - sCar = Mid$(REMOVE_ACC, iPosL + 1, iPosR - iPosL - 1) - Endif - Endif - sNewName &= sCar - Next - - Return sNewName + ' For iInd = 1 To String.Len(sName) + ' sCar = String.Mid$(sName, iInd, 1) + ' iPos = InStr(REMOVE_ACC, sCar) + ' If iPos Then + ' iPosL = InStr(REMOVE_ACC, "[", iPos + 1) + ' iPosR = InStr(REMOVE_ACC, "]", iPos + 1) + ' If iPosL <> 0 And If iPosR <> 0 And If iPosL < iPosR Then + ' sCar = Mid$(REMOVE_ACC, iPosL + 1, iPosR - iPosL - 1) + ' Endif + ' Endif + ' sNewName &= sCar + ' Next + + Return Util.RemoveAccents(sName) End @@ -306,9 +300,10 @@ Private Sub DoImport() Dim sKey As String Dim nImport As Integer Dim sDestCharset As String - Dim hWaiting As CWaitingAnimation $bImport = True + $bCancel = False + gvwMessage.Rows.Count = 0 hConn = $hConn sTable = Trim(cmbTable.Text) @@ -316,7 +311,7 @@ Private Sub DoImport() UpdateDelim - hWaiting = New CWaitingAnimation(Me, True) + spnImport.Start If hConn.IgnoreCharset Then sDestCharset = "UTF-8" @@ -407,14 +402,15 @@ Private Sub DoImport() rData.Update Inc nImport - hWaiting.SetValue(Seek(hFile) / Lof(hFile)) - If hWaiting.Cancelled Then Error.Raise(("Cancelled by user")) + spnImport.Value = Seek(hFile) / Lof(hFile) + spnImport.Wait + If $bCancel Then Error.Raise(("Cancelled by user")) Wend - hWaiting.SetValue(1) + spnImport.Value = 1 hConn.Commit - hWaiting.Stop + spnImport.Stop If nImport = 0 Then DoMessage(("No record imported.")) @@ -429,6 +425,7 @@ Private Sub DoImport() Finally Close #hFile + spnImport.Stop $bImport = False Catch @@ -459,8 +456,52 @@ Public Sub Form_Close() End -Public Sub tabImport_Click() +Public Sub wizImport_BeforeChange() - If tabImport.Index = 0 Then btnOK.Enabled = True + Select Case wizImport.Index + + Case 0 + $sPath = fchImport.SelectedPath + If Not Exist($sPath) Then Stop Event + + cmbCharset.Text = Project.Config["/FImportTable/Charset", "UTF-8"] + cmbEndOfLine.Text = Project.Config["/FImportTable/EndOfLine", "Unix"] + cmbDelim.Text = Project.Config["/FImportTable/Delim", ","] + cmbEscape.Text = Project.Config["/FImportTable/Escape", Chr$(34)] + chkStrip.Value = Project.Config["/FImportTable/StripSpace", False] + txtIgnore.Value = Project.Config["/FImportTable/Ignore", 0] + cmbTable.Text = File.BaseName($sPath) + + End Select + +End + +Public Sub wizImport_Cancel() + + If $bImport Then + $bCancel = True + Else + Me.Close + Endif + +End + +Public Sub wizImport_Arrange() + + spnImport.Move((wizImport.ClientW - spnImport.W) \ 2, (wizImport.ClientH - spnImport.H) \ 2) + +End + +Public Sub fchImport_Activate() + + wizImport.MoveNext + +End + +Public Sub wizImport_Change() + + If wizImport.Index = 1 Then + UpdateKey + Endif End diff --git a/app/src/gambas3/.src/Connection/FImportTable.form b/app/src/gambas3/.src/Connection/FImportTable.form index 58fcd46d6..e5ee87ee2 100644 --- a/app/src/gambas3/.src/Connection/FImportTable.form +++ b/app/src/gambas3/.src/Connection/FImportTable.form @@ -1,22 +1,25 @@ # Gambas Form File 3.0 { Form Form - MoveScaled(0,0,70,64) + MoveScaled(0,0,102,72) Text = ("Import file") Icon = Picture["icon:/medium/open"] - Arrangement = Arrange.Vertical + Arrangement = Arrange.Fill Spacing = True Margin = True - { tabImport TabPanel - MoveScaled(1,1,66,57) - Expand = True + { wizImport Wizard + MoveScaled(1,1,98,69) Arrangement = Arrange.Fill Count = 4 + TextFont = Font["Bold,+2"] + Border = False + ActionText = ("Import") + ActionPicture = Picture["icon:/small/open"] + Animated = True Index = 0 - Text = ("File properties") - { fprImport FileProperties - MoveScaled(2,1,62,50) - Border = False + Text = ("Select the CSV file to import") + { fchImport FileChooser + MoveScaled(2,2,94,54) } Index = 1 Text = ("Options") @@ -132,36 +135,19 @@ Index = 2 Text = ("Preview") { txtPreview TextArea - MoveScaled(1,1,61,43) + MoveScaled(1,2,61,43) ReadOnly = True - Border = False } Index = 3 - Text = ("Messages") + Text = ("Import") { gvwMessage GridView - MoveScaled(2,1,59,49) - Border = False + MoveScaled(1,1,59,49) + } + { spnImport Spinner + MoveScaled(66,24,18,18) + Ignore = True + Label = True } Index = 0 } - { HBox1 HBox - MoveScaled(1,59,66,4) - Spacing = True - { Panel1 Panel - MoveScaled(7,1,3,2) - Expand = True - } - { btnOK Button - MoveScaled(31,0,16,4) - Text = Shortcut(("Import"), "I") - Picture = Picture["icon:/small/open"] - Default = True - } - { btnCancel Button - MoveScaled(48,0,16,4) - Text = ("Close") - Picture = Picture["icon:/small/close"] - Cancel = True - } - } } diff --git a/app/src/gambas3/.src/Connection/FPasteTable.class b/app/src/gambas3/.src/Connection/FPasteTable.class index 4a3e0e06d..a0161f106 100644 --- a/app/src/gambas3/.src/Connection/FPasteTable.class +++ b/app/src/gambas3/.src/Connection/FPasteTable.class @@ -177,7 +177,7 @@ Private Sub DoCopyTable(hSrc As Connection, hDst As Connection, sSrc As String, rDst = hDst.Create(sDst) For iInd = 0 To rSrc.Fields.Count - 1 rDst[iInd] = rSrc[iInd] - If rSrc.Fields[iInd].Type = gb.String Then + If rSrc.Fields[iInd].Type = gb.String And If rSrc[iInd] Then Try rDst[iInd] = Conv(rSrc[iInd], sSrcCharset, sDstCharset) Endif Next diff --git a/app/src/gambas3/.src/Editor/Connection/FConnectionEditor.class b/app/src/gambas3/.src/Editor/Connection/FConnectionEditor.class index 211dc1373..abfb507a7 100644 --- a/app/src/gambas3/.src/Editor/Connection/FConnectionEditor.class +++ b/app/src/gambas3/.src/Editor/Connection/FConnectionEditor.class @@ -1686,14 +1686,7 @@ Public Sub btnImport_Click() If SaveTable() Then Return - Dialog.Title = ("Select the CSV file to import") - Dialog.Filter = ["*.csv", ("CSV files"), "*", ("All files")] - Dialog.Path = Settings["/Connection/ImportPath"] - If Dialog.OpenFile() Then Return - Settings["/Connection/ImportPath"] = Dialog.Path - If Not Exist(Dialog.Path) Then Return - - FImportTable.Run($hConn, GetTableList(), Dialog.Path) + FImportTable.Run($hConn, GetTableList()) If FImportTable.Table Then LoadList(FImportTable.Table) Else diff --git a/app/src/gambas3/.src/Packager/FMakeInstall.form b/app/src/gambas3/.src/Packager/FMakeInstall.form index 3f160b40e..803b3c79e 100644 --- a/app/src/gambas3/.src/Packager/FMakeInstall.form +++ b/app/src/gambas3/.src/Packager/FMakeInstall.form @@ -11,7 +11,7 @@ Arrangement = Arrange.Vertical Spacing = True Count = 11 - TextFont = Font["Bold,+3"] + TextFont = Font["Bold,+2"] ShowIndex = True Border = False ActionText = ("Create package") diff --git a/comp/src/gb.form/.info b/comp/src/gb.form/.info index 64b8282ab..0de22e4dc 100644 --- a/comp/src/gb.form/.info +++ b/comp/src/gb.form/.info @@ -2730,6 +2730,10 @@ Stop m +Wait +m + + DrawingArea_Draw m diff --git a/comp/src/gb.form/.project b/comp/src/gb.form/.project index 5bf6583a1..9a830d7fb 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.7.90 Title=More controls for graphical components -Startup=FTabPanel +Startup=FSpinner Version=3.7.90 VersionFile=1 Component=gb.image diff --git a/comp/src/gb.form/.src/Spinner.class b/comp/src/gb.form/.src/Spinner.class index 421829031..c386ec256 100644 --- a/comp/src/gb.form/.src/Spinner.class +++ b/comp/src/gb.form/.src/Spinner.class @@ -18,6 +18,7 @@ Private $hTimer As Timer Private $iBorder As Integer Private $bLabel As Boolean Private $fValue As Float +Private $fLastWait As Float Public Sub _new() @@ -42,6 +43,18 @@ Public Sub Stop() End +Public Sub Wait() + + If $fLastWait = 0 Or If (Timer - $fLastWait) >= 0.2 Then + Wait 0.05 + $fLastWait = Timer + Else + Wait + Endif + +End + + Public Sub DrawingArea_Draw() Dim iFlag As Integer @@ -52,35 +65,48 @@ Public Sub DrawingArea_Draw() Dim D As Float Dim I As Integer Dim C As Float + Dim W As Float + Dim H As Float If Not Me.Design Then If $fStartTime = 0 Then Goto DRAW_BORDER D = Frac(Timer - $fStartTime) * Pi(2) Endif - X = Paint.W / 2 - Y = Paint.H / 2 - R = Min(Paint.W, Paint.H) / 2 * 7 / 8 + W = Paint.W + H = Paint.H - Paint.LineWidth = R / 8 - Paint.LineCap = Paint.LineCapRound + If $bLabel Then + H -= Paint.Font.Height + Endif - For I = 0 To 11 + If H > 0 Then + + X = W / 2 + Y = H / 2 + R = Min(W, H) / 2 * 7 / 8 - A = Pi(2) * I / 12 - C = Frac(1 + (D - A) / Pi(2)) + Paint.LineWidth = R / 8 + Paint.LineCap = Paint.LineCapRound - 'Paint.Background = Color.Merge(Color.Background, Color.Foreground, C / 4) - Paint.Background = Color.SetAlpha(Color.Foreground, 255 * (1 - C / 4)) - Paint.MoveTo(X + Cos(A) * R / 2, Y + Sin(A) * R / 2) - Paint.LineTo(X + Cos(A) * R, Y + Sin(A) * R) - Paint.Stroke + For I = 0 To 11 + + A = Pi(2) * I / 12 + C = Frac(1 + (D - A) / Pi(2)) + + 'Paint.Background = Color.Merge(Color.Background, Color.Foreground, C / 4) + Paint.Background = Color.SetAlpha(Color.Foreground, 255 * (1 - C / 4)) + Paint.MoveTo(X + Cos(A) * R / 2, Y + Sin(A) * R / 2) + Paint.LineTo(X + Cos(A) * R, Y + Sin(A) * R) + Paint.Stroke + + Next - Next + Endif If $bLabel Then Paint.Background = Color.Foreground - Paint.DrawText(Format($fValue, "0%"), 0, 0, Paint.W, Paint.H, Align.Center) + Paint.DrawText(Format($fValue, "0%"), 0, Paint.H - Paint.Font.Height, Paint.W, Paint.Font.Height, Align.Center) Endif DRAW_BORDER: diff --git a/comp/src/gb.form/.src/Test/FSpinner.class b/comp/src/gb.form/.src/Test/FSpinner.class index 08a9031f4..d790b1a65 100644 --- a/comp/src/gb.form/.src/Test/FSpinner.class +++ b/comp/src/gb.form/.src/Test/FSpinner.class @@ -10,5 +10,6 @@ End Public Sub Timer1_Timer() Spinner1.Value += 0.005 + 'Print Spinner1.Value End diff --git a/comp/src/gb.form/.src/Wizard/Wizard.class b/comp/src/gb.form/.src/Wizard/Wizard.class index 83290cc86..7c61849f6 100644 --- a/comp/src/gb.form/.src/Wizard/Wizard.class +++ b/comp/src/gb.form/.src/Wizard/Wizard.class @@ -124,6 +124,9 @@ Private Sub DoAnimate(iSrc As Integer, iDest As Integer) Dim hCont As Container Dim hSrc As _WizardContainer Dim hDest As _WizardContainer + Dim Y As Integer + + Y = If($hWizard.GetBorder(), 1, 0) hCont = $hWizard.GetContainer() hSrc = $aStep[iSrc] @@ -136,7 +139,7 @@ Private Sub DoAnimate(iSrc As Integer, iDest As Integer) If iDest > iSrc Then - hDest.Move(hCont.W, 0) + hDest.Move(hCont.W, Y) fTime = Timer While hDest.X > 0 @@ -147,7 +150,7 @@ Private Sub DoAnimate(iSrc As Integer, iDest As Integer) Else - hDest.Move(- hCont.W, 0) + hDest.Move(- hCont.W, Y) fTime = Timer While hDest.X < 0 diff --git a/gb.qt4/src/CWindow.cpp b/gb.qt4/src/CWindow.cpp index 5382e1199..1987f3ba1 100644 --- a/gb.qt4/src/CWindow.cpp +++ b/gb.qt4/src/CWindow.cpp @@ -1693,7 +1693,7 @@ void MyMainWindow::present(QWidget *parent) activateWindow(); if (parent) X11_set_transient_for(effectiveWinId(), parent->effectiveWinId()); - if (parent || THIS->stacking == 1) + //if (parent || THIS->stacking == 1) raise(); } diff --git a/main/lib/db/c_subcollection.c b/main/lib/db/c_subcollection.c index 8fb99e6a1..b2eee4e41 100644 --- a/main/lib/db/c_subcollection.c +++ b/main/lib/db/c_subcollection.c @@ -231,16 +231,13 @@ void *GB_SubCollectionContainer(void *_object) void GB_SubCollectionAdd(void *_object, const char *key, int len, void *value) { - void *old_value = NULL; - if (len <= 0) len = strlen(key); + GB.Ref(value); + GB_SubCollectionRemove(THIS, key, len); //fprintf(stderr, "GB_SubCollectionAdd: insert %p '%.*s'\n", value, len, key); - GB.HashTable.Get(THIS->hash_table, key, len, &old_value); GB.HashTable.Add(THIS->hash_table, key, len, value); - GB.Ref(value); - GB.Unref(&old_value); } void GB_SubCollectionRemove(void *_object, const char *key, int len)