Skip to content

Added simple branch select git client #312

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
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
275 changes: 275 additions & 0 deletions Menu/GameShell/10_Settings/BranchSelect/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,275 @@
import git

from libs.roundrects import aa_round_rect

from UI.constants import Width
from UI.page import Page, PageSelector
from UI.scroller import ListScroller
from UI.info_page_list_item import InfoPageListItem
from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB
from UI.skin_manager import MySkinManager
from UI.lang_manager import MyLangManager

class SelectPage(Page):
_MyList = []

def __init__(self):
Page.__init__(self)
self._Icons = {}

def Init(self):
self._ListFontObj = MyLangManager.TrFont("varela15")
self._ListSmFontObj = MySkinManager.GiveFont("varela12")
if self._Screen != None:
if self._Screen._CanvasHWND != None and self._CanvasHWND == None:
self._HWND = self._Screen._CanvasHWND
self._CanvasHWND = self._Screen._CanvasHWND

self._PosX = self._Index*self._Screen._Width
self._Width = self._Screen._Width ## equal to screen width
self._Height = self._Screen._Height

ps = GamePageSelector()
ps._Parent = self

self._Ps = ps
self._PsIndex = 0

self._Scroller = ListScroller()
self._Scroller._Parent = self
self._Scroller._PosX = 2
self._Scroller._PosY = 2
self._Scroller.Init()

def Generate(self, game, branches, current):
start_x = 0
start_y = 0
i = 0
self._Game = game

for branch in branches:
li = InfoPageListItem()
li._Parent = self
li._PosX = start_x
li._PosY = start_y + i*InfoPageListItem._Height

li._Width = Width
li._Fonts["normal"] = self._ListFontObj

li._Fonts["small"] = self._ListSmFontObj

li._LinkObj = branch

li.Init(branch)

if branch == current:
self._PsIndex = i

li._PosX = 2
self._MyList.append(li)

i = i + 1

def Draw(self):
self.ClearCanvas()
if len(self._MyList) * InfoPageListItem._Height > self._Height:
self._Ps._Width = self._Width - 10
self._Ps._PosX = 9
self._Ps.Draw()
for i in self._MyList:
i.Draw()

self._Scroller.UpdateSize(len(self._MyList)*InfoPageListItem._Height, self._PsIndex*InfoPageListItem._Height)
self._Scroller.Draw()

else:
self._Ps._Width = self._Width
self._Ps.Draw()
for i in self._MyList:
i.Draw()

def KeyDown(self, event):
if IsKeyMenuOrB(event.key):
self.ReturnToUpLevelPage()
self._Screen.Draw()
self._Screen.SwapAndShow()

if event.key == CurKeys["Up"]:
self.ScrollUp()
self._Screen.Draw()
self._Screen.SwapAndShow()
if event.key == CurKeys["Down"]:
self.ScrollDown()
self._Screen.Draw()
self._Screen.SwapAndShow()

if IsKeyStartOrA(event.key):
self.Click()

def Click(self):
if self._PsIndex >= len(self._MyList):
return

cur_li = self._MyList[self._PsIndex]
git.checkout_branch(self._Game, cur_li._LinkObj)


class GamePageSelector(PageSelector):
_BackgroundColor = MySkinManager.GiveColor('Front')

def __init__(self):
self._PosX = 0
self._PosY = 0
self._Height = 0

def AnimateDraw(self, x2, y2):
pass

def Draw(self):
idx = self._Parent._PsIndex
if idx < len( self._Parent._MyList):
x = self._PosX+2
y = self._Parent._MyList[idx]._PosY+1
h = self._Parent._MyList[idx]._Height -3

self._PosX = x
self._PosY = y
self._Height = h

aa_round_rect(self._Parent._CanvasHWND,
(x,y,self._Width-4,h),self._BackgroundColor,4,0,self._BackgroundColor)

class BranchSelectPage(Page):
_MyList = []

def __init__(self):
Page.__init__(self)
self._Icons = {}

def Init(self):
self._SubPage = SelectPage()
self._SubPage._Screen = self._Screen
self._SubPage._Name = "Select Branch"
self._SubPage.Init()

self._ListFontObj = MyLangManager.TrFont("varela15")
self._ListSmFontObj = MySkinManager.GiveFont("varela12")
if self._Screen != None:
if self._Screen._CanvasHWND != None and self._CanvasHWND == None:
self._HWND = self._Screen._CanvasHWND
self._CanvasHWND = self._Screen._CanvasHWND

self._PosX = self._Index*self._Screen._Width
self._Width = self._Screen._Width ## equal to screen width
self._Height = self._Screen._Height

ps = GamePageSelector()
ps._Parent = self

self._Ps = ps
self._PsIndex = 0

self._Scroller = ListScroller()
self._Scroller._Parent = self
self._Scroller._PosX = 2
self._Scroller._PosY = 2
self._Scroller.Init()

start_x = 0
start_y = 0
i = 0
games = git.get_games()
for game in games:
li = InfoPageListItem()
li._Parent = self
li._PosX = start_x
li._PosY = start_y + i*InfoPageListItem._Height

li._Width = Width
li._Fonts["normal"] = self._ListFontObj

li._Fonts["small"] = self._ListSmFontObj

li._LinkObj = game

li.Init( game.split("/")[-1] )

sm_text = str(len(git.get_branches(game)[0]))
li.SetSmallText(sm_text)

li._PosX = 2
self._MyList.append(li)

i = i + 1

def Draw(self):
self.ClearCanvas()
if len(self._MyList) * InfoPageListItem._Height > self._Height:
self._Ps._Width = self._Width - 10
self._Ps._PosX = 9
self._Ps.Draw()
for i in self._MyList:
i.Draw()

self._Scroller.UpdateSize(len(self._MyList)*InfoPageListItem._Height, self._PsIndex*InfoPageListItem._Height)
self._Scroller.Draw()

else:
self._Ps._Width = self._Width
self._Ps.Draw()
for i in self._MyList:
i.Draw()

def KeyDown(self, event):
if IsKeyMenuOrB(event.key):
self.ReturnToUpLevelPage()
self._Screen.Draw()
self._Screen.SwapAndShow()

if event.key == CurKeys["Up"]:
self.ScrollUp()
self._Screen.Draw()
self._Screen.SwapAndShow()
if event.key == CurKeys["Down"]:
self.ScrollDown()
self._Screen.Draw()
self._Screen.SwapAndShow()

if IsKeyStartOrA(event.key):
self.Click()

def Click(self):
if self._PsIndex >= len(self._MyList):
return

cur_li = self._MyList[self._PsIndex]
branches, current = git.get_branches(cur_li._LinkObj)

self._SubPage.Generate(cur_li._LinkObj, branches, current)
self._Screen.PushPage(self._SubPage)
self._Screen.Draw()
self._Screen.SwapAndShow()


class APIOBJ(object):

_Page = None
def __init__(self):
pass
def Init(self,main_screen):
self._Page = BranchSelectPage()
self._Page._Screen = main_screen
self._Page._Name ="Branch Select"
self._Page.Init()

def API(self,main_screen):
if main_screen !=None:
main_screen.PushPage(self._Page)
main_screen.Draw()
main_screen.SwapAndShow()

OBJ = APIOBJ()
def Init(main_screen):
OBJ.Init(main_screen)
def API(main_screen):
OBJ.API(main_screen)
26 changes: 26 additions & 0 deletions Menu/GameShell/10_Settings/BranchSelect/git.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import subprocess
import os

def get_branches(path):
branches = subprocess.check_output(["git", "branch"], cwd=path).decode("utf-8").split("\n")[0:-1]
current = ""
result = []
for branch in branches:
if branch[0] == "*":
current = branch
result.append(branch[2:])
return result, current

def checkout_branch(path, branch):
return subprocess.check_call(["git", "checkout", branch], cwd=path)

def get_games():
result = []
for filename in os.listdir("/home/cpi/games"):
filename = os.path.join("/home/cpi/games", filename)
if os.path.isdir(filename) and is_git(filename):
result.append(filename)
return result

def is_git(path):
return os.path.join(path, ".git")
4 changes: 3 additions & 1 deletion Menu/GameShell/10_Settings/list_page.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,9 @@ def Init(self):
["","Skins","Theme Manager"],
["","LauncherGo","Switch to LauncherGo"],
["","Lima","GPU Driver Switch"],
["","GateWay","Network gateway switch"]]
["","GateWay","Network gateway switch"],
["","BranchSelect","Git Branch Select"]
]

start_x = 0
start_y = 0
Expand Down