Form Aussehen Windows/Linux

Für allgemeine Fragen zur Programmierung mit PureBasic.
Chregu
Beiträge: 22
Registriert: 22.12.2018 16:07
Wohnort: Viseu de Jos, Rumänien
Kontaktdaten:

Form Aussehen Windows/Linux

Beitrag von Chregu »

Hallo Programmierer,

für ein plattformübergreifendes Programm habe ich Linux Mint 21.2 Cinnamon einer Windows-VM installiert. Mit einigen

Code: Alles auswählen

CompilerIf / CompilerSelect #PB_Compiler_OS
habe ich es auch zum Funktionieren gebracht, aber das Aussehen ist unter Linux unhaltbar. Im Form-Designer geht es eigentlich noch, aber das Executable sieht total anders aus und ist nach unten verschoben (warscheinlich für die ToolTips?). Kompromisse musste ich noch machen mit den .ico da habe ich in GIF gewandelt. Geht natürlich der transparente Hintergrund verloren.

Bild

Das Problem wird auch hier diskutiert, ist aber älter:
https://www.lazarusforum.de/viewtopic.php?t=11982

Ich muss gestehen, ich habe bei der Installation von PureBasic einfach wild ALLE Pakete installiert. Ist das ein Problem. Kann es sein, dass das auf anderen Systemen anders (korrekt) dargestellt wird?

Wie handhabt Ihr das? Komplett verschiedene Branches für jedes OS führen wollte ich eben vermeiden.
Gruss Chregu
Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Re: Form Aussehen Windows/Linux

Beitrag von Macros »

Ich nutze immer die PB Dialog Bibliothek.

Wichtig bei Programmen mit Menü: Das musst du mit einplanen und ein <empty height='HeightPlatzhalter'/> Element unten einsetzen um genau so ein Rausschieben zu verhindern. Den Platzhalter ersetzt du mit Str(MenuHeight()) bevor du den Dialog öffnest. Das sieht dann gut aus auf beiden OS.

Unter Linux passt sich das Fenster auch automatisch an lange Strings in gadgets an, wenn du RefreshDialog() aufrufst, das klappt unter Win Leider nicht.

Unter Linux kannst du auch auf das QT Subsystem zugreifen. Sieht meiner Meinung nach deutlich besser aus, aber braucht bei Kunden eine Installation der libqt5webkit5. (Unter Compileroptionen einfügen. Etwas nervig weil man bei wechseln vom OS dann immer aus/eintragen muss)
Bild
Benutzeravatar
mk-soft
Beiträge: 3844
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Form Aussehen Windows/Linux

Beitrag von mk-soft »

Es gibt unter Linux unterschiedliche Oberflächen. Gnome, KDE, LX, etc.
Und dann kommt es noch an welche Theme man verwendet.
Somit sieht es unter jeder Linux Version etwas anderen aus.

Icon nach PNG wandeln.
Für die Gadgets etwas mehr platz lassen. Die Buttons brauchen etwas Mehr platz und das PanelGadget auch.
Auch wenn PureBasic intern schon die min Größen dafür schon in den css styles kleiner gestellt. Übernommen von SetLinuxStyle ...

Also ich verwende als VM die Mint Linux LMDE 6 und diese sieht schon sehr gut aus.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Chregu
Beiträge: 22
Registriert: 22.12.2018 16:07
Wohnort: Viseu de Jos, Rumänien
Kontaktdaten:

Re: Form Aussehen Windows/Linux

Beitrag von Chregu »

Ich nutze immer die PB Dialog Bibliothek.
Vielen Dank! Ich habe jetzt mal mit "Dialog DesignOR" rumprobiert, und das sieht vielversprechend aus! Grössen stimmen auf beiden OS. Läuft also auf ein komplettes Redesign des Dialogs hinaus...
Gruss Chregu
Benubi
Beiträge: 187
Registriert: 22.10.2004 17:51
Wohnort: Berlin, Wedding

Re: Form Aussehen Windows/Linux

Beitrag von Benubi »

Wenn man seine Fenster hard coded gibs immer Portierungs-Problemchen auf Linux anscheinend.

Das liegt daran, unter anderem, daß die Fonts und GUI styles verschieden sind. Man sollte quasi Pi mal Daumen eine "Schuhgröße" über der eigentlich (unter Windows) benötigten einplanen, weil unter Linux öfter abgeschnitten wird als andersrum. Oder man löst es mit der Dialog (und Runtime) library.

Mir fällt nur auf, daß deine Toolbar Bilder im Form Editor kleiner (halb so klein?) als später wenn sie ins "echte Form" geladen und angezeigt werden. Vielleicht ist das ein Bug im Form Editor oder Du hast die Größen zu klein gesetzt (k.A. wie das geht, benutze den fast nie).
Benutzeravatar
mk-soft
Beiträge: 3844
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Form Aussehen Windows/Linux

Beitrag von mk-soft »

Es wird nur 20 Pixel Höhe für String und Buttons im Designer verwendet.
Da aber schon String Min 32 Pixel haben und Buttons min 20 Pixel Plus rahmen 2 Pixel haben (20+2+2), reicht der platz nicht zwischen den Gadgets.

CSS Style Entry (StringGadget)

min-height = 20
padding-top = 5
padding-buttom = 5
outline-width = 1
Sum: 20+5+5+2*1 = 32


Linux Inspector (gtk3)

Terminal:
gsettings set org.gtk.Settings.Debug enable-inspector-keybinding true

Select gtk3 window:
<Shift><Ctrl><I>
Zuletzt geändert von mk-soft am 06.12.2023 20:08, insgesamt 1-mal geändert.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
mk-soft
Beiträge: 3844
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Form Aussehen Windows/Linux

Beitrag von mk-soft »

Ich finde das StringGadget braucht zu viel platz.

Hierzu habe mal den CSS Style für 'entry' angepasst.

Code: Alles auswählen

;-TOP by mk-soft, v1.02.0, create 21.05.2022, update 06.12.2023

CompilerIf #PB_Compiler_OS = #PB_OS_Linux
  ;- Constants
  #GTK_STYLE_PROVIDER_PRIORITY_FALLBACK = 1
  #GTK_STYLE_PROVIDER_PRIORITY_THEME = 200
  #GTK_STYLE_PROVIDER_PRIORITY_SETTINGS = 400
  #GTK_STYLE_PROVIDER_PRIORITY_APPLICATION = 600
  #GTK_STYLE_PROVIDER_PRIORITY_USER  = 800
  
  ImportC ""
    gtk_css_provider_load_from_data(*CSSProvider, CSSData.P-UTF8, Length, *Error.GError)
    gtk_css_provider_new()
    gtk_style_context_add_provider_for_screen(*Screen.GdkScreen, *StyleProvider, Priority)
  EndImport
  
  Procedure _SetLinuxStyle()
    Protected CSSProvider, CSSDefault.s, Screen
    
    CSSDefault = "button, entry {min-height: 20px;} "
    CSSDefault + "tab {min-height: 20px;} "
    CSSDefault + "button, scale {padding-bottom: 2px; padding-left: 2px; padding-right: 2px; padding-top: 2px} "
    CSSDefault + "entry {padding-bottom: 3px; padding-left: 6px; padding-right: 6px; padding-top: 3px} "
    
    CSSProvider= gtk_css_provider_new()
    gtk_css_provider_load_from_data(CSSProvider, CSSDefault, -1, 0)
    Screen = gdk_display_get_default_screen_(gdk_display_get_default_())
    gtk_style_context_add_provider_for_screen(Screen, CSSProvider, #GTK_STYLE_PROVIDER_PRIORITY_APPLICATION)
    g_object_unref_(CSSProvider)
    
  EndProcedure : _SetLinuxStyle()
  
CompilerEndIf

; *********************************************************

Procedure SetDarkMode(State)
  Protected boolVal, *Settings
  
  *Settings = gtk_settings_get_default_()
  If *Settings
    g_object_get_(*Settings, "gtk-application-prefer-dark-theme", @boolVal)
    g_object_set_(*Settings, "gtk-application-prefer-dark-theme", State);
    ProcedureReturn boolVal
  EndIf
EndProcedure

; *********************************************************

; Select examaple
#Example = 2

; *********************************************************

CompilerIf #Example = 1
  
  Procedure UpdateWindow()
    Protected dx, dy
    dx = WindowWidth(0)
    dy = WindowHeight(0)
    Debug dx
    ResizeGadget(0, 10, 10, dx - 20, dy - 70)
    ResizeGadget(1, 10, dy - 50, 120, 30)
  EndProcedure
  
  Procedure ShowDialog()
    If OpenWindow(1, 300, 300, 300, 200, "Dialog");, #PB_Window_Tool)
      dx = WindowWidth(1)
      dy = WindowHeight(1)
      EditorGadget(10, 10, 10, dx - 20, dy - 70)
      ButtonGadget(11, 10, dy - 50, 120, 30, "Ok")
      ButtonGadget(12, dx - 130, dy - 50, 120, 30, "Cancel")
    EndIf
  EndProcedure
  
  Procedure Main()
    Protected info.s
    info = "XDG_SESSION_TYPE: " + GetEnvironmentVariable("XDG_SESSION_TYPE") + #LF$
    
    If OpenWindow(0, 100, 100, 400, 300, "Window", #PB_Window_SystemMenu | #PB_Window_SizeGadget)
      
      dx = WindowWidth(0)
      dy = WindowHeight(0)
      TextGadget(0, 10, 10, dx - 20, dy - 70, info, #PB_Text_Border)
      ButtonGadget(1, 10, dy - 50, 120, 30, "Dialog")
      
      BindEvent(#PB_Event_SizeWindow, @UpdateWindow(), 0)
      
      Repeat
        Select WaitWindowEvent()
          Case #PB_Event_CloseWindow
            Select EventWindow()
              Case 0
                Break
              Case 1
                CloseWindow(1)
                
            EndSelect
            
          Case #PB_Event_Gadget
            Select EventGadget()
              Case 1
                ShowDialog()
              Case 11, 12
                CloseWindow(1)
                
            EndSelect
            
        EndSelect
      ForEver
      
    EndIf
    
  EndProcedure : Main()
  
CompilerEndIf

; ----

CompilerIf #Example = 2
  
  OpenWindow(0, 100, 100, 300, 160, "StringGadgets", #PB_Window_SystemMenu | #PB_Window_Invisible)
  
  SetDarkMode(#True)
  For i = 0 To 2
    StringGadget(i, 20, i * 35 + 20, WindowWidth(0) - 40, 25, "")
    SetGadgetText(i, "StringGadget " + Str(i + 1) +
      " - Required height: " + GadgetHeight(i, #PB_Gadget_RequiredSize))
  Next i
  HideWindow(0, #False)
  
  Repeat
  Until WaitWindowEvent() = #PB_Event_CloseWindow
  
CompilerEndIf

; ----

CompilerIf #Example = 3
  
   If OpenWindow(0, 0, 0, 322, 220, "PanelGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    PanelGadget     (0, 8, 8, 306, 203)
      AddGadgetItem (0, -1, "Panel 1")
        PanelGadget (1, 5, 5, 290, 166)
          AddGadgetItem(1, -1, "Sub-Panel 1")
          AddGadgetItem(1, -1, "Sub-Panel 2")
          AddGadgetItem(1, -1, "Sub-Panel 3")
        CloseGadgetList()
      AddGadgetItem (0, -1,"Panel 2")
        ButtonGadget(2, 10, 15, 80, 24,"Button 1")
        ButtonGadget(3, 95, 15, 80, 24,"Button 2")
      CloseGadgetList()
        
      SetDarkMode(1)
      
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf
  
CompilerEndIf
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Chregu
Beiträge: 22
Registriert: 22.12.2018 16:07
Wohnort: Viseu de Jos, Rumänien
Kontaktdaten:

Re: Form Aussehen Windows/Linux

Beitrag von Chregu »

Ich habe jetzt einfach drei verschiedene Forms gemacht, für jedes System Eine. Das geht, wenn sie mal fertig ist - nur muss jede kleinste Aenderung bei allen Dreien umgesetzt werden.
Auch MacOS habe ich schön hingekriegt, aber läuft halt nicht auf anderen Rechnern ohne Signierung. Das war's dann wohl mit diesem OS. Sonst darf man ~100€ blechen...

Gruss Chregu
Gruss Chregu
Benutzeravatar
mk-soft
Beiträge: 3844
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Form Aussehen Windows/Linux

Beitrag von mk-soft »

Man muss nicht die eigene APP bei macOS in das App Store signieren.
Es gibt auch viele Apps von anderen quellen. Nur muss der macOS Nutzer diese explizit erlauben.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten