Skip to content

Commit

Permalink
update layout mobile desktop and mobile for proposal detail page
Browse files Browse the repository at this point in the history
  • Loading branch information
JustinBeBoy committed Dec 12, 2023
1 parent 25931bd commit 2db0e3e
Show file tree
Hide file tree
Showing 3 changed files with 102 additions and 158 deletions.
2 changes: 1 addition & 1 deletion ui/load/appinfo.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ func (app *AppInfo) ConvertTextSize(size unit.Sp) unit.Sp {
return size
}
switch size {
case values.TextSize20:
case values.TextSize20, values.TextSize24:
return values.TextSize16
case values.TextSize18:
return values.TextSize14
Expand Down
240 changes: 89 additions & 151 deletions ui/page/governance/proposal_details_page.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ type ProposalDetails struct {

descriptionList *layout.List

proposal *libwallet.Proposal
proposalItems map[string]proposalItemWidgets
proposal *libwallet.Proposal
proposalDesRaw string

scrollbarList *widget.List
rejectedIcon *widget.Icon
Expand Down Expand Up @@ -79,7 +79,6 @@ func NewProposalDetailsPage(l *load.Load, proposal *libwallet.Proposal) *Proposa
List: layout.List{Axis: layout.Vertical},
},
redirectIcon: l.Theme.Icons.RedirectIcon,
proposalItems: make(map[string]proposalItemWidgets),
rejectedIcon: l.Theme.Icons.NavigationCancel,
successIcon: l.Theme.Icons.ActionCheckCircle,
viewInPoliteiaBtn: l.Theme.NewClickable(true),
Expand Down Expand Up @@ -110,6 +109,7 @@ func NewProposalDetailsPage(l *load.Load, proposal *libwallet.Proposal) *Proposa
// the page is displayed.
// Part of the load.Page interface.
func (pg *ProposalDetails) OnNavigatedTo() {
pg.loadProposalDescription()
pg.listenForSyncNotifications() // listener is stopped in OnNavigatedFrom()
}

Expand All @@ -133,6 +133,88 @@ func (pg *ProposalDetails) initWalletSelector() {
settingCommonDropdown(pg.Theme, pg.walletDropDown)
}

func (pg *ProposalDetails) loadProposalDescription() {
if pg.proposalDesRaw == "" && !pg.loadingDescription {
pg.loadingDescription = true
go func() {
var proposalDescription string
if pg.proposal.IndexFile != "" && pg.proposal.IndexFileVersion == pg.proposal.Version {
proposalDescription = pg.proposal.IndexFile
} else {
var err error
proposalDescription, err = pg.AssetsManager.Politeia.FetchProposalDescription(pg.proposal.Token)
if err != nil {
log.Errorf("Error loading proposal description: %v", err)
time.Sleep(7 * time.Second)
pg.loadingDescription = false
return
}
}

pg.proposalDesRaw = proposalDescription
pg.loadingDescription = false
}()
}
}

// Layout draws the page UI components into the provided layout context
// to be eventually drawn on screen.
// Part of the load.Page interface.
func (pg *ProposalDetails) Layout(gtx C) D {
proposal := pg.proposal
page := components.SubPage{
Load: pg.Load,
Title: components.TruncateString(proposal.Name, 40),
BackButton: pg.backButton,
Back: func() {
pg.ParentNavigator().CloseCurrentPage()
},
Body: func(gtx C) D {
return pg.layoutDescription(gtx)
},
ExtraHeader: func(gtx C) D {
return layout.Inset{Bottom: values.MarginPadding16, Top: values.MarginPadding16}.Layout(gtx, pg.layoutTitle)
},
ExtraItem: pg.tempRightHead,
Extra: func(gtx C) D {
grayCol := pg.Load.Theme.Color.GrayText2
timeAgoLabel := pg.Load.Theme.Body2(components.TimeAgo(proposal.Timestamp))
timeAgoLabel.Color = grayCol

dotLabel := pg.Load.Theme.H4(" . ")
dotLabel.Color = grayCol

categoryLabel := pg.Load.Theme.Body2(pg.getCategoryText())
categoryLabel.TextSize = pg.ConvertTextSize(values.TextSize14)
timeAgoLabel.TextSize = pg.ConvertTextSize(values.TextSize14)
return layout.Inset{}.Layout(gtx, func(gtx C) D {
return layout.E.Layout(gtx, func(gtx C) D {
return layout.Flex{}.Layout(gtx,
layout.Rigid(categoryLabel.Layout),
layout.Rigid(func(gtx C) D {
return layout.Inset{Top: values.MarginPaddingMinus22}.Layout(gtx, dotLabel.Layout)
}),
layout.Rigid(timeAgoLabel.Layout),
)
})
})
},
}
return page.LayoutWithHeadCard(pg.ParentWindow(), gtx)
}

func (pg *ProposalDetails) getProposalItemWidgets() *proposalItemWidgets {
if pg.proposalDesRaw == "" {
return nil
}
r := renderers.RenderMarkdown(pg.Load, pg.Theme, pg.proposalDesRaw)
proposalWidgets, proposalClickables := r.Layout()
return &proposalItemWidgets{
widgets: proposalWidgets,
clickables: proposalClickables,
}
}

// HandleUserInteractions is called just before Layout() to determine
// if any user interaction recently occurred on the page and may be
// used to update the page's UI components shortly before they are
Expand All @@ -144,14 +226,6 @@ func (pg *ProposalDetails) HandleUserInteractions() {
//TODO: implement when selected wallet
}

for token := range pg.proposalItems {
for location, clickable := range pg.proposalItems[token].clickables {
if clickable.Clicked() {
components.GoToURL(location)
}
}
}

if pg.vote.Clicked() {
pg.ParentWindow().ShowModal(newVoteModal(pg.Load, pg.proposal))
}
Expand Down Expand Up @@ -527,9 +601,10 @@ func (pg *ProposalDetails) layoutDescription(gtx C) D {
pg.lineSeparator(layout.Inset{Top: values.MarginPadding16, Bottom: values.MarginPadding16}),
}

_, ok := pg.proposalItems[proposal.Token]
if ok {
w = append(w, pg.proposalItems[proposal.Token].widgets...)
// _, ok := pg.proposalItems[proposal.Token]
itemWidgets := pg.getProposalItemWidgets()
if itemWidgets != nil {
w = append(w, itemWidgets.widgets...)
} else {
loading := func(gtx C) D {
return layout.Flex{Axis: layout.Horizontal}.Layout(gtx, layout.Flexed(1, func(gtx C) D {
Expand Down Expand Up @@ -584,140 +659,3 @@ func (pg *ProposalDetails) lineSeparator(inset layout.Inset) layout.Widget {
return inset.Layout(gtx, pg.Theme.Separator().Layout)
}
}

// Layout draws the page UI components into the provided layout context
// to be eventually drawn on screen.
// Part of the load.Page interface.
func (pg *ProposalDetails) Layout(gtx C) D {
// if pg.Load.IsMobileView() {
// return pg.layoutMobile(gtx)
// }
return pg.layoutDesktop(gtx)
}

func (pg *ProposalDetails) layoutDesktop(gtx C) D {
proposal := pg.proposal
_, ok := pg.proposalItems[proposal.Token]
if !ok && !pg.loadingDescription {
pg.loadingDescription = true
go func() {
var proposalDescription string
if proposal.IndexFile != "" && proposal.IndexFileVersion == proposal.Version {
proposalDescription = proposal.IndexFile
} else {
var err error
proposalDescription, err = pg.AssetsManager.Politeia.FetchProposalDescription(proposal.Token)
if err != nil {
log.Errorf("Error loading proposal description: %v", err)
time.Sleep(7 * time.Second)
pg.loadingDescription = false
return
}
}

r := renderers.RenderMarkdown(pg.Load, pg.Theme, proposalDescription)
proposalWidgets, proposalClickables := r.Layout()
pg.proposalItems[proposal.Token] = proposalItemWidgets{
widgets: proposalWidgets,
clickables: proposalClickables,
}
pg.loadingDescription = false
}()
}

page := components.SubPage{
Load: pg.Load,
Title: components.TruncateString(proposal.Name, 40),
BackButton: pg.backButton,
Back: func() {
pg.ParentNavigator().CloseCurrentPage()
},
Body: func(gtx C) D {
return pg.layoutDescription(gtx)
},
ExtraHeader: func(gtx C) D {
return layout.Inset{Bottom: values.MarginPadding16, Top: values.MarginPadding16}.Layout(gtx, pg.layoutTitle)
},
ExtraItem: pg.tempRightHead,
Extra: func(gtx C) D {
grayCol := pg.Load.Theme.Color.GrayText2
timeAgoLabel := pg.Load.Theme.Body2(components.TimeAgo(proposal.Timestamp))
timeAgoLabel.Color = grayCol

dotLabel := pg.Load.Theme.H4(" . ")
dotLabel.Color = grayCol

categoryLabel := pg.Load.Theme.Body2(pg.getCategoryText())
categoryLabel.TextSize = pg.ConvertTextSize(values.TextSize14)
timeAgoLabel.TextSize = pg.ConvertTextSize(values.TextSize14)
return layout.Inset{}.Layout(gtx, func(gtx C) D {
return layout.E.Layout(gtx, func(gtx C) D {
return layout.Flex{}.Layout(gtx,
layout.Rigid(categoryLabel.Layout),
layout.Rigid(func(gtx C) D {
return layout.Inset{Top: values.MarginPaddingMinus22}.Layout(gtx, dotLabel.Layout)
}),
layout.Rigid(timeAgoLabel.Layout),
)
})
})
},
}
return page.LayoutWithHeadCard(pg.ParentWindow(), gtx)
}

func (pg *ProposalDetails) layoutMobile(gtx C) D {
proposal := pg.proposal
_, ok := pg.proposalItems[proposal.Token]
if !ok && !pg.loadingDescription {
pg.loadingDescription = true
go func() {
var proposalDescription string
if proposal.IndexFile != "" && proposal.IndexFileVersion == proposal.Version {
proposalDescription = proposal.IndexFile
} else {
var err error
proposalDescription, err = pg.AssetsManager.Politeia.FetchProposalDescription(proposal.Token)
if err != nil {
log.Errorf("Error loading proposal description: %v", err)
time.Sleep(7 * time.Second)
pg.loadingDescription = false
return
}
}

r := renderers.RenderMarkdown(pg.Load, pg.Theme, proposalDescription)
proposalWidgets, proposalClickables := r.Layout()
pg.proposalItems[proposal.Token] = proposalItemWidgets{
widgets: proposalWidgets,
clickables: proposalClickables,
}
pg.loadingDescription = false
}()
}

body := func(gtx C) D {
page := components.SubPage{
Load: pg.Load,
Title: components.TruncateString(proposal.Name, 30),
BackButton: pg.backButton,
Back: func() {
pg.ParentNavigator().CloseCurrentPage()
},
Body: func(gtx C) D {
return layout.Flex{Axis: layout.Vertical}.Layout(gtx,
layout.Rigid(func(gtx C) D {
return layout.Inset{Bottom: values.MarginPadding10}.Layout(gtx, pg.layoutTitle)
}),
layout.Rigid(pg.layoutDescription),
)
},
ExtraItem: pg.viewInPoliteiaBtn,
Extra: func(gtx C) D {
return layout.Inset{}.Layout(gtx, pg.redirectIcon.Layout24dp)
},
}
return page.Layout(pg.ParentWindow(), gtx)
}
return components.UniformMobile(gtx, false, false, body)
}
18 changes: 12 additions & 6 deletions ui/renderers/markdown.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package renderers

import (
"fmt"
"strings"
"unicode"

Expand Down Expand Up @@ -34,23 +35,19 @@ type MarkdownProvider struct {
listItemNumber int // should be negative when not rendering a list
links map[string]*widget.Clickable
table *table
label *cryptomaterial.Label
prefix string

stringBuilder strings.Builder
tagStack []string
}

func RenderMarkdown(l *load.Load, theme *cryptomaterial.Theme, source string) *MarkdownProvider {
lbl := theme.Body1("")
lbl.TextSize = l.ConvertTextSize(values.TextSize14)
source = strings.Replace(source, " \n*", " \n\n *", -1)

mdProvider := &MarkdownProvider{
Load: l,
theme: theme,
listItemNumber: -1,
label: &lbl,
}
source = mdProvider.prepare(source)

Expand Down Expand Up @@ -167,6 +164,7 @@ func (p *MarkdownProvider) renderListItem(content string) {
lbl := p.getLabel()
strongLabel := p.getLabel()
strongLabel.Font.Weight = font.Bold
fmt.Println("-------getLabel----222222-->", lbl.TextSize)

return layout.Flex{}.Layout(gtx,
layout.Flexed(0.02, func(gtx C) D {
Expand Down Expand Up @@ -204,7 +202,11 @@ func (p *MarkdownProvider) prepareHeading(node *ast.Heading, entering bool) {
content := p.stringBuilder.String()
p.stringBuilder.Reset()
p.createNewRow()
p.appendToLastRow(getHeading(content, node.Level, p.theme).Layout)
p.appendToLastRow(func(gtx C) D {
lbl := getHeading(content, node.Level, p.theme)
lbl.TextSize = p.ConvertTextSize(lbl.TextSize)
return lbl.Layout(gtx)
})
p.addVerticalSpacing(8)
if node.Level == 1 {
p.drawLineRow(layout.Horizontal)
Expand All @@ -218,6 +220,7 @@ func (p *MarkdownProvider) prepareLink(_ /*node*/ *ast.Link, _ /*entering*/ bool
}

func (p *MarkdownProvider) renderBlock() {
fmt.Println("------renderBlock---->")
content := p.stringBuilder.String()
p.stringBuilder.Reset()

Expand Down Expand Up @@ -275,7 +278,9 @@ func (p *MarkdownProvider) renderBlock() {

func (p *MarkdownProvider) getLabel() cryptomaterial.Label {
lbl := p.theme.Body1("")
lbl.TextSize = p.ConvertTextSize(values.TextSize14)
size := p.ConvertTextSize(values.TextSize16)
// fmt.Println("-------getLabel------>", size)
lbl.TextSize = size
if len(p.tagStack) > 0 {
for i := range p.tagStack {
switch p.tagStack[i] {
Expand All @@ -294,6 +299,7 @@ func (p *MarkdownProvider) getLabel() cryptomaterial.Label {

func (p *MarkdownProvider) render(content *strings.Builder) {
lbl := p.getLabel()
fmt.Println("-------getLabel----111111-->", lbl.TextSize)
words := strings.Fields(content.String())
content.Reset()

Expand Down

0 comments on commit 2db0e3e

Please sign in to comment.