Come modificare le proprietà di DrawingArea a Gtk2Hs
Domanda
Qualcuno può per favore mi punto nella giusta direzione, quando si tratta di cambiare le proprietà di un elemento in Gtk2Hs.
Per esempio, come faccio a cambiare il colore di sfondo di un DrawingArea?
Soluzione
Ci sono vari metodi per modificare lo stile di un widget. Ad esempio, per modificare lo stile dello sfondo è possibile utilizzare widgetModifyBg
(corrispondente alla funzione C gtk_widget_modify_bg()
). In linea di principio, se si modifica lo stile di uno stato (ad esempio StateNormal) allora si dovrebbe anche cambiare per gli altri.
Y suggerisco di descrivere gli stili che si desidera in un file RC, e poi caricare il file dall'applicazione, ma sembra che funzioni come noreferrer gtk_rc_parse()
non sono vincolati a gtk2hs.
Ecco un esempio:
import Graphics.UI.Gtk
main = do
initGUI
window <- windowNew
window `onDestroy` mainQuit
drawingArea <- drawingAreaNew
window `containerAdd` drawingArea
widgetModifyBg drawingArea StateNormal (Color 0xffff 0 0)
widgetShowAll window
mainGUI
Se avete bisogno di fare il disegno personalizzato sulla base di stili di un widget, è possibile farlo utilizzando widgetGetState
, la proprietà e la famiglia widgetStyle
styleGet*
di funzioni (ad esempio, styleGetText
). Ecco un esempio di che:
import Graphics.Rendering.Cairo
import Graphics.UI.Gtk hiding (fill)
import Graphics.UI.Gtk.Gdk.Events (Event(Expose))
expose widget rect = do
state <- widgetGetState widget
style <- widget `get` widgetStyle
(Color red green blue) <- styleGetText style state
drawWindow <- widgetGetDrawWindow widget
renderWithDrawable drawWindow $ do
moveTo 50 50
setFontSize 20
setSourceRGB (fromIntegral red / 0xffff)
(fromIntegral green / 0xffff)
(fromIntegral blue / 0xffff)
showText "O HAI"
fill
return False
main = do
initGUI
window <- windowNew
window `onDestroy` mainQuit
drawingArea <- drawingAreaNew
drawingArea `onExpose` \(Expose sent area region count) ->
expose drawingArea area
window `containerAdd` drawingArea
widgetShowAll window
mainGUI