Skip to content

Commit 9b35002

Browse files
Collection Management is here!
1 parent b3d88fa commit 9b35002

15 files changed

+689
-112
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ A one-stop pak for all your game management needs.
2626
# Features
2727

2828
- [x] Renaming ROMs
29-
- [x] Renames Art & Game Tracker Name Automagically
29+
- [x] Renames Art, Save File & Game Tracker Name Automagically
30+
- [x] Collection Management (Create, Rename, Delete + Add & Remove Games)
3031
- [x] Download Box Art (from Libretro Thumbnails Project)
3132
- [x] Delete Box Art
3233
- [x] Clear Game Tracker Entry
@@ -38,7 +39,6 @@ A one-stop pak for all your game management needs.
3839

3940
# Future Features
4041

41-
- [ ] Collection Management
4242
- [ ] Save File Management
4343
- [ ] Save State Management
4444

game_manager.go

Lines changed: 145 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package main
22

33
import (
4+
"fmt"
45
"github.com/UncleJunVIP/nextui-pak-shared-functions/common"
56
shared "github.com/UncleJunVIP/nextui-pak-shared-functions/models"
7+
commonUI "github.com/UncleJunVIP/nextui-pak-shared-functions/ui"
68
"go.uber.org/zap"
79
"nextui-game-manager/models"
810
"nextui-game-manager/state"
@@ -28,6 +30,14 @@ func init() {
2830
logger.Debug("Config Loaded",
2931
zap.Object("config", config))
3032

33+
if _, err := os.Stat(common.CollectionDirectory); os.IsNotExist(err) {
34+
err := os.MkdirAll(common.CollectionDirectory, 0755)
35+
if err != nil {
36+
ui.ShowMessage("Unable to create collection directory! Quitting!", "3")
37+
logger.Fatal("Unable to create collection directory", zap.Error(err))
38+
}
39+
}
40+
3141
state.SetConfig(config)
3242
}
3343

@@ -51,7 +61,7 @@ func main() {
5161
case models.ScreenNames.MainMenu:
5262
switch code {
5363
case 0:
54-
if res.Value() == "Collections" {
64+
if res.(shared.RomDirectory).DisplayName == "Collections" {
5565
screen = ui.InitCollectionList("")
5666
continue
5767
}
@@ -64,18 +74,88 @@ func main() {
6474
}
6575

6676
case models.ScreenNames.CollectionsList:
77+
collection := res.(models.Collection)
6778
switch code {
6879
case 0:
69-
// screen = ui.InitCollectionManagement()
80+
screen = ui.InitCollectionManagement(collection, screen.(ui.CollectionListScreen).SearchFilter)
7081
case 4:
71-
// screen = ui.InitCollectionOptions()
82+
// TODO add search box
7283
case 1, 2:
7384
screen = ui.InitMainMenu()
7485
}
7586

87+
case models.ScreenNames.CollectionManagement:
88+
collection := screen.(ui.CollectionManagementScreen).Collection
89+
switch code {
90+
case 0:
91+
updatedCollection, err := utils.RemoveCollectionGame(collection, res.(shared.Item).DisplayName)
92+
if err != nil {
93+
ui.ShowMessage("Unable to remove game from collection!", "3")
94+
screen = ui.InitCollectionManagement(collection, screen.(ui.CollectionManagementScreen).SearchFilter)
95+
} else {
96+
screen = ui.InitCollectionManagement(updatedCollection, screen.(ui.CollectionManagementScreen).SearchFilter)
97+
}
98+
case 4:
99+
screen = ui.InitCollectionOptions(collection, screen.(ui.CollectionManagementScreen).SearchFilter)
100+
case 404:
101+
ui.ShowMessage("No games found in collection", "3")
102+
screen = ui.InitCollectionList(screen.(ui.CollectionManagementScreen).SearchFilter)
103+
default:
104+
screen = ui.InitCollectionList(screen.(ui.CollectionManagementScreen).SearchFilter)
105+
}
106+
76107
case models.ScreenNames.CollectionOptions:
108+
collectionOptions := screen.(ui.CollectionOptionsScreen)
109+
switch code {
110+
case 0:
111+
action := models.ActionMap[res.(shared.ListSelection).SelectedValue]
77112

78-
case models.ScreenNames.CollectionManagement:
113+
switch action {
114+
case models.Actions.CollectionRename:
115+
screen = ui.InitRenameCollectionScreen(collectionOptions.Collection)
116+
case models.Actions.CollectionDelete:
117+
message := fmt.Sprintf("Delete %s?", collectionOptions.Collection.DisplayName)
118+
119+
code, err := commonUI.ShowMessageWithOptions(message, "0",
120+
"--confirm-text", "DO IT!",
121+
"--confirm-show", "true",
122+
"--confirm-button", "X",
123+
"--cancel-show", "true",
124+
"--cancel-text", "CHANGED MY MIND",
125+
)
126+
127+
if err != nil {
128+
logger := common.GetLoggerInstance()
129+
logger.Info("Oh no", zap.Error(err))
130+
}
131+
132+
switch code {
133+
case 0:
134+
utils.DeleteCollection(collectionOptions.Collection)
135+
screen = ui.InitCollectionList(collectionOptions.SearchFilter)
136+
default:
137+
screen = ui.InitCollectionOptions(collectionOptions.Collection, collectionOptions.SearchFilter)
138+
}
139+
}
140+
case 2:
141+
screen = ui.InitCollectionManagement(collectionOptions.Collection, collectionOptions.SearchFilter)
142+
}
143+
144+
case models.ScreenNames.CollectionRename:
145+
rcs := screen.(ui.RenameCollectionScreen)
146+
newName := res.(models.WrappedString).Contents
147+
var err error
148+
switch code {
149+
case 0:
150+
err = utils.RenameCollection(rcs.Collection, newName)
151+
if err != nil {
152+
ui.ShowMessage("Unable to rename ROM!", "3")
153+
} else {
154+
rcs.Collection.DisplayName = newName
155+
}
156+
}
157+
158+
screen = ui.InitCollectionManagement(rcs.Collection, "")
79159

80160
case models.ScreenNames.GamesList:
81161
switch code {
@@ -125,30 +205,70 @@ func main() {
125205
screen = ui.InitGamesList(screen.(ui.Search).RomDirectory, searchFilter)
126206

127207
case models.ScreenNames.Actions:
208+
as := screen.(ui.ActionsScreen)
128209
switch code {
129210
case 0:
130211
switch models.ActionMap[res.(shared.ListSelection).SelectedValue] {
131212
case models.Actions.DownloadArt:
132-
screen = ui.InitDownloadArtScreen(screen.(ui.ActionsScreen).Game,
133-
screen.(ui.ActionsScreen).RomDirectory,
134-
screen.(ui.ActionsScreen).PreviousRomDirectory,
135-
screen.(ui.ActionsScreen).SearchFilter,
213+
screen = ui.InitDownloadArtScreen(as.Game,
214+
as.RomDirectory,
215+
as.PreviousRomDirectory,
216+
as.SearchFilter,
136217
state.GetAppState().Config.ArtDownloadType)
137218
case models.Actions.RenameRom:
138-
screen = ui.InitRenameRomScreen(screen.(ui.ActionsScreen).Game,
139-
screen.(ui.ActionsScreen).RomDirectory,
140-
screen.(ui.ActionsScreen).PreviousRomDirectory,
141-
screen.(ui.ActionsScreen).SearchFilter)
219+
screen = ui.InitRenameRomScreen(as.Game,
220+
as.RomDirectory,
221+
as.PreviousRomDirectory,
222+
as.SearchFilter)
223+
case models.Actions.CollectionAdd:
224+
screen = ui.InitAddToCollectionScreen(as.Game,
225+
as.RomDirectory,
226+
as.PreviousRomDirectory,
227+
as.SearchFilter)
142228
default:
143-
screen = ui.InitConfirmScreen(screen.(ui.ActionsScreen).Game,
144-
screen.(ui.ActionsScreen).RomDirectory,
145-
screen.(ui.ActionsScreen).PreviousRomDirectory,
146-
screen.(ui.ActionsScreen).SearchFilter,
229+
screen = ui.InitConfirmScreen(as.Game,
230+
as.RomDirectory,
231+
as.PreviousRomDirectory,
232+
as.SearchFilter,
147233
models.ActionMap[res.(shared.ListSelection).SelectedValue])
148234
}
149235
default:
150-
screen = ui.InitGamesList(screen.(ui.ActionsScreen).RomDirectory,
151-
screen.(ui.ActionsScreen).SearchFilter)
236+
screen = ui.InitGamesList(as.RomDirectory,
237+
as.SearchFilter)
238+
}
239+
240+
case models.ScreenNames.AddToCollection:
241+
atc := screen.(ui.AddToCollectionScreen)
242+
switch code {
243+
case 0:
244+
_, err := utils.AddCollectionGame(res.(models.Collection), atc.Game)
245+
if err != nil {
246+
ui.ShowMessage("Unable to add game to collection!", "2")
247+
} else {
248+
ui.ShowMessage("Added to collection!", "2")
249+
continue
250+
}
251+
case 4:
252+
screen = ui.InitCreateCollectionScreen(atc.Game, atc.RomDirectory, atc.PreviousRomDirectory, atc.SearchFilter)
253+
continue
254+
case 404:
255+
screen = ui.InitCreateCollectionScreen(atc.Game, atc.RomDirectory, atc.PreviousRomDirectory, atc.SearchFilter)
256+
continue
257+
}
258+
259+
screen = ui.InitActionsScreenWithPreviousDirectory(atc.Game,
260+
atc.RomDirectory,
261+
atc.PreviousRomDirectory,
262+
atc.SearchFilter)
263+
264+
case models.ScreenNames.CollectionCreate:
265+
cc := screen.(ui.CreateCollectionScreen)
266+
switch code {
267+
case 0:
268+
ui.ShowMessage("Created collection & added game!", "2")
269+
screen = ui.InitAddToCollectionScreen(cc.Game, cc.RomDirectory, cc.PreviousRomDirectory, cc.SearchFilter)
270+
case 2:
271+
screen = ui.InitActionsScreenWithPreviousDirectory(cc.Game, cc.RomDirectory, cc.PreviousRomDirectory, cc.SearchFilter)
152272
}
153273

154274
case models.ScreenNames.RenameRom:
@@ -161,13 +281,15 @@ func main() {
161281
newFilename, err = utils.RenameRom(rrs.Game.Filename, newName, rrs.RomDirectory)
162282
if err != nil {
163283
ui.ShowMessage("Unable to rename ROM!", "3")
164-
screen = ui.InitActionsScreenWithPreviousDirectory(rrs.Game, rrs.RomDirectory,
165-
rrs.PreviousRomDirectory, rrs.SearchFilter)
284+
} else {
285+
screen = ui.InitActionsScreenWithPreviousDirectory(shared.Item{DisplayName: newName, Filename: newFilename},
286+
rrs.RomDirectory, rrs.PreviousRomDirectory, rrs.SearchFilter)
166287
continue
167288
}
168289
}
169-
screen = ui.InitActionsScreenWithPreviousDirectory(shared.Item{DisplayName: newName, Filename: newFilename},
170-
rrs.RomDirectory, rrs.PreviousRomDirectory, rrs.SearchFilter)
290+
291+
screen = ui.InitActionsScreenWithPreviousDirectory(rrs.Game, rrs.RomDirectory,
292+
rrs.PreviousRomDirectory, rrs.SearchFilter)
171293

172294
case models.ScreenNames.DownloadArt:
173295
switch code {
@@ -188,7 +310,7 @@ func main() {
188310
screen = ui.InitActionsScreen(confirmScreen.Game, confirmScreen.RomDirectory,
189311
confirmScreen.SearchFilter)
190312
case models.Actions.ClearGameTracker:
191-
utils.ClearGameTracker(confirmScreen.Game.DisplayName, confirmScreen.RomDirectory)
313+
utils.ClearGameTracker(confirmScreen.Game.Filename, confirmScreen.RomDirectory)
192314
screen = ui.InitActionsScreen(confirmScreen.Game, confirmScreen.RomDirectory,
193315
confirmScreen.SearchFilter)
194316
case models.Actions.ClearSaveStates:

go.mod

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,8 @@ module nextui-game-manager
22

33
go 1.24
44

5-
replace github.com/UncleJunVIP/nextui-pak-shared-functions => ../nextui-pak-shared-functions // TODO remove this before committing!
6-
75
require (
8-
github.com/UncleJunVIP/nextui-pak-shared-functions v1.2.1
6+
github.com/UncleJunVIP/nextui-pak-shared-functions v1.3.0
97
github.com/disintegration/imaging v1.6.2
108
github.com/mattn/go-sqlite3 v1.14.28
119
go.uber.org/atomic v1.11.0

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ github.com/PuerkitoBio/goquery v1.10.3 h1:pFYcNSqHxBD06Fpj/KsbStFRsgRATgnf3LeXiU
22
github.com/PuerkitoBio/goquery v1.10.3/go.mod h1:tMUX0zDMHXYlAQk6p35XxQMqMweEKB7iK7iLNd4RH4Y=
33
github.com/UncleJunVIP/certifiable v1.0.0 h1:g8SMZrGW74qLvli9j0CYO5BvpVcGhqxfvAUnTeSjyfc=
44
github.com/UncleJunVIP/certifiable v1.0.0/go.mod h1:paPhCSE8DKzYvBcFcr5NVAYJmmvADq8e5fvkvs95np4=
5-
github.com/UncleJunVIP/nextui-pak-shared-functions v1.2.0 h1:uSMXscHgBskbghI6dDsU6OY3iLd1QxtedcrU30Kcsm8=
6-
github.com/UncleJunVIP/nextui-pak-shared-functions v1.2.0/go.mod h1:YEvuabyjM99f6fX2MnzTIgfHljjy0iqy5Tvm8NFvvcc=
5+
github.com/UncleJunVIP/nextui-pak-shared-functions v1.3.0 h1:Ow8F+4AbcdlVHuHwVl68oalKG51GMITCDX2/SsN2IQg=
6+
github.com/UncleJunVIP/nextui-pak-shared-functions v1.3.0/go.mod h1:YEvuabyjM99f6fX2MnzTIgfHljjy0iqy5Tvm8NFvvcc=
77
github.com/activcoding/HTML-Table-to-JSON v0.0.4 h1:6xQvdHFFMHHW8ubDS+xUW/USUx25kZtC6nfVnY8tZQU=
88
github.com/activcoding/HTML-Table-to-JSON v0.0.4/go.mod h1:xStjYiUrfnpo8937cHqbWh4hHGMSpT0sZ+qjvbCTLA0=
99
github.com/andybalholm/cascadia v1.3.3 h1:AG2YHrzJIm4BZ19iwJ/DAua6Btl3IwJX+VI4kktS1LM=

models/actions.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ type Action struct {
1515
Nuke,
1616

1717
CollectionRename,
18-
CollectionDelete sum.Int[Action]
18+
CollectionDelete,
19+
CollectionAdd sum.Int[Action]
1920
}
2021

2122
var Actions = sum.Int[Action]{}.Sum()
@@ -31,6 +32,7 @@ var ActionMap = map[string]sum.Int[Action]{
3132

3233
"Rename Collection": Actions.CollectionRename,
3334
"Delete Collection": Actions.CollectionDelete,
35+
"Add to Collection": Actions.CollectionAdd,
3436
}
3537

3638
var ActionMessages = map[sum.Int[Action]]string{
@@ -44,10 +46,12 @@ var ActionMessages = map[sum.Int[Action]]string{
4446
Actions.Nuke: "Nuke (Deletes ROM, Art and Game Tracker)",
4547
Actions.CollectionDelete: "Delete",
4648
Actions.CollectionRename: "Rename",
49+
Actions.CollectionAdd: "Add to",
4750
}
4851

4952
var ActionKeys = []string{
5053
"Rename ROM",
54+
"Add to Collection",
5155
//"Clear Save States",
5256
"Archive ROM",
5357
"Delete ROM",

models/collection.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package models
2+
3+
import shared "github.com/UncleJunVIP/nextui-pak-shared-functions/models"
4+
5+
type Collection struct {
6+
DisplayName string
7+
CollectionFile string
8+
Games shared.Items
9+
}
10+
11+
func (c Collection) Value() interface{} {
12+
return c
13+
}

models/screens.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,17 @@ type ScreenName struct {
66
MainMenu,
77
GamesList,
88
SearchBox,
9+
AddToCollection,
910
Actions,
1011
Confirm,
1112
RenameRom,
1213
DownloadArt,
1314

1415
CollectionsList,
1516
CollectionOptions,
16-
CollectionManagement sum.Int[ScreenName]
17+
CollectionManagement,
18+
CollectionRename,
19+
CollectionCreate sum.Int[ScreenName]
1720
}
1821

1922
var ScreenNames = sum.Int[ScreenName]{}.Sum()

0 commit comments

Comments
 (0)