purebasic.info

PureBasic forum
Текущее время: Ср сен 19, 2018 10:34 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 20 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: AccordionGadget основанный на канвасе
СообщениеДобавлено: Вс май 08, 2016 7:54 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вс дек 09, 2012 9:02 pm
Сообщений: 771
Откуда: Дагестан
Благодарил (а): 0 раз.
Поблагодарили: 11 раз.
Пункты репутации: 0
проблемы с сварачиваныем. Как можно решить?
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
EnableExplicit
;-
Enumeration
  #Window
  #Gadget
EndEnumeration
 
Structure ITEMS_STRUCT
  Gadget.i
  Text.S
 
  ItemHeight.i
 
  minus.i
  IsItem.b
  IsExpanded.b
  Expanded.b
EndStructure
 
Global NewList Item.ITEMS_STRUCT()
 
Global ScrollBar_Maximum, ScrollBar_PageLength, ScrollBar_Position, ThumbPosition, ThumbHeight, ItemHeight, ListSize
Global Item_Mouse_Entered =- 1
       
Define I,II,IsExpanded = 1, Expanded,Index
Define  d
 
 
Procedure AddAccordion(Text.S,Height=16, Image=0)
  With Item()
  AddElement(Item())
  \Text = Text.S
  \IsItem =- 1
  \ItemHeight = Height
  \IsExpanded = 0
  EndWith
EndProcedure
Procedure AddItems(Text.S,Height=16, Image=0)
  With Item()
  AddElement(Item())
  \Text = Text.S
  \IsItem = 1
  \ItemHeight = Height
 
  \IsExpanded = 1 ; Показываем
  EndWith
EndProcedure
 
Procedure _Expanded( Item ) ; Ok
  Protected Expanded, State
  ;SelectElement(Item(), Item)
   
  With Item()
    PushListPosition(Item())
    ForEach Item()
      If \IsExpanded = 0
       
        ;Debug ListIndex(Item())
        ;ScrollBar_Maximum = ((ListSize(Item()) - 5) * \ItemHeight)
       
        If Item<ListIndex(Item()) And \IsItem =- 1
          Break
          EndIf
      EndIf
    Next
    PopListPosition(Item())
  EndWith
EndProcedure
 
Procedure Expanded( Item ) ; Ok
  Protected Expanded, State
 
  With Item()
   
    SelectElement(Item(), Item)
      State = \IsExpanded
   
    If \IsItem =- 1
     
      PushListPosition(Item())
      ForEach Item()
        If ListIndex(Item()) > Item
          If \IsItem =- 1
           
            PushListPosition(Item())
            SelectElement(Item(), Item)
            Expanded = \IsExpanded
            PopListPosition(Item())
           
            If Expanded
              ;\minus =
              Debug "ListIndex "+Str((ListIndex(Item()) ) * \ItemHeight)
            EndIf
           
            Break
          Else
             \IsExpanded = State
          EndIf
        EndIf
      Next
      PopListPosition(Item())
     
      ; Если скрыто раскрываем иначе скрываем
      If \IsExpanded = 1 : \IsExpanded = 0 : Else :\IsExpanded = 1 : EndIf
    EndIf
  EndWith
 
 ; _Expanded( Item )
EndProcedure
 
For I = 1 To 15
  With Item()
      AddAccordion(" ^ Accordion "+Str(I))
     
      For II = 0 To 3
        AddItems("     Text "+Str(II))
       
      Next
     
  EndWith
Next
 
  Expanded( 5 )
;-
Procedure ControlGadget_Repaint(Gadget)
  Protected X.i, Y.i, Height.i,FontHeight
  If StartDrawing(CanvasOutput(Gadget))
    Box(0, 0, OutputWidth(), OutputHeight(), $FFFFFF)
    Protected ot = 0, Item_Mouse_Enter =- 1
   
   
    With Item()
      If (ScrollBar_Position / \ItemHeight) >= 0 And
         SelectElement(Item(), ScrollBar_Position / \ItemHeight)
       
        ScrollBar_Maximum = ((ListSize(Item())) * \ItemHeight)
        ScrollBar_PageLength = (OutputHeight() )
       
;         ; 3
;         If (ScrollBar_Position - (((ListSize(Item())) * \ItemHeight) - OutputHeight())) = 0
;           Y = (((ScrollBar_Position / \ItemHeight) * \ItemHeight) - ScrollBar_Position) - 1;
;         EndIf  
       
        Protected Frame,Canvas_MouseY = GetGadgetAttribute(Gadget, #PB_Canvas_MouseY)
       
        Static Index
        Repeat
          Y = (ListIndex(Item()) * \ItemHeight - ScrollBar_Position)
         
          If Canvas_MouseY And (( (Canvas_MouseY) > Y) And ((Canvas_MouseY)< (Y+\ItemHeight+1) ))
            Item_Mouse_Enter = ListIndex(Item())
            Item_Mouse_Entered = Item_Mouse_Enter
          Else
            Item_Mouse_Enter =- 1
          EndIf
         
         
          If \IsItem =- 1
            DrawingMode(#PB_2DDrawing_Default)
            Box(0, Y+2, OutputWidth() - 17, (\ItemHeight+1)-4,$E9DCD2)
            Line(0, Y+2, OutputWidth() - 17,1,0)
           
            DrawingMode(#PB_2DDrawing_Transparent)
            DrawText(3, Y, \Text, $000000)
          Else
            If \IsExpanded
              If Item_Mouse_Enter = ListIndex(Item())
                DrawingMode(#PB_2DDrawing_Default)
                Box(Frame+2, Frame+(Y +1)+ot, OutputWidth() - 17 - Frame*2 - 4, (\ItemHeight+1) - ot*2 - 2,$EB7B24)
              Else
                DrawingMode(#PB_2DDrawing_Outlined)
                Box(Frame+1, Frame+(Y )+ot, OutputWidth() - 17 - Frame*2 - 2, (\ItemHeight+1) - ot*2,0)
              EndIf
             
              DrawingMode(#PB_2DDrawing_Transparent)
              DrawText(3, Y, \Text, $000000)
            EndIf
          EndIf
         
        Until NextElement(Item()) = #False Or (Y > OutputHeight())
       
      EndIf
    EndWith
   
    ; Scrollbar
    X = OutputWidth()-17
   
    DrawingMode(#PB_2DDrawing_Default)
    Box(X, 0, 20, OutputHeight(), $F0F0F0)
   
    If ThumbHeight < OutputHeight()
      If GetGadgetAttribute(Gadget, #PB_Canvas_MouseX) >= X
        Box(X, ThumbPosition, 20, ThumbHeight, $A0A0A0)
      Else
        Box(X, ThumbPosition, 20, ThumbHeight, $D0D0D0)
      EndIf
    EndIf
    StopDrawing()
  EndIf
EndProcedure
 
Procedure ThumbPosition3(GadgetHeight, ScrollMaximum, ScrollPosition, ItemHeight, ListSize)
  ThumbPosition = ((GadgetHeight-((GadgetHeight * GadgetHeight) / ScrollMaximum)) * (ScrollPosition)) / ((ListSize-GadgetHeight/ItemHeight)*ItemHeight)
 
  ProcedureReturn ThumbPosition
EndProcedure
 
Procedure ControlGadget_Event(Gadget)
  Static DeltaY
  ;   Protected ScrollBar_Maximum = GetProp_( GadgetID(Gadget), "ScrollBar_Maximum")
  ;   Protected ScrollBar_PageLength = GetProp_( GadgetID(Gadget), "ScrollBar_PageLength")
  ;   Protected ScrollBar_Position = GetProp_( GadgetID(Gadget), "ScrollBar_Position")
  ;Debug 333333
  Protected Canvas_MouseY = GetGadgetAttribute(Gadget, #PB_Canvas_MouseY)
 
  If ScrollBar_Maximum
    ThumbHeight = (( ScrollBar_PageLength * ScrollBar_PageLength ) / ScrollBar_Maximum ) : If ThumbHeight < 17 : ThumbHeight = 17 : EndIf
  EndIf
 
  Select EventType()
    Case #PB_EventType_LeftButtonDown
      DeltaY = Canvas_MouseY - ThumbPosition
     
     
    Case #PB_EventType_MouseWheel
      Static Pos
      ScrollBar_Position - 17 * GetGadgetAttribute( Gadget, #PB_Canvas_WheelDelta )
      ;         Pos-1*GetGadgetAttribute( Gadget, #PB_Canvas_WheelDelta )
      ;         ScrollBar_Position = (( (ScrollBar_Maximum - ScrollBar_PageLength) * Pos ) / (ScrollBar_PageLength-(( ScrollBar_PageLength * ScrollBar_PageLength ) / ScrollBar_Maximum )) ) ; Ok
     
    Case #PB_EventType_MouseMove, #PB_EventType_LeftButtonDown
      If GetGadgetAttribute( Gadget, #PB_Canvas_Buttons ) & #PB_Canvas_LeftButton
        ;Debug (Canvas_MouseY-DeltaY)
        ScrollBar_Position = (( (ScrollBar_Maximum - ScrollBar_PageLength) * (Canvas_MouseY-DeltaY) ) / (ScrollBar_PageLength-(( ScrollBar_PageLength * ScrollBar_PageLength ) / ScrollBar_Maximum )) ) ; Ok
       
      EndIf
  EndSelect
 
  If ScrollBar_Position < 0
    ScrollBar_Position = 0
  ElseIf ScrollBar_Position > (ScrollBar_Maximum - ScrollBar_PageLength)
    ScrollBar_Position = (ScrollBar_Maximum - ScrollBar_PageLength)
  EndIf
 
  If (ScrollBar_Maximum - ScrollBar_PageLength) > 0
    ;ThumbPosition3(ScrollBar_PageLength, ScrollBar_Maximum, ScrollBar_Position, ItemHeight, ListSize);
    ThumbPosition = ((((ScrollBar_PageLength)-(( ScrollBar_PageLength * ScrollBar_PageLength ) / ScrollBar_Maximum )) * ScrollBar_Position) / (ScrollBar_Maximum - ScrollBar_PageLength))
  EndIf
 
  ControlGadget_Repaint(Gadget)
EndProcedure
 
Procedure ControlGadgetEvent()
 
 
  If #Gadget = EventGadget()
    Static ActiveGadget =- 1
    Static ActiveWindow =- 1
   
    Select EventType()
      Case #PB_EventType_MouseEnter
        ActiveWindow = GetActiveWindow()
        ActiveGadget = GetActiveGadget()
       
        SetActiveGadget( EventGadget() )
       
      Case #PB_EventType_MouseLeave
        If IsWindow( ActiveWindow )
          SetActiveWindow( ActiveWindow )
        EndIf
       
        If IsGadget( ActiveGadget )
          SetActiveGadget( ActiveGadget )
        EndIf
       
      Case #PB_EventType_LeftButtonDown
        Expanded(Item_Mouse_Entered)
       
       
    EndSelect
   
    ControlGadget_Event(EventGadget())
   
  EndIf
EndProcedure
 
 
Procedure ControlGadget(Gadget, X,Y,Width,Height)
  CanvasGadget(Gadget, X,Y,Width,Height, #PB_Canvas_Keyboard)
 
  ControlGadget_Repaint(Gadget)
  ;BindEvent( #PB_Event_Gadget, @ControlGadgetEvent())
  BindGadgetEvent( Gadget, @ControlGadgetEvent())
EndProcedure
 
Procedure ControlGadget_Resize(Gadget)
  ControlGadget_Event(Gadget)
  ControlGadget_Repaint(Gadget)
EndProcedure
 
 
Procedure Resize()
  ResizeGadget(#Gadget, 0, 0, WindowWidth(#Window), WindowHeight(#Window))
  ControlGadget_Resize(#Gadget)
 
EndProcedure
 
OpenWindow(#Window, 0, 0, 400, 300, "WindowTitle", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered|#PB_Window_SizeGadget)
ControlGadget(#Gadget, 0, 0, WindowWidth(#Window), WindowHeight(#Window))
; ;Canvas::DisableEvent(#Gadget,@CanvasGadgetEvent())
 
BindEvent( #PB_Event_SizeWindow, @Resize())
 
Repeat
 
  Select WaitWindowEvent()
     
    Case #PB_Event_CloseWindow
      End
     
  EndSelect
 
ForEver



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: AccordionGadget основанный на канвасе
СообщениеДобавлено: Пн май 09, 2016 12:43 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1694
Откуда: Алматы
Благодарил (а): 15 раз.
Поблагодарили: 46 раз.
Пункты репутации: 5
немного оффтопну :) код классный - я так понимаю на таком канвасном гаджете можно будет сделать миди редактор? ну чтоб ноты были видны как кораблики в морском бое на листе в клетку? и чтоб мышкой их можно было редактировать по длительности и по высоте?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: AccordionGadget основанный на канвасе
СообщениеДобавлено: Пн май 09, 2016 3:32 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вс дек 09, 2012 9:02 pm
Сообщений: 771
Откуда: Дагестан
Благодарил (а): 0 раз.
Поблагодарили: 11 раз.
Пункты репутации: 0
Цитата:
я так понимаю на таком канвасном гаджете можно будет сделать миди редактор? ну чтоб ноты были видны как кораблики в морском бое на листе в клетку? и чтоб мышкой их можно было редактировать по длительности и по высоте?

К чему это не понятно. :)
Вот по лучше код единственное проблема с скроллом.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
EnableExplicit
 
;-
Enumeration
  #Window
  #Gadget
EndEnumeration
 
 
Global ScrollBar_Maximum,
       ScrollBar_PageLength,
       ScrollBar_Position,
       ThumbPosition,
       ThumbHeight,
       Item_Mouse_Entered
 
Structure ItemStruct
  IsItem.i
  IsExpanded.i
  Expanded.i
 
  Text.S
  ItemHeight.i
EndStructure
 
Global NewList Item.ItemStruct()
 
 
Procedure Expanded( Item ) ; Ok
  Protected State
 
  If Item >= 0
    With Item()
      SelectElement(Item(), Item)
     
      If \IsItem =- 1
        State =  \Expanded
       
        PushListPosition(Item())
        ForEach Item()
          If ListIndex(Item()) > Item
            If \IsItem =- 1 : Break : EndIf
           
            \IsExpanded = State
          EndIf
        Next
        PopListPosition(Item())
       
        ; Если скрыто раскрываем иначе скрываем
        If \Expanded = 0 : \Expanded = 1 : Else : \Expanded = 0 : EndIf
      EndIf
    EndWith
  EndIf
 
EndProcedure
 
Define I,II
For I = 1 To 30;50
  With Item()
   
    AddElement(Item())
  Select i
    Case 5,10,15,20,25
      II+1
      \ItemHeight = 40;16
      \Text = Str(II)+" This is Accord "+Str(I)
      \IsItem =- 1
      \IsExpanded = 1
     
    Default
      \ItemHeight = 16
      \Text = "This is Item "+Str(I)
      \IsItem = 1
      \IsExpanded = 1
     
  EndSelect
 
 
  ScrollBar_Maximum  + Item()\ItemHeight;
  EndWith
Next
; ;ScrollBar_Maximum  - 24 ;= 540
; ;ScrollBar_Maximum  - 48 ;= 540
;ScrollBar_Maximum - 5*40 ;= 540
 
Debug ScrollBar_Maximum
 
 
Procedure ControlGadget_Repaint( Gadget )
  Protected X.i, Y.i, Height.i,FontHeight
  Protected ot = 0
  Protected Scroll_Position = ScrollBar_Position/16
  Protected Canvas_MouseY = GetGadgetAttribute( Gadget, #PB_Canvas_MouseY )
       
 
  If StartDrawing(CanvasOutput( Gadget ))
    Box(0, 0, OutputWidth(), OutputHeight(), $FFFFFF)
   
    With Item()
      ; List von Items
      If SelectElement(Item(), Scroll_Position)
        ;       ; ScrollEnd
        ;       If (ScrollBar_Position = (ScrollBar_Maximum - OutputHeight()))
        ;         Y = (((Scroll_Position) * \ItemHeight) - ScrollBar_Position) - 1;
        ;       EndIf  
       
        Repeat
          If \IsExpanded = 0
            Repeat : Until NextElement(Item()) = 0 Or \IsItem =- 1
            SelectElement(Item(), ListIndex(Item()) )
          EndIf
         
          If Canvas_MouseY And ((Canvas_MouseY > Y) And (Canvas_MouseY < (Y+\ItemHeight)))
            Item_Mouse_Entered = ListIndex(Item())
            Debug Item_Mouse_Entered
          EndIf
         
          ; Сетка
          If \IsItem =- 1
            DrawingMode(#PB_2DDrawing_Default)
            Box(1, Y+2, OutputWidth()-17 - 2, (\ItemHeight+1) - 4 , $D89E88)
          Else
            DrawingMode(#PB_2DDrawing_Outlined)
            Box(0, Y+ot, OutputWidth()-17, (\ItemHeight+1) - ot*2 , 0)
          EndIf
       
          DrawingMode(#PB_2DDrawing_Transparent)
          DrawText(3, Y+((\ItemHeight-TextHeight(\Text))/2), \Text, $000000)
         
          ;Debug ListIndex(Item())
          ; 3
          Y + \ItemHeight
        Until (NextElement(Item()) = #False Or Y > OutputHeight())
      EndIf
     
      ; Scrollbar
      X = OutputWidth()-17
     
      DrawingMode(#PB_2DDrawing_Default)
      Box(X, 0, 20, OutputHeight(), $F0F0F0)
     
      If ThumbHeight < OutputHeight()
        If GetGadgetAttribute(Gadget, #PB_Canvas_MouseX) >= X
          Box(X, ThumbPosition, 20, ThumbHeight, $A0A0A0)
        Else
          Box(X, ThumbPosition, 20, ThumbHeight, $D0D0D0)
        EndIf
      EndIf
     
    EndWith
    StopDrawing()
  EndIf
EndProcedure
 
Procedure ControlGadget_Event( Gadget )
  Static DeltaY
  Shared ThumbHeight, ThumbPosition
 
  Protected Canvas_MouseY = GetGadgetAttribute(Gadget, #PB_Canvas_MouseY)
  Protected Scroll_PageLength = (ScrollBar_Maximum - ScrollBar_PageLength)
 
  ThumbHeight = (( ScrollBar_PageLength * ScrollBar_PageLength ) / ScrollBar_Maximum )
 
  Select EventType()
    Case #PB_EventType_LeftButtonDown
      DeltaY = Canvas_MouseY - ThumbPosition
     
    Case #PB_EventType_MouseWheel
      ScrollBar_Position - 16 * GetGadgetAttribute( Gadget, #PB_Canvas_WheelDelta )
     
    Case #PB_EventType_MouseMove, #PB_EventType_LeftButtonDown
      If GetGadgetAttribute( Gadget, #PB_Canvas_Buttons ) & #PB_Canvas_LeftButton
        ScrollBar_Position = (( Scroll_PageLength * (Canvas_MouseY-DeltaY) ) / (ScrollBar_PageLength - ThumbHeight) ) ; Ok
      EndIf
     
  EndSelect
 
  If ScrollBar_Position < 0 : ScrollBar_Position = 0
  ElseIf ScrollBar_Position > Scroll_PageLength
    ScrollBar_Position = Scroll_PageLength
  EndIf
 
  If Scroll_PageLength
    ThumbPosition = (((ScrollBar_PageLength - ThumbHeight) * ScrollBar_Position) / Scroll_PageLength)
  EndIf
  ;ScrollBar_Position - ThumbHeight
  ;Debug ScrollBar_Position
  ControlGadget_Repaint(Gadget)
EndProcedure
 
Procedure ControlGadgetEvent( )
  Static ActiveGadget =- 1
  Static ActiveWindow =- 1
 
  Select EventType()
    Case #PB_EventType_MouseEnter
      ActiveWindow = GetActiveWindow()
      ActiveGadget = GetActiveGadget()
     
      SetActiveGadget( EventGadget() )
     
    Case #PB_EventType_MouseLeave
      If IsWindow( ActiveWindow )
        SetActiveWindow( ActiveWindow )
      EndIf
     
      If IsGadget( ActiveGadget )
        SetActiveGadget( ActiveGadget )
      EndIf
     
    Case #PB_EventType_LeftButtonDown
      Expanded(Item_Mouse_Entered)
     
  EndSelect
 
  ControlGadget_Event( EventGadget() )
EndProcedure
 
 
Procedure ControlGadget_Resize( Gadget,Width,Height )
  ResizeGadget( Gadget, #PB_Ignore, #PB_Ignore, Width,Height )
  ScrollBar_PageLength = Height
  ControlGadget_Event(Gadget)
  ControlGadget_Repaint(Gadget)
EndProcedure
 
Procedure ControlGadget( Gadget, X,Y,Width,Height )
  CanvasGadget(Gadget, X,Y,Width,Height, #PB_Canvas_Keyboard)
 
  ControlGadget_Resize( Gadget,Width,Height )
 
  BindGadgetEvent( Gadget, @ControlGadgetEvent())
EndProcedure
 
 
OpenWindow(#Window, 0, 0, 400, 300, "WindowTitle", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered|#PB_Window_SizeGadget)
ControlGadget(#Gadget, 0, 0, WindowWidth(#Window), WindowHeight(#Window))
; ;Canvas::DisableEvent(#Gadget,@CanvasGadgetEvent())
 
 
Procedure Resize()
  ControlGadget_Resize(#Gadget, WindowWidth(#Window), WindowHeight(#Window))
 
EndProcedure
 
 
BindEvent( #PB_Event_SizeWindow, @Resize())
 
 
Repeat
 
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      End
     
  EndSelect
 
ForEver



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: AccordionGadget основанный на канвасе
СообщениеДобавлено: Пн май 09, 2016 8:18 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1694
Откуда: Алматы
Благодарил (а): 15 раз.
Поблагодарили: 46 раз.
Пункты репутации: 5
я чот тупеть начал в последнее время... добавь еще значение к строчкам. типа флаг свернут не свернут и делай проверку в цикле. если флаг развернут - рисовать, если свернут то не рисовать. сейчас оно высоту по размеру листа видимо считает для скроллбара. поэтому надо будет считать не размер листа, а размер только тех строчек, которые с включеным флагом.

по поводу моего "морского боя" - это мне хотелось бы сделать миди редактор, точнее не совсем миди - но как в миди редакторах :)
Изображение

очень хочу доделать :) давно пообещал там на форуме и чот мозги начали вытекать. начал подтормаживать... возраст чтоль...


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: AccordionGadget основанный на канвасе
СообщениеДобавлено: Ср май 11, 2016 12:47 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вс дек 09, 2012 9:02 pm
Сообщений: 771
Откуда: Дагестан
Благодарил (а): 0 раз.
Поблагодарили: 11 раз.
Пункты репутации: 0
Цитата:
я чот тупеть начал в последнее время
Мне от тебя помощи нет. :)
Цитата:
очень хочу доделать

Может я с могу чем помочь, что не получается?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: AccordionGadget основанный на канвасе
СообщениеДобавлено: Ср май 11, 2016 2:22 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1694
Откуда: Алматы
Благодарил (а): 15 раз.
Поблагодарили: 46 раз.
Пункты репутации: 5
как нет? я ж говорю что надо пересчитывать ScrollBar_Maximum каждый раз. правда еще не понятно почему изначально, пока все развернуты - все равно внизу рисует пустое место. еще неудобный косяк что кликаешь на прогресс баре чтоб его двигать - а он берет и разворачивает какой-то пункт, напротив которого ты кликал. надо как-то по Х ограничить зону кликания.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: AccordionGadget основанный на канвасе
СообщениеДобавлено: Ср май 11, 2016 2:35 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1694
Откуда: Алматы
Благодарил (а): 15 раз.
Поблагодарили: 46 раз.
Пункты репутации: 5
что-то типа:
Код:
1
2
3
4
5
6
7
8
; Если скрыто раскрываем иначе скрываем
        If \Expanded = 0
          \Expanded = 1
          ScrollBar_Maximum = ScrollBar_Maximum - (14 * 4)
        Else
          \Expanded = 0
          ScrollBar_Maximum = ScrollBar_Maximum + (14 * 4)
        EndIf



а что касается моей задумки - да там пока несчем помогать :) есть только задумка, а вот как реализовать не представляю. там несколько проблем.

первая: в миди используется своеобразные тики - временные отрезки мелкие. типа мелодия из 134534 тиков состоит (от фонаря), в этом миди есть значение Дельта - количество тиков, то есть длительность для 1/4 ноты. но сами ноты благодаря такому огромному запасу по тикам совсем не обязательно 1/4 может быть и 1/128 и еще мельче, и бывает совсем что-то невообразимо нестандартное. в моем же целевом формате, вкуда я хочу конвертировать мелодию - минимальная нота может быть 1/24. то есть опять таки не стандартная и довольно таки крупная нота. то есть мне надо мелодию разместить в некой матрице из клеток=1/24 нот, как миди редакторе. проблема будет с мелкими нотами, поскольку их система удлинит до 1/24 в результате дорожка собьется с ритма. типа скрипки играют правильно, а барабаны ушли вперед скажем. будет сраный рассинхрон. поэтому видимо придется или игнорировать, или сдвигать мелодию всю. там будет не очень уж заметно что ритм чуть чуть поплыл на общем фоне. все равно бывает эмулятор подвисает и ритм чуть чуть плавает. а вторая задумка - отображать все это дело графически, как на том скрине в миди редакторе, с возможностью подправить какую-то ноту.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: AccordionGadget основанный на канвасе
СообщениеДобавлено: Чт май 12, 2016 4:30 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вс дек 09, 2012 9:02 pm
Сообщений: 771
Откуда: Дагестан
Благодарил (а): 0 раз.
Поблагодарили: 11 раз.
Пункты репутации: 0
Цитата:
что-то типа:

Код:
1
2
3
4
5
6
7
8
9
; Если скрыто раскрываем иначе скрываем
        If \Expanded = 0
          \Expanded = 1
          ScrollBar_Maximum = ScrollBar_Maximum - (14 * 4)
        Else
          \Expanded = 0
          ScrollBar_Maximum = ScrollBar_Maximum + (14 * 4)
        EndIf
 





Это у меня решено
У меня другие проблемы связанные с Scroll_Position
Если свернуть accord с индексом меньше индекса Scroll_Position, то тогда появляются проблемы.
А в остальном если высота accord-а равна высоте итема , то все в порядке.
Вот если бы кто нибудь помог с этим было бы не плохо.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
 
 
EnableExplicit
 
;-
Enumeration
  #Window
  #Gadget
EndEnumeration
 
 
Global ScrollBar_Maximum,
       ScrollBar_PageLength,
       ScrollBar_Position,
       ThumbPosition,
       ThumbHeight,
       Item_Mouse_Entered
 
Structure ItemStruct
  IsItem.i
  IsExpanded.i
  Expanded.i
 
  Text.S
  ItemHeight.i
EndStructure
 
Global NewList Item.ItemStruct()
 
Procedure ScrollBar_Maximum( ) ; Ok
  Protected Expanded
 
  With Item()
    PushListPosition(Item())
    ForEach Item()
      If \IsExpanded
        Expanded + \ItemHeight
      EndIf
    Next
    PopListPosition(Item())
  EndWith
 
  Debug Str(Expanded) +" - ScrollBar_Maximum"
  ProcedureReturn (Expanded)
EndProcedure
 
Procedure Expanded( Item ) ; Ok
  Protected State
 
  If Item >= 0
    With Item()
      SelectElement(Item(), Item)
     
      If \IsItem =- 1
        State =  \Expanded
       
        PushListPosition(Item())
        ForEach Item()
          If ListIndex(Item()) > Item
            If \IsItem =- 1 : Break : EndIf
           
            \IsExpanded = State
          EndIf
        Next
        PopListPosition(Item())
       
        ; Если скрыто раскрываем иначе скрываем
        If \Expanded = 0 : \Expanded = 1 : Else : \Expanded = 0 : EndIf
      EndIf
    EndWith
  EndIf
 
EndProcedure
 
Define I,II
For I = 1 To 30;50
  With Item()
   
    AddElement(Item())
  Select i
    Case 5,10,15,20,25
      II+1
      \ItemHeight = 16;16
      \Text = Str(II)+" This is Accord "+Str(I)
      \IsItem =- 1
      \IsExpanded = 1
     
    Default
      \ItemHeight = 16
      \Text = "This is Item "+Str(I)
      \IsItem = 1
      \IsExpanded = 1
     
  EndSelect
 
 
  ScrollBar_Maximum  + Item()\ItemHeight;
  EndWith
Next
 
Debug Str(ScrollBar_Maximum) +" - ScrollBar_Maximum"
   
 
Procedure ControlGadget_Repaint( Gadget )
  Protected X.i, Y.i, Height.i,FontHeight
  Protected ot = 0
 
  Protected EnterIndex =- 1
  Protected Scroll_Position = ScrollBar_Position/16
  Protected Canvas_MouseY = GetGadgetAttribute( Gadget, #PB_Canvas_MouseY )
       
 
  If StartDrawing(CanvasOutput( Gadget ))
    Box(0, 0, OutputWidth(), OutputHeight(), $FFFFFF)
   
    If ThumbHeight < OutputHeight()
      X = OutputWidth()-17
    Else
      X = OutputWidth()
    EndIf
   
    With Item()
      ; List von Items
      If SelectElement(Item(), Scroll_Position)
        ; ScrollEnd
        If (ScrollBar_Position = (ScrollBar_Maximum - OutputHeight()))
          Y = (((Scroll_Position) * \ItemHeight) - ScrollBar_Position) - 1;
        EndIf  
       
        Repeat
          If \IsExpanded = 0
            Repeat : Until NextElement(Item()) = 0 Or \IsItem =- 1
            If ListIndex(Item()) = (ListSize(Item()) - 1) : Break : EndIf
          EndIf
         
          If Canvas_MouseY And ((Canvas_MouseY > Y) And (Canvas_MouseY < (Y+\ItemHeight)))
            Item_Mouse_Entered = ListIndex(Item())
            EnterIndex = Item_Mouse_Entered
          Else
            EnterIndex =- 1
          EndIf
         
          ; Сетка
          If \IsItem =- 1
            DrawingMode(#PB_2DDrawing_Default)
            Box(1, Y+2, X - 2, (\ItemHeight+1) - 4 , $D89E88)
          Else
            If ListIndex(Item()) = EnterIndex
              DrawingMode(#PB_2DDrawing_Default)
              Box(0, Y+ot+1, X, (\ItemHeight+1) - ot*2 - 2 , $FFBAA0)
            EndIf
           
            DrawingMode(#PB_2DDrawing_Outlined)
            Box(0, Y+ot, X, (\ItemHeight+1) - ot*2 , 0)
          EndIf
       
          DrawingMode(#PB_2DDrawing_Transparent)
          DrawText(3, Y+((\ItemHeight-TextHeight(\Text))/2), \Text, $000000)
         
          ;Debug ListIndex(Item())
          ; 3
          Y + \ItemHeight
        Until (NextElement(Item()) = #False Or Y > OutputHeight())
      EndIf
     
      ; Scrollbar
      If ThumbHeight < OutputHeight()
        DrawingMode(#PB_2DDrawing_Default)
        Box(X, 0, 20, OutputHeight(), $F0F0F0)
       
        If GetGadgetAttribute(Gadget, #PB_Canvas_MouseX) >= X
          Box(X, ThumbPosition, 20, ThumbHeight, $A0A0A0)
        Else
          Box(X, ThumbPosition, 20, ThumbHeight, $D0D0D0)
        EndIf
      EndIf
     
    EndWith
    StopDrawing()
  EndIf
EndProcedure
 
Procedure ControlGadget_Event( Gadget )
  Static DeltaY
  Shared ThumbHeight, ThumbPosition
 
  Protected Canvas_MouseY = GetGadgetAttribute(Gadget, #PB_Canvas_MouseY)
 
  If (ScrollBar_Maximum - ScrollBar_PageLength) >= 0
    Protected Scroll_PageLength = (ScrollBar_Maximum - ScrollBar_PageLength)
  EndIf
 
  ThumbHeight = (( ScrollBar_PageLength * ScrollBar_PageLength ) / ScrollBar_Maximum )
 
  Select EventType()
    Case #PB_EventType_LeftButtonDown
      DeltaY = Canvas_MouseY - ThumbPosition
     
    Case #PB_EventType_MouseWheel
      ScrollBar_Position - 16 * GetGadgetAttribute( Gadget, #PB_Canvas_WheelDelta )
     
    Case #PB_EventType_MouseMove, #PB_EventType_LeftButtonDown
      If GetGadgetAttribute( Gadget, #PB_Canvas_Buttons ) & #PB_Canvas_LeftButton
        ScrollBar_Position = (( Scroll_PageLength * (Canvas_MouseY-DeltaY) ) / (ScrollBar_PageLength - ThumbHeight) ) ; Ok
      EndIf
     
  EndSelect
 
  If ScrollBar_Position < 0 : ScrollBar_Position = 0
  ElseIf ScrollBar_Position > Scroll_PageLength
    ScrollBar_Position = Scroll_PageLength
  EndIf
 
  If Scroll_PageLength
    ThumbPosition = (((ScrollBar_PageLength - ThumbHeight) * ScrollBar_Position) / Scroll_PageLength)
  EndIf
 
  ControlGadget_Repaint(Gadget)
EndProcedure
 
Procedure ControlGadgetEvent( )
  Static ActiveGadget =- 1
  Static ActiveWindow =- 1
 
  Select EventType()
    Case #PB_EventType_MouseEnter
      ActiveWindow = GetActiveWindow()
      ActiveGadget = GetActiveGadget()
     
      SetActiveGadget( EventGadget() )
     
    Case #PB_EventType_MouseLeave
      If IsWindow( ActiveWindow )
        SetActiveWindow( ActiveWindow )
      EndIf
     
      If IsGadget( ActiveGadget )
        SetActiveGadget( ActiveGadget )
      EndIf
     
    Case #PB_EventType_LeftButtonDown
      Expanded(Item_Mouse_Entered)
      ScrollBar_Maximum = ScrollBar_Maximum( )
     
  EndSelect
 
  ControlGadget_Event( EventGadget() )
EndProcedure
 
 
Procedure ControlGadget_Resize( Gadget,Width,Height )
  ResizeGadget( Gadget, #PB_Ignore, #PB_Ignore, Width,Height )
  ScrollBar_PageLength = Height
  ControlGadget_Event(Gadget)
  ControlGadget_Repaint(Gadget)
EndProcedure
 
Procedure ControlGadget( Gadget, X,Y,Width,Height )
  CanvasGadget(Gadget, X,Y,Width,Height, #PB_Canvas_Keyboard)
 
  ControlGadget_Resize( Gadget,Width,Height )
 
  BindGadgetEvent( Gadget, @ControlGadgetEvent())
EndProcedure
 
 
OpenWindow(#Window, 0, 0, 400, 300, "WindowTitle", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered|#PB_Window_SizeGadget)
ControlGadget(#Gadget, 0, 0, WindowWidth(#Window), WindowHeight(#Window))
; ;Canvas::DisableEvent(#Gadget,@CanvasGadgetEvent())
 
 
Procedure Resize()
  ControlGadget_Resize(#Gadget, WindowWidth(#Window), WindowHeight(#Window))
 
EndProcedure
 
 
BindEvent( #PB_Event_SizeWindow, @Resize())
 
 
Repeat
 
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      End
     
  EndSelect
 
ForEver
 
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: AccordionGadget основанный на канвасе
СообщениеДобавлено: Чт май 12, 2016 4:54 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1694
Откуда: Алматы
Благодарил (а): 15 раз.
Поблагодарили: 46 раз.
Пункты репутации: 5
и что делать чтоб увидеть в чем косяк? я чот не вижу :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: AccordionGadget основанный на канвасе
СообщениеДобавлено: Чт май 12, 2016 5:06 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вс дек 09, 2012 9:02 pm
Сообщений: 771
Откуда: Дагестан
Благодарил (а): 0 раз.
Поблагодарили: 11 раз.
Пункты репутации: 0
:) Ну ты шутник. Сверни первый accord и сделай скролл до конца. Теперь видишь что последный итем 28 в место 30


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: AccordionGadget основанный на канвасе
СообщениеДобавлено: Чт май 12, 2016 6:13 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1694
Откуда: Алматы
Благодарил (а): 15 раз.
Поблагодарили: 46 раз.
Пункты репутации: 5
это ты где-то с высотой напутал для скрола. физически он есть - увелич мышкой размер окошка и оно появится. видимо ты вычитаешь не 4 * высота одной строки, а 6 * высота одной строки. в результате убавляется чуть больше, чем должно быть. или высота реальная скажем 16, а у тебя 14 в формуле считается и остаток в аккурат в высоту двух строчек видимо и вошел.

хотя не... при ресайзе перерисовка идет. значит видимо не рисует :) где-то ашипка в коде...

кароче я взял и увеличил размер окошка с 300 до 336 и тогда все нормально показывает :))))) черт знает где там косяк...


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: AccordionGadget основанный на канвасе
СообщениеДобавлено: Чт май 12, 2016 8:24 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вс дек 09, 2012 9:02 pm
Сообщений: 771
Откуда: Дагестан
Благодарил (а): 0 раз.
Поблагодарили: 11 раз.
Пункты репутации: 0
Это не с высотой связано а с позицией. Вот посмотри
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
 
EnableExplicit
 
;-
Enumeration
  #Window
  #Gadget
EndEnumeration
 
 
Global ScrollBar_Maximum,
       ScrollBar_PageLength,
       ScrollBar_Position,
       ThumbPosition,
       ThumbHeight,
       Item_Mouse_Entered
 
Structure ItemStruct
  IsItem.i
  IsExpanded.i
  Expanded.i
 
  Text.S
  ItemHeight.i
EndStructure
 
Global NewList Item.ItemStruct()
 
Procedure ScrollBar_Maximum( ) ; Ok
  Protected Expanded
 
  With Item()
    PushListPosition(Item())
    ForEach Item()
      If \IsExpanded
        Expanded + \ItemHeight
      EndIf
    Next
    PopListPosition(Item())
  EndWith
 
  Debug Str(Expanded) +" - ScrollBar_Maximum"
  ProcedureReturn (Expanded)
EndProcedure
 
Procedure Expanded( Item ) ; Ok
  Protected State
 
  If Item >= 0
    With Item()
      SelectElement(Item(), Item)
     
      If \IsItem =- 1
        State =  \Expanded
       
        PushListPosition(Item())
        ForEach Item()
          If ListIndex(Item()) > Item
            If \IsItem =- 1 : Break : EndIf
           
            \IsExpanded = State
          EndIf
        Next
        PopListPosition(Item())
       
        ; Если скрыто раскрываем иначе скрываем
        If \Expanded = 0 : \Expanded = 1 : Else : \Expanded = 0 : EndIf
      EndIf
    EndWith
  EndIf
 
EndProcedure
 
Define I,II
For I = 0 To 30;50
  With Item()
   
    AddElement(Item())
  Select i
    Case 0,5,10,15,20,25
      II+1
      \ItemHeight = 16;16
      \Text = Str(II)+" This is Accord "+Str(I)
      \IsItem =- 1
      \IsExpanded = 1
     
    Default
      \ItemHeight = 16
      \Text = "This is Item "+Str(I)
      \IsItem = 1
      \IsExpanded = 1
     
  EndSelect
 
 
  ScrollBar_Maximum  + Item()\ItemHeight;
  EndWith
Next
 
Debug Str(ScrollBar_Maximum) +" - ScrollBar_Maximum"
   
 
Procedure ControlGadget_Repaint( Gadget )
  Protected X.i, Y.i, Height.i,FontHeight
  Protected ot = 0
 
  Protected EnterIndex =- 1
  Protected Scroll_Position = ScrollBar_Position/16
  Protected Canvas_MouseY = GetGadgetAttribute( Gadget, #PB_Canvas_MouseY )
       
 
  If StartDrawing(CanvasOutput( Gadget ))
    Box(0, 0, OutputWidth(), OutputHeight(), $FFFFFF)
   
    If ThumbHeight < OutputHeight()
      X = OutputWidth()-17
    Else
      X = OutputWidth()
    EndIf
   
    With Item()
      ; List von Items
      If SelectElement(Item(), Scroll_Position)
        ; ScrollEnd
        If (ScrollBar_Position = ( ScrollBar_Maximum - ScrollBar_PageLength))
          Y = ((Scroll_Position * \ItemHeight) - ScrollBar_Position) - 1;
        EndIf  
       
        Debug ""
        Debug "Scroll_Position "+Scroll_Position
         
        Repeat
          If \IsExpanded = 0
            Repeat
             
            Until NextElement(Item()) = 0 Or \IsItem =- 1
            If ListIndex(Item()) = (ListSize(Item()) - 1) : Break : EndIf
          EndIf
         
          Debug "ListIndex "+ListIndex(Item())
         
          If Canvas_MouseY And ((Canvas_MouseY > Y) And (Canvas_MouseY < (Y+\ItemHeight)))
            Item_Mouse_Entered = ListIndex(Item())
            EnterIndex = Item_Mouse_Entered
          Else
            EnterIndex =- 1
          EndIf
         
          ; Сетка
          If \IsItem =- 1
            DrawingMode(#PB_2DDrawing_Default)
            Box(1, Y+2, X - 2, (\ItemHeight+1) - 4 , $D89E88)
          Else
            If ListIndex(Item()) = EnterIndex
              DrawingMode(#PB_2DDrawing_Default)
              Box(0, Y+ot+1, X, (\ItemHeight+1) - ot*2 - 2 , $FFBAA0)
            EndIf
           
            DrawingMode(#PB_2DDrawing_Outlined)
            Box(0, Y+ot, X, (\ItemHeight+1) - ot*2 , 0)
          EndIf
       
          DrawingMode(#PB_2DDrawing_Transparent)
          DrawText(3, Y+((\ItemHeight-TextHeight(\Text))/2), \Text, $000000)
         
          ;Debug ListIndex(Item())
          ; 3
          Y + \ItemHeight
        Until (NextElement(Item()) = #False Or Y > OutputHeight())
       
        If SelectElement(Item(), Scroll_Position)
          Debug "IsItem "+\IsItem
          Debug "Expanded "+\Expanded
          Debug "IsExpanded "+\IsExpanded
         
          If \IsItem =- 1
            If \IsExpanded And \Expanded
              Debug 888888
;            
            EndIf
          Else
            If \IsExpanded = 0 And \Expanded = 0
              Debug 99999999
             
            EndIf
          EndIf
        EndIf
      EndIf
     
      ; Scrollbar
      If ThumbHeight < OutputHeight()
        DrawingMode(#PB_2DDrawing_Default)
        Box(X, 0, 20, OutputHeight(), $F0F0F0)
       
        If GetGadgetAttribute(Gadget, #PB_Canvas_MouseX) >= X
          Box(X, ThumbPosition, 20, ThumbHeight, $A0A0A0)
        Else
          Box(X, ThumbPosition, 20, ThumbHeight, $D0D0D0)
        EndIf
      EndIf
     
    EndWith
    StopDrawing()
  EndIf
EndProcedure
 
Procedure ControlGadget_Event( Gadget )
  Static DeltaY
  Shared ThumbHeight, ThumbPosition
 
  Protected Canvas_MouseY = GetGadgetAttribute(Gadget, #PB_Canvas_MouseY)
 
  If (ScrollBar_Maximum - ScrollBar_PageLength) >= 0
    Protected Scroll_PageLength = (ScrollBar_Maximum - ScrollBar_PageLength)
  EndIf
 
  ThumbHeight = (( ScrollBar_PageLength * ScrollBar_PageLength ) / ScrollBar_Maximum )
 
  Select EventType()
    Case #PB_EventType_LeftButtonDown
      DeltaY = Canvas_MouseY - ThumbPosition
     
    Case #PB_EventType_MouseWheel
      ScrollBar_Position - 16 * GetGadgetAttribute( Gadget, #PB_Canvas_WheelDelta )
     
    Case #PB_EventType_MouseMove, #PB_EventType_LeftButtonDown
      If GetGadgetAttribute( Gadget, #PB_Canvas_Buttons ) & #PB_Canvas_LeftButton
        ScrollBar_Position = (( Scroll_PageLength * (Canvas_MouseY-DeltaY) ) / (ScrollBar_PageLength - ThumbHeight) ) ; Ok
      EndIf
     
  EndSelect
 
  If ScrollBar_Position < 0 : ScrollBar_Position = 0
  ElseIf ScrollBar_Position > Scroll_PageLength
    ScrollBar_Position = Scroll_PageLength
  EndIf
 
  If Scroll_PageLength
    ThumbPosition = (((ScrollBar_PageLength - ThumbHeight) * ScrollBar_Position) / Scroll_PageLength)
  EndIf
 
  ControlGadget_Repaint(Gadget)
EndProcedure
 
Procedure ControlGadgetEvent( )
  Static ActiveGadget =- 1
  Static ActiveWindow =- 1
 
  Select EventType()
    Case #PB_EventType_MouseEnter
      ActiveWindow = GetActiveWindow()
      ActiveGadget = GetActiveGadget()
     
      SetActiveGadget( EventGadget() )
     
    Case #PB_EventType_MouseLeave
      If IsWindow( ActiveWindow )
        SetActiveWindow( ActiveWindow )
      EndIf
     
      If IsGadget( ActiveGadget )
        SetActiveGadget( ActiveGadget )
      EndIf
     
    Case #PB_EventType_LeftButtonDown
      Expanded(Item_Mouse_Entered)
      ScrollBar_Maximum = ScrollBar_Maximum( )
     
  EndSelect
 
  ControlGadget_Event( EventGadget() )
EndProcedure
 
 
Procedure ControlGadget_Resize( Gadget,Width,Height )
  ResizeGadget( Gadget, #PB_Ignore, #PB_Ignore, Width,Height )
  ScrollBar_PageLength = Height
  ControlGadget_Event(Gadget)
  ControlGadget_Repaint(Gadget)
EndProcedure
 
Procedure ControlGadget( Gadget, X,Y,Width,Height )
  CanvasGadget(Gadget, X,Y,Width,Height, #PB_Canvas_Keyboard)
 
  ControlGadget_Resize( Gadget,Width,Height )
 
  BindGadgetEvent( Gadget, @ControlGadgetEvent())
EndProcedure
 
 
OpenWindow(#Window, 0, 0, 400, 300, "WindowTitle", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered|#PB_Window_SizeGadget)
ControlGadget(#Gadget, 0, 0, WindowWidth(#Window), WindowHeight(#Window))
; ;Canvas::DisableEvent(#Gadget,@CanvasGadgetEvent())
 
 
Procedure Resize()
  ControlGadget_Resize(#Gadget, WindowWidth(#Window), WindowHeight(#Window))
 
EndProcedure
 
 
BindEvent( #PB_Event_SizeWindow, @Resize())
 
 
Repeat
 
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      End
     
  EndSelect
 
ForEver
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: AccordionGadget основанный на канвасе
СообщениеДобавлено: Чт май 12, 2016 9:53 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1694
Откуда: Алматы
Благодарил (а): 15 раз.
Поблагодарили: 46 раз.
Пункты репутации: 5
чот кода слишком дофига... я в нем плаваю. вобщем высота вроде как правильная причем как самого поля с текстом, так и скролл бара. сам прогресс бар отщелкивает невидимые позиции верно - там можно посчитать по колесику мышки и сравнить с количеством строк, которые скрываются за пределами видимости. вся закавыка где-то в формуле, которая отвечает за рисование основного поля с текстом в зависимости от положения прокрутки. там есть момент где скроллбар щелкает, а поле текста стоит на месте - хотя оно должно двигаться синхронно со скролбаром. вот эти холостые прощелки и виноваты что не отображается внизу несколько строк.

а... ну понятно в чем дело чо :) прощелки холостые происходят как раз на тех строках, что уже невидимы - скрыты. кароче сделай два списка и мозги не парь. первый главный - в нем все строки. а во второй копируются только видимые. вот его и считай потом. там все будет правильно считаться. сейчас же скролл бар скажем на 0 - показывает 0 строку. 1 строка уже скрыта - но скроллбар все равно хочет показать 1 строку, хотя должен показывать 5 строчку вместо первой. отсюда и это холостое прощелкивание.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: AccordionGadget основанный на канвасе
СообщениеДобавлено: Чт май 12, 2016 10:33 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вс дек 09, 2012 9:02 pm
Сообщений: 771
Откуда: Дагестан
Благодарил (а): 0 раз.
Поблагодарили: 11 раз.
Пункты репутации: 0
Цитата:
отсюда и это холостое прощелкивание.
Это я и толкаю тебе :D Вот как это исправить? на примере.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: AccordionGadget основанный на канвасе
СообщениеДобавлено: Чт май 12, 2016 10:41 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1694
Откуда: Алматы
Благодарил (а): 15 раз.
Поблагодарили: 46 раз.
Пункты репутации: 5
а я незнаю в какой части кода у тебя считается этот скроллбар, точнее куда должно будет прыгать основное поле текста при движении скроллбара. я ж говорю плаваю в твоем коде :) надо кароче чтоб скроллбар показывал не 0, 1, 2, 3, 4... а видимая, видимая, видимая, видимая. то есть 0, 5, 6, 7, 8 - то есть игнорировать невидимые. точнее физически скролл бар 0, 1, 2, 3 показывает, но основное поле должно как-бы присваивать этим значениям свои в зависимости от видимости или невидимости строчек.


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 20 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB