packages feed

apelsin-1.1: src/GtkUtils.hs

module GtkUtils where
import Graphics.UI.Gtk
import Control.Monad 

whenJust :: Monad m => Maybe a -> (a -> m ()) -> m ()
whenJust x f = case x of
	Nothing	-> return ()
	Just a	-> f a 
	
			
scrollIt, scrollItV :: WidgetClass widget => widget -> PolicyType -> PolicyType -> IO ScrolledWindow
scrollIt widget pol1 pol2 = do
	scroll <- scrolledWindowNew Nothing Nothing
	scrolledWindowSetPolicy scroll pol1 pol2
	containerAdd scroll widget
	return scroll
	
scrollItV widget pol1 pol2 = do
	scroll <- scrolledWindowNew Nothing Nothing
	scrolledWindowSetPolicy scroll pol1 pol2
	scrolledWindowAddWithViewport scroll widget
	Just vp <- binGetChild scroll
	set scroll [ scrolledWindowShadowType := ShadowNone ]
	set (castToViewport vp) [ viewportShadowType := ShadowNone ]
	return scroll
	

simpleListView :: [(String, Bool, a -> String)] -> IO (ListStore a, TreeView)
simpleListView headers = do
	model <- listStoreNew []
	view <- treeViewNewWithModel model
	select <- treeViewGetSelection view
	treeSelectionSetMode select SelectionNone
	addColumns model view $
		map (\(title, isName, f) -> (title, if isName then 0 else 1, isName, isName, isName, f)) headers
	return (model, view)
	
	

newLabeledFrame :: String -> IO Frame
newLabeledFrame lbl = do
	frame <- frameNew
	frameSetLabel frame lbl
	return frame
	
addColumns :: (TreeViewClass view, TreeModelClass (model row), TypedTreeModelClass model) =>
	model row -> view -> [(String, Float, Bool, Bool, Bool, row -> String)] -> IO ()
addColumns model view xs = mapM_ g xs where
	g (title, align, format, expand, ellipsize, f) = do
		col <- treeViewColumnNew
		set col	[ treeViewColumnTitle := title
			, treeViewColumnExpand := expand ]
		rend <- cellRendererTextNew
		set rend [ cellXAlign := align]
		when ellipsize $
			set rend [ cellTextEllipsizeSet := True, cellTextEllipsize := EllipsizeEnd]
		cellLayoutPackStart col rend True
		cellLayoutSetAttributes col rend model $ \row -> if format
			then [ cellTextMarkup := Just (f row) ]
			else [ cellText := f row ]
		treeViewAppendColumn view col
		
{-
addColumnsSort raw model view xs = sequence_ $ zipWith f (iterate (+1) 0) xs where
	f n (title, format, expand, showf,  sortf) = do
		col <- treeViewColumnNew
		set col	[ treeViewColumnTitle := title
			, treeViewColumnExpand := expand ]
		rend <- cellRendererTextNew
		cellLayoutPackStart col rend True
		cellLayoutSetAttributeFunc col rend model $ \iter -> do
			cIter	<- treeModelSortConvertIterToChildIter model iter
			item	<- treeModelGetRow raw cIter
			set rend $ if format 
				then [ cellTextMarkup := Just (showf item) ]
				else [ cellText := showf item ]
		treeViewAppendColumn view col
		case sortf of
			Nothing	-> return ()
			Just g	-> do
				col `treeViewColumnSetSortColumnId` n
				treeSortableSetSortFunc model n (xort raw g)
-}
addColumnsFilter :: (TreeViewClass self1, TreeModelFilterClass self, TreeModelClass self, TypedTreeModelClass model) =>
	model t -> self -> self1 -> [(String, Bool, t -> String)] -> IO ()
addColumnsFilter raw model view xs = mapM_ f xs where
	f (title, expand, showf) = do
		col <- treeViewColumnNew
		set col	[ treeViewColumnTitle := title
			, treeViewColumnExpand := expand ]
		rend <- cellRendererTextNew
		when expand $
			set rend [ cellTextEllipsize := EllipsizeEnd]
		cellLayoutPackStart col rend True
		cellLayoutSetAttributeFunc col rend model $ \iter -> do
			cIter	<- treeModelFilterConvertIterToChildIter model iter
			item	<- treeModelGetRow raw cIter
			set rend [ cellTextMarkup := Just (showf item) ]
		treeViewAppendColumn view col

data RendType i = RendText (i -> [AttrOp CellRendererText]) | RendPixbuf (i -> [AttrOp CellRendererPixbuf])
addColumnsFilterSort :: (TreeViewClass self, TreeSortableClass self1, TreeModelSortClass self1,
	TreeModelFilterClass self2, TreeModelClass self1, TypedTreeModelClass model) =>
	model t -> self2 -> self1 -> self -> Int -> SortType
	-> [(String, Bool, RendType t, Maybe (t -> t -> Ordering))]
	-> IO ()
addColumnsFilterSort raw filtered sorted view defaultSort sortType xs = zipWithM_ f [0..] xs where
	f n (title, expand, rt, sortf) = do
		col <- treeViewColumnNew
		set col	[ treeViewColumnTitle := title
			, treeViewColumnExpand := expand ]
		case rt of
			RendText attr -> do
				rend <- cellRendererTextNew
				cellLayoutPackStart col rend True
				cellLayoutSetAttributeFunc col rend sorted $ \iter -> do
					cIter	<- treeModelSortConvertIterToChildIter sorted iter
					rcIter	<- treeModelFilterConvertIterToChildIter filtered cIter
					item	<- treeModelGetRow raw rcIter
					set rend $ attr item
			RendPixbuf attr -> do
				rend <- cellRendererPixbufNew
				cellLayoutPackStart col rend True
				cellLayoutSetAttributeFunc col rend sorted $ \iter -> do
					cIter	<- treeModelSortConvertIterToChildIter sorted iter
					rcIter	<- treeModelFilterConvertIterToChildIter filtered cIter
					item	<- treeModelGetRow raw rcIter
					set rend $ attr item
		treeViewAppendColumn view col
		case sortf of
			Nothing	-> return ()
			Just g	-> do
				col `treeViewColumnSetSortColumnId` n
				treeSortableSetSortFunc sorted n $ \it1 it2 -> do
					rit1	<- treeModelFilterConvertIterToChildIter filtered it1
					rit2	<- treeModelFilterConvertIterToChildIter filtered it2
					xort raw g rit1 rit2
		treeSortableSetDefaultSortFunc sorted Nothing
		treeSortableSetSortColumnId sorted defaultSort sortType
		
getElementFS :: (TreeModelClass self, TreeModelFilterClass self1, TreeModelSortClass self, TypedTreeModelClass model) =>
	model b -> self -> self1 -> TreePath -> IO b
getElementFS store sorted filtered x = do
	Just vIter	<- treeModelGetIter sorted x
	sIter		<- treeModelSortConvertIterToChildIter sorted vIter
	fIter		<- treeModelFilterConvertIterToChildIter filtered sIter
	treeModelGetRow store fIter

getElementF :: (TreeModelClass self, TreeModelFilterClass self, TypedTreeModelClass model) =>
	model b -> self -> TreePath -> IO b
getElementF store filtered path = do
	Just vIter	<- treeModelGetIter filtered path
	iter		<- treeModelFilterConvertIterToChildIter filtered vIter
	treeModelGetRow store iter
	
getElement :: (TreeModelClass (model m), TypedTreeModelClass model) => model m -> TreePath -> IO m
getElement raw path = do
	Just iter	<- treeModelGetIter raw path
	treeModelGetRow raw iter
		
gtkPopup :: MessageType -> String -> IO ()
gtkPopup what str = do
	a <- messageDialogNew Nothing [DialogDestroyWithParent, DialogModal]
		what ButtonsOk str
	set a [ windowWindowPosition := WinPosCenter]
	dialogRun a
	widgetDestroy a

gtkWarn, gtkError :: String -> IO ()
gtkWarn = gtkPopup MessageWarning
gtkError = gtkPopup MessageError

xort :: TypedTreeModelClass model => model t -> (t -> t -> b) -> TreeIter -> TreeIter -> IO b
xort model g it1 it2 = do
a <- treeModelGetRow model it1 
b <- treeModelGetRow model  it2
return $ g a b