Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@ vcsguis.lkshw
haskellVCSGUI.lkshs
haskellVCSGUI.lkshw
/.shelly/
/dist-newstyle/
44 changes: 17 additions & 27 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,36 +1,26 @@
language: haskell
sudo: required
services:
- docker

sudo: false
cache:
directories:
- .cabal
- .ghc

matrix:
include:
- env: CABALVER=1.22 GHCVER=7.8.3
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]}}
- env: CABALVER=1.22 GHCVER=7.8.4
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]}}
- env: CABALVER=1.22 GHCVER=7.10.1
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]}}
- env: CABALVER=1.22 GHCVER=7.10.2
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]}}
- env: CABALVER=head GHCVER=head
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]}}
allow_failures:
- env: CABALVER=1.22 GHCVER=7.10.2
- env: CABALVER=head GHCVER=head
env:
- CABALVER=1.24 GHCVER=7.10.3 OSVER=xenial
- CABALVER=1.24 GHCVER=8.0.1 OSVER=xenial
- CABALVER=1.24 GHCVER=8.0.2 OSVER=xenial

before_install:
- 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

install:
- cabal --version
- echo "$(ghc --version) [$(ghc --print-project-git-commit-id 2> /dev/null || echo '?')]"
- cabal update
- cabal install gtk2hs-buildtools
- docker build -t leksah -f travis/$OSVER.Dockerfile travis

script:
- cd vcsgui
- cabal install -v2
- cabal check
- docker run -v `pwd`:/build leksah
bash -x -c "
apt-get install -y cabal-install-$CABALVER ghc-$GHCVER &&
export PATH=\$HOME/.cabal/bin:/opt/ghc/$GHCVER/bin:/opt/cabal/$CABALVER/bin:/opt/alex/3.1.7/bin:/opt/happy/1.19.5/bin:\$PATH &&
./travis/build.sh"

notifications:
irc:
Expand Down
37 changes: 37 additions & 0 deletions cabal.project
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
flags: -overloaded-methods -overloaded-signals -overloaded-properties

packages: ./vcsgui

package gi-atk
flags: -overloaded-methods -overloaded-signals -overloaded-properties
package gi-cairo
flags: -overloaded-methods -overloaded-signals -overloaded-properties
package gi-gdk
flags: -overloaded-methods -overloaded-signals -overloaded-properties
package gi-gdkpixbuf
flags: -overloaded-methods -overloaded-signals -overloaded-properties
package gi-gio
flags: -overloaded-methods -overloaded-signals -overloaded-properties
package gi-glib
flags: -overloaded-methods -overloaded-signals -overloaded-properties
package gi-gobject
flags: -overloaded-methods -overloaded-signals -overloaded-properties
package gi-gtk
flags: -overloaded-methods -overloaded-signals -overloaded-properties
package gi-gtk-hs
flags: -overloaded-methods -overloaded-signals -overloaded-properties
package gi-gtkosxapplication
flags: -overloaded-methods -overloaded-signals -overloaded-properties
package gi-gtksource
flags: -overloaded-methods -overloaded-signals -overloaded-properties
package gi-javascriptcore
flags: -overloaded-methods -overloaded-signals -overloaded-properties
package gi-pango
flags: -overloaded-methods -overloaded-signals -overloaded-properties
package gi-soup
flags: -overloaded-methods -overloaded-signals -overloaded-properties
package gi-webkit
flags: -overloaded-methods -overloaded-signals -overloaded-properties
package gi-webkit2
flags: -overloaded-methods -overloaded-signals -overloaded-properties

18 changes: 18 additions & 0 deletions travis/build.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#!/bin/bash -ex

echo $PATH
export LC_ALL=C.UTF-8

if [[ -d .cabal && -d .ghc ]]; then
cp -a .cabal .ghc /root
fi

cabal update
cd vcsgui
cabal new-build

# update the cache
rm -rf .cabal
cp -a /root/.cabal ./
rm -rf .ghc
cp -a /root/.ghc ./
11 changes: 11 additions & 0 deletions travis/vivid.Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
FROM ubuntu:vivid

RUN apt-get update && \
apt-get -y install software-properties-common && \
add-apt-repository -y ppa:hvr/ghc && \
apt-get update && \
apt-get -y install happy-1.19.5 alex-3.1.7 libgirepository1.0-dev libgtksourceview-3.0-dev libwebkitgtk-3.0-dev

RUN mkdir /build
WORKDIR /build

11 changes: 11 additions & 0 deletions travis/wily.Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
FROM ubuntu:wily

RUN apt-get update && \
apt-get -y install software-properties-common && \
add-apt-repository -y ppa:hvr/ghc && \
apt-get update && \
apt-get -y install happy-1.19.5 alex-3.1.7 libgirepository1.0-dev libgtksourceview-3.0-dev libwebkitgtk-3.0-dev

RUN mkdir /build
WORKDIR /build

11 changes: 11 additions & 0 deletions travis/xenial.Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
FROM ubuntu:xenial

RUN apt-get update && \
apt-get -y install software-properties-common && \
add-apt-repository -y ppa:hvr/ghc && \
apt-get update && \
apt-get -y install happy-1.19.5 alex-3.1.7 libgirepository1.0-dev libgtksourceview-3.0-dev libwebkitgtk-3.0-dev

RUN mkdir /build
WORKDIR /build

8 changes: 4 additions & 4 deletions vcsgui/src/VCSGui/Common/Commit.hs
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,8 @@ import Data.GI.Gtk.ModelView.SeqStore
import GI.Gtk.Objects.Action (onActionActivate)
import GI.Gtk.Objects.Widget (widgetShowAll)
import GI.Gtk.Objects.Builder (builderGetObject, Builder(..))
import Foreign.ForeignPtr (ForeignPtr)
import Data.GI.Base.BasicTypes (NullToNothing(..), GObject)
import Data.GI.Base.BasicTypes
(ManagedPtr(..), GObject)
import Data.GI.Base.ManagedPtr (unsafeCastTo)

--
Expand Down Expand Up @@ -176,11 +176,11 @@ getTreeViewFromGladeCustomStore builder name setupSeqStore = do
---
wrapWidget :: GObject objClass =>
Builder
-> (ForeignPtr objClass -> objClass)
-> (ManagedPtr objClass -> objClass)
-> Text -> IO (Text, objClass)
wrapWidget builder constructor name = do
putStrLn $ " cast " ++ T.unpack name
gobj <- nullToNothing (builderGetObject builder name) >>= unsafeCastTo constructor . fromJust
gobj <- builderGetObject builder name >>= unsafeCastTo constructor . fromJust
return (name, gobj)

getFromSeqStore :: (SeqStore a, TreeView)
Expand Down
14 changes: 7 additions & 7 deletions vcsgui/src/VCSGui/Common/Error.hs
Original file line number Diff line number Diff line change
Expand Up @@ -19,22 +19,22 @@ module VCSGui.Common.Error (
) where

import Data.Text (Text)
import GI.Gtk.Objects.Dialog (dialogUseHeaderBar, dialogRun)
import GI.Gtk.Objects.Dialog (constructDialogUseHeaderBar, dialogRun)
import GI.Gtk.Objects.Widget (widgetDestroy)
import Data.GI.Base (new)
import Data.GI.Base.GObject (new')
import GI.Gtk.Objects.MessageDialog
(messageDialogMessageType, messageDialogButtons,
(constructMessageDialogMessageType, constructMessageDialogButtons,
setMessageDialogText, MessageDialog(..))
import GI.Gtk.Enums (ButtonsType(..), MessageType(..))
import Data.GI.Base.Attributes (AttrOp(..))

-- | Displays a simple window displaying given 'String' as an error message.
showErrorGUI :: Text -- ^ Message to display.
-> IO ()
showErrorGUI msg = do
dialog <- new MessageDialog [dialogUseHeaderBar := 0,
messageDialogMessageType := MessageTypeError,
messageDialogButtons := ButtonsTypeOk]
dialog <- new' MessageDialog [
constructDialogUseHeaderBar 0,
constructMessageDialogMessageType MessageTypeError,
constructMessageDialogButtons ButtonsTypeOk]
setMessageDialogText dialog msg
_ <- dialogRun dialog
widgetDestroy dialog
Expand Down
24 changes: 11 additions & 13 deletions vcsgui/src/VCSGui/Common/FilesInConflict.hs
Original file line number Diff line number Diff line change
Expand Up @@ -37,29 +37,27 @@ import GI.Gtk.Objects.Action (onActionActivate)
import GI.Gtk.Enums (ResponseType(..), FileChooserAction(..))
import GI.Gtk.Objects.Widget (widgetDestroy, widgetShowAll)
import GI.Gtk.Objects.CellRendererText (cellRendererTextNew)
import Data.GI.Base.Attributes (AttrOp(..), AttrLabelProxy(..))
import GI.Gtk.Objects.CellRendererToggle
(onCellRendererToggleToggled, cellRendererToggleNew)
import GI.Gtk.Interfaces.TreeModel (treeModelGetIterFromString)
import GI.Gtk.Objects.Builder (builderGetObject, Builder(..))
import Data.GI.Base.BasicTypes (NullToNothing(..), GObject)
import Foreign.ForeignPtr (ForeignPtr)
import Data.GI.Base.BasicTypes
(ManagedPtr(..), GObject)
import Data.GI.Base.ManagedPtr (unsafeCastTo)
import Data.GI.Gtk.ModelView.SeqStore
(seqStoreAppend, seqStoreClear, seqStoreToList,
seqStoreSetValue, seqStoreIterToIndex, seqStoreGetValue,
seqStoreNew, SeqStore(..))
import GI.Gtk.Objects.Window
(setWindowTransientFor, setWindowTitle, Window(..))
import Data.GI.Base (new, nullToNothing)
import Data.GI.Base.GObject (new')
import GI.Gtk.Objects.FileChooserDialog (FileChooserDialog(..))
import GI.Gtk.Objects.Dialog (dialogRun, dialogAddButton)
import GI.Gtk.Interfaces.FileChooser
(fileChooserGetFilename, setFileChooserAction)
import Data.Maybe (fromJust)

_active = AttrLabelProxy :: AttrLabelProxy "active"
_text = AttrLabelProxy :: AttrLabelProxy "text"
import GI.Gtk
(setCellRendererToggleActive, setCellRendererTextText)

--
-- glade path and object accessors
Expand Down Expand Up @@ -186,13 +184,13 @@ defaultSetUpTreeView mbcwd conflictingFiles filesToResolveGetter resolveMarker e
H.addColumnToTreeView' treeViewItem
renderer
"File"
$ \scf -> [_text := T.pack $ filePath scf]
$ \cell scf -> setCellRendererTextText cell . T.pack $ filePath scf

renderer <- cellRendererToggleNew
H.addColumnToTreeView' treeViewItem
renderer
"Resolved"
$ \scf -> [_active := isResolved scf]
$ \cell scf -> setCellRendererToggleActive cell $ isResolved scf

-- connect select action
onCellRendererToggleToggled renderer $ \(columnId :: Text) -> do
Expand Down Expand Up @@ -251,11 +249,11 @@ getTreeViewFromGladeCustomStore builder name setupSeqStore = do
---
wrapWidget :: GObject objClass =>
Builder
-> (ForeignPtr objClass -> objClass)
-> (ManagedPtr objClass -> objClass)
-> Text -> IO (Text, objClass)
wrapWidget builder constructor name = do
putStrLn $ " cast " ++ T.unpack name
gobj <- nullToNothing (builderGetObject builder name) >>= unsafeCastTo constructor . fromJust
gobj <- builderGetObject builder name >>= unsafeCastTo constructor . fromJust
return (name, gobj)

getFromSeqStore :: (SeqStore a, TreeView)
Expand All @@ -282,7 +280,7 @@ showFolderChooserDialog :: Text -- ^ title of the window
-> FileChooserAction
-> IO (Maybe FilePath)
showFolderChooserDialog title parent fcAction = do
dialog <- new FileChooserDialog []
dialog <- new' FileChooserDialog []
setWindowTitle dialog title
dialogAddButton dialog "gtk-cancel" (fromIntegral $ fromEnum ResponseTypeCancel)
dialogAddButton dialog "Select" (fromIntegral $ fromEnum ResponseTypeAccept)
Expand All @@ -293,7 +291,7 @@ showFolderChooserDialog title parent fcAction = do
ResponseTypeCancel -> widgetDestroy dialog >> return Nothing
ResponseTypeDeleteEvent -> widgetDestroy dialog >> return Nothing
ResponseTypeAccept -> do
f <- nullToNothing $ fileChooserGetFilename dialog
f <- fileChooserGetFilename dialog
widgetDestroy dialog
return f

Expand Down
27 changes: 12 additions & 15 deletions vcsgui/src/VCSGui/Common/GtkHelper.hs
Original file line number Diff line number Diff line change
Expand Up @@ -100,20 +100,17 @@ import qualified GI.Gtk.Objects.ToggleButton as Gtk
import qualified GI.Gtk.Objects.Widget as Gtk
(onWidgetDeleteEvent, widgetHide)
import qualified GI.Gtk.Functions as Gtk (mainQuit)
import qualified GI.Gtk.Objects.CellRenderer as Gtk (CellRendererK)
import qualified Data.GI.Base.Attributes as Gtk
(AttrOpTag(..), AttrOp)
import qualified GI.Gtk.Objects.CellRenderer as Gtk (IsCellRenderer)
import qualified GI.Gtk.Objects.TreeViewColumn as Gtk
(treeViewColumnPackStart, setTreeViewColumnTitle,
treeViewColumnNew)
import qualified Data.GI.Gtk.ModelView.CellLayout as Gtk
(cellLayoutSetAttributes)
(cellLayoutSetDataFunction)
import qualified GI.Gtk.Objects.CellRendererText as Gtk
(cellRendererTextNew, CellRendererText(..))
import qualified Data.GI.Base.BasicTypes as Gtk (GObject)
import Foreign.ForeignPtr (ForeignPtr)
import Data.GI.Base.ManagedPtr (unsafeCastTo)
import Data.GI.Base.BasicTypes (NullToNothing(..))
import Data.GI.Base.BasicTypes (ManagedPtr(..))
import Data.Maybe (fromJust)

-- Typesynonyms
Expand Down Expand Up @@ -337,11 +334,11 @@ registerQuitWithCustomFun win fun = Gtk.onWidgetDeleteEvent (getItem win) (\_ ->

-- | Add a column to given SeqStore and TreeView using a mapping.
-- The mapping consists of a CellRenderer, the title and a function, that maps each row to attributes of the column
addColumnToTreeView :: Gtk.CellRendererK r =>
addColumnToTreeView :: Gtk.IsCellRenderer r =>
TreeViewItem a
-> r -- ^ CellRenderer
-> Text -- ^ title
-> (a -> [Gtk.AttrOp r 'Gtk.AttrSet]) -- ^ mapping
-> (r -> a -> IO ()) -- ^ mapping
-> IO ()
addColumnToTreeView (_, item, _) = do
addColumnToTreeView' item
Expand All @@ -352,23 +349,23 @@ addColumnToTreeView (_, item, _) = do
-- Gtk.cellLayoutSetAttributes newCol renderer seqStore value2attributes

-- | Same as 'addColumnToTreeView'. This function can be called without a complete 'TreeViewItem'.
addColumnToTreeView' :: Gtk.CellRendererK r =>
addColumnToTreeView' :: Gtk.IsCellRenderer r =>
(Gtk.SeqStore a, Gtk.TreeView)
-> r
-> Text
-> (a -> [Gtk.AttrOp r 'Gtk.AttrSet])
-> (r -> a -> IO ())
-> IO ()
addColumnToTreeView' (seqStore, listView) renderer title value2attributes = do
newCol <- Gtk.treeViewColumnNew
Gtk.setTreeViewColumnTitle newCol title
Gtk.treeViewAppendColumn listView newCol
Gtk.treeViewColumnPackStart newCol renderer True
Gtk.cellLayoutSetAttributes newCol renderer seqStore value2attributes
Gtk.cellLayoutSetDataFunction newCol renderer seqStore (value2attributes renderer)

-- | Shortcut for adding text columns to a TreeView. See 'addColumnToTreeView'.
addTextColumnToTreeView :: TreeViewItem a
-> Text -- ^ title
-> (a -> [Gtk.AttrOp Gtk.CellRendererText 'Gtk.AttrSet]) -- ^ mapping
-> (Gtk.CellRendererText -> a -> IO ()) -- ^ mapping
-> IO ()
addTextColumnToTreeView tree title map = do
r <- Gtk.cellRendererTextNew
Expand All @@ -377,7 +374,7 @@ addTextColumnToTreeView tree title map = do
-- | Shortcut for adding text columns to a TreeView. See 'addColumnToTreeView\''.
addTextColumnToTreeView' :: (Gtk.SeqStore a, Gtk.TreeView)
-> Text
-> (a -> [Gtk.AttrOp Gtk.CellRendererText 'Gtk.AttrSet])
-> (Gtk.CellRendererText -> a -> IO ())
-> IO ()
addTextColumnToTreeView' item title map = do
r <- Gtk.cellRendererTextNew
Expand All @@ -389,11 +386,11 @@ addTextColumnToTreeView' item title map = do

wrapWidget :: Gtk.GObject objClass =>
Gtk.Builder
-> (ForeignPtr objClass -> objClass)
-> (ManagedPtr objClass -> objClass)
-> Text -> IO (Text, objClass)
wrapWidget builder constructor name = do
hPutStrLn stderr $ " cast " ++ T.unpack name
gobj <- nullToNothing (Gtk.builderGetObject builder name) >>= unsafeCastTo constructor . fromJust
gobj <- Gtk.builderGetObject builder name >>= unsafeCastTo constructor . fromJust
return (name, gobj)


Loading