ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/ns_dev/Python/NinoCode/Active_prgs/Gromulus/Gromulus_UI.py
Revision: 806
Committed: Thu Dec 21 18:25:36 2023 UTC (2 years, 3 months ago) by nino.borges
Content type: text/x-python
File size: 12743 byte(s)
Log Message:
I'm tagging this as the final version of version 1. This version works, although it's limited, but it doesnt support zip files and archives in general.  I'm going to re-do the tables so that it better supports this.  This will then start the version 2.

File Contents

# User Rev Content
1 nino.borges 795 """
2     Created by Emanuel Borges
3     05.19.2023
4    
5     This is the main UI for Gromulus, which is a catalog inventory for roms, games and maybe one day applications.
6     Like most of my GUI programs, this will import a separate library with my methods for doing the actual work.
7    
8     """
9    
10    
11     import sys, os, wx
12     #import wx.lib.buttons as buttons
13     import Gromulus_Lib
14    
15    
16    
17     class MyFrame(wx.Frame):
18     def __init__(self, parent, ID, title, pos=wx.DefaultPosition):
19     wx.Frame.__init__(self, parent, ID, title, pos, size = (1450,525))
20     #db = Gromulus_Lib()
21     self.panel = wx.Panel(self,-1)
22     self.gamesListMatrix = Gromulus_Lib.GetGameListBySystem('snes')
23     gamesList = list(self.gamesListMatrix.keys())
24     gamesList.sort()
25 nino.borges 806 self.gamesCount = len(gamesList)
26     unmatchedGamesList=[i for i in gamesList if "." in i]
27     self.unmatchedGamesCount = len(unmatchedGamesList)
28     print(f"{self.gamesCount} total games for this system. {self.gamesCount - self.unmatchedGamesCount} matched and {self.unmatchedGamesCount} unmatched.")
29 nino.borges 795
30     self.CreateSystemButtonSection()
31     self.gameSelectionListBox = wx.ListBox(self.panel, 60, (100, 50), (490, 320), gamesList , wx.LB_SINGLE|wx.LB_OWNERDRAW)
32     self.CreateFieldsFirstRow()
33    
34    
35    
36     mainSizer = wx.BoxSizer(wx.HORIZONTAL)
37     mainSizer.Add(self.buttonSizer, 0, wx.ALIGN_TOP|wx.LEFT|wx.TOP,25)
38     mainSizer.Add(self.gameSelectionListBox, 0, wx.ALIGN_TOP|wx.LEFT|wx.TOP,25)
39     mainSizer.Add(self.fieldsFirstRowSizer, 0, wx.ALIGN_TOP|wx.LEFT|wx.TOP,25)
40     self.panel.SetSizer(mainSizer)
41    
42    
43     self.CreateStatusBar()
44     self.SetStatusText("Ready.")
45     self.CreateMenuBar()
46    
47     self.Bind(wx. EVT_TOGGLEBUTTON, self.OnSystemSelected, self.snesSystemButton)
48     self.Bind(wx. EVT_TOGGLEBUTTON, self.OnSystemSelected, self.nesSystemButton)
49     self.Bind(wx. EVT_TOGGLEBUTTON, self.OnSystemSelected, self.genesisSystemButton)
50     self.Bind(wx. EVT_TOGGLEBUTTON, self.OnSystemSelected, self.fz1SystemButton)
51     self.Bind(wx. EVT_TOGGLEBUTTON, self.OnSystemSelected, self.ps1SystemButton)
52    
53     self.Bind(wx.EVT_LISTBOX, self.OnGameSelected, self.gameSelectionListBox)
54    
55    
56     def CreateSystemButtonSection(self):
57     #systemsList = ['SNES','NES','Genisys']
58     #for system in systemsList:
59     #self.snesSystemButton = buttons.GenToggleButton(self.panel, -1, "SNES")
60     #self.nesSystemButton = buttons.GenToggleButton(self.panel, -1, "NES")
61     #self.genesisSystemButton = buttons.GenToggleButton(self.panel, -1, "Genesis")
62     #self.ps1SystemButton = buttons.GenToggleButton(self.panel, -1, "Playstation")
63    
64     ## Create a dictionary that holds the button instances by label text, so that you can toggle the other ones off in the bind event.
65     self.systemButtonDict = {}
66     self.snesSystemButton = wx.ToggleButton(self.panel, -1, "SNES")
67     self.systemButtonDict[self.snesSystemButton.GetLabelText()] = self.snesSystemButton
68    
69     self.nesSystemButton = wx.ToggleButton(self.panel, -1, "NES")
70     self.systemButtonDict[self.nesSystemButton.GetLabelText()] = self.nesSystemButton
71    
72     self.genesisSystemButton = wx.ToggleButton(self.panel, -1, "Genesis")
73     self.systemButtonDict[self.genesisSystemButton.GetLabelText()] = self.genesisSystemButton
74    
75     self.fz1SystemButton = wx.ToggleButton(self.panel, -1, "3DO")
76     self.systemButtonDict[self.fz1SystemButton.GetLabelText()] = self.fz1SystemButton
77    
78     self.ps1SystemButton = wx.ToggleButton(self.panel, -1, "Playstation")
79     self.systemButtonDict[self.ps1SystemButton.GetLabelText()] = self.ps1SystemButton
80    
81    
82     self.buttonSizer = wx.BoxSizer(wx.VERTICAL)
83     self.buttonSizer.Add(self.snesSystemButton, 0, wx.ALL,10)
84     self.buttonSizer.Add(self.nesSystemButton,0,wx.ALL,10)
85     self.buttonSizer.Add(self.genesisSystemButton,0,wx.ALL,10)
86     self.buttonSizer.Add(self.fz1SystemButton,0,wx.ALL,10)
87     self.buttonSizer.Add(self.ps1SystemButton,0,wx.ALL,10)
88    
89     def CreateFieldsFirstRow(self):
90     self.gameNameStaticText = wx.StaticText(self.panel, -1, "Game Name:")
91     self.gameNameTextCtrl = wx.TextCtrl(self.panel, -1, size=(325, -1))
92    
93     self.gameHashStaticText = wx.StaticText(self.panel, -1, "Game Hash:")
94     self.gameHashTextCtrl = wx.TextCtrl(self.panel, -1, size=(325, -1))
95    
96     self.gameFileNameStaticText = wx.StaticText(self.panel, -1, "Game File Name:")
97     self.gameFileNameTextCtrl = wx.TextCtrl(self.panel, -1, size=(325, -1))
98    
99     self.gameFilePathStaticText = wx.StaticText(self.panel, -1, "Game File Path:")
100     self.gameFilePathTextCtrl = wx.TextCtrl(self.panel, -1, size=(425, -1))
101    
102     self.noIntroGameNameStaticText = wx.StaticText(self.panel, -1, "No Intro Game Name:")
103     self.noIntroGameNameTextCtrl = wx.TextCtrl(self.panel, -1, size=(325, -1))
104    
105     self.noIntroSystemNameStaticText = wx.StaticText(self.panel, -1, "No Intro System:")
106     self.noIntroSystemNameTextCtrl = wx.TextCtrl(self.panel, -1, size=(380, -1))
107    
108     self.gameNameSizer = wx.BoxSizer(wx.HORIZONTAL)
109     self.gameNameSizer.Add(self.gameNameStaticText,0,wx.ALL, 10)
110     self.gameNameSizer.Add(self.gameNameTextCtrl,0,wx.ALL, 10)
111    
112     self.gameHashSizer = wx.BoxSizer(wx.HORIZONTAL)
113     self.gameHashSizer.Add(self.gameHashStaticText,0,wx.ALL, 10)
114     self.gameHashSizer.Add(self.gameHashTextCtrl,0,wx.ALL, 10)
115    
116     self.gameFileNameSizer = wx.BoxSizer(wx.HORIZONTAL)
117     self.gameFileNameSizer.Add(self.gameFileNameStaticText,0,wx.ALL, 10)
118     self.gameFileNameSizer.Add(self.gameFileNameTextCtrl,0,wx.ALL, 10)
119    
120     self.gameFilePathSizer = wx.BoxSizer(wx.HORIZONTAL)
121     self.gameFilePathSizer.Add(self.gameFilePathStaticText,0,wx.ALL, 10)
122     self.gameFilePathSizer.Add(self.gameFilePathTextCtrl,0,wx.ALL, 10)
123    
124     self.noIntroGameNameSizer = wx.BoxSizer(wx.HORIZONTAL)
125     self.noIntroGameNameSizer.Add(self.noIntroGameNameStaticText,0,wx.ALL, 10)
126     self.noIntroGameNameSizer.Add(self.noIntroGameNameTextCtrl,0,wx.ALL, 10)
127    
128     self.noIntroSystemNameSizer = wx.BoxSizer(wx.HORIZONTAL)
129     self.noIntroSystemNameSizer.Add(self.noIntroSystemNameStaticText,0,wx.ALL, 10)
130     self.noIntroSystemNameSizer.Add(self.noIntroSystemNameTextCtrl,0,wx.ALL, 10)
131    
132     self.fieldsFirstRowSizer = wx.BoxSizer(wx.VERTICAL)
133     self.fieldsFirstRowSizer.Add(self.gameNameSizer,0,wx.ALL, 10)
134     self.fieldsFirstRowSizer.Add(self.gameHashSizer,0,wx.ALL, 10)
135     self.fieldsFirstRowSizer.Add(self.gameFileNameSizer,0,wx.ALL, 10)
136     self.fieldsFirstRowSizer.Add(self.gameFilePathSizer,0,wx.ALL, 10)
137     self.fieldsFirstRowSizer.Add(self.noIntroGameNameSizer,0,wx.ALL, 10)
138     self.fieldsFirstRowSizer.Add(self.noIntroSystemNameSizer,0,wx.ALL, 10)
139    
140    
141     def MenuData(self):
142     return(("&Tools",
143 nino.borges 805 ("&Add Roms","Adds new Roms to a selected system.", self.OnAddNewRoms),
144     ("Import &NoIntro DAT", "Allows for the import of any of the No Intro DAT files.", self.OnImportNewNoIntroDat),
145 nino.borges 806 ("Import &TOSEC DAT", "Allows for the import of any of the TOSEC DAT files.", self.OnImportNewTosecDat)),
146 nino.borges 795 ("&Reports",
147     ("&Duplicates Report","Generates a report detailing duplicates that exist in your collection.", self.NothingYet)),
148     ("&Help",
149     ("&About", "Displays the About Window", self.NothingYet)))
150    
151     def CreateMenuBar(self):
152     menuBar = wx.MenuBar()
153     for eachMenuData in self.MenuData():
154     menuLabel = eachMenuData[0]
155     menuItems = eachMenuData[1:]
156     menuBar.Append(self.CreateMenu(menuItems), menuLabel)
157     self.SetMenuBar(menuBar)
158    
159     def CreateMenu(self, menuData):
160     menu = wx.Menu()
161     for eachLabel, eachStatus, eachHandler in menuData:
162     if not eachLabel:
163     menu.AppendSeparator()
164     continue
165     menuItem = menu.Append(-1, eachLabel, eachStatus)
166     self.Bind(wx.EVT_MENU, eachHandler, menuItem)
167     return menu
168    
169     def OnSystemSelected(self, evt):
170     systemsButtonNamesList = list(self.systemButtonDict.keys())
171     #print(list(self.systemButtonDict.keys()))
172     systemsButtonNamesList.remove(evt.GetEventObject().GetLabelText())
173     #print(evt.GetEventObject().GetLabelText())
174     for i in systemsButtonNamesList:
175     self.systemButtonDict[i].SetValue(False)
176    
177     self.gamesListMatrix = Gromulus_Lib.GetGameListBySystem('snes')
178     gamesList = list(self.gamesListMatrix.keys())
179     gamesList.sort()
180    
181     self.gameSelectionListBox.Clear()
182     self.gameSelectionListBox.AppendItems(gamesList)
183    
184    
185     def OnGameSelected(self, evt):
186     print(self.gameSelectionListBox.GetStringSelection())
187     gameTuple = Gromulus_Lib.GetSingleGameById(self.gamesListMatrix[self.gameSelectionListBox.GetStringSelection()])
188    
189     if gameTuple[0]:
190     self.gameNameTextCtrl.SetValue(gameTuple[0])
191     else:
192     self.gameNameTextCtrl.SetValue("")
193     if gameTuple[1]:
194     self.gameHashTextCtrl.SetValue(gameTuple[1])
195     else:
196     self.gameHashTextCtrl.SetValue("")
197     if gameTuple[2]:
198     self.gameFileNameTextCtrl.SetValue(gameTuple[2])
199     else:
200     self.gameFileNameTextCtrl.SetValue("")
201     if gameTuple[3]:
202     self.gameFilePathTextCtrl.SetValue(gameTuple[3])
203     else:
204     self.gameFilePathTextCtrl.SetValue("")
205     if gameTuple[4]:
206     self.noIntroGameNameTextCtrl.SetValue(gameTuple[4])
207     else:
208     self.noIntroGameNameTextCtrl.SetValue("")
209     if gameTuple[5]:
210     self.noIntroSystemNameTextCtrl.SetValue(gameTuple[5])
211     else:
212     self.noIntroSystemNameTextCtrl.SetValue("")
213    
214     def NothingYet(self, event):
215     diag = wx.MessageDialog(self, "Nothing here yet!", "Disabled...", wx.OK | wx.ICON_INFORMATION)
216     diag.ShowModal()
217     diag.Destroy()
218    
219 nino.borges 805 def OnImportNewNoIntroDat(self,event):
220     dlg = wx.FileDialog(
221     self, message="Import New NoIntro DAT ...", defaultDir=os.getcwd(),
222     defaultFile="", wildcard="DAT files (*.dat)|*.dat", style=wx.FD_OPEN | wx.FD_CHANGE_DIR
223     )
224     if dlg.ShowModal() == wx.ID_OK:
225     datPath = dlg.GetPath()
226     Gromulus_Lib.ImportNewNoIntroDat(datPath)
227     doneDiag = wx.MessageDialog(self, "NoIntro DAT imported","All Done!",wx.OK | wx.ICON_INFORMATION)
228     doneDiag.ShowModal()
229     doneDiag.Destroy()
230 nino.borges 795
231 nino.borges 806 def OnImportNewTosecDat(self,event):
232     dlg = wx.FileDialog(
233     self, message="Import New Tosec DAT ...", defaultDir=os.getcwd(),
234     defaultFile="", wildcard="DAT files (*.dat)|*.dat", style=wx.FD_OPEN | wx.FD_CHANGE_DIR
235     )
236     if dlg.ShowModal() == wx.ID_OK:
237     datPath = dlg.GetPath()
238     Gromulus_Lib.ImportNewTosecDat(datPath, '49')
239     doneDiag = wx.MessageDialog(self, "Tosec DAT imported","All Done!",wx.OK | wx.ICON_INFORMATION)
240     doneDiag.ShowModal()
241     doneDiag.Destroy()
242    
243    
244 nino.borges 805 def OnAddNewRoms(self,event):
245     systemMatrix = Gromulus_Lib.GetSystemList()
246     systemsList = list(systemMatrix.keys())
247     dlg = wx.SingleChoiceDialog(self,
248     "Select system for new ROMs",
249     "List of systemss", systemsList)
250     if (dlg.ShowModal() == wx.ID_OK):
251     dlg2 = wx.DirDialog(self, "Choose a directory:",
252     style=wx.DD_DEFAULT_STYLE)
253     if (dlg2.ShowModal() == wx.ID_OK):
254     romsToImportPath = dlg2.GetPath()
255     systemID = systemMatrix[dlg.GetStringSelection()][0]
256 nino.borges 806 importedCount, alreadyExistsCount, errImportCount = Gromulus_Lib.AddNewRoms(romsToImportPath, systemID)#, testOnly=True)
257 nino.borges 805 #print(systemMatrix[dlg.GetStringSelection()])
258     #print(dlg2.GetPath())
259     doneDiag = wx.MessageDialog(self, f"{str(importedCount)} files imported.\n{str(alreadyExistsCount)} files not imported because you already have them.\n{str(errImportCount)} files imported because of errors.", "Rom import process complete",wx.OK | wx.ICON_INFORMATION)
260     doneDiag.ShowModal()
261     doneDiag.Destroy()
262    
263    
264    
265 nino.borges 795 class MyApp(wx.App):
266     def OnInit(self):
267 nino.borges 805 self.frame = MyFrame(None, -1, "Gromulus v1.1")
268 nino.borges 795 self.frame.Show(True)
269     self.SetTopWindow(self.frame)
270     return True
271    
272    
273     if __name__ == '__main__':
274     app = MyApp(0)
275     app.MainLoop()