PropertiesGadget()

Share your advanced PureBasic knowledge/code with the community.
mestnyi
Addict
Addict
Posts: 1001
Joined: Mon Nov 25, 2013 6:41 am

PropertiesGadget()

Post by mestnyi »

blueb
hopefully this will be the start of a Drag'N'Drop Visual Designer tool :mrgreen:
He remembered from his bullying
I am not finished yet but I think he is better than the built-in ide.

Code: Select all

;PropertyGadget 
;
;Befehlsbeschreibung:
; ________________________________________________________________________________________________________________
;| -PropertyGadget_Create(Gadget.i, X.i, Y.i, Width.i, Height.i, ItemHeight.i = 20, BackColor.i = $fcfcfc)|
;|Erstellt ein PropertyGadget an den angegebenen Koordinaten mit der den angegebenen Dimensionen.                 |
;|Die `ItemHeight` bestimmt die Schriftgrцsse und die Hцhe der Items.                                              |
;|________________________________________________________________________________________________________________|
;| -PropertyGadget_AddItem(Gadget.i, Pos.i, Info.S, Text$, Type)                                      |
;|Fьgt einen neuen Eintrag mit der angegebenen Beschreibung und Text hinzu.                                       |
;|Wenn bei `Pos` -1 angegeben wird, dann wird der Eintrag am Ende der Liste eingefьgt.                            |
;|________________________________________________________________________________________________________________|
;| -PropertyGadget_AddComboItem(Gadget.i, Item.i, Text$)                                                        |
;|Fьgt dem angegebenen Eintrag ein Combobox-Item hinzu                                                            |
;|________________________________________________________________________________________________________________|
;| -PropertyGadget_GetItemText(Gadget.i, Item.i)                                                                |
;|Ermittelt den Text des angegebenen Items.                                                                       |
;|________________________________________________________________________________________________________________|
;| -PropertyGadget_SetItemText(Gadget.i, Item.i, Text$)                                                         |
;|Дndert den Text des angegebenen Items.                                                                          |
;|________________________________________________________________________________________________________________|
;| -PropertyGadget_Refresh(Gadget.i, WindowEvent.i)                                                             |
;|Dieser Befehl berechnet und zeichnet das Gadget und sollte in der Hauptschleife aufgerufen werden.              |
;|`WindowEvent` wird fьr die Tastendrьcke verwendet.                                                              |
;|________________________________________________________________________________________________________________|

;Typeen
#Item_Text = 1
#Item_Combo = 2

Structure _Items
  Info.S
  Text$
  CursorPos.i
  IsTextSelected.b
  Selected_Text.S
  CursorMovePos.i
  Seperator.i
  SeperatorText.S
  SeperatorFont.i
  
  Type.i
  AktuellesComboItem.i
  List ComboItems.s()
EndStructure

Structure _PropertyGadget
  Gadget.i
  X.i
  Y.i
  Width.i
  GesWidth.i
  Height.i
  ItemHeight.i
  BackColor.i
  Font.i
  SelectedItem.i
  Focus.i
  ScrollBar.i
  
  LineClick.i
  LinePos.i
  EnterItem.i
  
  List Items._Items()
EndStructure

Procedure.s RemoveStringSign(String$, Pos.i)
  Left$ = Left(String$, Pos)
  Right$ = Right(String$, Len(String$)-(Pos+1))
  ProcedureReturn Left$+Right$ 
EndProcedure

Global NewMap *gadgetData()

Procedure _setGadgetData(Gadget, *data)
  *gadgetData(Str(Gadget)) = *data
EndProcedure

Procedure _getGadgetData(Gadget)
  ProcedureReturn *gadgetData(Str(Gadget))
EndProcedure

Procedure PropertyGadget_Create(Gadget.i, X.i, Y.i, Width.i, Height.i, ItemHeight.i = 20, LinePos = 90, BackColor.i = $F9F9F9)
  *Property._PropertyGadget = AllocateMemory(SizeOf(_PropertyGadget))
  If *Property
    InitializeStructure(*Property, _PropertyGadget)
    *Property\X = X
    *Property\Y = Y
    *Property\Width = Width-20
    *Property\GesWidth = Width
    *Property\Height = Height
    *Property\LinePos = LinePos
    *Property\ItemHeight = ItemHeight
    *Property\BackColor = BackColor
    *Property\Font = LoadFont(#PB_Any, "Anonymous Pro Minus", ItemHeight*0.5, #PB_Font_HighQuality);Consolas
    *Property\ScrollBar = ScrollBarGadget(#PB_Any, Width-20, Y, 20, Height, 0, 210, Height, #PB_ScrollBar_Vertical)
    
    GadgetID = CanvasGadget(Gadget, X, Y, Width-20, Height, #PB_Canvas_Keyboard) :If Gadget = #PB_Any :Gadget = GadgetID :EndIf
    
    *Property\Gadget = Gadget
    
    _setGadgetData(Gadget, *Property)
    ProcedureReturn Gadget
  EndIf
EndProcedure

Procedure PropertyGadget_AddItem(Gadget.i, Pos.i, Info.S, Text$, Type.i = #PB_GadgetType_String)
  *Property._PropertyGadget = _getGadgetData(Gadget)
  If *Property
    With *Property
      If Pos >= 0 ; Если явно указали итем 
        If Pos >= ListSize(\Items()) ; Проверка есть ли такой итем, если нет
          AddElement(\Items())       ; Добавляем итем, после всех итемов
        Else                         ; Если есть
          SelectElement(\Items(), Pos) ; Выбираем итем и заменяем его
        EndIf
      ElseIf Pos = -1 ; Если явно не указан итем 
        LastElement(\Items()) ; Выбираем последный элемент и 
        AddElement(\Items())  ; Добавляем после него
      EndIf
      
      \Items()\Info.S = Info.S+": "
      \Items()\Text$ = Text$
      \Items()\Selected_Text = Text$
      \Items()\Type = Type
      \Items()\CursorMovePos = -1 ; 
      \Items()\IsTextSelected = 0 ; 
      \Items()\CursorPos = 0      ; 
      
      SetGadgetAttribute(\ScrollBar, #PB_ScrollBar_Maximum, \ItemHeight * ListSize(\Items())+10) 
      SetGadgetAttribute(\ScrollBar, #PB_ScrollBar_PageLength, \Height)
      If \Height > \ItemHeight * ListSize(\Items())+10 
        \Width = \GesWidth
        ResizeGadget(\ScrollBar, \Width, #PB_Ignore, 0, #PB_Ignore)
      Else 
        \Width = \GesWidth-20
        ResizeGadget(\ScrollBar, \Width+5, #PB_Ignore, 20, #PB_Ignore)
      EndIf
      ResizeGadget(\Gadget, #PB_Ignore, #PB_Ignore, \Width, #PB_Ignore)
      SetGadgetData(\Gadget, *Property)
    EndWith
  EndIf
EndProcedure

Procedure PropertyGadget_AddComboItem(Gadget.i, Item.i, Text$)
  *Property._PropertyGadget = _getGadgetData(Gadget)
  If *Property
    SelectElement(*Property\Items(), Item)
    LastElement(*Property\Items()\ComboItems())
    AddElement(*Property\Items()\ComboItems())
    *Property\Items()\ComboItems() = Text$
    SetGadgetData(Gadget, *Property)
  EndIf
EndProcedure

Procedure.S PropertyGadget_GetItemText(Gadget.i, Item.i)
  *Property._PropertyGadget = _getGadgetData(Gadget)
  If *Property
    If Item < ListSize(*Property\Items()) And Item >=0
      SelectElement(*Property\Items(), Item)
      ProcedureReturn *Property\Items()\Text$
    EndIf
  EndIf
EndProcedure

Procedure PropertyGadget_SetItemText(Gadget.i, Item.i, Text$)
  *Property._PropertyGadget = _getGadgetData(Gadget)
  If *Property
    If Item < ListSize(*Property\Items()) And Item >=0
      SelectElement(*Property\Items(), Item)
      *Property\Items()\Text$ = Text$
      SetGadgetData(*Property\Gadget, *Property)
    EndIf
  EndIf
EndProcedure

Procedure PropertyGadget_AddItemSeparator(Gadget, Text.S, State)
  *Property._PropertyGadget = _getGadgetData(Gadget)
  If *Property
    With *Property
      LastElement(\Items()) ; Выбираем последный элемент и 
      AddElement(\Items())  ; Добавляем после него
                            ; SelectElement(\Items(), ListIndex(\Items())) ; Выбираем итем и заменяем его
      Debug \Items()\Text$
      \Items()\SeperatorText = Text.S
      \Items()\SeperatorFont = LoadFont(#PB_Any, "Anonymous Pro Minus", \ItemHeight*0.7, #PB_Font_HighQuality);Consolas
      
      SetGadgetData(\Gadget, *Property)
    EndWith
  EndIf
EndProcedure

Procedure PropertyGadget_GetItemState(Gadget, Item.i)
  *Property._PropertyGadget = _getGadgetData(Gadget)
  If *Property
    If Item < ListSize(*Property\Items()) And Item >=0
      SelectElement(*Property\Items(), Item)
      ProcedureReturn *Property\Items()\AktuellesComboItem
    EndIf
  EndIf
EndProcedure

Procedure PropertyGadget_Timer( Milliseconds )
  Static Delay, Result
  If Delay = #False :Delay = ElapsedMilliseconds() :EndIf
  If ((ElapsedMilliseconds() - Delay) >= (Milliseconds*2)) 
    Delay = 0 
    Result ! 1
  EndIf
  ProcedureReturn Result
EndProcedure

Procedure Arrow(X1,Y1,Direction = - 1,ArrowLineWidth = 2, Size = 4, ArrowColor = 0)
  Protected I
  X1 = X1 + Size*2
  DrawingMode(#PB_2DDrawing_Default)
  For i = 1 To Size
    If Direction = 1
      ; верх
      LineXY(((X1-(1))+i),(Y1+i),((X1-(1))+i),(Y1+i)+ArrowLineWidth,ArrowColor )
      LineXY(((X1+(1))-i),(Y1+i),((X1+(1))-i),(Y1+i)+ArrowLineWidth,ArrowColor )
    ElseIf Direction = - 1
      ; вниз
      LineXY(((X1-Size)+i),(Y1+i),((X1-Size)+i),(Y1+i)+ArrowLineWidth,ArrowColor )
      LineXY(((X1+Size)-i),(Y1+i),((X1+Size)-i),(Y1+i)+ArrowLineWidth,ArrowColor )
    EndIf
  Next
EndProcedure


Procedure PropertyGadget_Refresh(Gadget.i, WindowEvent.i)
  Protected CharWidth = 7
  Protected UpDownWidth = 15
  
  Static Popupmenu.i, ScrollPos
  Protected EnterItem 
  *Property._PropertyGadget = _getGadgetData(Gadget)
  If *Property 
    With *Property
      If WindowEvent = #PB_Event_Gadget And EventGadget() = \Gadget 
        ; Только на сушествующих итемах
        If ListSize(\Items()) -1 >= (GetGadgetAttribute(\Gadget, #PB_Canvas_MouseY)+GetGadgetState(\ScrollBar)) / \ItemHeight
          Select EventType() 
            Case #PB_EventType_Input :SelectElement(\Items(), \SelectedItem)
              If \Items()\IsTextSelected
                If  \Items()\CursorPos > \Items()\CursorMovePos
                  \Items()\Text$ = RemoveString( \Items()\Text$ ,\Items()\Selected_Text,#PB_String_CaseSensitive,\Items()\CursorMovePos,1)
                  If \Items()\CursorMovePos >= 0
                    \Items()\CursorPos = \Items()\CursorMovePos ; Место куда добавлят буквы
                  EndIf
                Else
                  \Items()\Text$ = RemoveString( \Items()\Text$ ,\Items()\Selected_Text,#PB_String_CaseSensitive,\Items()\CursorPos,1)
                EndIf
                
                \Items()\CursorMovePos = -1
                \Items()\IsTextSelected = #False
              EndIf
              
              If \Items()\Type = #PB_GadgetType_Spin
                Select GetGadgetAttribute(\Gadget, #PB_Canvas_Input)
                  Case '0' To '9'
                    \Items()\CursorPos + (1) :\Items()\Text$ = InsertString(\Items()\Text$, Chr(GetGadgetAttribute(\Gadget, #PB_Canvas_Input)), \Items()\CursorPos)
                EndSelect
              Else
                \Items()\CursorPos + (1) :\Items()\Text$ = InsertString(\Items()\Text$, Chr(GetGadgetAttribute(\Gadget, #PB_Canvas_Input)), \Items()\CursorPos)
              EndIf
              
            Case #PB_EventType_LeftButtonDown
              SelectElement(\Items(), (GetGadgetAttribute(\Gadget, #PB_Canvas_MouseY)+GetGadgetState(\ScrollBar))/\ItemHeight)
              If \Items()\SeperatorText = ""
                ; Если текст выделен убираем выделение
                SelectElement(\Items(), \SelectedItem) :\Items()\IsTextSelected = #False :\Items()\CursorMovePos = -1
                ; Чтобы при первом клике выделить техт
                If \SelectedItem <> (GetGadgetAttribute(\Gadget, #PB_Canvas_MouseY)+GetGadgetState(\ScrollBar))/\ItemHeight
                  ; Если не на сплиттере то выделяем
                  If GetGadgetAttribute(\Gadget, #PB_Canvas_Cursor) ! #PB_Cursor_LeftRight
                    \SelectedItem = (GetGadgetAttribute(\Gadget, #PB_Canvas_MouseY)+GetGadgetState(\ScrollBar))/\ItemHeight
                    SelectElement(\Items(),  \SelectedItem ) :\Items()\IsTextSelected = #True ; Отмечаем что техт выделен
                    \Items()\CursorPos = Len(\Items()\Text$)                                  ; Перемещаем коректор в конец текста
                  EndIf
                Else
                  ; Положение коректора в тексте
                  If ( \LinePos ) < GetGadgetAttribute(\Gadget, #PB_Canvas_MouseX) And
                     (\Width - UpDownWidth - 5 ) > GetGadgetAttribute(\Gadget, #PB_Canvas_MouseX) 
                    
                    If \Items()\IsTextSelected = #False
                      
                      ; Позиция коректора
                      If GetGadgetAttribute(\Gadget, #PB_Canvas_MouseX) >\LinePos 
                        If (GetGadgetAttribute(\Gadget, #PB_Canvas_MouseX)< \LinePos + (Len(\Items()\Text$) * CharWidth ))
                          \Items()\CursorPos = (GetGadgetAttribute(\Gadget, #PB_Canvas_MouseX)-\LinePos ) / CharWidth 
                        Else
                          \Items()\CursorPos = Len(\Items()\Text$)
                        EndIf
                      Else
                        \Items()\CursorPos = 0
                      EndIf
                      
                      \Items()\CursorMovePos = \Items()\CursorPos
                      \Items()\IsTextSelected = #True
                    EndIf
                  EndIf
                EndIf
              EndIf
              
            Case #PB_EventType_LeftDoubleClick
              If GetGadgetAttribute(\Gadget, #PB_Canvas_MouseX) < (\Width - UpDownWidth - 5)
                SelectElement(\Items(), \SelectedItem) :\Items()\IsTextSelected = #True
                \Items()\CursorPos = Len(\Items()\Text$)
                \Items()\CursorMovePos = -1
              EndIf
              
            Case #PB_EventType_LeftClick
              If (GetGadgetAttribute(\Gadget, #PB_Canvas_MouseY)-5)/\ItemHeight < ListSize(\Items())
              If GetGadgetAttribute(\Gadget, #PB_Canvas_Cursor) ! #PB_Cursor_LeftRight
                \SelectedItem = (GetGadgetAttribute(\Gadget, #PB_Canvas_MouseY)+GetGadgetState(\ScrollBar))/\ItemHeight 
                SelectElement(\Items(), \SelectedItem)
              EndIf
              
              If \Items()\Type = #PB_GadgetType_Spin And GetGadgetAttribute(\Gadget, #PB_Canvas_MouseX) > (\Width - UpDownWidth)
                If (GetGadgetAttribute(\Gadget, #PB_Canvas_MouseY) ) < ListIndex(\Items())*\ItemHeight + \ItemHeight>>1
                  \Items()\Text$ = Str(Val(\Items()\Text$)+1)
                Else
                  \Items()\Text$ = Str(Val(\Items()\Text$)-1)
                EndIf
              EndIf
            EndIf
              
            Case #PB_EventType_MouseMove
              If \Items()\SeperatorText = ""
                EnterItem = (GetGadgetAttribute(\Gadget, #PB_Canvas_MouseY)+GetGadgetState(\ScrollBar)) / \ItemHeight
                If \EnterItem ! EnterItem :\EnterItem = EnterItem :EndIf
                
                If GetGadgetAttribute(\Gadget, #PB_Canvas_Buttons) = #False
                  
                  If GetGadgetAttribute(\Gadget, #PB_Canvas_MouseX) > \LinePos - 3
                    If GetGadgetAttribute(\Gadget, #PB_Canvas_MouseX) < \LinePos + 3
                      SetGadgetAttribute(\Gadget, #PB_Canvas_Cursor, #PB_Cursor_LeftRight)
                    Else
                      If \Items()\Type = #PB_GadgetType_String
                        SetGadgetAttribute(\Gadget, #PB_Canvas_Cursor, #PB_Cursor_IBeam)
                      Else
                        If GetGadgetAttribute(\Gadget, #PB_Canvas_MouseX) < (\Width - UpDownWidth)
                          SetGadgetAttribute(\Gadget, #PB_Canvas_Cursor, #PB_Cursor_IBeam)
                        Else
                          SetGadgetAttribute(\Gadget, #PB_Canvas_Cursor, #PB_Cursor_Default)
                        EndIf
                      EndIf
                    EndIf
                  Else
                    SetGadgetAttribute(\Gadget, #PB_Canvas_Cursor, #PB_Cursor_Default)
                  EndIf
                  
                  ; Если нажали на кнопку мыши
                ElseIf GetGadgetAttribute(\Gadget, #PB_Canvas_Buttons) = #PB_Canvas_LeftButton
                  ; Если находимся на сплиттере
                  If GetGadgetAttribute(\Gadget, #PB_Canvas_Cursor) = #PB_Cursor_LeftRight
                    \LinePos = GetGadgetAttribute(\Gadget, #PB_Canvas_MouseX)
                    \EnterItem = -1
                  Else
                    ; Выбираем текущий элемент под курсором
                    SelectElement(\Items(), \EnterItem)
                    
                    If \Items()\IsTextSelected = #True
                      
                      ; Позиция коректора
                      If GetGadgetAttribute(\Gadget, #PB_Canvas_MouseX) > \LinePos 
                        If (GetGadgetAttribute(\Gadget, #PB_Canvas_MouseX) < \LinePos + (Len(\Items()\Text$) * CharWidth ))
                          \Items()\CursorPos = (GetGadgetAttribute(\Gadget, #PB_Canvas_MouseX)-\LinePos ) / CharWidth 
                        Else
                          \Items()\CursorPos = Len(\Items()\Text$)
                        EndIf
                      Else
                        \Items()\CursorPos = 0
                      EndIf
                    EndIf
                    
                  EndIf
                EndIf
              EndIf
              
            Case #PB_EventType_MouseEnter
              SetActiveGadget(\Gadget)
              
            Case #PB_EventType_MouseLeave
              \EnterItem = -1
              
            Case #PB_EventType_KeyDown
              Select ( GetGadgetAttribute( \Gadget, #PB_Canvas_Key ) )
                  Case #PB_Shortcut_Up :If \SelectedItem > 0 : \SelectedItem-1 : EndIf
                  Case #PB_Shortcut_Down :If \SelectedItem < (ListSize(\Items()) - (1)) :\SelectedItem + (1) : EndIf
                  Case #PB_Shortcut_Left :If \Items()\CursorPos > 0 :\Items()\CursorPos - (1) : EndIf
                  Case #PB_Shortcut_Right :If \Items()\CursorPos < Len( \Items()\Text$ ) :\Items()\CursorPos + (1) : EndIf
                  Case #PB_Shortcut_Back  : If \Items()\CursorPos > 0 And (\Items()\Type = #PB_GadgetType_String Or \Items()\Type = #PB_GadgetType_Spin) : \Items()\Text$ = RemoveStringSign(\Items()\Text$, \Items()\CursorPos-1) : \Items()\CursorPos -1 : EndIf
              EndSelect 
          EndSelect
        Else
          \EnterItem = -1
        EndIf
      EndIf
      
      
      
      
      
      
      
      
      
      
      Protected ItemVisibleHeight = \ItemHeight +1
      Protected Lenght, CursorPos
      If StartDrawing(CanvasOutput(\Gadget))
        DrawingMode(#PB_2DDrawing_Default) :Box(0, 0, \Width, \Height, \BackColor)
        DrawingMode(#PB_2DDrawing_Outlined|#PB_2DDrawing_Transparent) :Box(0, 0, \Width, \Height, $52150D)
        DrawingFont(FontID(\Font))
        ScrollPos = GetGadgetState(\ScrollBar)
        
        PushListPosition(\Items())
        ForEach \Items()
          Y = ListIndex(\Items())*\ItemHeight 
          
          If ListIndex(\Items()) = \SelectedItem
            If \Items()\SeperatorText = ""
              farbe = \BackColor
              DrawingMode(#PB_2DDrawing_Default) 
              Box(1, Y-ScrollPos, \Width-2, ItemVisibleHeight)
              Box(1, Y-ScrollPos+1, \LinePos-1, ItemVisibleHeight-2, $FF9933);$4576EF);
              
              Protected TopColor     = RGB(240, 240, 240)
              Protected BottomColor  = RGB(229, 229, 229)
              Protected X
                Protected Y1 
                Protected Width
                Protected Height
                X = \Width-UpDownWidth - 2
                Y1 = (Y-ScrollPos);+(ItemVisibleHeight>>1-2)-1
                
                Width = UpDownWidth
                Height = ItemVisibleHeight;(ItemVisibleHeight>>1-2)
                
              If \Items()\Type = #PB_GadgetType_ComboBox
                DrawingMode(#PB_2DDrawing_Gradient)
                BackColor(TopColor)
                FrontColor(BottomColor)
                LinearGradient(X, Y1, X, Height+Y1)
                Box(X, Y1, Width, Height)
                Arrow(X-1,Y1+(ItemVisibleHeight>>1-2)-1,-1,2,4)
                
                DrawingMode(#PB_2DDrawing_Outlined) 
                Line(X-1,Y1,1,Height, $FF9933)
              ElseIf \Items()\Type = #PB_GadgetType_Spin ; SpinGadget
                DrawingMode(#PB_2DDrawing_Gradient)
                BackColor(TopColor)
                FrontColor(BottomColor)
                LinearGradient(X, Y1, X, Height+Y1)
                Box(X, Y1, Width, Height)
                         
                DrawingMode(#PB_2DDrawing_Outlined|#PB_2DDrawing_Transparent) 
                Box(\Width-3-UpDownWidth, Y-ScrollPos+2, UpDownWidth,(ItemVisibleHeight>>1-2), $FF9933)
                Box(\Width-3-UpDownWidth, (Y-ScrollPos+(ItemVisibleHeight>>1))+1, UpDownWidth, (ItemVisibleHeight>>1-2), $FF9933)
                Arrow(\Width-UpDownWidth-2,Y-ScrollPos+2,1,2,3)
                Arrow(\Width-UpDownWidth-2,(Y-ScrollPos+(ItemVisibleHeight>>1))+1,-1,2,3)
             EndIf
              
              ; Рамка вокруг выделенного итема
              DrawingMode(#PB_2DDrawing_Outlined|#PB_2DDrawing_Transparent) :Box(1, Y-ScrollPos, \Width-2, ItemVisibleHeight, $FF9933)
            Else
              DrawingMode(#PB_2DDrawing_Default) 
              Box(1, Y-ScrollPos, \Width-2, ItemVisibleHeight)
            EndIf
          Else
            farbe = $101010
            If ListIndex(\Items()) = \EnterItem 
              DrawingMode(#PB_2DDrawing_Default) :Box(1, Y-ScrollPos+1, \Width-2, ItemVisibleHeight-2, $EFD3C6);$4576EF);
            EndIf 
            
            If \Items()\SeperatorText = ""
              ; Линии по горизонтали
              DrawingMode(#PB_2DDrawing_Outlined|#PB_2DDrawing_Transparent) :Line(1, Y-ScrollPos+\ItemHeight, \Width-2, 1, $BDBDBD)
            Else
              
            EndIf
          EndIf
          
          ; линия по вертикали
          DrawingMode(#PB_2DDrawing_Outlined|#PB_2DDrawing_Transparent) :Line(\LinePos, Y-ScrollPos, 1, \ItemHeight, $BDBDBD)
          
          If \Items()\SeperatorText = ""
            ; Перерисовка текст инфо
            DrawingMode(#PB_2DDrawing_Outlined|#PB_2DDrawing_Transparent)
            DrawText(\LinePos-TextWidth(\Items()\Info.S), (Y+(\ItemHeight - TextHeight(\Items()\Info))>>1) - ScrollPos , \Items()\Info, farbe, \BackColor)
          Else
            
            DrawingMode(#PB_2DDrawing_Default) 
            Box(1, Y-ScrollPos, \Width-2, ItemVisibleHeight, $E6E6E6)
            DrawingFont(FontID(\Items()\SeperatorFont))
            ; Перерисовка текст инфо
            DrawingMode(#PB_2DDrawing_Outlined|#PB_2DDrawing_Transparent)
            DrawText(\LinePos-TextWidth(\Items()\SeperatorText.S), (Y+(\ItemHeight - TextHeight(\Items()\SeperatorText))>>1) - ScrollPos , \Items()\SeperatorText, farbe, \BackColor)
            DrawingFont(FontID(\Font))
          EndIf
          
          ; Перерисовка текст итема 
          DrawingMode(#PB_2DDrawing_Outlined|#PB_2DDrawing_Transparent)
          DrawText(\LinePos+5, (Y+(\ItemHeight - TextHeight(\Items()\Info))>>1) - ScrollPos+1, \Items()\Text$, $101010, \BackColor)    
          
          
          If ListIndex(\Items()) = \SelectedItem
            If \Items()\SeperatorText = ""
              ; Перерисовка выделения текста
              If \Items()\IsTextSelected
                \Items()\Selected_Text = \Items()\Text$ ; Выделеный текст по умолчанию
                DrawingMode(#PB_2DDrawing_Default)
                If \Items()\CursorMovePos >= 0 
                  If \Items()\CursorMovePos < \Items()\CursorPos
                    CursorPos = \Items()\CursorMovePos
                    Lenght = \Items()\CursorPos-\Items()\CursorMovePos
                  Else ; Если выделяем на лево
                    CursorPos = \Items()\CursorPos
                    Lenght = \Items()\CursorMovePos-\Items()\CursorPos
                  EndIf
                  
                  \Items()\Selected_Text = Mid(\Items()\Text$, CursorPos + (1), Lenght)
                  Box(\LinePos+5 + (CursorPos * CharWidth), 3+Y-ScrollPos, TextWidth(Left(\Items()\Text$, Lenght)), ItemVisibleHeight-6, $FF9933)
                  DrawingMode(#PB_2DDrawing_Outlined|#PB_2DDrawing_Transparent)
                  DrawText(\LinePos+5 + (CursorPos * CharWidth), (Y+(\ItemHeight - TextHeight(\Items()\Info))>>1) - ScrollPos+1, \Items()\Selected_Text, \BackColor, \BackColor)    
                  
                Else
                  Box(\LinePos+5, 3+Y-ScrollPos, TextWidth(Left(\Items()\Text$, \Items()\CursorPos)), ItemVisibleHeight-6, $FF9933)
                  DrawingMode(#PB_2DDrawing_Outlined|#PB_2DDrawing_Transparent)
                  DrawText(\LinePos+5, (Y+(\ItemHeight - TextHeight(\Items()\Info.S))>>1) - ScrollPos+1, \Items()\Text$, \BackColor, \BackColor)    
                EndIf
                
              EndIf  
              
              ; Перерисовка коректора
              If PropertyGadget_Timer( 300 )
                Line(\LinePos+5+TextWidth(Left(\Items()\Text$, \Items()\CursorPos)), 3+Y-ScrollPos, 1, ItemVisibleHeight-6, $202020)
              EndIf 
            EndIf
          EndIf
          
        Next
        PopListPosition(\Items())
        StopDrawing()
      EndIf
      
      SetGadgetData(\Gadget, *Property)
    EndWith
  EndIf
EndProcedure


If OpenWindow(0, 0, 0, 300, 400, "Property Beispiel", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
  PropertyGadget_Create(0, 5, 5, 290, 390, 18)
  PropertyGadget_AddItem(0, -1, "ID", "#Form_0", #PB_GadgetType_String)
  PropertyGadget_AddItem(0, -1, "Title", "Window_0", #PB_GadgetType_String)
  ;   PropertyGadget_AddComboItem(0, 2, "1")
  ;   PropertyGadget_AddComboItem(0, 2, "2")
  ;   PropertyGadget_AddComboItem(0, 2, "3")
  
  PropertyGadget_AddItemSeparator(0, "Положение", 1)
  PropertyGadget_AddItem(0, -1, "X", "12", #PB_GadgetType_Spin)
  PropertyGadget_AddItem(0, -1, "Y", "15", #PB_GadgetType_Spin)
  PropertyGadget_AddItem(0, -1, "Width", "732", #PB_GadgetType_Spin)
  PropertyGadget_AddItem(0, -1, "Height", "300", #PB_GadgetType_Spin)
  
  PropertyGadget_AddItemSeparator(0, "Seperator", 1)
  PropertyGadget_AddItem(0, -1, "Enable", "#True", #PB_GadgetType_ComboBox)
  PropertyGadget_AddItem(0, -1, "Disable", "Bitte Wдhlen", #PB_GadgetType_ComboBox)
  
  Repeat
    Ev = WaitWindowEvent(2)
    
    PropertyGadget_Refresh(0, Ev)
  Until Ev = #PB_Event_CloseWindow
EndIf
End
; IDE Options = PureBasic 5.31 (Linux - x86)
; CursorPosition = 473
; FirstLine = 450
; Folding = -------------
; EnableUnicode
; EnableXP
Last edited by mestnyi on Thu Dec 24, 2015 6:54 pm, edited 1 time in total.
User avatar
Keya
Addict
Addict
Posts: 1891
Joined: Thu Jun 04, 2015 7:10 am

Re: PropertiesGadget()

Post by Keya »

looks good! I have a newfound appreciation for custom controls since last week heehee
One problem however - the Up/Down minibuttons when editing a textbox don't do anything (that would normally change for example "2" to "3")
mestnyi
Addict
Addict
Posts: 1001
Joined: Mon Nov 25, 2013 6:41 am

Re: PropertiesGadget()

Post by mestnyi »

One problem however - the Up/Down minibuttons when editing a textbox don't do anything (that would normally change for example "2" to "3")
Corrected
Once finalized drawing arrows :)
User avatar
Lunasole
Addict
Addict
Posts: 1091
Joined: Mon Oct 26, 2015 2:55 am
Location: UA
Contact:

Re: PropertiesGadget()

Post by Lunasole »

Looks serious 8)
"W̷i̷s̷h̷i̷n̷g o̷n a s̷t̷a̷r"
User avatar
RSBasic
Moderator
Moderator
Posts: 1218
Joined: Thu Dec 31, 2009 11:05 pm
Location: Gernsbach (Germany)
Contact:

Re: PropertiesGadget()

Post by RSBasic »

Very good!
Image
Image
User avatar
Kwai chang caine
Always Here
Always Here
Posts: 5357
Joined: Sun Nov 05, 2006 11:42 pm
Location: Lyon - France

Re: PropertiesGadget()

Post by Kwai chang caine »

Nice thanks for sharing 8)
ImageThe happiness is a road...
Not a destination
User avatar
Andre
PureBasic Team
PureBasic Team
Posts: 2071
Joined: Fri Apr 25, 2003 6:14 pm
Location: Germany (Saxony, Deutscheinsiedel)
Contact:

Re: PropertiesGadget()

Post by Andre »

Looks like an useful piece of code, thank you for sharing! :D

While testing it with PB5.41 on MacOS 10.6.8 I got it working, but
- the up/down buttons change the number only to the next higher/lower value
- the DropDown button doesn't do anything
Bye,
...André
(PureBasicTeam::Docs & Support - PureArea.net | Order:: PureBasic | PureVisionXP)
Post Reply