Skip to content

Commit 1ef2882

Browse files
committed
Merge pull request #7 from leksah/master
Use haskell-gi and add support for GHC 8
2 parents 2d111c3 + 0eb83ed commit 1ef2882

File tree

18 files changed

+595
-358
lines changed

18 files changed

+595
-358
lines changed

.travis.yml

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,36 @@
1-
env:
2-
- GHCVER=7.4.1
3-
- GHCVER=7.4.2
4-
- GHCVER=7.6.3
5-
- GHCVER=7.8.3
1+
language: haskell
2+
3+
sudo: false
4+
5+
matrix:
6+
include:
7+
- env: CABALVER=1.22 GHCVER=7.8.3
8+
addons: {apt: {packages: [cabal-install-1.18,ghc-7.8.3,happy-1.19.5,alex-3.1.4,libwebkitgtk-dev,libwebkitgtk-3.0-dev], sources: [hvr-ghc]}}
9+
- env: CABALVER=1.22 GHCVER=7.8.4
10+
addons: {apt: {packages: [cabal-install-1.18,ghc-7.8.4,happy-1.19.5,alex-3.1.4,libwebkitgtk-dev,libwebkitgtk-3.0-dev], sources: [hvr-ghc]}}
11+
- env: CABALVER=1.22 GHCVER=7.10.1
12+
addons: {apt: {packages: [cabal-install-1.22,ghc-7.10.1,happy-1.19.5,alex-3.1.4,libwebkitgtk-dev,libwebkitgtk-3.0-dev], sources: [hvr-ghc]}}
13+
- env: CABALVER=1.22 GHCVER=7.10.2
14+
addons: {apt: {packages: [cabal-install-1.22,ghc-7.10.2,happy-1.19.5,alex-3.1.4,libwebkitgtk-dev,libwebkitgtk-3.0-dev], sources: [hvr-ghc]}}
15+
- env: CABALVER=head GHCVER=head
16+
addons: {apt: {packages: [cabal-install-head,ghc-head,happy-1.19.5,alex-3.1.4,libwebkitgtk-dev,libwebkitgtk-3.0-dev], sources: [hvr-ghc]}}
17+
allow_failures:
18+
- env: CABALVER=1.22 GHCVER=7.10.2
19+
- env: CABALVER=head GHCVER=head
620

721
before_install:
8-
- sudo add-apt-repository -y ppa:hvr/ghc
9-
- sudo apt-get update -qq
10-
- sudo apt-get --no-install-recommends install libgtk2.0-dev libgtk-3-dev
11-
- sudo apt-get install cabal-install-1.20 ghc-$GHCVER
12-
- export PATH=$HOME/.cabal/bin:/opt/ghc/$GHCVER/bin:/opt/cabal/1.20/bin:$PATH
13-
- cabal update
14-
- |
15-
if [ $GHCVER = "head" ] || [ ${GHCVER%.*} = "7.8" ]; then
16-
sudo apt-get install happy-1.19.3 alex-3.1.3
17-
export PATH=/opt/alex/3.1.3/bin:/opt/happy/1.19.3/bin:$PATH
18-
else
19-
sudo apt-get install happy alex
20-
fi
22+
- export PATH=$HOME/.cabal/bin:/opt/ghc/$GHCVER/bin:/opt/cabal/$CABALVER/bin:/opt/alex/3.1.4/bin:/opt/happy/1.19.5/bin:$PATH
2123

2224
install:
23-
- cabal install Cabal
25+
- cabal --version
26+
- echo "$(ghc --version) [$(ghc --print-project-git-commit-id 2> /dev/null || echo '?')]"
27+
- cabal update
2428
- cabal install gtk2hs-buildtools
2529

2630
script:
27-
- cabal install
31+
- cd vcsgui
32+
- cabal install -v2
33+
- cabal check
2834

2935
notifications:
3036
irc:

vcsgui/src/Main.hs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ import qualified VCSGui.Git.Log as GitLog
2424
import qualified VCSGui.Git.Commit as GitCommit
2525
import qualified VCSGui.Mercurial.Commit as MercurialCommit
2626
import qualified VCSGui.Mercurial.Log as MercurialLog
27-
import Graphics.UI.Gtk
2827
import Control.Monad.Trans(liftIO)
28+
import qualified GI.Gtk.Functions as Gtk (main, init)
2929
--
3030
--svn
3131
--
@@ -165,10 +165,10 @@ main = do
165165

166166
--{-
167167
main = do
168-
initGUI
168+
Gtk.init Nothing
169169
runWithConfig $
170170
MercurialLog.showLogGUI
171-
mainGUI
171+
Gtk.main
172172
where
173173
runWithConfig = Wrapper.runVcs $ Wrapper.makeConfig (Just cwdMercurial) Nothing Nothing
174174
---}

vcsgui/src/VCSGui/Common/Commit.hs

Lines changed: 32 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,22 @@ module VCSGui.Common.Commit (
2525

2626
import qualified VCSWrapper.Common as Wrapper
2727
import qualified VCSGui.Common.GtkHelper as H
28-
import Graphics.UI.Gtk
2928
import Control.Monad.Trans(liftIO)
3029
import Control.Monad
3130
import Control.Monad.Reader
3231
import Data.Maybe
3332
import Paths_vcsgui(getDataFileName)
3433
import qualified Data.Text as T (unpack, pack)
3534
import Data.Text (Text)
35+
import GI.Gtk.Objects.TreeView (TreeView(..))
36+
import Data.GI.Gtk.ModelView.SeqStore
37+
(seqStoreAppend, seqStoreClear, seqStoreToList, SeqStore(..))
38+
import GI.Gtk.Objects.Action (onActionActivate)
39+
import GI.Gtk.Objects.Widget (widgetShowAll)
40+
import GI.Gtk.Objects.Builder (builderGetObject, Builder(..))
41+
import Foreign.ForeignPtr (ForeignPtr)
42+
import Data.GI.Base.BasicTypes (NullToNothing(..), GObject)
43+
import Data.GI.Base.ManagedPtr (unsafeCastTo)
3644

3745
--
3846
-- glade path and object accessors
@@ -55,9 +63,9 @@ type OkCallBack = Text -- ^ Commit message as specified in the GUI.
5563
-> [Option] -- ^ options (this is currently not implemented i.e. '[]' is passed)
5664
-> Wrapper.Ctx ()
5765

58-
-- | fn to set listStore model for treeview
66+
-- | fn to set seqStore model for treeview
5967
type TreeViewSetter = TreeView
60-
-> Wrapper.Ctx (ListStore SCFile)
68+
-> Wrapper.Ctx (SeqStore SCFile)
6169

6270

6371
data CommitGUI = CommitGUI {
@@ -110,7 +118,7 @@ showCommitGUI setUpTreeView okCallback = do
110118
liftIO $ H.registerClose $ windowCommit gui
111119
liftIO $ H.registerCloseAction (actCancel gui) (windowCommit gui)
112120
config <- ask
113-
liftIO $ on (H.getItem (actCommit gui)) actionActivated $ do
121+
liftIO $ onActionActivate (H.getItem (actCommit gui)) $ do
114122
let (store,_) = H.getItem (treeViewFiles gui)
115123
selectedFiles <- getSelectedFiles store
116124
mbMsg <- H.get (txtViewMsg gui)
@@ -129,7 +137,7 @@ showCommitGUI setUpTreeView okCallback = do
129137

130138

131139

132-
loadCommitGUI :: TreeViewSetter -- ^ fn to set listStore model for treeview
140+
loadCommitGUI :: TreeViewSetter -- ^ fn to set seqStore model for treeview
133141
-> Wrapper.Ctx CommitGUI
134142
loadCommitGUI setUpTreeView = do
135143
gladepath <- liftIO getGladepath
@@ -145,9 +153,9 @@ loadCommitGUI setUpTreeView = do
145153
---- HELPERS
146154
----
147155

148-
getSelectedFiles :: ListStore SCFile -> IO [FilePath]
149-
getSelectedFiles listStore = do
150-
listedFiles <- listStoreToList listStore
156+
getSelectedFiles :: SeqStore SCFile -> IO [FilePath]
157+
getSelectedFiles seqStore = do
158+
listedFiles <- seqStoreToList seqStore
151159
let selectedFiles = map (\scf -> filePath scf )
152160
$ filter (\scf -> selected scf) listedFiles
153161
return (selectedFiles)
@@ -156,39 +164,39 @@ getTreeViewFromGladeCustomStore :: Builder
156164
-> Text
157165
-> TreeViewSetter
158166
-> Wrapper.Ctx (H.TreeViewItem SCFile)
159-
getTreeViewFromGladeCustomStore builder name setupListStore = do
160-
(_, tView) <- liftIO $ wrapWidget builder castToTreeView name
161-
store <- setupListStore tView
162-
let getter = getFromListStore (store, tView)
163-
setter = setToListStore (store, tView)
167+
getTreeViewFromGladeCustomStore builder name setupSeqStore = do
168+
(_, tView) <- liftIO $ wrapWidget builder TreeView name
169+
store <- setupSeqStore tView
170+
let getter = getFromSeqStore (store, tView)
171+
setter = setToSeqStore (store, tView)
164172
return (name, (store, tView), (getter, setter))
165173

166174
---
167175
--- same as gtkhelper, but avoiding exposing it
168176
---
169-
wrapWidget :: GObjectClass objClass =>
177+
wrapWidget :: GObject objClass =>
170178
Builder
171-
-> (GObject -> objClass)
179+
-> (ForeignPtr objClass -> objClass)
172180
-> Text -> IO (Text, objClass)
173-
wrapWidget builder cast name = do
181+
wrapWidget builder constructor name = do
174182
putStrLn $ " cast " ++ T.unpack name
175-
gobj <- builderGetObject builder cast name
183+
gobj <- nullToNothing (builderGetObject builder name) >>= unsafeCastTo constructor . fromJust
176184
return (name, gobj)
177185

178-
getFromListStore :: (ListStore a, TreeView)
186+
getFromSeqStore :: (SeqStore a, TreeView)
179187
-> IO (Maybe [a])
180-
getFromListStore (store, _) = do
181-
list <- listStoreToList store
188+
getFromSeqStore (store, _) = do
189+
list <- seqStoreToList store
182190
if null list
183191
then return Nothing
184192
else return $ Just list
185193

186-
setToListStore :: (ListStore a, TreeView)
194+
setToSeqStore :: (SeqStore a, TreeView)
187195
-> [a]
188196
-> IO ()
189-
setToListStore (store, view) newList = do
190-
listStoreClear store
191-
mapM_ (listStoreAppend store) newList
197+
setToSeqStore (store, view) newList = do
198+
seqStoreClear store
199+
mapM_ (seqStoreAppend store) newList
192200
return ()
193201

194202

vcsgui/src/VCSGui/Common/ConflictsResolved.hs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,9 @@ import qualified VCSWrapper.Common as Wrapper
2121
import Paths_vcsgui(getDataFileName)
2222
import qualified VCSGui.Common.GtkHelper as H
2323
import Control.Monad.Trans(liftIO)
24-
import Graphics.UI.Gtk
2524
import Control.Monad.Reader(ask)
25+
import GI.Gtk.Objects.Action (onActionActivate)
26+
import GI.Gtk.Objects.Widget (widgetShowAll)
2627

2728
--
2829
-- glade path and object accessors
@@ -50,11 +51,11 @@ showConflictsResolvedGUI handler = do
5051
-- connect actions
5152
liftIO $ H.registerClose $ windowConflictsResolved gui
5253
config <- ask
53-
liftIO $ on (H.getItem (actConflictsNotResolved gui)) actionActivated $ do
54+
liftIO $ onActionActivate (H.getItem (actConflictsNotResolved gui)) $ do
5455
Wrapper.runVcs config $ handler False
5556
H.closeWin (windowConflictsResolved gui)
5657

57-
liftIO $ on (H.getItem (actConflictsResolved gui)) actionActivated $ do
58+
liftIO $ onActionActivate (H.getItem (actConflictsResolved gui)) $ do
5859
Wrapper.runVcs config $ handler True
5960
H.closeWin (windowConflictsResolved gui)
6061

vcsgui/src/VCSGui/Common/Error.hs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
{-# LANGUAGE DataKinds #-}
12
{-# LANGUAGE OverloadedStrings #-}
23
-----------------------------------------------------------------------------
34
--
@@ -17,14 +18,24 @@ module VCSGui.Common.Error (
1718
showErrorGUI
1819
) where
1920

20-
import Graphics.UI.Gtk
2121
import Data.Text (Text)
22+
import GI.Gtk.Objects.Dialog (dialogUseHeaderBar, dialogRun)
23+
import GI.Gtk.Objects.Widget (widgetDestroy)
24+
import Data.GI.Base (new)
25+
import GI.Gtk.Objects.MessageDialog
26+
(messageDialogMessageType, messageDialogButtons,
27+
setMessageDialogText, MessageDialog(..))
28+
import GI.Gtk.Enums (ButtonsType(..), MessageType(..))
29+
import Data.GI.Base.Attributes (AttrOp(..))
2230

2331
-- | Displays a simple window displaying given 'String' as an error message.
2432
showErrorGUI :: Text -- ^ Message to display.
2533
-> IO ()
2634
showErrorGUI msg = do
27-
dialog <- messageDialogNew Nothing [] MessageError ButtonsOk msg
35+
dialog <- new MessageDialog [dialogUseHeaderBar := 0,
36+
messageDialogMessageType := MessageTypeError,
37+
messageDialogButtons := ButtonsTypeOk]
38+
setMessageDialogText dialog msg
2839
_ <- dialogRun dialog
2940
widgetDestroy dialog
3041
return ()

0 commit comments

Comments
 (0)