Ver código fonte

feat: hide tabs by group

Jocelyn Boullier 4 anos atrás
pai
commit
7eb9c9b055

+ 21 - 2
src/Background.purs

@@ -25,6 +25,7 @@ import Data.Lens (_Just, set, view)
 import Data.Lens.At (at)
 import Data.List (List, foldMap)
 import Data.Map as M
+import Data.Set as Set
 import Data.Maybe (Maybe(..), maybe)
 import Data.Monoid ((<>))
 import Data.Show (show)
@@ -36,7 +37,7 @@ import Effect.Console (log)
 import Effect.Ref as Ref
 import Prelude (Unit, bind, ($), discard, (<<<))
 import PureTabs.Model.Events (BackgroundEvent(..), SidebarEvent(..))
-import PureTabs.Model.GlobalState as GS 
+import PureTabs.Model.GlobalState as GS
 
 type Ports
   = Ref.Ref (List Runtime.Port)
@@ -173,9 +174,13 @@ onNewWindowId port stateRef listenerRef winId = do
 -- the data required
 manageSidebar :: StateRef -> WindowId -> Runtime.Port -> SidebarEvent -> Effect Unit
 manageSidebar ref winId port = case _ of
+
   SbDeleteTab tabId -> launchAff_ $ BT.browserRemoveOne tabId
+
   SbActivateTab tabId -> launchAff_ $ BT.browserActivateTab tabId
+
   SbMoveTab tabId newIndex -> BT.browserMoveTab tabId { index: newIndex }
+
   SbCreateTab tid' -> case tid' of
     Nothing -> BT.browserCreateTab { windowId: winId }
     Just tid ->
@@ -183,7 +188,21 @@ manageSidebar ref winId port = case _ of
         >>= \positions -> case A.elemIndex tid positions of
             Nothing -> BT.browserCreateTab { windowId: winId }
             Just idx -> BT.browserCreateTab { windowId: winId, index: idx + 1 }
-  _ -> pure unit
+
+  SbSelectedGroup tabIds -> do
+     state <- Ref.read ref
+     let 
+         allTabIds = M.keys $ view ((GS._windowIdToWindow winId) <<< GS._tabs) state
+         tabIdsToHide = A.fromFoldable $ Set.difference allTabIds (Set.fromFoldable tabIds)
+     BT.browserHideTabs tabIdsToHide
+     BT.browserShowTabs tabIds
+
+  SbDetacheTab -> pure unit
+  SbCreatedGroup -> pure unit
+  SbDeleteGroup -> pure unit
+  SbRenameGroup -> pure unit
+  SbHasWindowId winId' -> pure unit
+
 
 onDisconnect :: forall a. StateRef -> WindowId -> Listener a -> Effect Unit
 onDisconnect stateRef winId listener = Ref.modify_ (set (GS._windows <<< (at winId) <<< _Just <<< GS._port) Nothing) stateRef

+ 12 - 0
src/Browser/Tabs.js

@@ -35,3 +35,15 @@ exports["browserCreateTab"] = function (union) {
     };
   };
 };
+
+exports["browserHideTabs"] = function (tabIds) {
+  return function () {
+    return browser.tabs.hide(tabIds);
+  }
+}
+
+exports["browserShowTabs"] = function (tabIds) {
+  return function () {
+    return browser.tabs.show(tabIds);
+  }
+}

+ 6 - 0
src/Browser/Tabs.purs

@@ -11,6 +11,8 @@ module Browser.Tabs (
   , browserActivateTab
   , browserMoveTab
   , browserCreateTab
+  , browserHideTabs
+  , browserShowTabs
   , showTabId
   ) where
 
@@ -187,3 +189,7 @@ type CreateProperties = (
 )
 
 foreign import browserCreateTab :: forall props trash. Union props trash CreateProperties => { | props } -> Effect Unit
+
+foreign import browserHideTabs :: Array TabId -> Effect Unit
+
+foreign import browserShowTabs :: Array TabId -> Effect Unit

+ 1 - 0
src/Model/Events.purs

@@ -39,6 +39,7 @@ data SidebarEvent
   | SbDeleteGroup
   | SbRenameGroup
   | SbHasWindowId WindowId
+  | SbSelectedGroup (Array TabId)
 
 derive instance genSidebarEvent :: Generic SidebarEvent _
 

+ 25 - 8
src/Sidebar/Components/Bar.purs

@@ -2,7 +2,7 @@ module PureTabs.Sidebar.Bar where
 
 import Browser.Tabs (Tab(..), TabId)
 import Control.Alternative (pure)
-import Control.Bind (bind, discard, map, void, (*>), (<#>))
+import Control.Bind (bind, discard, map, void, (<#>))
 import Data.Array ((:))
 import Data.Array as A
 import Data.Function (($))
@@ -126,13 +126,20 @@ component =
   handleAction = 
     case _ of
 
-         UserSelectedGroup gid -> H.modify_ _ { currentGroup = gid }
+         UserSelectedGroup gid -> do
+            H.modify_ _ { currentGroup = gid }
 
          UserRenameGroup gid newName -> 
             H.modify_ \s -> s { groups = M.update (\g -> Just $ g { name = newName }) gid s.groups }
 
          UserCreatedGroup -> do
-           H.modify_ \s -> s { groups = M.insert (findNextGroupId $ M.keys s.groups) { name: "new group", pos: M.size s.groups } s.groups }
+           H.modify_ \s -> 
+             s { groups = 
+               M.insert 
+                 (findNextGroupId $ M.keys s.groups) 
+                 { name: "new group", pos: M.size s.groups } 
+                 s.groups 
+               }
 
          UserDeletedGroup gid -> pure unit
 
@@ -169,7 +176,7 @@ component =
             let GroupId(maxValue) = NES.max (NES.cons (GroupId 0) values)
              in GroupId(maxValue + 1)
 
-  handleQuery :: forall act o a. Tabs.Query a -> H.HalogenM State act Slots o m (Maybe a)
+  handleQuery :: forall act a. Tabs.Query a -> H.HalogenM State act Slots SidebarEvent m (Maybe a)
   handleQuery = case _ of
 
     Tabs.InitialTabList tabs a -> do
@@ -227,7 +234,8 @@ component =
                 void $ tellChild gid $ Tabs.TabActivated mPrevTid tid
             Nothing -> pure unit
        doOnTabGroup tid \gid -> do 
-         H.modify_ (_ { currentGroup = gid})
+         { tabsToGroup } <- H.modify (_ { currentGroup = gid})
+         H.raise $ SbSelectedGroup $ getTabIdsOfGroup gid tabsToGroup
          void $ tellChild gid $ Tabs.TabActivated prevTid' tid
        pure (Just a)
 
@@ -257,13 +265,13 @@ component =
        handleQuery $ Tabs.TabCreated tab a
 
     where
-        tellChild :: GroupId -> (H.Tell Tabs.Query) -> H.HalogenM State act Slots o m (Maybe Unit)
+        tellChild :: GroupId -> (H.Tell Tabs.Query) -> H.HalogenM State act Slots SidebarEvent m (Maybe Unit)
         tellChild gid q = H.query _tab gid $ H.tell q
 
         doOnTabGroup 
           :: TabId 
-          -> (GroupId -> H.HalogenM State act Slots o m Unit) 
-          -> H.HalogenM State act Slots o m Unit
+          -> (GroupId -> H.HalogenM State act Slots SidebarEvent m Unit) 
+          -> H.HalogenM State act Slots SidebarEvent m Unit
         doOnTabGroup tabId f = do
           { tabsToGroup } <- H.get
           case M.lookup tabId tabsToGroup of 
@@ -287,3 +295,12 @@ getPositionTab
   -> Array (Tuple TabId GroupId)
   -> Maybe Int
 getPositionTab tid gid arr = A.findIndex (\(Tuple tid' gid') -> tid' == tid && gid' == gid) arr
+
+getTabIdsOfGroup 
+  :: GroupId
+  -> M.Map TabId GroupId
+  -> Array TabId
+getTabIdsOfGroup gid =
+  M.toUnfoldable 
+  >>> A.filter (\(Tuple tid gid') -> gid' == gid)
+  >>> map T.fst