Basic GUI client, login dialog, various comments fixes after copypaste.
Some checks failed
Linting and tests / Linting (push) Failing after 6s

This commit is contained in:
2025-09-13 09:23:47 +05:00
parent 91bc3acb08
commit 0c37f46b53
24 changed files with 507 additions and 56 deletions

View 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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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()
}
}

View File

@@ -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.")
}

View File

@@ -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())
}

View File

@@ -0,0 +1,5 @@
package mainwindow
func (m *mainWindow) initializeSwitcherMobile() {
m.logger.Debug("Initializing mobile switcher...")
}

View 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
}

View File

@@ -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) {
}