Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
GUI Shutdown or Restart (Linux)
#1
This is a small program to shutdown or restart a linux computer.
It is not perfect but it is a sufficient demo to show off the GUI toolkit im workin on.

Be careful, on linux this will actually shutdown your computer. Windows it wont unless you change the SHELL statement.

Code: (Select All)
Option _Explicit

_Title "kbde-shutdown"

Type Position
    X As Integer
    Y As Integer
End Type

Type Size
    X As _Unsigned Integer
    Y As _Unsigned Integer
End Type

Type Label
    Text As String
    Position As Position
    Handle As _Unsigned Long
End Type

Dim Shared labelQuantity As _Unsigned Integer
ReDim Shared Label(labelQuantity) As Label

Type radiobuttonStatus
    Clicked As _Byte
    Checked As _Byte
End Type

Type Radiobutton
    Position As Position
    Size As Size
    Status As radiobuttonStatus
    Handle As _Unsigned Long
End Type

Dim Shared radiobuttonQuantity As _Unsigned Integer
ReDim Shared Radiobutton(radiobuttonQuantity) As Radiobutton

Type checkboxStatus
    Clicked As _Byte
    Checked As _Byte
End Type

Type Checkbox
    Position As Position
    Size As Size
    Status As checkboxStatus
    Handle As _Unsigned Long
End Type

Dim Shared checkboxQuantity As _Unsigned Integer
ReDim Shared Checkbox(checkboxQuantity) As Checkbox

Type buttonStatus
    Clicked As _Bit
    Enabled As _Bit
End Type

Type Button
    Text As String
    Position As Position
    Size As Size
    Status As buttonStatus
    Handle As _Unsigned Long
End Type

Dim Shared buttonQuantity As _Unsigned Integer
ReDim Shared Button(buttonQuantity) As Button

Type Cursor
    Position As Position
    Button As Integer
End Type

Dim Shared Cursor As Cursor

Screen _NewImage(480, 200, 32)

Dim Shared textColor As _Unsigned Long: textColor = _RGBA32(255, 255, 255, 255)
Dim Shared highlightColor As _Unsigned Long: highlightColor = _RGBA32(223, 223, 223, 255)
Dim Shared faceColor As _Unsigned Long: faceColor = _RGBA32(191, 191, 191, 255)
Dim Shared shadowColor As _Unsigned Long: shadowColor = _RGBA32(127, 127, 127, 255)

Dim Shared whiteColor As _Unsigned Long: whiteColor = _RGBA32(255, 255, 255, 255)
Dim Shared blackColor As _Unsigned Long: blackColor = _RGBA32(0, 0, 0, 255)

Dim Shared backgroundColor As _Unsigned Long: backgroundColor = _RGBA32(0, 255, 0, 255)

Dim Shared Label0 As _Unsigned Integer
Dim Shared Question As String: Question = "Are you sure you want to?:"
Label0 = addLabel
Label0 = initLabel(Label0, (_Width - _PrintWidth(Question)) / 2, 25, Question)
Label0 = drawLabel(Label0)

Dim Shared Label1 As _Unsigned Integer
Label1 = addLabel
Label1 = initLabel(Label1, 50, 75, "Shutdown Your Computer")
Label1 = drawLabel(Label1)

Dim Shared Label2 As _Unsigned Integer
Label2 = addLabel
Label2 = initLabel(Label2, 50, 100, "Restart Your Computer")
Label2 = drawLabel(Label2)

Dim Shared Label3 As _Unsigned Integer
Label3 = addLabel
Label3 = initLabel(Label3, 300, 100, "Timed Execution")
Label3 = drawLabel(Label3)

Dim Shared Radiobutton1 As _Unsigned Integer
Radiobutton1 = addRadiobutton
Radiobutton1 = initRadiobutton(Radiobutton1, 240, 75, 16, 16)
Radiobutton(Radiobutton1).Status.Checked = -1
Radiobutton1 = drawRadiobutton(Radiobutton1)

Dim Shared Radiobutton2 As _Unsigned Integer
Radiobutton2 = addRadiobutton
Radiobutton2 = initRadiobutton(Radiobutton2, 240, 100, 16, 16)
Radiobutton2 = drawRadiobutton(Radiobutton2)

Dim Shared Checkbox1 As _Unsigned Integer
Checkbox1 = addCheckbox
Checkbox1 = initCheckbox(Checkbox1, 435, 100, 16, 16)
Checkbox1 = drawCheckbox(Checkbox1)

Dim Shared Button1 As _Unsigned Integer
Button1 = addButton
Button1 = initButton(Button1, "OK", ((_Width - ((75 * 2) + 20)) / 2), (_Height - 48), 75, 23)
Button1 = drawButton(Button1)

Dim Shared Button2 As _Unsigned Integer
Button2 = addButton
Button2 = initButton(Button2, "Cancel", (((_Width - ((75 * 2) + 20)) / 2) + 95), (_Height - 48), 75, 23)
Button2 = drawButton(Button2)

Dim I As _Unsigned Integer, J As _Unsigned Integer, A As _Unsigned Integer

Dim Timed As _Unsigned Integer: Timed = 0

Do
    Line (0, 0)-(_Width, _Height), faceColor, BF

    For I = 1 To labelQuantity
        _PutImage (Label(I).Position.X, Label(I).Position.Y), Label(I).Handle
    Next I

    For I = 1 To radiobuttonQuantity
        _PutImage (Radiobutton(I).Position.X, Radiobutton(I).Position.Y), Radiobutton(I).Handle
    Next I

    For I = 1 To checkboxQuantity
        _PutImage (Checkbox(I).Position.X, Checkbox(I).Position.Y), Checkbox(I).Handle
    Next I

    For I = 1 To buttonQuantity
        _PutImage (Button(I).Position.X, Button(I).Position.Y), Button(I).Handle
    Next I

    Check

    For I = 1 To radiobuttonQuantity
        If Cursor.Position.X >= Radiobutton(I).Position.X And Cursor.Position.X <= Radiobutton(I).Position.X + Radiobutton(I).Size.X Then
            If Cursor.Position.Y >= Radiobutton(I).Position.Y And Cursor.Position.Y <= Radiobutton(I).Position.Y + Radiobutton(I).Size.Y Then
                If Cursor.Button Then
                    For J = 1 To radiobuttonQuantity
                        Radiobutton(J).Status.Checked = 0
                        A = drawRadiobutton(J)
                    Next J
                    Radiobutton(I).Status.Checked = -1
                    A = drawRadiobutton(I)
                End If
            End If
        End If
    Next I

    For I = 1 To checkboxQuantity
        If Cursor.Position.X >= Checkbox(I).Position.X And Cursor.Position.X <= Checkbox(I).Position.X + Checkbox(I).Size.X Then
            If Cursor.Position.Y >= Checkbox(I).Position.Y And Cursor.Position.Y <= Checkbox(I).Position.Y + Checkbox(I).Size.Y Then
                If Cursor.Button Then
                    If Checkbox(I).Status.Checked = 0 Then
                        Checkbox(I).Status.Checked = -1
                    Else
                        Checkbox(I).Status.Checked = 0
                    End If
                    A = drawCheckbox(I)
                    _Delay 0.2
                End If
            End If
        End If
    Next I

    For I = 1 To buttonQuantity
        If Cursor.Position.X >= Button(I).Position.X And Cursor.Position.X <= Button(I).Position.X + Button(I).Size.X Then
            If Cursor.Position.Y >= Button(I).Position.Y And Cursor.Position.Y <= Button(I).Position.Y + Button(I).Size.Y Then
                If Cursor.Button Then
                    Select Case I
                        Case Button1
                            If Checkbox(Checkbox1).Status.Checked = -1 Then
                                Input "Amount of time to wait? ", Timed
                            End If
                            If Radiobutton(Radiobutton1).Status.Checked = -1 Then
                                Shell _DontWait "shutdown -h " + LTrim$(RTrim$(Str$(Timed)))
                                System
                            ElseIf Radiobutton(Radiobutton2).Status.Checked = -1 Then
                                Shell _DontWait "shutdown -r " + LTrim$(RTrim$(Str$(Timed)))
                                System
                            End If
                        Case Button2
                            System
                    End Select
                End If
            End If
        End If
    Next I
    _Display
Loop

Function addLabel~%
    labelQuantity = labelQuantity + 1
    ReDim _Preserve Label(labelQuantity) As Label
    addLabel = labelQuantity
End Function

Function initLabel~% (inID As _Unsigned Integer, inPositionX As Integer, inPositionY As Integer, inText As String)
    Dim sX As Integer
    Dim sY As Integer
    Label(inID).Position.X = inPositionX
    Label(inID).Position.Y = inPositionY
    inText = LTrim$(RTrim$(inText))
    Label(inID).Text = inText
    sX = (_PrintWidth(Label(inID).Text) + 2)
    sY = (_FontHeight + 2)
    Label(inID).Handle = _NewImage(sX, sY, 32)
    initLabel = inID
End Function

Function drawLabel~% (inID As _Unsigned Integer)
    _Dest Label(inID).Handle
    Line (0, 0)-(_Width, _Height), faceColor, BF
    _PrintMode _KeepBackground
    _PrintString (2, 1), Label(inID).Text
    _Dest 0
    drawLabel = inID
End Function

Function addRadiobutton~%
    radiobuttonQuantity = radiobuttonQuantity + 1
    ReDim _Preserve Radiobutton(radiobuttonQuantity) As Radiobutton
    addRadiobutton = radiobuttonQuantity
End Function

Function initRadiobutton~% (inID As _Unsigned Integer, inPositionX As Integer, inPositionY As Integer, inSizeX As _Unsigned Integer, inSizeY As _Unsigned Integer)
    Radiobutton(inID).Position.X = inPositionX
    Radiobutton(inID).Position.Y = inPositionY
    Radiobutton(inID).Size.X = inSizeX
    Radiobutton(inID).Size.Y = inSizeY
    Radiobutton(inID).Handle = _NewImage(Radiobutton(inID).Size.X, Radiobutton(inID).Size.Y, 32)
    initRadiobutton = inID
End Function

Function drawRadiobutton~% (inID As _Unsigned Integer)
    Dim centeredX As Integer, centeredY As Integer
    _Dest Radiobutton(inID).Handle
    Circle ((Radiobutton(inID).Size.X / 2) + 1 - 1, (Radiobutton(inID).Size.Y / 2) + 1 - 1), (Radiobutton(inID).Size.X / 2), highlightColor
    Circle ((Radiobutton(inID).Size.X / 2) - 1, (Radiobutton(inID).Size.Y / 2) - 1), (Radiobutton(inID).Size.X / 2), shadowColor
    Paint (_Width / 2, _Height / 2), whiteColor, shadowColor
    Dim Mark As String
    If Radiobutton(inID).Status.Checked Then
        Color blackColor
        Mark = "*"
    End If
    centeredX = (_Width - _PrintWidth(Mark)) / 2
    centeredY = (_Height - _FontHeight) / 2
    _PrintMode _KeepBackground
    _PrintString (centeredX, centeredY), Mark
    _Dest 0
    drawRadiobutton = inID
End Function

Function toggleRadiobutton~% (inID As _Unsigned Integer)
    Dim I As _Unsigned Integer
    For I = 1 To radiobuttonQuantity
        Radiobutton(I).Status.Checked = 0
    Next I
    Radiobutton(inID).Status.Checked = -1
    toggleRadiobutton = inID
End Function

Function addCheckbox~%
    checkboxQuantity = checkboxQuantity + 1
    ReDim _Preserve Checkbox(checkboxQuantity) As Checkbox
    addCheckbox = checkboxQuantity
End Function

Function initCheckbox~% (inID As _Unsigned Integer, inPositionX As Integer, inPositionY As Integer, inSizeX As _Unsigned Integer, inSizeY As _Unsigned Integer)
    Checkbox(inID).Position.X = inPositionX
    Checkbox(inID).Position.Y = inPositionY
    Checkbox(inID).Size.X = inSizeX
    Checkbox(inID).Size.Y = inSizeY
    Checkbox(inID).Handle = _NewImage(Checkbox(inID).Size.X, Checkbox(inID).Size.Y, 32)
    initCheckbox = inID
End Function

Function drawCheckbox~% (inID As _Unsigned Integer)
    Dim centeredX As Integer, centeredY As Integer
    _Dest Checkbox(inID).Handle
    Line (0, 0)-(_Width - 1, _Height - 1), highlightColor, BF
    Line (0, 0)-(_Width - 2, _Height - 2), shadowColor, BF
    Line (1, 1)-(_Width - 2, _Height - 2), highlightColor, BF
    Line (1, 1)-(_Width - 3, _Height - 3), shadowColor, BF
    Line (2, 2)-(_Width - 3, _Height - 3), whiteColor, BF
    Dim Mark As String
    If Checkbox(inID).Status.Checked Then
        Mark = "*"
    Else
        Mark = " "
    End If
    centeredX = (_Width - _PrintWidth(Mark)) / 2
    centeredY = (_Height - _FontHeight) / 2
    _PrintMode _KeepBackground
    Color blackColor
    _PrintString (centeredX, centeredY), Mark
    _Dest 0
    drawCheckbox = inID
End Function

Function addButton~%
    buttonQuantity = buttonQuantity + 1
    ReDim _Preserve Button(buttonQuantity) As Button
    addButton = buttonQuantity
End Function

Function initButton~% (inID As _Unsigned Integer, inText As String, inPositionX As Integer, inPositionY As Integer, inSizeX As _Unsigned Integer, inSizeY As _Unsigned Integer)
    Button(inID).Text = inText
    Button(inID).Position.X = inPositionX
    Button(inID).Position.Y = inPositionY
    Button(inID).Size.X = inSizeX
    Button(inID).Size.Y = inSizeY
    Button(inID).Handle = _NewImage(Button(inID).Size.X, Button(inID).Size.Y, 32)
    initButton = inID
End Function

Function drawButton~% (inID As _Unsigned Integer)
    Dim centeredX As Integer, centeredY As Integer
    _Dest Button(inID).Handle
    _PrintMode _KeepBackground
    Line (0, 0)-(_Width - 1, _Height - 1), backgroundColor, BF
    Line (1, 0)-(_Width - 2, _Height - 1), blackColor, BF
    Line (0, 1)-(_Width - 1, _Height - 2), blackColor, BF
    Line (2, 2)-(_Width - 3, _Height - 3), shadowColor, BF
    Line (2, 2)-(_Width - 4, _Height - 4), highlightColor, BF
    Line (3, 3)-(_Width - 4, _Height - 4), shadowColor, BF
    Line (3, 3)-(_Width - 5, _Height - 5), highlightColor, BF
    Line (4, 4)-(_Width - 5, _Height - 5), faceColor, BF
    centeredX = (_Width - _PrintWidth(Button(inID).Text)) / 2
    centeredY = (_Height - _FontHeight) / 2
    Color textColor, faceColor
    _PrintString (centeredX, centeredY), Button(inID).Text
    _Dest 0
    drawButton = inID
End Function

Sub Check
    While _MouseInput
    Wend
    Cursor.Position.X = _MouseX
    Cursor.Position.Y = _MouseY
    Cursor.Button = _MouseButton(1)
End Sub

[Image: final.png]
Reply
#2
This is working in Slackel, however I have neutralized the "SHELL" statements. Wanted to see the dialog box in action. Smile

I guess you'll be working on the input box to ask for time in seconds. Having the user type an entry and press [ENTER] could be unsettling for somebody quite used to GUI programs.

You might consider replacing the zero-time with "now", as in:

Code: (Select All)
shutdown -h now
Reply
#3
(04-17-2023, 11:30 PM)mnrvovrfc Wrote: This is working in Slackel, however I have neutralized the "SHELL" statements. Wanted to see the dialog box in action. Smile

I guess you'll be working on the input box to ask for time in seconds. Having the user type an entry and press [ENTER] could be unsettling for somebody quite used to GUI programs.

You might consider replacing the zero-time with "now", as in:

Code: (Select All)
shutdown -h now

I have a whole bunch of widgets i can add in eventually. the important thing is that i got as far as i did.
Now that a basic version is working i can start on improving it.
Reply
#4
Well I look forward to seeing what you, @Keybone, do with Textboxes for comparing to what I am doing.

Update: OH! Already posted, ha!
b = b + ...
Reply
#5
(04-19-2023, 03:33 PM)bplus Wrote: Well I look forward to seeing what you, @Keybone, do with Textboxes for comparing to what I am doing.

Update: OH! Already posted, ha!

Textboxes are something im probably going to have a difficult time with.
Next thing on my list are going to be 2 simple widgets, a box to group similar controls, and a line separator.
That should be very easy.

The next thing on my list after that is probably going to be a numerical up/down widget.

I take breaks in programming so it might not be quickly done.

My solution will probably be the simplest one i can think of. My main goal is to keep the line count to a minimal and make it stable as possible.
Reply




Users browsing this thread: 4 Guest(s)