manatee-pdfviewer 0.0.8 → 0.1.0
raw patch · 9 files changed
+168/−66 lines, 9 filesdep +binarydep +derivedep −gtk-serialized-eventdep ~manatee-coresetup-changedbinary-added
Dependencies added: binary, derive
Dependencies removed: gtk-serialized-event
Dependency ranges changed: manatee-core
Files
- Main.hs +1/−1
- Manatee/Extension/PdfViewer.hs +1/−1
- Manatee/Extension/PdfViewer/PageMode.hs +1/−1
- Manatee/Extension/PdfViewer/PdfBuffer.hs +34/−1
- Manatee/Extension/PdfViewer/PdfView.hs +109/−54
- Setup.hs +12/−2
- data/welcome/LearnYouAHaskell.pdf binary
- data/welcome/snapshot.png binary
- manatee-pdfviewer.cabal +10/−6
Main.hs view
@@ -1,7 +1,7 @@ -- Author: Andy Stewart <lazycat.manatee@gmail.com> -- Maintainer: Andy Stewart <lazycat.manatee@gmail.com> -- --- Copyright (C) 2010 Andy Stewart, all rights reserved.+-- Copyright (C) 2010 ~ 2011 Andy Stewart, all rights reserved. -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by
Manatee/Extension/PdfViewer.hs view
@@ -1,7 +1,7 @@ -- Author: Andy Stewart <lazycat.manatee@gmail.com> -- Maintainer: Andy Stewart <lazycat.manatee@gmail.com> -- --- Copyright (C) 2010 Andy Stewart, all rights reserved.+-- Copyright (C) 2010 ~ 2011 Andy Stewart, all rights reserved. -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by
Manatee/Extension/PdfViewer/PageMode.hs view
@@ -1,7 +1,7 @@ -- Author: Andy Stewart <lazycat.manatee@gmail.com> -- Maintainer: Andy Stewart <lazycat.manatee@gmail.com> -- --- Copyright (C) 2010 Andy Stewart, all rights reserved.+-- Copyright (C) 2010 ~ 2011 Andy Stewart, all rights reserved. -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by
Manatee/Extension/PdfViewer/PdfBuffer.hs view
@@ -1,7 +1,7 @@ -- Author: Andy Stewart <lazycat.manatee@gmail.com> -- Maintainer: Andy Stewart <lazycat.manatee@gmail.com> -- --- Copyright (C) 2010 Andy Stewart, all rights reserved.+-- Copyright (C) 2010 ~ 2011 Andy Stewart, all rights reserved. -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by@@ -17,19 +17,24 @@ -- along with this program. If not, see <http://www.gnu.org/licenses/>. {-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE TemplateHaskell #-} module Manatee.Extension.PdfViewer.PdfBuffer where import Control.Applicative import Control.Concurrent.STM import Control.Monad import DBus.Client hiding (Signal)+import Data.Binary import Data.ByteString.UTF8+import Data.DeriveTH import Data.Maybe import Data.Typeable import Graphics.UI.Gtk.Poppler.Document hiding (PageMode) import Graphics.UI.Gtk.Poppler.Page+import Manatee.Core.Config import Manatee.Core.Types import Manatee.Extension.PdfViewer.PageMode+import Manatee.Toolkit.General.STM import Manatee.Toolkit.Gio.Gio data PdfBuffer =@@ -40,9 +45,21 @@ ,pdfBufferDocument :: Document ,pdfBufferNPages :: Int ,pdfBufferPageSize :: (Double, Double)+ ,pdfBufferState :: TVar PdfState } deriving Typeable +data PdfState =+ PdfState {pdfStatePageIndex :: Int+ ,pdfStateScale :: Maybe Double+ ,pdfStatePageSize :: Maybe (Int, Int)+ ,pdfStateScrolledPosition :: (Double, Double)}++-- | Init state.+pdfInitState :: PdfState+pdfInitState =+ PdfState 0 Nothing Nothing (0, 0)+ -- | New pdf viewer buffer. pdfBufferNew :: String -> [String] -> Client -> PageId -> CustomizeWrap -> IO PdfBuffer pdfBufferNew path _ client pageId _ = do@@ -63,5 +80,21 @@ <*> pure document <*> pure nPages <*> pure size+ <*> newTVarIO pdfInitState+ where filepath = filepathGetDisplayName (fromString path)++-- | Write state.+pdfBufferWriteState :: PdfBuffer -> FilePath -> IO ()+pdfBufferWriteState buffer path = do+ state <- readTVarIO $ pdfBufferState buffer+ writeConfigPath path state++-- | Read state.+pdfBufferReadState :: PdfBuffer -> FilePath -> IO () +pdfBufferReadState buffer path = do+ state <- readConfigPath path pdfInitState+ writeTVarIO (pdfBufferState buffer) state+ +$(derive makeBinary ''PdfState)
Manatee/Extension/PdfViewer/PdfView.hs view
@@ -1,7 +1,7 @@ -- Author: Andy Stewart <lazycat.manatee@gmail.com> -- Maintainer: Andy Stewart <lazycat.manatee@gmail.com> -- --- Copyright (C) 2010 Andy Stewart, all rights reserved.+-- Copyright (C) 2010 ~ 2011 Andy Stewart, all rights reserved. -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by@@ -29,17 +29,18 @@ import Data.Typeable import Graphics.Rendering.Cairo import Graphics.UI.Gtk hiding (Statusbar, statusbarNew, get)-import Graphics.UI.Gtk.Gdk.SerializedEvent import Graphics.UI.Gtk.Poppler.Document import Graphics.UI.Gtk.Poppler.Page+import Manatee.Core.Config import Manatee.Core.PageFrame import Manatee.Core.PageView import Manatee.Core.Types import Manatee.Extension.PdfViewer.PdfBuffer import Manatee.Toolkit.General.Basic+import Manatee.Toolkit.General.Maybe import Manatee.Toolkit.General.STM import Manatee.Toolkit.Gtk.Event-import Manatee.Toolkit.Gtk.Gtk+import Manatee.Toolkit.Gtk.ScrolledWindow import Paths_manatee_pdfviewer import System.FilePath @@ -64,12 +65,17 @@ pageBufferPackageName _ = fmap takeFileName getDataDir instance PageView PdfView where- pageViewBuffer = PageBufferWrap . pdfViewBuffer- pageViewPlugId = pdfViewPlugId- pageViewBox = pageFrameBox . pdfViewFrame- pageViewScrolledWindow = pdfViewScrolledWindow- pageViewFocus = widgetGrabFocus . pdfViewView- pageViewHandleKeyAction = pdfViewHandleKeyAction+ pageViewBuffer = PageBufferWrap . pdfViewBuffer+ pageViewPlugId = pdfViewPlugId+ pageViewFrame = pdfViewFrame+ pageViewLocalKeymap _ = pdfViewLocalKeymap+ pageViewLocalCommandMap _ = pdfViewLocalCommandMap+ pageViewFocus = widgetGrabFocus . pdfViewView+ pageViewPropagateWidget = castToWidget . pdfViewView+ pageViewSaveState view = pdfViewSaveState view Nothing+ pageViewRestoreState view = pdfViewRestoreState view Nothing+ pageViewWriteState view path = pdfViewSaveState view (Just path)+ pageViewReadState view path = pdfViewRestoreState view (Just path) -- | New pdf viewer view. pdfViewNew :: PdfBuffer -> PagePlugId -> IO PdfView@@ -88,32 +94,29 @@ let viewer = PdfView pId pFrame view buffer pageIndex scale -- Redraw signal.- view `on` exposeEvent $ tryEvent $ pdfViewHandleExpose viewer+ view `after` exposeEvent $ tryEvent $ pdfViewHandleExpose viewer return viewer -- | Handle expose signal. pdfViewHandleExpose :: PdfView -> EventM EExpose () pdfViewHandleExpose view@(PdfView {pdfViewBuffer = buffer- ,pdfViewScale = viewScale+ ,pdfViewScale = scaleTVar }) = do (winWidth, _) <- eventWindowSize liftIO $ do let (pageWidth, pageHeight) = pdfBufferPageSize buffer area = pdfViewView view -- Init scale and size request.- readTVarIO viewScale- >>= \ value -> - -- Update scale value and area size request when haven't set.- when (value == 0) $ do- -- Update scale value.+ scale <- readTVarIO scaleTVar+ when (scale == 0) $ do+ putStrLn "Hello" let scaleValue = (winWidth / pageWidth)- writeTVarIO viewScale scaleValue- -- Update size request.+ writeTVarIO scaleTVar scaleValue widgetSetSizeRequest - area - (truncate winWidth) - (truncate (scaleValue * pageHeight * i2d (pdfBufferNPages buffer)))+ area + (truncate winWidth) + (truncate (scaleValue * pageHeight * i2d (pdfBufferNPages buffer))) -- Draw. pdfViewDraw view @@ -150,38 +153,38 @@ scale scaleValue scaleValue pageRender page --- | Handle key action. -pdfViewHandleKeyAction :: PdfView -> Text -> SerializedEvent -> IO ()-pdfViewHandleKeyAction view keystoke sEvent = - case M.lookup keystoke pdfViewKeymap of- Just action -> action view- Nothing -> widgetPropagateEvent (pdfViewView view) sEvent---- | Update adjustment.-pdfViewUpdateAdjustment :: PdfView -> (Double, Double) -> IO ()-pdfViewUpdateAdjustment view (width, height) = do- let sWin = pdfViewScrolledWindow view- hAdj <- scrolledWindowGetHAdjustment sWin- vAdj <- scrolledWindowGetVAdjustment sWin- adjustmentSetUpper hAdj width- adjustmentSetUpper vAdj height+-- | Keymap.+pdfViewLocalKeymap :: Map Text Text+pdfViewLocalKeymap = + M.fromList [("j", "Scroll step up")+ ,("k", "Scroll step down")+ ,("Down", "Scroll step up")+ ,("Up", "Scroll step down")+ ,(" ", "Scroll page up")+ ,("b", "Scroll page down")+ ,("J", "Scroll to bottom")+ ,("K", "Scroll to top")+ ,("n", "Next page")+ ,("p", "Previous page")+ ,("N", "Last page")+ ,("P", "First page")+ ,("g", "Goto page")+ ] -- | Keymap.-pdfViewKeymap :: Map Text (PdfView -> IO ())-pdfViewKeymap = - M.fromList [("j", pageViewScrollVerticalStep True)- ,("k", pageViewScrollVerticalStep False)- ,("Down", pageViewScrollVerticalStep True)- ,("Up", pageViewScrollVerticalStep False)- ,(" ", pageViewScrollVerticalPage True)- ,("b", pageViewScrollVerticalPage False)- ,("J", pageViewScrollToBottom)- ,("K", pageViewScrollToTop)- ,("n", pdfViewNextPage)- ,("p", pdfViewPrevPage)- ,("N", pdfViewLastPage)- ,("P", pdfViewFirstPage)- ,("g", pdfViewGotoPage)+pdfViewLocalCommandMap :: Map Text (PdfView -> IO ())+pdfViewLocalCommandMap = + M.fromList [("Scroll step up", pageViewScrollVerticalStep True)+ ,("Scroll step down", pageViewScrollVerticalStep False)+ ,("Scroll page up", pageViewScrollVerticalPage True)+ ,("Scroll page down", pageViewScrollVerticalPage False)+ ,("Scroll to bottom", pageViewScrollToBottom)+ ,("Scroll to top", pageViewScrollToTop)+ ,("Next page", pdfViewNextPage)+ ,("Previous page", pdfViewPrevPage)+ ,("Last page", pdfViewLastPage)+ ,("First page", pdfViewFirstPage)+ ,("Goto page", pdfViewGotoPage) ] -- | Get index range to render visible are.@@ -218,11 +221,11 @@ destIndex <- if page < minIndex then do- pageFrameShowOutputbar (pdfViewFrame view) "Out of bound, goto first page." Nothing + pageViewShowOutputbar view "Out of bound, goto first page." Nothing return minIndex else if page > maxIndex then do- pageFrameShowOutputbar (pdfViewFrame view) "Out of bound, goto last page." Nothing+ pageViewShowOutputbar view "Out of bound, goto last page." Nothing return maxIndex else return page vAdj <- scrolledWindowGetVAdjustment $ pdfViewScrolledWindow view@@ -255,7 +258,7 @@ pdfViewGotoPage :: PdfView -> IO () pdfViewGotoPage view@(PdfView {pdfViewBuffer = buffer}) = do let maxPage = pdfBufferNPages buffer- localInteractive view ("nGoto page (1 - " ++ show maxPage ++ ") : ") $ \ [page] -> do+ interactive view [(INum, "Goto page (1 - " ++ show maxPage ++ ") : ", "")] $ \ [page] -> do let pageNumber = read page :: Int pdfViewSetPage view (pageNumber - 1) @@ -263,3 +266,55 @@ pdfViewScrolledWindow :: PdfView -> ScrolledWindow pdfViewScrolledWindow = pageFrameScrolledWindow . pdfViewFrame++-- | Save state.+pdfViewSaveState :: PdfView -> Maybe FilePath -> IO ()+pdfViewSaveState view@(PdfView {pdfViewBuffer = buffer+ ,pdfViewView = area}) + statePath = do+ -- Get page index.+ pageIndex <- readTVarIO (pdfViewPageIndex view)++ -- Get scale.+ scale <- readTVarIO (pdfViewScale view)++ -- Get page size.+ (Rectangle _ _ w h) <- widgetGetAllocation area++ -- Get scroll position.+ scrolledWindowPosition <- scrolledWindowGetValue (pdfViewScrolledWindow view)++ -- Save state.+ let state = PdfState pageIndex (Just scale) (Just (w, h)) scrolledWindowPosition+ case statePath of+ Nothing -> writeTVarIO (pdfBufferState buffer) state+ Just path -> writeConfigPath path state++-- | Restore state.+pdfViewRestoreState :: PdfView -> Maybe FilePath -> IO ()+pdfViewRestoreState view@(PdfView {pdfViewBuffer = buffer+ ,pdfViewView = area})+ statePath = do+ let scrolledWindow = pdfViewScrolledWindow view++ bufferState <- readTVarIO (pdfBufferState buffer)+ (PdfState pageIndex scale size scrolledWindowPosition) <- + case statePath of+ Just path -> readConfigPath path bufferState+ Nothing -> return bufferState++ -- Restore page index.+ writeTVarIO (pdfViewPageIndex view) pageIndex++ -- Restore scale.+ scale ?>= (writeTVarIO (pdfViewScale view))++ -- Restore page size.+ size ?>= \ (w, h) -> do+ widgetSetSizeRequest area w h+ scrolledWindowSetUpper scrolledWindow (i2d w, i2d h)++ -- Restore scroll position.+ scrolledWindowSetValue scrolledWindow scrolledWindowPosition++ return ()
Setup.hs view
@@ -1,7 +1,7 @@ -- Author: Andy Stewart <lazycat.manatee@gmail.com> -- Maintainer: Andy Stewart <lazycat.manatee@gmail.com> -- --- Copyright (C) 2010 Andy Stewart, all rights reserved.+-- Copyright (C) 2010 ~ 2011 Andy Stewart, all rights reserved. -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by@@ -19,6 +19,7 @@ import Distribution.Simple import Manatee.Core.Config import Manatee.Core.Types+import Manatee.Toolkit.Cabal.Utils import Manatee.Toolkit.General.List import Manatee.Toolkit.General.Map import Manatee.Extension.PdfViewer.PageMode@@ -28,7 +29,7 @@ main = defaultMainWithHooks -- Update Rule after install successful. simpleUserHooks {- postInst = \ _ _ _ _ -> do+ postInst = \ _ _ pack_des lbi -> do -- Update PageTypeRule. (PageTypeRule rule) <- readConfig pageTypeRulePath (PageTypeRule M.empty) writeConfig pageTypeRulePath (PageTypeRule (M.insert "PagePDF" "manatee-pdfviewer" rule))@@ -46,4 +47,13 @@ (PageModeRule modeRule) <- readConfig pageModeRulePath (PageModeRule M.empty) writeConfig pageModeRulePath (PageModeRule (M.insert "PagePDF" (Left $ pageModeName pdfMode) modeRule))+ -- Update Application info.+ let snapshotPath = getDataFilePath pack_des lbi "data/welcome/snapshot.png"+ rwhPdf = getDataFilePath pack_des lbi "data/welcome/LearnYouAHaskell.pdf"+ (WelcomeApplication apps) <- readConfig welcomeApplicationPath (WelcomeApplication M.empty)+ writeConfig welcomeApplicationPath (WelcomeApplication+ (M.insert + ("Pdf Viewer", snapshotPath)+ ("PagePDF", rwhPdf, [])+ apps)) }
+ data/welcome/LearnYouAHaskell.pdf view
binary file changed (absent → 1366517 bytes)
+ data/welcome/snapshot.png view
binary file changed (absent → 67606 bytes)
manatee-pdfviewer.cabal view
@@ -1,9 +1,9 @@ name: manatee-pdfviewer-version: 0.0.8+version: 0.1.0 Cabal-Version: >= 1.6 license: GPL-3 license-file: LICENSE-copyright: (c) 2009 ~ 2010 Andy Stewart+copyright: (c) 2010 ~ 2011 Andy Stewart synopsis: PDF viewer extension for Manatee. description: manatee-pdfviewer is PDF viewer extension for Manatee (Haskell/Gtk+ Integrated Live Environment) .@@ -15,7 +15,7 @@ . And replace Chinese font string in file `/etc/fonts/conf.d/49-sansserif.conf' .- Video at (Select 720p HD) at : <http://www.youtube.com/watch?v=weS6zys3U8k> <http://www.youtube.com/watch?v=A3DgKDVkyeM> <http://v.youku.com/v_show/id_XMjI2MDMzODI4.html>+ Video (Select 720p HD) at : <http://www.youtube.com/watch?v=weS6zys3U8k> <http://www.youtube.com/watch?v=A3DgKDVkyeM> <http://v.youku.com/v_show/id_XMjI2MDMzODI4.html> . Screenshots at : <http://goo.gl/MkVw> .@@ -30,16 +30,20 @@ stability: provisional category: Manatee, PDF Viewer, PDF -tested-with: GHC==6.12.3+tested-with: GHC==7.0.2 build-type: Custom +data-dir: ""+data-files: data/welcome/snapshot.png+ data/welcome/LearnYouAHaskell.pdf+ Source-Repository head type: darcs location: http://patch-tag.com/r/AndyStewart/manatee-pdfviewer Library- build-depends: base >= 4 && < 5, manatee-core >= 0.0.8, dbus-client >= 0.3 && < 0.4, stm >= 2.1.2.0,- containers >= 0.3.0.0, gtk-serialized-event >= 0.12.0, poppler >= 0.12.1, gtk >= 0.12.0,+ build-depends: base >= 4 && < 5, manatee-core >= 0.1.0, dbus-client >= 0.3 && < 0.4, stm >= 2.1.2.0,+ containers >= 0.3.0.0, poppler >= 0.12.1, gtk >= 0.12.0, derive, binary, cairo >= 0.12.0, text >= 0.7.1.0, mtl >= 1.1.0.2, utf8-string, filepath exposed-modules: Manatee.Extension.PdfViewer