GTK CSS Provider

In dieser Linux-Ecke dürfen nur Themen rund um Linux geschrieben werden.
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

GTK CSS Provider

Beitrag von mk-soft »

Zum testen... :wink:

Update v0.3
- Beispiel erweitert

Code: Alles auswählen

;-TOP

; Linux GTK CSS Gadget Style
; by      : mk-soft
; Version : v0.2
; Create  : 28.12.2018
; Update  : 

DeclareModule GtkGadgetStyle
  
  Declare AddCssProvider(Gadget, StyleID, CSSData.s)
  Declare RemoveCssProvider(Gadget, StyleID)
  Declare AddCssProviderForScreen(Gadget, StyleID, CSSData.s)
  Declare RemoveCssProviderForScreen(Gadget, StyleID)
  
  Declare.s CSSColorString(color)
  
EndDeclareModule

Module GtkGadgetStyle
  
  EnableExplicit
  
  ;- Imports
  ImportC ""
    gtk_widget_get_screen(*Widget.GtkWidget)
    gtk_widget_get_style_context(*Widget.GtkWidget)
    gtk_css_provider_new()
    gtk_css_provider_load_from_data(*CSSProvider, CSSData.P-UTF8, Length, *Error.GError)
    gtk_style_context_add_provider(*CSSContext, *CSSProvider, Priority)
    gtk_style_context_remove_provider(*CSSContext, *CSSProvider)
    gtk_style_context_add_provider_for_screen(*CSSContext, *CSSProvider, Priority)
    gtk_style_context_remove_provider_for_screen(*CSSContext, *CSSProvider)
  EndImport
  
  ;- 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
  
  ;- Maps
  Global NewMap CSSProviderList()
  Global NewMap CSSProviderForScreenList()
  
  ; ---------------------------------------------------------------------------
  
  Procedure AddCssProvider(Gadget, StyleID, CSSData.s)
    Protected CSSProvider, CSSContext
    CSSProvider = gtk_css_provider_new()
    CSSContext = gtk_widget_get_style_context(GadgetID(Gadget))
    If FindMapElement(CSSProviderList(), Hex(Gadget) + "/" + Hex(StyleID))
      gtk_style_context_remove_provider(CSSContext, CSSProviderList())
    EndIf
    CSSProviderList(Hex(Gadget) + "/" + Hex(StyleID)) = CSSProvider
    gtk_css_provider_load_from_data(CSSProvider, CSSData, -1, 0)
    gtk_style_context_add_provider(CSSContext, CSSProvider, #GTK_STYLE_PROVIDER_PRIORITY_USER)
    g_object_unref_(CSSProvider)
  EndProcedure
  
  ; ---------------------------------------------------------------------------
  
  Procedure RemoveCssProvider(Gadget, StyleID)
    Protected CSSContext
    CSSContext = gtk_widget_get_style_context(GadgetID(Gadget))
    If FindMapElement(CSSProviderList(), Hex(Gadget) + "/" + Hex(StyleID))
      gtk_style_context_remove_provider(CSSContext, CSSProviderList())
      DeleteMapElement(CSSProviderList())
    EndIf
  EndProcedure
  
  ; ---------------------------------------------------------------------------
  
  Procedure AddCssProviderForScreen(Gadget, StyleID, CSSData.s)
    Protected CSSProvider, CSSContext
    CSSProvider = gtk_css_provider_new()
    CSSContext = gtk_widget_get_screen(GadgetID(Gadget))
    If FindMapElement(CSSProviderForScreenList(), Hex(gadget) + "/" + Hex(StyleID))
      gtk_style_context_remove_provider_for_screen(CSSContext, CSSProviderForScreenList())
    EndIf
    CSSProviderForScreenList(Hex(gadget) + "/" + Hex(StyleID)) = CSSProvider
    gtk_css_provider_load_from_data(CSSProvider, CSSData, -1, 0)
    gtk_style_context_add_provider_for_screen(CSSContext, CSSProvider, #GTK_STYLE_PROVIDER_PRIORITY_APPLICATION)
    g_object_unref_(CSSProvider)
  EndProcedure
  
  ; ---------------------------------------------------------------------------
  
  Procedure RemoveCssProviderForScreen(Gadget, StyleID)
    Protected CSSContext
    CSSContext = gtk_widget_get_screen(GadgetID(Gadget))
    If FindMapElement(CSSProviderForScreenList(), Hex(gadget) + "/" + Hex(StyleID))
      gtk_style_context_remove_provider_for_screen(CSSContext, CSSProviderForScreenList())
      DeleteMapElement(CSSProviderForScreenList())
    EndIf
  EndProcedure
  
  ; ---------------------------------------------------------------------------
  
  Procedure.s CSSColorString(color)
    !mov eax, dword [p.v_color]
    !bswap eax
    !shr eax, 8
    !mov dword [p.v_color], eax
    ProcedureReturn "#" + Hex(Color)
  EndProcedure
  
  ; ---------------------------------------------------------------------------
  
EndModule

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

CompilerIf #PB_Compiler_IsMainFile
  
  UseModule GtkGadgetStyle
  
  Define css_string.s, css_fr.s, css_bg1.s, css_bg2.s
  Define css_color.s
  
  If OpenWindow(0, 0, 0, 270, 140, "CSS-Gadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    StringGadget(0, 10, 10, 250, 25, "StringGadget")
    ButtonGadget(1, 10, 45, 120, 25, "Toggle", #PB_Button_Toggle)  
    ButtonGadget(2, 140, 45, 120, 25, "Remove")  
    
    css_color = CSSColorString(RGB(255,255,0))
    
    css_string = "entry {color: darkred; background-color: gray} entry > selection {background-color: " + css_color + "}"
    css_fr = "button {color: blue}"
    css_bg1 = "button {background-color: yellow}"
    css_bg2 = "button {background-color: green}"
    
    AddCssProviderForScreen(1, 1, css_fr) ; Gilt für alle Gadgets ab den Level
    
    AddCssProvider(0, 1, css_string)
    AddCssProvider(1, 2, css_bg1)
    
    Repeat
      Select WaitWindowEvent()
        Case #PB_Event_CloseWindow
          Break
        Case #PB_Event_Gadget
          Select EventGadget()
            Case 1
              If GetGadgetState(1)
                AddCssProvider(1, 2, css_bg2)
              Else
                AddCssProvider(1, 2, css_bg1)
              EndIf  
            Case 2
              RemoveCssProvider(1, 2)
          EndSelect
      EndSelect
    ForEver
  EndIf
  
CompilerEndIf
Zuletzt geändert von mk-soft am 28.12.2018 23:37, insgesamt 1-mal geändert.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: GTK CSS Provider

Beitrag von ccode_new »

:allright:
:allright: (für das im englischen Forum) :mrgreen:

Anbei: Je nach GTK-Theme ist eine "background" - Eigenschaft sinnlos, aber so ist man freier Meister des Cascading Style Sheets - Ungetüms.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: GTK CSS Provider

Beitrag von mk-soft »

Danke :wink:

Hinter manche CSS-Styles bin ich noch nicht hinter gestiegen. Beschäftige mich aber noch nicht lange genug damit.

Man kann aber seine eigene App komplett mit umbauen :mrgreen:

Beispiel

Code: Alles auswählen

;-TOP

IncludeFile "CSSProvider.pb"

UseModule GtkGadgetStyle

Enumeration FormWindow
  #Window_0
EndEnumeration

Enumeration FormGadget
  #Container_0
  #Editor_0
  #Button_0
  #Button_1
  #Container_1
  #Editor_1
  #Button_2
  #Button_3
  #Container_2
  #Editor_2
  #Button_4
  #Button_5
EndEnumeration


Procedure OpenWindow_0(x = 0, y = 0, width = 910, height = 350)
  OpenWindow(#Window_0, x, y, width, height, "GTK3 Gadgets", #PB_Window_SystemMenu)
  ContainerGadget(#Container_0, 10, 10, 290, 330, #PB_Container_Single)
  EditorGadget(#Editor_0, 10, 10, 270, 270)
  ButtonGadget(#Button_0, 10, 290, 130, 30, "Ok")
  ButtonGadget(#Button_1, 150, 290, 130, 30, "Cancel")
  CloseGadgetList()
  ContainerGadget(#Container_1, 310, 10, 290, 330, #PB_Container_Single)
  EditorGadget(#Editor_1, 10, 10, 270, 270)
  ButtonGadget(#Button_2, 10, 290, 130, 30, "Ok")
  ButtonGadget(#Button_3, 150, 290, 130, 30, "Cancel")
  CloseGadgetList()
  ContainerGadget(#Container_2, 610, 10, 290, 330, #PB_Container_Single)
  EditorGadget(#Editor_2, 10, 10, 270, 270)
  ButtonGadget(#Button_4, 10, 290, 130, 30, "Ok")
  ButtonGadget(#Button_5, 150, 290, 130, 30, "Cancel")
  CloseGadgetList()
EndProcedure

  UseModule GtkGadgetStyle
  
  Define css0.s, css1.s, css2.s
  
  If 1;
    OpenWindow_0()
    
    css0 = "text {color: black; background-color: darkgreen} text > selection {background-color: lightgreen} "
    css0 + "button {color: red; background-color: yellow} "
    css0 + "frame {background: green} "
    
    AddCssProviderForScreen(#Container_0, 1, css0) ; Gilt für alle Gadgets ab den Level
    
    Repeat
      Select WaitWindowEvent()
        Case #PB_Event_CloseWindow
          Break
      EndSelect
    ForEver
  EndIf
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: GTK CSS Provider

Beitrag von ccode_new »

keiner CSS-Tipp:

Beispiel:

button {background-image: none; background-color: yellow}
oder:
"button {background: yellow}"

Bei Verwendung von "background-color" bleibt das evt. vorhandene Bild erhalten und man sieht die Farbe nicht.
Bei Verwendung von "background" wird das vorhandene Bild überschrieben und man sieht die Farbe.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Omi
Beiträge: 143
Registriert: 25.03.2013 09:59

Re: GTK CSS Provider

Beitrag von Omi »

Danke an beide :allright:
PureBasic Linux-API-Library: http://www.chabba.de
Antworten