i think to make some trakker programm for it. i think it will help with convert process. i will put some matrix over VGM file. so i start from excel-like window. but i think your OS will not like it... it have winapi for cursors and callback. and midi for demo:
Code: Select all
;ver 1.1
Structure RowData
Height.i
HeaderText.s
EndStructure
Structure ColumnData
Width.i
HeaderText.s
EndStructure
Global Dim Rows.RowData(0)
Global Dim Columns.ColumnData(0)
Global FirstVisibleRow.i,FirstVisibleColumn.i
Global LastVisibleRow.i,LastVisibleColumn.i
Global cvsGrid.i,Gridrows.i,GridColumns.i
Global CellTop.i,CellLeft.i,Cellbottom.i,CellRight.i
Global scrVertical.i,scrHorizontal.i
Define MainWindow.i,txtRow.i,cmbRow.i,txtRowHeight.i,btnCommit.i,HScroll.i,VScroll.i,txtCoordinates.i
Define SGridArray
Global Dim SGridArray.s(0,0)
Global cvsGrdH, cvsGrdW
;Cells
Global xw.i = 50, yh.i = 20
Structure rows
notelength.i
EndStructure
Structure notesarray
;row.rows[30]
row.i
notelength.i
shadow.i
shadowrow.i
EndStructure
Global Dim Notes.notesarray(26)
Global selectednote.i
Procedure GetRowPix(RowNum.i)
;Header Row?
If RowNum = 0
CellTop = 0
CellBottom = Rows(0)\Height
Else
CellTop = Rows(0)\Height
CellBottom = 0
For i = FirstVisibleRow To LastVisibleRow ;Grid width
If i < RowNum
CellTop = CellTop + Rows(i)\Height
Else
CellBottom = CellTop + Rows(i)\Height
Break
EndIf
Next i
EndIf
EndProcedure
Procedure GetColPix(ColNum.i)
;Header Column?
If ColNum = 0
CellLeft = 0
CellRight = Columns(0)\Width
Else
CellLeft = Columns(0)\Width
CellRight = 0
For i = FirstVisibleColumn To LastVisibleColumn ;Grid width
If i < ColNum
CellLeft = CellLeft + Columns(i)\Width
Else
CellRight = CellLeft + Columns(i)\Width
Break
EndIf
Next i
EndIf
EndProcedure
Procedure SetcellText(Row,Column,Text.s)
If (Row => FirstVisibleRow And row <= LastVisibleRow) Or row = 0
If (Column => FirstVisibleColumn And column <= LastVisibleColumn) Or column = 0
;Display Now
GetColPix(Column)
GetRowPix(Row)
Define Startx = CellLeft + 2
Define Starty = CellTop + 2
StartDrawing(CanvasOutput(cvsGrid))
DrawingMode(#PB_2DDrawing_Default|#PB_2DDrawing_Transparent)
DrawText(Startx,Starty, Text,RGB(0,0,0))
StopDrawing()
EndIf
EndIf
EndProcedure
Procedure SetRowDefaults()
Define LoopCounter.i = 0
For LoopCounter = 0 To GridRows
Rows(Loopcounter)\HeaderText = Str(LoopCounter)
Rows(Loopcounter)\Height = yh
Next LoopCounter
EndProcedure
Procedure SetColumnDefaults()
Define LoopCounter.i = 0
For LoopCounter = 0 To GridColumns
Columns(Loopcounter)\HeaderText = Chr(LoopCounter + 64)
Columns(Loopcounter)\Width = xw
Next LoopCounter
EndProcedure
Global baseimage
Procedure DrawGrid()
CopyImage(baseimage, gadgetimage)
LastVisibleRow = FirstVisibleRow + 18 ; row per page
LastVisibleColumn = FirstVisibleColumn + 10 ; column per page
If StartDrawing(ImageOutput(gadgetimage))
DrawingMode(#PB_2DDrawing_Default|#PB_2DDrawing_Transparent)
For iLoop = FirstVisibleRow To LastVisibleRow
Column = 0
If (iLoop => FirstVisibleRow And iLoop <= LastVisibleRow) Or iLoop = 0
If (Column => FirstVisibleColumn And column <= LastVisibleColumn) Or column = 0
;Display Now
GetColPix(Column)
GetRowPix(iLoop)
Startx = CellLeft + 2
Starty = CellTop + 2
DrawText(Startx, Starty, Rows(iLoop)\HeaderText, RGB(0,0,0))
EndIf
EndIf
Next iLoop
For iLoop = FirstVisibleColumn To LastVisibleColumn
Row = 0
Column = iLoop
If (Row => FirstVisibleRow And row <= LastVisibleRow) Or row = 0
If (Column => FirstVisibleColumn And column <= LastVisibleColumn) Or column = 0
;Display Now
GetColPix(Column)
GetRowPix(Row)
Startx = CellLeft + 2
Starty = CellTop + 2
DrawText(Startx,Starty, Columns(iLoop)\HeaderText, RGB(0,0,0))
EndIf
EndIf
Next iLoop
For icolums = FirstVisibleColumn To FirstVisibleColumn + 10
For irows = FirstVisibleRow To LastVisibleRow
If Notes(icolums)\notelength And Notes(icolums)\row = irows
Startx = (icolums - FirstVisibleColumn) * xw + xw
Starty = (irows - FirstVisibleRow) * 20 + 20
If Notes(icolums)\notelength = 1
If selectednote = icolums
; with select - more dark
Box( Startx + 2, Starty + 2, 47, 17, RGB(150, 50, 150))
Else
; no select
Box( Startx + 2, Starty + 2, 47, 17, RGB(200, 100, 200))
EndIf
Line(Startx + 1, Starty + 19, 49, 1, RGB(170, 40, 170))
Line(Startx + 49, Starty + 1, 1, 19, RGB(170, 40, 170))
Break
Else
notewidth = (50 * Notes(icolums)\notelength) - 3
If selectednote = icolums
; with select - more dark
Box( Startx + 2, Starty + 2, notewidth, 17, RGB(150, 50, 150))
Else
; no select
Box( Startx + 2, Starty + 2, notewidth, 17, RGB(200, 100, 200))
EndIf
Line(Startx + 1, Starty + 19, notewidth + 2, 1, RGB(170, 40, 170))
Line(Startx + notewidth + 2, Starty + 1, 1, 19, RGB(170, 40, 170))
icolums + (Notes(icolums)\notelength - 1) ; overjump per note length
Break
EndIf
ElseIf Notes(icolums)\shadow And Notes(icolums)\shadowrow = irows
Startx = (icolums - FirstVisibleColumn) * xw + xw
Starty = (irows - FirstVisibleRow) * 20 + 20
Box( Startx + 2, Starty + 2, 47, 17, RGB(200, 200, 200))
;Break
EndIf
Next
Next
StopDrawing()
EndIf
SetGadgetAttribute(cvsGrid, #PB_Canvas_Image, ImageID(gadgetimage))
EndProcedure
;{ midi
Global hMidiOut
Global midi.MIDIOUTCAPS
Global devices = midiOutGetNumDevs_()
For devnum=-1 To devices-1
If midiOutGetDevCaps_(devnum,@midi,SizeOf(MIDIOUTCAPS))=0
If midi\wVoices >0
Global midiport=devnum
EndIf
EndIf
Next
Procedure MidiOutMessage(hMidi,iStatus,iChannel,iData1,iData2)
dwMessage = iStatus | iChannel | (iData1 << 8 ) | (iData2 << 16)
ProcedureReturn midiOutShortMsg_(hMidi, dwMessage) ;
EndProcedure
Procedure SetInstrument(channel,instrument)
MidiOutMessage(hMidiOut, $C0, channel, instrument, 0)
EndProcedure
Procedure PlayNote(channel,Note,velocity)
MidiOutMessage(hMidiOut, $90, channel, Note , velocity)
EndProcedure
Procedure StopNote(channel,Note)
MidiOutMessage(hMidiOut, $90, channel, Note , 0)
EndProcedure
Procedure MIDIVolume(Channel,Volume)
midiOutShortMsg_(hMidiOut,$B0 | Channel | $700 | Volume << 16 )
EndProcedure
;}
Global mousewheelmonitoring
Procedure WinCallback(hWnd, uMsg, WParam, LParam)
; Windows fills the parameter automatically, which we will use in the callback...
;Debug uMsg
Select uMsg
Case 522 ; mousewheel
Select mousewheelmonitoring
Case 1 ; vertical
If WParam > 0 ; up
verticalvalue = GetGadgetState(scrVertical) - 1
If verticalvalue > 0
SetGadgetState(scrVertical, verticalvalue)
FirstVisibleRow = verticalvalue
DrawGrid()
EndIf
Else ; down
verticalvalue = GetGadgetState(scrVertical) + 1
If verticalvalue < 12 ; who knows how it count...
SetGadgetState(scrVertical, verticalvalue)
FirstVisibleRow = verticalvalue
DrawGrid()
EndIf
EndIf
Case 2 ; horizont
If WParam > 0 ; up
horizontvalue = GetGadgetState(scrHorizontal) - 1
If horizontvalue > 0
SetGadgetState(scrHorizontal, horizontvalue)
FirstVisibleColumn = horizontvalue
DrawGrid()
EndIf
Else ; down
horizontvalue = GetGadgetState(scrHorizontal) + 1
If horizontvalue < 16 ; again - no idea :)
SetGadgetState(scrHorizontal, horizontvalue)
FirstVisibleColumn = horizontvalue
DrawGrid()
EndIf
EndIf
EndSelect
EndSelect
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
Global treadquit
Procedure PlayProc(*Value)
For i = 1 To 26
If treadquit
Break
EndIf
If Notes(i)\notelength
StopNote(1, oldnote)
PlayNote(1, 80-Notes(i)\row, 127)
oldnote = 80-Notes(i)\row
EndIf
Delay(100)
Next
StopNote(1, oldnote)
EndProcedure
Procedure scrVertical()
If FirstVisibleRow <> GetGadgetState(scrVertical)
FirstVisibleRow = GetGadgetState(scrVertical)
DrawGrid()
EndIf
EndProcedure
Procedure scrHorizontal()
If FirstVisibleColumn <> GetGadgetState(scrHorizontal)
FirstVisibleColumn = GetGadgetState(scrHorizontal)
DrawGrid()
EndIf
EndProcedure
baseimage = CreateImage(#PB_Any,700,400,32,RGB(255,255,255))
GridWidth = 600
GridHeight = 400
GridRows = 30
GridColumns = 26
ReDim Rows(Gridrows)
ReDim Columns(GridColumns)
SetRowDefaults()
SetColumnDefaults()
FirstVisibleRow = 1
FirstVisibleColumn = 1
If StartDrawing(ImageOutput(baseimage))
DrawingMode(#PB_2DDrawing_Default|#PB_2DDrawing_Transparent)
;Column Header
Box(0,0,GridWidth,Rows(0)\Height,RGB(153,204,255))
startx = Columns(0)\Width
;Row Header
Box(0,0,Columns(0)\Width, GridHeight,RGB(153,204,255))
starty = Rows(0)\Height
DrawingMode(#PB_2DDrawing_Outlined|#PB_2DDrawing_Transparent)
;All Other Columns
For iLoop = FirstVisibleColumn To GridColumns - 1
Box(Startx,0,Columns(iLoop)\Width + 1,GridHeight,RGB(0,0,0))
;DrawingMode(#PB_2DDrawing_Outlined|#PB_2DDrawing_Transparent)
Startx = Startx + Columns(iLoop)\Width
LastVisibleColumn = iLoop
If Startx > GridWidth
;No More Columns Visible
Break
EndIf
Next iLoop
;All Other Rows
For iLoop = FirstVisibleRow To GridRows - 1
Box(0,Starty,GridWidth,Rows(iLoop)\Height + 1,RGB(0,0,0))
Starty = Starty + Rows(iLoop)\Height
LastVisibleRow = iLoop
If Starty > 400 ;GridHeight
;No More Rows Visible After This
Break
EndIf
Next iLoop
StopDrawing()
EndIf
cur0 = LoadCursor_(0, #IDC_ARROW)
cur1 = LoadCursor_(0, #IDC_SIZEWE) ; left-right
cur2 = LoadCursor_(0, #IDC_SIZENS) ; up-down
MouseRect.RECT
MainWindow = OpenWindow(#PB_Any, 0, 0, 651, 480, "", #PB_Window_SystemMenu)
If MainWindow And midiOutOpen_(@hMidiOut,midiport,0,0,0) = #MMSYSERR_NOERROR
;cvsGrid = CanvasGadget(#PB_Any, 25, 50, 600, 400)
cvsGrdX1 = 25
cvsGrdW = 600
cvsGrdX2 = cvsGrdX1 + cvsGrdW
cvsGrdY1 = 50
cvsGrdH = 400
cvsGrdY2 = cvsGrdY1 + cvsGrdH
cvsGrid = CanvasGadget(#PB_Any, cvsGrdX1, cvsGrdY1, cvsGrdW, cvsGrdH)
txtRow = TextGadget(#PB_Any, 20, 10, 30, 20, "Row", #PB_Text_Right)
cmbRow = ComboBoxGadget(#PB_Any, 60, 10, 60, 20)
txtRowHeight = TextGadget(#PB_Any, 130, 10, 40, 20, "Height")
strRowHeight = StringGadget(#PB_Any, 180, 10, 60, 20, "")
btnCommit = ButtonGadget(#PB_Any, 250, 10, 70, 20, "Commit")
DisableGadget(cmbRow, 1)
DisableGadget(strRowHeight, 1)
DisableGadget(btnCommit, 1)
;scrVertical = ScrollBarGadget(#PB_Any, 625, 50, 20, 400, 1, 30, 10, #PB_ScrollBar_Vertical)
scrVerX1 = 626
scrVerW = 20
scrVerX2 = scrVerX1 + scrVerW
scrVerY1 = 50
scrVerH = 400
scrVerY2 = scrVerY1 + scrVerH
scrVertical = ScrollBarGadget(#PB_Any, scrVerX1, scrVerY1, scrVerW, scrVerH, 1, 30, 20, #PB_ScrollBar_Vertical)
;scrHorizontal = ScrollBarGadget(#PB_Any, 25, 450, 600, 20, 1, 26, 5)
scrHorX1 = 25
scrHorW = 600
scrHorX2 = scrHorX1 + scrHorW
scrHorY1 = 450
scrHorH = 20
scrHorY2 = scrHorY1 + scrHorH
scrHorizontal = ScrollBarGadget(#PB_Any, scrHorX1, scrHorY1, scrHorW, 20, 1, 26, 12)
;Number of rows in the grid. This is not the displayed rows but the number of rows in the underlying grid array.
;GridRows = 30
;GridColumns = 26
;ReDim Rows(Gridrows)
;ReDim Columns(GridColumns)
;SetRowDefaults()
;SetColumnDefaults()
;FirstVisibleRow = 1
;FirstVisibleColumn = 1
;DrawGrid()
;SetGadgetAttribute(cvsGrid, #PB_Canvas_Image, ImageID(baseimage))
DrawGrid()
;Add row numbers to the row selection combo
For LoopCounter = 0 To GridRows
AddGadgetItem(cmbRow,-1,Str(LoopCounter))
Next LoopCounter
txtCoordinates = TextGadget(#PB_Any, 400, 10, 40, 20, "")
btnPlay = ButtonGadget(#PB_Any, 500, 10, 50, 20, "Play")
btnStop = ButtonGadget(#PB_Any, 570, 10, 50, 20, "Stop")
SetWindowCallback(@WinCallback())
BindGadgetEvent(scrVertical, @scrVertical())
BindGadgetEvent(scrHorizontal, @scrHorizontal())
Repeat
Event = WaitWindowEvent()
Select event
Case #PB_Event_Gadget
Select EventGadget()
Case btnCommit
If Len(GetGadgetText(cmbRow)) > 0
If Val(GetGadgetText(strRowHeight)) > 0
Rows(Val(GetGadgetText(cmbRow)))\Height = Val(GetGadgetText(strRowHeight))
DrawGrid()
EndIf
EndIf
;Case scrVertical
; If FirstVisibleRow <> GetGadgetState(scrVertical)
; FirstVisibleRow = GetGadgetState(scrVertical)
; DrawGrid()
; EndIf
;Case scrHorizontal
; If FirstVisibleColumn <> GetGadgetState(scrHorizontal)
; FirstVisibleColumn = GetGadgetState(scrHorizontal)
; DrawGrid()
; EndIf
Case cvsGrid
EvType = EventType()
If EvType = #PB_EventType_LeftDoubleClick; #PB_EventType_LeftClick
If Notes(ColumdId+FirstVisibleColumn)\row = RowId+FirstVisibleRow
Notes(ColumdId+FirstVisibleColumn)\notelength = 0
Notes(ColumdId+FirstVisibleColumn)\row = 0
For i = FirstVisibleColumn To LastVisibleColumn
Notes(i)\shadow = 0
Notes(i)\shadowrow = 0
Next
Else
Notes(ColumdId+FirstVisibleColumn)\row = RowId+FirstVisibleRow
Notes(ColumdId+FirstVisibleColumn)\notelength = 1
EndIf
DrawGrid()
ElseIf EvType = #PB_EventType_LeftButtonDown
If move = 1 ; probably start move or make longer note
dragstartflag = 1
notestart = ColumdId+FirstVisibleColumn
SetGadgetAttribute(cvsGrid, #PB_Canvas_Cursor, #PB_Cursor_LeftRight)
StickyWindow(MainWindow, 1)
GetWindowRect_(GadgetID(cvsGrid),MouseRect.RECT)
MouseRect\top + yh
leftlimit = 0
For i = notestart-1 To FirstVisibleColumn Step -1
If Notes(i)\notelength
leftlimit = i * xw
Break
EndIf
Next
MouseRect\left + leftlimit + xw + 1 ; from previous note and from 0 column
; +1 becouse cant detect column
rightlimit = 0
For i = notestart+1 To LastVisibleColumn
If Notes(i)\notelength
rightlimit = i * xw
rightlimit = MouseRect\right - rightlimit
Break
EndIf
Next
MouseRect\right - rightlimit + 28 ;no idea where this 28 is gets
ClipCursor_(MouseRect)
ElseIf move = 2
dragstartflag = 1
notestart = ColumdId+FirstVisibleColumn
SetGadgetAttribute(cvsGrid, #PB_Canvas_Cursor, #PB_Cursor_LeftRight)
StickyWindow(MainWindow, 1)
GetWindowRect_(GadgetID(cvsGrid),MouseRect.RECT)
MouseRect\top + yh
MouseRect\top + RowId * yh
MouseRect\bottom = MouseRect\top + yh
leftlimit = ColumdId * xw
MouseRect\left + leftlimit + xw + 1
rightlimit = 0
For i = notestart+1 To LastVisibleColumn
If Notes(i)\notelength
rightlimit = i * xw
rightlimit = MouseRect\right - rightlimit
Break
EndIf
Next
MouseRect\right - rightlimit + 28 ;no idea where this 28 is gets
ClipCursor_(MouseRect)
EndIf
ElseIf EvType = #PB_EventType_LeftClick
If Notes(ColumdId+FirstVisibleColumn)\notelength And Notes(ColumdId+FirstVisibleColumn)\row = RowId+FirstVisibleRow
selectednote = ColumdId+FirstVisibleColumn
DrawGrid()
EndIf
EndIf
Case btnPlay
treadquit = 0
Delay(110)
CreateThread(@PlayProc(), 1)
Case btnStop
treadquit = 1
EndSelect
Case 512 ; mouse move
xmouse = WindowMouseX(MainWindow)
ymouse = WindowMouseY(MainWindow)
Select xmouse
Case scrVerX1 To scrVerX2;, cvsGrdX1 To cvsGrdX2
Select ymouse
Case scrVerY1 To scrVerY2
;Debug "over vert scrollbar"
mousewheelmonitoring = 1
EndSelect
Case scrHorX1 To scrHorX2
Select ymouse
Case scrHorY1 To scrHorY2
;Debug "over horiz scrollbar"
mousewheelmonitoring = 2
Case cvsGrdY1 To cvsGrdY2
mousewheelmonitoring = 1 ; over canvas field
; i know canvas have mouse enter and out value
; but i think it will work not very properly
; when mouse come from canvas to horizontal gadget
xcolpos = xmouse - 75 ; 75 = from border of window to A column
yrowpos = ymouse - 70
If xcolpos > 0 And yrowpos > 0
ColumdId = xcolpos / xw
RowId = yrowpos / 20
SetGadgetText(txtCoordinates, Columns(ColumdId + FirstVisibleColumn)\HeaderText + Rows(RowId + FirstVisibleRow)\HeaderText)
; move note case
If dragstartflag = 1
; paint shadows
If move = 1
;single shadow
If ColumdId + FirstVisibleColumn <> notestart
For i = FirstVisibleColumn To LastVisibleColumn ;notestart - 1
Notes(i)\shadow = 0 ; delete all shadows
Next
;set single shadow
Notes(ColumdId + FirstVisibleColumn)\shadow = 1
Notes(ColumdId + FirstVisibleColumn)\shadowrow = RowId + FirstVisibleRow
Else
For i = FirstVisibleColumn To LastVisibleColumn
Notes(i)\shadow = 0 ; delete all shadows
Next
EndIf
ElseIf move = 2
;multipleshadow
If ColumdId + FirstVisibleColumn > notestart ; only to right
For i = FirstVisibleColumn To LastVisibleColumn
Notes(i)\shadow = 0 ; delete all old shadows
Next
For i = notestart + 1 To ColumdId + FirstVisibleColumn
Notes(i)\shadow = 1
Notes(i)\shadowrow = RowId + FirstVisibleRow
Next
Else
For i = FirstVisibleColumn To LastVisibleColumn
Notes(i)\shadow = 0 ; delete all shadows
Next
EndIf
Else
If ColumdId + FirstVisibleColumn < notestart
For i = FirstVisibleColumn To notestart - 1
Notes(i)\shadow = 0
If i >= ColumdId + FirstVisibleColumn
Notes(i)\shadow = 1
Notes(i)\row = RowId + FirstVisibleRow
EndIf
Next
EndIf
EndIf
DrawGrid()
; show arrow cursor case
ElseIf Notes(ColumdId + FirstVisibleColumn)\notelength And Notes(ColumdId + FirstVisibleColumn)\row = RowId + FirstVisibleRow
arrows = xcolpos - (ColumdId * xw)
;recount move2 case coordinates
startcrd = 46
endcrd = 49
If Notes(ColumdId + FirstVisibleColumn)\notelength > 1
startcrd = (Notes(ColumdId + FirstVisibleColumn)\notelength - 1) * 50 + startcrd
endcrd = startcrd + 3
EndIf
Select arrows
Case 0 To 3
;If ColumdId ; not starts on 1 column, only from 2 - wrong idea
SetCursor_(cur1) ; move left
;SetGadgetAttribute(cvsGrid, #PB_Canvas_Cursor, #PB_Cursor_LeftRight)
move = 1
;EndIf
Case startcrd To endcrd ; from scrVerY1, 50
SetCursor_(cur1) ; make longer
move = 2
Default
move = 0
;SetGadgetAttribute(cvsGrid, #PB_Canvas_Cursor, #PB_Cursor_Default)
; arrows = yrowpos - (RowId * 20)
; Select arrows
; Case 0 To 3, 16 To 19
; SetCursor_(cur2)
; EndSelect
EndSelect
EndIf
Else
ColumdId = -1
RowId = -1
EndIf
EndSelect
Default
mousewheelmonitoring = 0
EndSelect
Case 514 ;{ mouse relise
If dragstartflag = 1 ; if dragndrop was turn on...
If move = 1
move = 0
dragstartflag = 0
SetGadgetAttribute(cvsGrid, #PB_Canvas_Cursor, #PB_Cursor_Default)
ClipCursor_(0)
StickyWindow(MainWindow, 0)
; reallocate note
Notes(ColumdId + FirstVisibleColumn)\notelength = Notes(notestart)\notelength
Notes(ColumdId + FirstVisibleColumn)\row = RowId + FirstVisibleRow
If ColumdId + FirstVisibleColumn <> notestart
Notes(notestart)\notelength = 0
Notes(notestart)\row = 0
EndIf
DrawGrid()
ElseIf move = 2
move = 0
dragstartflag = 0
SetGadgetAttribute(cvsGrid, #PB_Canvas_Cursor, #PB_Cursor_Default)
ClipCursor_(0)
StickyWindow(MainWindow, 0)
If ColumdId + FirstVisibleColumn <> notestart
Notes(notestart)\notelength = (ColumdId + FirstVisibleColumn - notestart) + 1
EndIf
DrawGrid()
EndIf
EndIf ;}
EndSelect
Until Event = #PB_Event_CloseWindow
midiOutClose_(hMidiOut)
End
EndIf
it have doubleclick for note create, one click for select, near left border of note - dragndrop and move note, near right border - can make larger note (make smaller not work yet). and do not move scrollbars - now it have wrong count