mirror of
https://github.com/Xpl0itU/WiiUDownloader.git
synced 2025-05-13 06:34:44 -04:00
Add display UI
This commit is contained in:
parent
0a319d80d8
commit
cb0510931e
5 changed files with 142 additions and 12 deletions
|
@ -1,9 +1,10 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import wiiudownloader "github.com/Xpl0itU/WiiUDownloader"
|
||||||
"fmt"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
fmt.Println("Hello World!")
|
win := NewMainWindow(wiiudownloader.GetTitleEntries(wiiudownloader.TITLE_CATEGORY_GAME))
|
||||||
|
|
||||||
|
win.ShowAll()
|
||||||
|
Main()
|
||||||
}
|
}
|
||||||
|
|
99
cmd/WiiUDownloader/mainwindow.go
Normal file
99
cmd/WiiUDownloader/mainwindow.go
Normal file
|
@ -0,0 +1,99 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
|
||||||
|
wiiudownloader "github.com/Xpl0itU/WiiUDownloader"
|
||||||
|
"github.com/gotk3/gotk3/glib"
|
||||||
|
"github.com/gotk3/gotk3/gtk"
|
||||||
|
)
|
||||||
|
|
||||||
|
type MainWindow struct {
|
||||||
|
window *gtk.Window
|
||||||
|
titles []wiiudownloader.TitleEntry
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewMainWindow(entries []wiiudownloader.TitleEntry) *MainWindow {
|
||||||
|
gtk.Init(nil)
|
||||||
|
|
||||||
|
win, err := gtk.WindowNew(gtk.WINDOW_TOPLEVEL)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal("Unable to create window:", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
win.SetTitle("WiiUDownloaderGo")
|
||||||
|
win.SetDefaultSize(400, 300)
|
||||||
|
win.Connect("destroy", func() {
|
||||||
|
gtk.MainQuit()
|
||||||
|
})
|
||||||
|
|
||||||
|
return &MainWindow{
|
||||||
|
window: win,
|
||||||
|
titles: entries,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (mw *MainWindow) ShowAll() {
|
||||||
|
store, err := gtk.ListStoreNew(glib.TYPE_STRING, glib.TYPE_STRING, glib.TYPE_STRING)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal("Unable to create list store:", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, entry := range mw.titles {
|
||||||
|
iter := store.Append()
|
||||||
|
err = store.Set(iter,
|
||||||
|
[]int{0, 1, 2},
|
||||||
|
[]interface{}{entry.Name, fmt.Sprintf("%016x", entry.TitleID), wiiudownloader.GetFormattedRegion(entry.Region)},
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal("Unable to set values:", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
treeView, err := gtk.TreeViewNewWithModel(store)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal("Unable to create tree view:", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
renderer, err := gtk.CellRendererTextNew()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal("Unable to create cell renderer:", err)
|
||||||
|
}
|
||||||
|
column, err := gtk.TreeViewColumnNewWithAttribute("Name", renderer, "text", 0)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal("Unable to create tree view column:", err)
|
||||||
|
}
|
||||||
|
treeView.AppendColumn(column)
|
||||||
|
|
||||||
|
renderer, err = gtk.CellRendererTextNew()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal("Unable to create cell renderer:", err)
|
||||||
|
}
|
||||||
|
column, err = gtk.TreeViewColumnNewWithAttribute("Title ID", renderer, "text", 1)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal("Unable to create tree view column:", err)
|
||||||
|
}
|
||||||
|
treeView.AppendColumn(column)
|
||||||
|
|
||||||
|
column, err = gtk.TreeViewColumnNewWithAttribute("Region", renderer, "text", 2)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal("Unable to create tree view column:", err)
|
||||||
|
}
|
||||||
|
treeView.AppendColumn(column)
|
||||||
|
|
||||||
|
scrollable, err := gtk.ScrolledWindowNew(nil, nil)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal("Unable to create scrolled window:", err)
|
||||||
|
}
|
||||||
|
scrollable.SetPolicy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
|
||||||
|
scrollable.Add(treeView)
|
||||||
|
|
||||||
|
mw.window.Add(scrollable)
|
||||||
|
|
||||||
|
mw.window.ShowAll()
|
||||||
|
}
|
||||||
|
|
||||||
|
func Main() {
|
||||||
|
gtk.Main()
|
||||||
|
}
|
5
go.mod
5
go.mod
|
@ -2,4 +2,7 @@ module github.com/Xpl0itU/WiiUDownloader
|
||||||
|
|
||||||
go 1.20
|
go 1.20
|
||||||
|
|
||||||
require github.com/cavaliergopher/grab/v3 v3.0.1
|
require (
|
||||||
|
github.com/cavaliergopher/grab/v3 v3.0.1
|
||||||
|
github.com/gotk3/gotk3 v0.6.2
|
||||||
|
)
|
||||||
|
|
2
go.sum
2
go.sum
|
@ -1,2 +1,4 @@
|
||||||
github.com/cavaliergopher/grab/v3 v3.0.1 h1:4z7TkBfmPjmLAAmkkAZNX/6QJ1nNFdv3SdIHXju0Fr4=
|
github.com/cavaliergopher/grab/v3 v3.0.1 h1:4z7TkBfmPjmLAAmkkAZNX/6QJ1nNFdv3SdIHXju0Fr4=
|
||||||
github.com/cavaliergopher/grab/v3 v3.0.1/go.mod h1:1U/KNnD+Ft6JJiYoYBAimKH2XrYptb8Kl3DFGmsjpq4=
|
github.com/cavaliergopher/grab/v3 v3.0.1/go.mod h1:1U/KNnD+Ft6JJiYoYBAimKH2XrYptb8Kl3DFGmsjpq4=
|
||||||
|
github.com/gotk3/gotk3 v0.6.2 h1:sx/PjaKfKULJPTPq8p2kn2ZbcNFxpOJqi4VLzMbEOO8=
|
||||||
|
github.com/gotk3/gotk3 v0.6.2/go.mod h1:/hqFpkNa9T3JgNAE2fLvCdov7c5bw//FHNZrZ3Uv9/Q=
|
||||||
|
|
39
gtitles.go
39
gtitles.go
|
@ -43,22 +43,22 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
type TitleEntry struct {
|
type TitleEntry struct {
|
||||||
name string
|
Name string
|
||||||
titleID uint64
|
TitleID uint64
|
||||||
region uint8
|
Region uint8
|
||||||
key uint8
|
key uint8
|
||||||
}
|
}
|
||||||
|
|
||||||
func getTitleEntries(category uint8) []TitleEntry {
|
func GetTitleEntries(category uint8) []TitleEntry {
|
||||||
entriesSize := getTitleEntriesSize(category)
|
entriesSize := getTitleEntriesSize(category)
|
||||||
entriesSlice := make([]TitleEntry, entriesSize)
|
entriesSlice := make([]TitleEntry, entriesSize)
|
||||||
cEntries := C.getTitleEntries(C.TITLE_CATEGORY(category))
|
cEntries := C.getTitleEntries(C.TITLE_CATEGORY(category))
|
||||||
cSlice := (*[1 << 28]C.TitleEntry)(unsafe.Pointer(cEntries))[:entriesSize:entriesSize]
|
cSlice := (*[1 << 28]C.TitleEntry)(unsafe.Pointer(cEntries))[:entriesSize:entriesSize]
|
||||||
for i := 0; i < entriesSize; i++ {
|
for i := 0; i < entriesSize; i++ {
|
||||||
entriesSlice[i] = TitleEntry{
|
entriesSlice[i] = TitleEntry{
|
||||||
name: C.GoString(cSlice[i].name),
|
Name: C.GoString(cSlice[i].name),
|
||||||
titleID: uint64(cSlice[i].tid),
|
TitleID: uint64(cSlice[i].tid),
|
||||||
region: uint8(cSlice[i].region),
|
Region: uint8(cSlice[i].region),
|
||||||
key: uint8(cSlice[i].key),
|
key: uint8(cSlice[i].key),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -68,3 +68,28 @@ func getTitleEntries(category uint8) []TitleEntry {
|
||||||
func getTitleEntriesSize(category uint8) int {
|
func getTitleEntriesSize(category uint8) int {
|
||||||
return int(C.getTitleEntriesSize(C.TITLE_CATEGORY(category)))
|
return int(C.getTitleEntriesSize(C.TITLE_CATEGORY(category)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GetFormattedRegion(region uint8) string {
|
||||||
|
if region&MCP_REGION_EUROPE != 0 {
|
||||||
|
if region&MCP_REGION_USA != 0 {
|
||||||
|
if region&MCP_REGION_JAPAN != 0 {
|
||||||
|
return "All"
|
||||||
|
}
|
||||||
|
return "USA/Europe"
|
||||||
|
}
|
||||||
|
if region&MCP_REGION_JAPAN != 0 {
|
||||||
|
return "Europe/Japan"
|
||||||
|
}
|
||||||
|
return "Europe"
|
||||||
|
}
|
||||||
|
if region&MCP_REGION_USA != 0 {
|
||||||
|
if region&MCP_REGION_JAPAN != 0 {
|
||||||
|
return "USA/Japan"
|
||||||
|
}
|
||||||
|
return "USA"
|
||||||
|
}
|
||||||
|
if region&MCP_REGION_JAPAN != 0 {
|
||||||
|
return "Japan"
|
||||||
|
}
|
||||||
|
return "Unknown"
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue