Basic GUI client, login dialog, various comments fixes after copypaste.
Some checks failed
Linting and tests / Linting (push) Failing after 6s
Some checks failed
Linting and tests / Linting (push) Failing after 6s
This commit is contained in:
20
client/internal/services/core/mainwindow/dto/tab.go
Normal file
20
client/internal/services/core/mainwindow/dto/tab.go
Normal file
@@ -0,0 +1,20 @@
|
||||
package dto
|
||||
|
||||
import (
|
||||
"fyne.io/fyne/v2"
|
||||
"fyne.io/fyne/v2/canvas"
|
||||
)
|
||||
|
||||
// Tab is a DTO of main window's tab that is responsible for showing content.
|
||||
type Tab struct {
|
||||
// Name is a name for tab. Won't render by default on desktop, only on mouse hover, but will be rendered on mobiles.
|
||||
Name string
|
||||
// Sidebar is a sidebar widget. On desktop in will be shown on left side of window, on mobiles as separate window.
|
||||
Sidebar fyne.CanvasObject
|
||||
// Widget is a widget shown in window.
|
||||
Widget fyne.CanvasObject
|
||||
// Icon is an icon to show on tab.
|
||||
Icon canvas.Image
|
||||
// BadgeCount is a number to show on tab, like unread messages, incompleted tasks, etc.
|
||||
BadgeCount uint16
|
||||
}
|
@@ -6,12 +6,12 @@ import (
|
||||
"os"
|
||||
|
||||
"bunker/client/internal/application"
|
||||
"bunker/client/internal/helpers"
|
||||
"bunker/client/internal/services/core"
|
||||
"bunker/client/internal/services/core/mainwindow/models"
|
||||
"bunker/commons"
|
||||
|
||||
"fyne.io/fyne/v2"
|
||||
"fyne.io/fyne/v2/container"
|
||||
"fyne.io/fyne/v2/lang"
|
||||
"fyne.io/fyne/v2/widget"
|
||||
)
|
||||
@@ -19,15 +19,18 @@ import (
|
||||
var _ = core.MainWindow(&mainWindow{})
|
||||
|
||||
type mainWindow struct {
|
||||
app *application.Application
|
||||
logger *slog.Logger
|
||||
window fyne.Window
|
||||
options core.Options
|
||||
tabs *container.AppTabs
|
||||
sysInfoHandlers map[string]*models.SysInfoHandler
|
||||
app *application.Application
|
||||
logger *slog.Logger
|
||||
window fyne.Window
|
||||
options core.Options
|
||||
tabsWidget *fyne.Container
|
||||
statusBarProgress *widget.ProgressBar
|
||||
statusBarStatus *widget.Label
|
||||
sysInfoHandlers map[string]*models.SysInfoHandler
|
||||
tabs []*models.Tab
|
||||
}
|
||||
|
||||
// Initialize инициализирует сервис.
|
||||
// Initialize initializes service.
|
||||
func Initialize(app *application.Application) error {
|
||||
mainW := &mainWindow{
|
||||
app: app,
|
||||
@@ -70,20 +73,20 @@ func (m *mainWindow) Initialize() error {
|
||||
m.window = m.app.Fyne().NewWindow(lang.L("window.title"))
|
||||
// ToDo: сохранение и восстановление размеров окна.
|
||||
//nolint:mnd
|
||||
m.window.Resize(fyne.NewSize(800, 650))
|
||||
m.window.Resize(fyne.NewSize(1100, 800))
|
||||
|
||||
m.initializeMenu()
|
||||
var mainWindowCanvas fyne.CanvasObject
|
||||
|
||||
if helpers.IsMobile() {
|
||||
mainWindowCanvas = m.initializeMainWindowMobile()
|
||||
} else {
|
||||
mainWindowCanvas = m.initializeMainWindowDesktop()
|
||||
}
|
||||
|
||||
m.window.SetContent(mainWindowCanvas)
|
||||
|
||||
m.window.SetCloseIntercept(m.stopApp)
|
||||
|
||||
welcomeLabel := widget.NewLabel(lang.L("window.lorem_ipsum.text"))
|
||||
welcomeLabel.Wrapping = fyne.TextWrapWord
|
||||
|
||||
m.tabs = container.NewAppTabs(
|
||||
container.NewTabItem(lang.L("window.lorem_ipsum.tab_name"), welcomeLabel),
|
||||
)
|
||||
m.window.SetContent(m.tabs)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
@@ -0,0 +1,23 @@
|
||||
package mainwindow
|
||||
|
||||
import (
|
||||
"fyne.io/fyne/v2"
|
||||
"fyne.io/fyne/v2/container"
|
||||
"fyne.io/fyne/v2/widget"
|
||||
)
|
||||
|
||||
func (m *mainWindow) initializeMainWindowDesktop() fyne.CanvasObject {
|
||||
switcherButton := m.initializeSwitcherDesktop()
|
||||
appNameLabel := widget.NewLabel("Bunker " + m.app.Fyne().Metadata().Custom["Version"])
|
||||
sidebarHeader := container.NewVBox(container.NewHBox(switcherButton, appNameLabel), widget.NewSeparator())
|
||||
sideBar := container.NewBorder(sidebarHeader, nil, nil, nil)
|
||||
|
||||
splitter := container.NewHSplit(sideBar, container.NewVBox(widget.NewLabel("widget data"), widget.NewSeparator()))
|
||||
splitter.SetOffset(0.2)
|
||||
|
||||
statusBar := m.initializeDesktopStatusBar()
|
||||
|
||||
mainWidget := container.NewBorder(nil, statusBar, nil, nil, splitter)
|
||||
|
||||
return mainWidget
|
||||
}
|
@@ -0,0 +1,42 @@
|
||||
package mainwindow
|
||||
|
||||
import (
|
||||
"bunker/client/internal/widgets"
|
||||
|
||||
"fyne.io/fyne/v2"
|
||||
"fyne.io/fyne/v2/widget"
|
||||
)
|
||||
|
||||
func (m *mainWindow) initializeDesktopStatusBar() fyne.CanvasObject {
|
||||
m.statusBarStatus = widget.NewLabel("Ready.")
|
||||
m.statusBarProgress = widget.NewProgressBar()
|
||||
m.statusBarProgress.Hide()
|
||||
|
||||
statusBarForToolbar := widgets.NewToolbarProgressBarWithBar(m.statusBarProgress)
|
||||
|
||||
statusBar := widget.NewToolbar()
|
||||
statusBar.Append(widgets.NewToolbarLabelWithLabel(m.statusBarStatus))
|
||||
statusBar.Append(statusBarForToolbar)
|
||||
statusBar.Append(widget.NewToolbarSpacer())
|
||||
|
||||
return statusBar
|
||||
}
|
||||
|
||||
func (m *mainWindow) SetStatusProgressBarCurrentValue(current float64) {
|
||||
m.statusBarProgress.SetValue(current)
|
||||
}
|
||||
|
||||
func (m *mainWindow) SetStatusProgressBarMaxValue(maxValue float64) {
|
||||
m.statusBarProgress.Max = maxValue
|
||||
}
|
||||
|
||||
func (m *mainWindow) SetStatus(status string) {
|
||||
m.statusBarStatus.SetText(status)
|
||||
|
||||
if status == "" {
|
||||
m.statusBarStatus.SetText("Ready.")
|
||||
m.statusBarProgress.Hide()
|
||||
} else {
|
||||
m.statusBarProgress.Show()
|
||||
}
|
||||
}
|
@@ -0,0 +1,10 @@
|
||||
package mainwindow
|
||||
|
||||
import (
|
||||
"fyne.io/fyne/v2"
|
||||
"fyne.io/fyne/v2/widget"
|
||||
)
|
||||
|
||||
func (m *mainWindow) initializeMainWindowMobile() fyne.CanvasObject {
|
||||
return widget.NewLabel("Mobile interface not yet implemented.")
|
||||
}
|
@@ -0,0 +1,26 @@
|
||||
package mainwindow
|
||||
|
||||
import (
|
||||
"fyne.io/fyne/v2"
|
||||
"fyne.io/fyne/v2/theme"
|
||||
"fyne.io/fyne/v2/widget"
|
||||
)
|
||||
|
||||
func (m *mainWindow) initializeSwitcherDesktop() fyne.CanvasObject {
|
||||
m.logger.Debug("Initializing desktop switcher...")
|
||||
|
||||
btn := widget.NewButtonWithIcon(
|
||||
"",
|
||||
m.app.Fyne().Settings().Theme().Icon(theme.IconNameMenu),
|
||||
m.desktopSwitcherButtonTapped,
|
||||
)
|
||||
|
||||
return btn
|
||||
}
|
||||
|
||||
func (m *mainWindow) desktopSwitcherButtonTapped() {
|
||||
m.logger.Debug("Showing desktop switcher...")
|
||||
|
||||
popup := widget.NewPopUp(widget.NewLabel("All hail switcher!"), m.window.Canvas())
|
||||
popup.ShowAtRelativePosition(fyne.NewPos(0, 0), m.window.Content())
|
||||
}
|
@@ -0,0 +1,5 @@
|
||||
package mainwindow
|
||||
|
||||
func (m *mainWindow) initializeSwitcherMobile() {
|
||||
m.logger.Debug("Initializing mobile switcher...")
|
||||
}
|
18
client/internal/services/core/mainwindow/models/tab.go
Normal file
18
client/internal/services/core/mainwindow/models/tab.go
Normal file
@@ -0,0 +1,18 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
"fyne.io/fyne/v2"
|
||||
"fyne.io/fyne/v2/canvas"
|
||||
)
|
||||
|
||||
// Tab is an internal representation of main window's tab that is responsible for showing content.
|
||||
type Tab struct {
|
||||
// Name is a name for tab. Won't render by default on desktop, only on mouse hover, but will be rendered on mobiles.
|
||||
Name string
|
||||
// Widget is a widget shown in window.
|
||||
Widget fyne.CanvasObject
|
||||
// Icon is an icon to show on tab.
|
||||
Icon canvas.Image
|
||||
// BadgeCount is a number to show on tab, like unread messages, incompleted tasks, etc.
|
||||
BadgeCount uint16
|
||||
}
|
@@ -1,14 +1,8 @@
|
||||
package mainwindow
|
||||
|
||||
import (
|
||||
"fyne.io/fyne/v2/container"
|
||||
"fyne.io/fyne/v2/lang"
|
||||
"bunker/client/internal/services/core/mainwindow/dto"
|
||||
)
|
||||
|
||||
func (m *mainWindow) AddTab(tab *container.TabItem) {
|
||||
if len(m.tabs.Items) == 1 && m.tabs.Items[0].Text == lang.L("window.lorem_ipsum.tab_name") {
|
||||
m.tabs.Remove(m.tabs.Items[0])
|
||||
}
|
||||
|
||||
m.tabs.Append(tab)
|
||||
func (m *mainWindow) AddTab(tab *dto.Tab) {
|
||||
}
|
||||
|
Reference in New Issue
Block a user