Skip to content
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

Fyne History Page Implementation #439

Open
wants to merge 74 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 69 commits
Commits
Show all changes
74 commits
Select commit Hold shift + click to select a range
f1dcdfd
added transaction filter popup
Sirmorrison Nov 5, 2019
eae10b8
fixed dropdown selection issues
Sirmorrison Nov 6, 2019
d347c73
added table.go, and table header
Sirmorrison Nov 9, 2019
6af6f32
added table.go, and fetched table data into the table
Sirmorrison Nov 11, 2019
a8a6c51
bug fix with tablefilter
Sirmorrison Nov 13, 2019
cf1a818
implemented txtable filtering
Sirmorrison Nov 15, 2019
0f3fa0c
added pagination
Sirmorrison Nov 16, 2019
2c1c538
added transaction details page, improved table.go, removed pagination…
Sirmorrison Nov 19, 2019
d19d5f8
removed txdetails.go
Sirmorrison Nov 19, 2019
95100e2
added errorhandling, split function into table header and table conte…
Sirmorrison Nov 23, 2019
4bd5f6d
added copy txhash copy functionality for txdetails page, aligned txde…
Sirmorrison Nov 25, 2019
c70253a
added modal popup collapse icon, made txdetail pop a modal popup, add…
Sirmorrison Nov 28, 2019
a241b45
hint tip
Sirmorrison Nov 29, 2019
60ad5d1
renamed variables, remoeved commentedline and un used lines ofcode
Sirmorrison Dec 1, 2019
c35e1ba
fixed ssues with tx table not scrolling and returning to the table to…
Sirmorrison Dec 3, 2019
3463275
fixed panic issue with error handlers for txdetails page and txdropdo…
Sirmorrison Dec 4, 2019
1e8334c
fixed error handler panic for tx, added txsort dropdown to history page
Sirmorrison Dec 4, 2019
c328cb1
fixe issues with txdetails popup
Sirmorrison Dec 4, 2019
6278f21
un-did changes
Sirmorrison Dec 4, 2019
7540cf9
rebased pr
Sirmorrison Dec 5, 2019
b5c41bd
added transaction filter popup
Sirmorrison Nov 5, 2019
f3057c6
fixed dropdown selection issues
Sirmorrison Nov 6, 2019
b9b10ab
added table.go, and table header
Sirmorrison Nov 9, 2019
b6de20b
added table.go, and fetched table data into the table
Sirmorrison Nov 11, 2019
1a72ea4
bug fix with tablefilter
Sirmorrison Nov 13, 2019
e17a827
implemented txtable filtering
Sirmorrison Nov 15, 2019
f8d90cc
added pagination
Sirmorrison Nov 16, 2019
49f45bb
added transaction details page, improved table.go, removed pagination…
Sirmorrison Nov 19, 2019
433720d
removed txdetails.go
Sirmorrison Nov 19, 2019
c3f4dad
added errorhandling, split function into table header and table conte…
Sirmorrison Nov 23, 2019
55fece0
added copy txhash copy functionality for txdetails page, aligned txde…
Sirmorrison Nov 25, 2019
9f7f4f2
added modal popup collapse icon, made txdetail pop a modal popup, add…
Sirmorrison Nov 28, 2019
321d755
hint tip
Sirmorrison Nov 29, 2019
df594a1
renamed variables, remoeved commentedline and un used lines ofcode
Sirmorrison Dec 1, 2019
f203132
fixed ssues with tx table not scrolling and returning to the table to…
Sirmorrison Dec 3, 2019
4b9f4a1
fixed panic issue with error handlers for txdetails page and txdropdo…
Sirmorrison Dec 4, 2019
452c58f
fixed error handler panic for tx, added txsort dropdown to history page
Sirmorrison Dec 4, 2019
7c42b02
fixe issues with txdetails popup
Sirmorrison Dec 4, 2019
0475626
un-did changes
Sirmorrison Dec 4, 2019
a6ab7d9
fixing history page
Sirmorrison Dec 6, 2019
aa8fde1
implemented multiwallet feature
Sirmorrison Dec 8, 2019
578a185
added selected wallet line
Sirmorrison Dec 9, 2019
39010fc
fixed issues with txDetailsPopup
Sirmorrison Dec 11, 2019
5804ef8
hide filter popup when there re no tx in wallet
Sirmorrison Dec 11, 2019
86fe1b5
fixed issues with txSort dropdown
Sirmorrison Dec 12, 2019
e2fe7aa
added info popup and cleaned up code
Sirmorrison Dec 12, 2019
8a838e4
added txdirection icon to tx table
Sirmorrison Dec 13, 2019
77776e1
fixed issues with history table when a diiferent wallet is selected
Sirmorrison Dec 18, 2019
ffbc339
fixed issues with txDropdown and txSort Labels not reflecting the cur…
Sirmorrison Dec 19, 2019
e78054f
fixed panic when there is an error, changed wallet list to a dropdown…
Sirmorrison Dec 20, 2019
e7c6888
cleaned up code
Sirmorrison Dec 20, 2019
fc7fa45
removed repeated codes, rebased pr and cleaned up code
Sirmorrison Dec 20, 2019
f076174
optimzed txupdate
Sirmorrison Dec 20, 2019
f70be2e
added redirect to dcrdata feature
Sirmorrison Dec 20, 2019
00b4208
added section seperators
Sirmorrison Dec 21, 2019
6cc7353
removed file
Sirmorrison Dec 21, 2019
19e6a96
rebased PR
Sirmorrison Dec 21, 2019
6a52d76
fixed broken page after rebase due to fyne update
Sirmorrison Dec 21, 2019
5463d00
undid changes
Sirmorrison Dec 21, 2019
ef81d88
added scroll feature to wallet dropdown
Sirmorrison Dec 22, 2019
9f4ce43
implemented @metaclips review
Sirmorrison Dec 23, 2019
a8cab7a
removed unrelated file
Sirmorrison Dec 24, 2019
06b6a8b
removed unrelated file
Sirmorrison Dec 24, 2019
3bc6ba6
minor mod
Sirmorrison Dec 24, 2019
a7a406b
Merge branch 'fyneHistoryPage' of https://github.com/Sirmorrison/godc…
Sirmorrison Dec 24, 2019
c868cab
reduced table width, removed horizontal scroll, removed type column
Sirmorrison Dec 25, 2019
0d86a52
fixed issues with no transaction in wallet message not showing
Sirmorrison Dec 25, 2019
7e63a18
removed direction label and added #column
Sirmorrison Dec 25, 2019
c72a35a
fixed issues with txdetails popup being larger than the screensize, u…
Sirmorrison Dec 28, 2019
1303925
trimmed long string and optimized code
Sirmorrison Dec 28, 2019
a50dcd4
aligned info icon to the right and reduced popup size, aligned table …
Sirmorrison Dec 28, 2019
8b9d018
used form widget for txdetails data
Sirmorrison Dec 28, 2019
08c678b
cleaned up code and fixed issues with txtable content alignment
Sirmorrison Dec 29, 2019
2fb8d2e
fixed pagination
Sirmorrison Jan 5, 2019
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
314 changes: 0 additions & 314 deletions cli/go.sum

This file was deleted.

2 changes: 1 addition & 1 deletion cmd/godcr-fyne/fyne.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,4 @@ var defaultAppDataDir = dcrutil.AppDataDir("godcr", false)

func main() {
fyne.LaunchUserInterface(appDisplayName, defaultAppDataDir, "testnet3")
}
}
2 changes: 1 addition & 1 deletion cmd/godcr-fyne/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -407,4 +407,4 @@ gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkep
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
6 changes: 3 additions & 3 deletions fyne/assets/icons.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,9 @@ const (
MoreIcon = "more.png"
InfoIcon = "info.png"
ReceiveAccountIcon = "receiveAccount.png"

CollapseDropdown = "collapseDropdown.png"
ExpandDropdown = "expandDropdown.png"
CollapseDropdown = "collapseDropdown.png"
ExpandDropdown = "expandDropdown.png"
RedirectIcon = "redirect.png"
)

var imageBox = packr.New("icons", "../assets")
Expand Down
Binary file added fyne/assets/redirect.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added fyne/assets/share.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions fyne/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ go 1.13

require (
fyne.io/fyne v1.2.0
github.com/decred/dcrd/chaincfg/chainhash v1.0.2
github.com/decred/dcrd/dcrutil v1.4.0
github.com/decred/slog v1.0.0
github.com/gen2brain/beeep v0.0.0-20190719094215-ece0cb67ca77
Expand Down
24 changes: 24 additions & 0 deletions fyne/helpers/helpers.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package helpers

import (
"fyne.io/fyne/widget"
"github.com/raedahgroup/godcr/fyne/assets"
)

func TxDirectionIcon(direction int32) string {
switch direction {
case 0:
return assets.SendIcon
case 1:
return assets.ReceiveIcon
case 2:
return assets.ReceiveIcon
default:
return assets.InfoIcon
}
}

func ErrorHandler(err string, errorLabel *widget.Label) {
errorLabel.SetText(err)
errorLabel.Show()
}
2 changes: 1 addition & 1 deletion fyne/pages/display.go
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ func (app *AppInterface) setupNavigationMenu() {
case 0:
newPageContent = overviewPageContent(app)
case 1:
newPageContent = historyPageContent()
newPageContent = historyPageContent(app)
case 2:
newPageContent = sendPageContent(app.MultiWallet, app.Window)
case 3:
Expand Down
45 changes: 45 additions & 0 deletions fyne/pages/handler/historypagehandler/basewidgets.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package historypagehandler

import (
"fyne.io/fyne"
"fyne.io/fyne/canvas"
"fyne.io/fyne/layout"
"fyne.io/fyne/widget"

"github.com/raedahgroup/godcr/fyne/assets"
"github.com/raedahgroup/godcr/fyne/pages/handler/values"
"github.com/raedahgroup/godcr/fyne/widgets"
)

func (historyPage *HistoryPageData) initBaseObjects() error {
icons, err := assets.GetIcons(assets.CollapseIcon, assets.InfoIcon, assets.SendIcon, assets.ReceiveIcon, assets.ReceiveIcon, assets.InfoIcon, assets.RedirectIcon)
if err != nil {
return err
}
historyPage.icons = icons
// history page title label
historyTitleLabel := widget.NewLabelWithStyle(values.HistoryTitle, fyne.TextAlignLeading, fyne.TextStyle{Bold: true, Italic: true})

// infoPopUp creates a popup with history page hint-text
var infoIcon *widgets.ImageButton
infoIcon = widgets.NewImageButton(historyPage.icons[assets.InfoIcon], nil, func() {
infoLabel := widget.NewLabelWithStyle(values.PageHint, fyne.TextAlignLeading, fyne.TextStyle{Monospace: true})
gotItLabel := canvas.NewText(values.GotIt, values.Blue)
gotItLabel.TextStyle = fyne.TextStyle{Bold: true}
gotItLabel.TextSize = 14

var infoPopUp *widget.PopUp
infoPopUp = widget.NewPopUp(widget.NewVBox(
widgets.NewVSpacer(5),
widget.NewHBox(widgets.NewHSpacer(5), infoLabel, widgets.NewHSpacer(5)),
widgets.NewVSpacer(5),
widget.NewHBox(layout.NewSpacer(), widgets.NewClickableBox(widget.NewVBox(gotItLabel), func() { infoPopUp.Hide() }), widgets.NewHSpacer(5)),
widgets.NewVSpacer(5),
), historyPage.Window.Canvas())

infoPopUp.Move(fyne.CurrentApp().Driver().AbsolutePositionForObject(infoIcon).Add(fyne.NewPos(0, infoIcon.Size().Height)))
})

historyPage.HistoryPageContents.Append(widget.NewHBox(historyTitleLabel, widgets.NewHSpacer(110), infoIcon))
return nil
}
133 changes: 133 additions & 0 deletions fyne/pages/handler/historypagehandler/filterselector.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
package historypagehandler

import (
"fmt"
"strings"

"fyne.io/fyne/widget"

"github.com/raedahgroup/dcrlibwallet"
"github.com/raedahgroup/godcr/fyne/assets"
"github.com/raedahgroup/godcr/fyne/widgets"
)

func (historyPage *HistoryPageData) txFilterDropDown(walletId int) {
var txTable widgets.Table
txFilterListWidget := widget.NewVBox()

var allTxFilterNames = []string{"All", "Sent", "Received", "Transferred", "Coinbase", "Staking"}
var allTxFilters = map[string]int32{
"All": dcrlibwallet.TxFilterAll,
"Sent": dcrlibwallet.TxFilterSent,
"Received": dcrlibwallet.TxFilterReceived,
"Transferred": dcrlibwallet.TxFilterTransferred,
"Coinbase": dcrlibwallet.TxFilterCoinBase,
"Staking": dcrlibwallet.TxFilterStaking,
}

if walletId != historyPage.selectedWalletID {
historyPage.selectedWalletID = walletId
}

txCountForFilter, err := historyPage.MultiWallet.WalletWithID(historyPage.selectedWalletID).CountTransactions(allTxFilters["All"])
if err != nil {
historyPage.errorMessage = fmt.Sprintf("Cannot load history page page. Error getting transaction count for filter All: %s", err.Error())
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why are we passing error messages here? isn't there already a widget that handles that? Also, if err!=nil parameter is met, the app crashes, all component functions that require using dcrlibwallet should have a return parameter "error", you should stop all history page initialisation if any function throws an error.

Copy link
Contributor Author

@Sirmorrison Sirmorrison Dec 29, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is not true if there is an error at any point the error is returned the app does not panic... you should do well to test this properly as i have done so from my end...

if you are changing != to == you should comment out err.Error() else it will panic as there is no error to be returned.

image

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Screenshot 2019-12-30 at 19 58 06

This is what is shown when I make err == nil here, you are showing parts of history page components even when there was an error.
You shouldn't be passing errors to variables and then making a return

You are still calling up functions even if there was error on other functions called recently and then checking if any of the functions returned an error here

This shouldn't be as any of the functions that errors and returns early without initialising struct variable "HistoryPageData struct" could cause a panic in other functions if they use the uninitialised variable, you should instead pass return parameter "errors" to all functions that uses dcrlibwallet also InitHistoryPage function and then if any of the dcrlibwallet library functions return an error,

  • Stop the failed function, return the error
  • Stop history page initialisation in the handler package, return the error passed to InitHistoryPage
  • Check if InitHistoryPage function which is to be called in history.go file returns an err if there was an error, only show on history page a label indicating that there was an error initialising history page.

return
}

historyPage.allTxCount = txCountForFilter

historyPage.selectedTxFilterLabel.SetText(fmt.Sprintf("%s (%d)", "All", txCountForFilter))

for _, filterName := range allTxFilterNames {
filterId := allTxFilters[filterName]
txCountForFilter, err := historyPage.MultiWallet.WalletWithID(historyPage.selectedWalletID).CountTransactions(filterId)
if err != nil {
historyPage.errorMessage = fmt.Sprintf("Cannot load historyPage page. Error getting transaction count for filter %s: %s", filterName, err.Error())
return
}
if txCountForFilter > 0 {
filter := fmt.Sprintf("%s (%d)", filterName, txCountForFilter)
txFilterView := widget.NewHBox(
widgets.NewHSpacer(5),
widget.NewLabel(filter),
widgets.NewHSpacer(5),
)

txFilterListWidget.Append(widgets.NewClickableBox(txFilterView, func() {
selectedFilterName := strings.Split(filter, " ")[0]
selectedFilterId := allTxFilters[selectedFilterName]
if allTxCountForSelectedTx, err := historyPage.MultiWallet.WalletWithID(historyPage.selectedWalletID).CountTransactions(selectedFilterId); err == nil {
historyPage.allTxCount = allTxCountForSelectedTx
}

if selectedFilterId != historyPage.selectedFilterId {
historyPage.selectedTxFilterLabel.SetText(filter)
historyPage.txTableHeader(&txTable)
historyPage.fetchTx(&txTable, 0, selectedFilterId, false)
widget.Refresh(historyPage.txTable.Result)
}

historyPage.txFilterSelectionPopup.Hide()
}))
}
}

// txFilterSelectionPopup create a popup that has tx filter name and tx count
historyPage.txFilterSelectionPopup = widget.NewPopUp(widget.NewVBox(txFilterListWidget), historyPage.Window.Canvas())
historyPage.txFilterSelectionPopup.Hide()

historyPage.txFilterTab = widget.NewHBox(
historyPage.selectedTxFilterLabel,
widgets.NewHSpacer(10),
widget.NewIcon(historyPage.icons[assets.CollapseIcon]),
widgets.NewHSpacer(10),
)
widget.Refresh(historyPage.txFilterTab)
}

func (historyPage *HistoryPageData) txSortDropDown() {
var txTable widgets.Table
var allTxSortNames = []string{"Newest", "Oldest"}
var allTxSortFilters = map[string]bool{
"Newest": true,
"Oldest": false,
}

historyPage.selectedTxSortFilterLabel.SetText("Newest")

historyPage.selectedtxSort = allTxSortFilters["Newest"]

txSortFilterListWidget := widget.NewVBox()
for _, sortName := range allTxSortNames {
txSortView := widget.NewHBox(
widgets.NewHSpacer(5),
widget.NewLabel(sortName),
widgets.NewHSpacer(5),
)
txSort := allTxSortFilters[sortName]
newSortName := sortName

txSortFilterListWidget.Append(widgets.NewClickableBox(txSortView, func() {
historyPage.selectedTxSortFilterLabel.SetText(newSortName)
historyPage.selectedtxSort = txSort

historyPage.txTableHeader(&txTable)
historyPage.txTable.Result.Children = txTable.Result.Children
historyPage.fetchTx(&txTable, 0, historyPage.selectedFilterId, false)
widget.Refresh(historyPage.txTable.Result)
historyPage.txSortFilterSelectionPopup.Hide()
}))
}

// txSortFilterSelectionPopup create a popup that has tx filter name and tx count
historyPage.txSortFilterSelectionPopup = widget.NewPopUp(widget.NewVBox(txSortFilterListWidget), historyPage.Window.Canvas())
historyPage.txSortFilterSelectionPopup.Hide()

historyPage.txSortFilterTab = widget.NewHBox(
historyPage.selectedTxSortFilterLabel,
widgets.NewHSpacer(10),
widget.NewIcon(historyPage.icons[assets.CollapseIcon]),
)
widget.Refresh(historyPage.txSortFilterTab)
}
91 changes: 91 additions & 0 deletions fyne/pages/handler/historypagehandler/inithistorypage.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
package historypagehandler

import (
"errors"

"fyne.io/fyne"
"fyne.io/fyne/layout"
"fyne.io/fyne/widget"

"github.com/raedahgroup/dcrlibwallet"
"github.com/raedahgroup/godcr/fyne/pages/handler/values"
"github.com/raedahgroup/godcr/fyne/widgets"
)

type HistoryPageData struct {
allTxCount int
selectedWalletID int
selectedFilterId int32
TotalTxFetched int32
selectedtxSort bool
errorMessage string
txFilterTab *widget.Box
txSortFilterTab *widget.Box
txTable widgets.Table
errorLabel *widget.Label
selectedTxFilterLabel *widget.Label
selectedTxSortFilterLabel *widget.Label
txFilterSelectionPopup *widget.PopUp
txSortFilterSelectionPopup *widget.PopUp
MultiWallet *dcrlibwallet.MultiWallet
icons map[string]*fyne.StaticResource
HistoryPageContents *widget.Box
Window fyne.Window
TabMenu *widget.TabContainer
}

func (historyPage *HistoryPageData) InitHistoryPage() error {
historyPage.HistoryPageContents.Append(widgets.NewVSpacer(values.Padding))

err := historyPage.initBaseObjects()
if err != nil {
return err
}

historyPage.HistoryPageContents.Append(widgets.NewVSpacer(values.SpacerSize10))

historyPage.errorLabel = widget.NewLabelWithStyle("", fyne.TextAlignCenter, fyne.TextStyle{Bold: true})
historyPage.errorLabel.Hide()

historyPage.selectedFilterId = dcrlibwallet.TxFilterAll
historyPage.selectedTxFilterLabel = widget.NewLabel("")
historyPage.selectedTxSortFilterLabel = widget.NewLabel("")

historyPage.txWalletList()

// txFilterDropDown creates a popup like dropdown that holds the list of tx filters.
var txFilterDropDown *widgets.ClickableBox
txFilterDropDown = widgets.NewClickableBox(historyPage.txFilterTab, func() {
if historyPage.allTxCount == 0 {
historyPage.txFilterSelectionPopup.Hide()
} else {
historyPage.txFilterSelectionPopup.Move(fyne.CurrentApp().Driver().AbsolutePositionForObject(
txFilterDropDown).Add(fyne.NewPos(0, txFilterDropDown.Size().Height)))
historyPage.txFilterSelectionPopup.Show()
}
})

// txSortFilterDropDown creates a popup like dropdown that holds the list of sort filters.
var txSortFilterDropDown *widgets.ClickableBox
txSortFilterDropDown = widgets.NewClickableBox(historyPage.txSortFilterTab, func() {
if historyPage.allTxCount == 0 {
historyPage.txSortFilterSelectionPopup.Hide()
} else {
historyPage.txSortFilterSelectionPopup.Move(fyne.CurrentApp().Driver().AbsolutePositionForObject(
txSortFilterDropDown).Add(fyne.NewPos(0, txSortFilterDropDown.Size().Height)))
historyPage.txSortFilterSelectionPopup.Show()
}
})

// catch all errors when trying to setup and render tx page data.
if historyPage.errorMessage != "" {
return errors.New(historyPage.errorMessage)
}

historyPage.HistoryPageContents.Append(widget.NewHBox(txSortFilterDropDown, widgets.NewHSpacer(30), txFilterDropDown))
historyPage.HistoryPageContents.Append(widgets.NewVSpacer(5))
historyPage.HistoryPageContents.Append(historyPage.errorLabel)
historyPage.HistoryPageContents.Append(fyne.NewContainerWithLayout(layout.NewFixedGridLayout(fyne.NewSize(historyPage.txTable.Result.MinSize().Width+30, historyPage.txTable.Container.MinSize().Height+450)), historyPage.txTable.Container))
historyPage.HistoryPageContents.Append(widgets.NewVSpacer(15))
return nil
}
Loading