package main import ( "fmt" "github.com/TheCreeper/go-notify" "github.com/delucks/go-subsonic" "github.com/diamondburned/gotk4/pkg/gtk/v4" "github.com/zalando/go-keyring" // "github.com/diamondburned/gotk4/pkg/gdk/v4" "github.com/diamondburned/gotk4/pkg/core/glib" ) func SetUpGui() { SettingsTabUserUsernameEntry = gtk.NewEntry() SettingsTabUserServerEntry = gtk.NewEntry() SettingsTabUserDeviceNameEntry = gtk.NewEntry() SettingsTabUserPasswordEntry = gtk.NewEntry() SettingsTabUserStatusLabel = gtk.NewLabel("- ") SearchTabSearchEntry = gtk.NewSearchEntry() SearchTabSongCheckButton = gtk.NewCheckButton() SearchTabAlbumCheckButton = gtk.NewCheckButton() SearchTabArtistCheckButton = gtk.NewCheckButton() SearchListBoxResult = gtk.NewListBox() MainSongTitleLabel = gtk.NewLabel(":") MainArtistLabel = gtk.NewLabel(":") MainAlbumLabel = gtk.NewLabel(":") MainTimeDrawnLabel = gtk.NewLabel(":") MainTimeLeft = gtk.NewLabel(":") MainTotalTimeLabel = gtk.NewLabel(":") SettingsTabAppDeleteSwitch = gtk.NewSwitch() MainAdjustment = gtk.NewAdjustment(float64(0), float64(0), float64(1), float64(1), float64(10), float64(0)) SettingsTabAppCodecComboBoxTest = gtk.NewComboBoxText() QueueListBox = gtk.NewListBox() PlayListListBox = gtk.NewListBox() MainAlbumCover = gtk.NewImage() MainPlayPauseButton = gtk.NewButton() // gtk.NewLabel("▶") MainSubtitlesTextView = gtk.NewTextView() MainNotebook = gtk.NewNotebook() LibraryNotebook = gtk.NewNotebook() QueueListBoxLibrary = gtk.NewListBox() SettingsTabAppCoverSizeEntry = gtk.NewEntry() SettingsTabAppCoverSizeEntry = gtk.NewEntry() SettingsTabAppBlurRadiusEntry = gtk.NewEntry() SettingsTabAppBufferSizeEntry = gtk.NewEntry() SettingsTabAppStreamingProxySwitch = gtk.NewSwitch() SettingsTabAppStreamingProxyEntry = gtk.NewEntry() SettingsTabAppAuthStreamingProxySwitch = gtk.NewSwitch() SettingsTabAppStreamingProxyUsernameEntry = gtk.NewEntry() SettingsTabAppStreamingProxyPassEntry = gtk.NewEntry() SettingsTabAppMetadataProxySwitch = gtk.NewSwitch() SettingsTabAppMetadataProxyEntry = gtk.NewEntry() SettingsTabAppAuthMetadataProxySwitch = gtk.NewSwitch() SettingsTabAppMetadataProxyUsernameEntry = gtk.NewEntry() SettingsTabAppMetadataProxyPassEntry = gtk.NewEntry() MainNotebook = gtk.NewNotebook() LyricsNotebook = gtk.NewNotebook() MainFlowbox = gtk.NewFlowBox() LyricsScrolledWindow := gtk.NewScrolledWindow() MainFlowBoxChild1 = gtk.NewFlowBoxChild() MainFlowBoxChild2 = gtk.NewFlowBoxChild() MainGridFlowBoxChild2 = gtk.NewGrid() MainGridFlowBoxChild2Grid = gtk.NewGrid() MainLeftSeparator = gtk.NewSeparator(gtk.OrientationHorizontal) MainRightSeparator = gtk.NewSeparator(gtk.OrientationHorizontal) MainFlowBoxChild3 = gtk.NewFlowBoxChild() MainAdjustment.SetUpper(100) MainAdjustment.SetStepIncrement(1) MainAdjustment.SetPageIncrement(10) MainScale = gtk.NewScale(gtk.OrientationHorizontal, MainAdjustment) MainScaleGrid := gtk.NewGrid() MainFlowBoxChild4 = gtk.NewFlowBoxChild() MainGridFlowBoxChild4 = gtk.NewGrid() MainPreviousButton = gtk.NewButton() MainNextButton = gtk.NewButton() MainRepeatButton = gtk.NewButton() MainStarredButton = gtk.NewButton() QueueMasterBox = gtk.NewBox(gtk.OrientationVertical, 2) QueueSearchControlBox = gtk.NewGrid() QueueScrolledWindow = gtk.NewScrolledWindow() QueueSaveButton = gtk.NewButton() // QueueClearButton = gtk.NewButton() // QueueShuffleButton = gtk.NewButton() // SearchControlBox = gtk.NewGrid() QueueFlowBox := gtk.NewFlowBox() QueueFlowBoxChild1 = gtk.NewFlowBoxChild() LibraryFlowBox1 = gtk.NewFlowBox() LibraryFlowBox2 = gtk.NewFlowBox() LibraryFlowBox3 = gtk.NewFlowBox() LibraryFlowBox4 = gtk.NewFlowBox() LibraryPlaylistMainBox = gtk.NewBox(gtk.OrientationVertical, 0) LibraryStarredMainBox = gtk.NewBox(gtk.OrientationVertical, 0) LibraryLibraryMainBox = gtk.NewBox(gtk.OrientationVertical, 0) LibraryPodcastMainBox = gtk.NewBox(gtk.OrientationVertical, 0) LibraryFlowBox1Child1 = gtk.NewFlowBoxChild() LibraryFlowBox2Child1 = gtk.NewFlowBoxChild() LibraryFlowBox3Child1 = gtk.NewFlowBoxChild() LibraryFlowBox4Child1 = gtk.NewFlowBoxChild() LibraryPlaylistMainControlGrid = gtk.NewGrid() LibraryStarredMainControlGrid = gtk.NewGrid() LibraryLibraryMainControlGrid = gtk.NewGrid() LibraryPodcastMainControlGrid = gtk.NewGrid() LibraryPlaylistBackButton = gtk.NewButton() LibraryPlaylistRefreshButton = gtk.NewButton() LibraryStarredBackButton = gtk.NewButton() LibraryStarredRefreshButton = gtk.NewButton() LibraryLibraryBackButton = gtk.NewButton() LibraryLibraryRefreshButton = gtk.NewButton() LibraryPodcastBackButton = gtk.NewButton() LibraryPodcastRefreshButton = gtk.NewButton() LibraryStarredListBox = gtk.NewListBox() LibraryPodcastListBox = gtk.NewListBox() LibraryPlaylistMainScrolledWindow = gtk.NewScrolledWindow() LibraryPodcastListBoxScrolledWindow = gtk.NewScrolledWindow() LibraryStarredListBoxScrolledWindow = gtk.NewScrolledWindow() QueueListBoxLibraryScrolledWindow = gtk.NewScrolledWindow() SettingsAccountScrolledWindow = gtk.NewScrolledWindow() SettingsAppScrolledWindow = gtk.NewScrolledWindow() SettingsCreditsScrolledWindow = gtk.NewScrolledWindow() SettingsAccountsFlowBox = gtk.NewFlowBox() SettingsAppFlowBox = gtk.NewFlowBox() SettingsCreditsFlowBox = gtk.NewFlowBox() SettingsAccountFlowboxChild1 = gtk.NewFlowBoxChild() SettingsAccountFlowboxChild2 = gtk.NewFlowBoxChild() SettingsNotebook = gtk.NewNotebook() SettingsAccountBox = gtk.NewBox(gtk.OrientationVertical, 3) SettingsAccountLoginGrid = gtk.NewGrid() SettingsAccountButtonsGrid = gtk.NewGrid() SettingsAccountUserListbox = gtk.NewListBox() SettingsAccountUsernameLabel = gtk.NewLabel("Username: ") SettingsAccountPasswordLabel = gtk.NewLabel("Password: ") SettingsAccountPLayerNameLabel = gtk.NewLabel("Player Name: ") SettingsAccountServerLabel = gtk.NewLabel("Server: ") SettingsAccountTestButton = gtk.NewButton() SettingsAccountSaveButton = gtk.NewButton() SettingsAccountLoadButton = gtk.NewButton() SettingsAppScrolledWindow = gtk.NewScrolledWindow() SettingsAppFlowBoxChild1 = gtk.NewFlowBoxChild() SettingsAppFlowBoxChild2 = gtk.NewFlowBoxChild() SettingsAppFlowBoxChild3 = gtk.NewFlowBoxChild() SettingsAppFlowBoxChild4 = gtk.NewFlowBoxChild() SettingsAppGrid1 = gtk.NewGrid() SettingsAppGrid2 = gtk.NewGrid() SettingsAppGrid3 = gtk.NewGrid() SettingsAppGrid4 = gtk.NewGrid() SettingsTabAppBitrateEntry = gtk.NewEntry() SettingsAppLabelGrid1 = gtk.NewLabel("Local") SettingsAppLabelGrid2 = gtk.NewLabel("Transcoding") SettingsAppLabelGrid3 = gtk.NewLabel("Net") SettingsAppLabelGrid1DeleteOnClose = gtk.NewLabel("Clear cache on close") SettingsAppLabelGrid1CoverSideSize = gtk.NewLabel("Cover Side Size (px)") SettingsAppLabelGrid1BackgroundBlurRadius = gtk.NewLabel("Cover blur radius") SettingsTabAppHideHeaderBarSwitch = gtk.NewSwitch() SettingsAppLabelHideHeaderBar = gtk.NewLabel("Hide Headerbar") SettingsAppLabelGrid2Codec = gtk.NewLabel("Codec") SettingsAppLabelGrid2Bitrate = gtk.NewLabel("Bitrate") SettingsAppLabelGrid2DownloadBufferSize = gtk.NewLabel("Download Buffer Size") SettingsAppLabelGrid3UseProxyForStreaming = gtk.NewLabel("Use proxy for streaming") SettingsAppLabelGrid3AuthenticateStreamingProxy = gtk.NewLabel("Authenticate") SettingsAppLabelGrid3UseProxyForMetadata = gtk.NewLabel("User proxy for Metadata") SettingsAppLabelGrid3AuthenticateMetadataProxy = gtk.NewLabel("Authenticate") SettingsAppLabelGrid4 = gtk.NewLabel("External Services") SettingsAppLabelGrid4Metadata = gtk.NewLabel("Metadata") SettingsTabAppMetadataComboBoxTest = gtk.NewComboBoxText() SearchFlowBox := gtk.NewFlowBox() SearchMasterBox = gtk.NewBox(gtk.OrientationVertical, 0) SearchFlowBoxChild1 = gtk.NewFlowBoxChild() SearchScrolledWindow = gtk.NewScrolledWindow() // BELOW // Main Notebook MainNotebook.SetTabPos(gtk.PosBottom) MainWindow.SetChild(MainNotebook) // Home page MainFlowbox.SetOrientation(gtk.OrientationVertical) MainNotebook.AppendPage(LyricsNotebook, gtk.NewLabel("⌂")) LyricsNotebook.AppendPage(MainFlowbox, gtk.NewLabel("⌂")) LyricsNotebook.AppendPage(LyricsScrolledWindow, gtk.NewLabel("♪")) MainFlowBoxChild1.SetChild(MainAlbumCover) MainFlowBoxChild2.SetChild(MainGridFlowBoxChild2) MainGridFlowBoxChild2.Attach(MainSongTitleLabel, 0, 0, 1, 1) MainGridFlowBoxChild2.Attach(MainArtistLabel, 0, 1, 1, 1) MainGridFlowBoxChild2.Attach(MainAlbumLabel, 0, 2, 1, 1) MainGridFlowBoxChild2.Attach(MainGridFlowBoxChild2Grid, 0, 3, 1, 1) // MainGridFlowBoxChild2Grid.Attach(MainTimeDrawnLabel, 0, 0, 1, 1) MainGridFlowBoxChild2Grid.Attach(MainLeftSeparator, 1, 0, 1, 1) // MainGridFlowBoxChild2Grid.Attach(MainTotalTimeLabel, 2, 0, 1, 1) MainGridFlowBoxChild2Grid.Attach(MainRightSeparator, 3, 0, 1, 1) // MainGridFlowBoxChild2Grid.Attach(MainTimeLeft, 4, 0, 1, 1) MainFlowBoxChild3.SetChild(MainScaleGrid) MainFlowBoxChild4.SetChild(MainGridFlowBoxChild4) MainFlowbox.SetMaxChildrenPerLine(2) MainFlowbox.SetMinChildrenPerLine(0) MainPreviousButton.SetChild(gtk.NewLabel("◀◀")) MainNextButton.SetChild(gtk.NewLabel("▶▶")) MainRepeatButton.SetChild(gtk.NewLabel("⟳")) MainStarredButton.SetChild(gtk.NewLabel("☆")) MainGridFlowBoxChild4.Attach(MainPreviousButton, 1, 0, 1, 1) MainGridFlowBoxChild4.Attach(MainPlayPauseButton, 2, 0, 1, 1) MainGridFlowBoxChild4.Attach(MainNextButton, 3, 0, 1, 1) MainGridFlowBoxChild4.Attach(MainRepeatButton, 0, 0, 1, 1) MainGridFlowBoxChild4.Attach(MainStarredButton, 4, 0, 1, 1) MainFlowbox.SetOrientation(gtk.OrientationHorizontal) MainFlowbox.Insert(MainFlowBoxChild1, 0) MainFlowbox.Insert(MainFlowBoxChild2, 1) MainFlowbox.Insert(MainFlowBoxChild3, 2) MainFlowbox.Insert(MainFlowBoxChild4, 3) MainFlowbox.SetVAlign(gtk.AlignFill) MainFlowbox.SetHAlign(gtk.AlignFill) MainScale.SetHExpand(true) MainScale.SetShowFillLevel(true) MainScale.SetDrawValue(false) MainScale.SetSizeRequest(294, 1) // MainAdjustment.SetUpper(100) // MainAdjustment.SetStepIncrement(float64(1.0)) // MainAdjustment.SetPageIncrement(float64(10.0)) MainAlbumCover.SetSizeRequest(300, 300) MainAlbumCover.SetHAlign(gtk.AlignFill) MainAlbumCover.SetVAlign(gtk.AlignFill) MainGridFlowBoxChild2.SetHAlign(gtk.AlignCenter) MainGridFlowBoxChild2.SetVAlign(gtk.AlignCenter) MainGridFlowBoxChild2Grid.SetHAlign(gtk.AlignCenter) MainGridFlowBoxChild2Grid.SetVAlign(gtk.AlignCenter) MainLeftSeparator.SetHExpand(true) MainRightSeparator.SetVExpand(true) MainLeftSeparator.SetOpacity(0.0) MainRightSeparator.SetOpacity(0.0) MainLeftSeparator.SetSizeRequest(90, 0) MainRightSeparator.SetSizeRequest(90, 0) MainGridFlowBoxChild4.SetHAlign(gtk.AlignCenter) MainGridFlowBoxChild4.SetVAlign(gtk.AlignCenter) MainScale.SetShowFillLevel(true) MainScaleGrid.Attach(MainScale, 0, 1, 3, 1) MainScaleGrid.Attach(MainTimeDrawnLabel, 0, 0, 1, 1) MainScaleGrid.Attach(MainTotalTimeLabel, 1, 0, 1, 1) MainScaleGrid.Attach(MainTimeLeft, 2, 0, 1, 1) MainFlowbox.SetSelectionMode(gtk.SelectionNone) MainPlayPauseButton.SetLabel("▶") // MainAdjustment // Queue page MainNotebook.AppendPage(QueueFlowBox, gtk.NewLabel("☰")) QueueFlowBox.SetSelectionMode(gtk.SelectionNone) QueueMasterBox.Append(QueueSearchControlBox) QueueMasterBox.Append(QueueScrolledWindow) QueueScrolledWindow.SetChild(QueueListBox) QueueSearchControlBox.Attach(QueueSaveButton, 0, 0, 1, 1) QueueSearchControlBox.Attach(QueueClearButton, 1, 0, 1, 1) QueueSearchControlBox.Attach(QueueShuffleButton, 2, 0, 1, 1) QueueSaveButton.SetChild(gtk.NewLabel("↧")) QueueClearButton.SetChild(gtk.NewLabel("✘")) QueueShuffleButton.SetChild(gtk.NewLabel("shuffle")) QueueFlowBox.SetOrientation(gtk.OrientationVertical) QueueFlowBox.Insert(QueueFlowBoxChild1, 0) QueueFlowBoxChild1.SetChild(QueueMasterBox) QueueSearchControlBox.SetHAlign(gtk.AlignEnd) QueueSearchControlBox.SetVAlign(gtk.AlignFill) QueueFlowBox.SetMaxChildrenPerLine(1) QueueFlowBox.SetMinChildrenPerLine(0) QueueListBox.SetSelectionMode(gtk.SelectionSingle) QueueFlowBox.SetHAlign(gtk.AlignFill) QueueFlowBox.SetVAlign(gtk.AlignFill) QueueFlowBox.SetHExpand(true) QueueFlowBox.SetVExpand(true) QueueScrolledWindow.SetHExpand(true) QueueScrolledWindow.SetVExpand(true) QueueScrolledWindow.SetVAlign(gtk.AlignFill) QueueScrolledWindow.SetHAlign(gtk.AlignFill) // Search page MainNotebook.AppendPage(SearchFlowBox, gtk.NewLabel("⌕")) SearchFlowBox.SetSelectionMode(gtk.SelectionNone) SearchMasterBox.Append(SearchControlBox) SearchControlBox.Attach(SearchTabAlbumCheckButton, 1, 1, 1, 1) SearchControlBox.Attach(SearchTabSongCheckButton, 0, 1, 1, 1) SearchControlBox.Attach(SearchTabArtistCheckButton, 2, 1, 1, 1) SearchControlBox.Attach(SearchTabSearchEntry, 0, 0, 2, 1) SearchMasterBox.Append(SearchScrolledWindow) SearchFlowBoxChild1.SetChild(SearchMasterBox) SearchScrolledWindow.SetChild(SearchListBoxResult) SearchFlowBox.Insert(SearchFlowBoxChild1, 0) SearchFlowBox.SetOrientation(gtk.OrientationVertical) SearchFlowBoxChild1.SetHAlign(gtk.AlignFill) SearchFlowBoxChild1.SetVAlign(gtk.AlignFill) SearchFlowBox.SetHAlign(gtk.AlignFill) SearchFlowBox.SetVAlign(gtk.AlignFill) SearchFlowBox.SetMaxChildrenPerLine(1) SearchFlowBox.SetMinChildrenPerLine(0) SearchListBoxResult.SetHExpand(true) SearchListBoxResult.SetVExpand(true) SearchListBoxResult.SetHAlign(gtk.AlignFill) SearchListBoxResult.SetVAlign(gtk.AlignFill) SearchFlowBoxChild1.SetHExpand(true) SearchFlowBoxChild1.SetVExpand(true) SearchFlowBox.SetHExpand(true) SearchFlowBox.SetVExpand(true) SearchFlowBox.SetVAlign(gtk.AlignFill) SearchFlowBox.SetHAlign(gtk.AlignFill) SearchControlBox.SetHAlign(gtk.AlignCenter) SearchControlBox.SetVAlign(gtk.AlignCenter) SearchTabSongCheckButton.SetActive(true) SearchTabSongCheckButton.SetLabel("Songs") SearchTabArtistCheckButton.SetLabel("Artists") SearchTabAlbumCheckButton.SetLabel("Albums") // Library page MainNotebook.AppendPage(LibraryNotebook, gtk.NewLabel("||\\")) LibraryNotebook.AppendPage(LibraryFlowBox1, gtk.NewLabel("playlists")) LibraryNotebook.AppendPage(LibraryFlowBox2, gtk.NewLabel("☆")) LibraryNotebook.AppendPage(LibraryFlowBox3, gtk.NewLabel("||\\")) LibraryNotebook.AppendPage(LibraryFlowBox4, gtk.NewLabel("podcasts")) LibraryFlowBox1.Insert(LibraryFlowBox1Child1, 0) LibraryFlowBox2.Insert(LibraryFlowBox2Child1, 0) LibraryFlowBox3.Insert(LibraryFlowBox3Child1, 0) LibraryFlowBox4.Insert(LibraryFlowBox4Child1, 0) LibraryFlowBox1.SetSelectionMode(gtk.SelectionNone) LibraryFlowBox2.SetSelectionMode(gtk.SelectionNone) LibraryFlowBox3.SetSelectionMode(gtk.SelectionNone) LibraryFlowBox4.SetSelectionMode(gtk.SelectionNone) LibraryFlowBox1Child1.SetChild(LibraryPlaylistMainBox) LibraryFlowBox2Child1.SetChild(LibraryStarredMainBox) LibraryFlowBox3Child1.SetChild(LibraryLibraryMainBox) LibraryFlowBox4Child1.SetChild(LibraryPodcastMainBox) LibraryPlaylistMainBox.Append(LibraryPlaylistMainControlGrid) LibraryStarredMainBox.Append(LibraryStarredMainControlGrid) LibraryLibraryMainBox.Append(LibraryLibraryMainControlGrid) LibraryPodcastMainBox.Append(LibraryPodcastMainControlGrid) LibraryPlaylistMainControlGrid.Attach(LibraryPlaylistBackButton, 0, 0, 1, 1) LibraryPlaylistMainControlGrid.Attach(LibraryPlaylistRefreshButton, 1, 0, 1, 1) LibraryPlaylistBackButton.SetLabel("↵") LibraryPlaylistRefreshButton.SetLabel("⟳") LibraryPlaylistMainScrolledWindow.SetHExpand(true) LibraryPlaylistMainScrolledWindow.SetVExpand(true) LibraryPlaylistMainScrolledWindow.SetVAlign(gtk.AlignFill) LibraryPlaylistMainScrolledWindow.SetHAlign(gtk.AlignFill) LibraryPlaylistMainScrolledWindow.SetChild(PlayListListBox) LibraryPlaylistMainBox.Append(LibraryPlaylistMainScrolledWindow) LibraryStarredMainControlGrid.Attach(LibraryStarredBackButton, 0, 0, 1, 1) LibraryStarredMainControlGrid.Attach(LibraryStarredRefreshButton, 1, 0, 1, 1) LibraryStarredBackButton.SetLabel("↵") LibraryStarredRefreshButton.SetLabel("⟳") LibraryStarredListBoxScrolledWindow.SetHExpand(true) LibraryStarredListBoxScrolledWindow.SetVExpand(true) LibraryStarredListBoxScrolledWindow.SetVAlign(gtk.AlignFill) LibraryStarredListBoxScrolledWindow.SetHAlign(gtk.AlignFill) LibraryStarredListBoxScrolledWindow.SetChild(LibraryStarredListBox) LibraryStarredMainBox.Append(LibraryStarredListBoxScrolledWindow) LibraryLibraryMainControlGrid.Attach(LibraryLibraryBackButton, 0, 0, 1, 1) LibraryLibraryMainControlGrid.Attach(LibraryLibraryRefreshButton, 1, 0, 1, 1) LibraryLibraryBackButton.SetLabel("↵") LibraryLibraryRefreshButton.SetLabel("⟳") QueueListBoxLibraryScrolledWindow.SetHExpand(true) QueueListBoxLibraryScrolledWindow.SetVExpand(true) QueueListBoxLibraryScrolledWindow.SetVAlign(gtk.AlignFill) QueueListBoxLibraryScrolledWindow.SetHAlign(gtk.AlignFill) QueueListBoxLibraryScrolledWindow.SetChild(QueueListBoxLibrary) LibraryLibraryMainBox.Append(QueueListBoxLibraryScrolledWindow) LibraryPodcastMainControlGrid.Attach(LibraryPodcastBackButton, 0, 0, 1, 1) LibraryPodcastMainControlGrid.Attach(LibraryPodcastRefreshButton, 1, 0, 1, 1) LibraryPodcastBackButton.SetLabel("↵") LibraryPodcastRefreshButton.SetLabel("⟳") LibraryPodcastListBoxScrolledWindow.SetHExpand(true) LibraryPodcastListBoxScrolledWindow.SetVExpand(true) LibraryPodcastListBoxScrolledWindow.SetVAlign(gtk.AlignFill) LibraryPodcastListBoxScrolledWindow.SetHAlign(gtk.AlignFill) LibraryPodcastListBoxScrolledWindow.SetChild(LibraryPodcastListBox) LibraryPodcastMainBox.Append(LibraryPodcastListBoxScrolledWindow) LibraryFlowBox1.SetHExpand(true) LibraryFlowBox1.SetVExpand(true) LibraryFlowBox2.SetHExpand(true) LibraryFlowBox2.SetVExpand(true) LibraryFlowBox3.SetHExpand(true) LibraryFlowBox3.SetVExpand(true) LibraryFlowBox4.SetHExpand(true) LibraryFlowBox4.SetVExpand(true) LibraryFlowBox1Child1.SetHAlign(gtk.AlignFill) LibraryFlowBox1Child1.SetVAlign(gtk.AlignFill) LibraryFlowBox2Child1.SetHAlign(gtk.AlignFill) LibraryFlowBox2Child1.SetVAlign(gtk.AlignFill) LibraryFlowBox3Child1.SetHAlign(gtk.AlignFill) LibraryFlowBox3Child1.SetVAlign(gtk.AlignFill) LibraryFlowBox4Child1.SetHAlign(gtk.AlignFill) LibraryFlowBox4Child1.SetVAlign(gtk.AlignFill) LibraryPlaylistMainBox.SetHExpand(true) LibraryStarredMainBox.SetHExpand(true) LibraryLibraryMainBox.SetHExpand(true) LibraryPodcastMainBox.SetHExpand(true) LibraryPlaylistMainBox.SetVExpand(true) LibraryStarredMainBox.SetVExpand(true) LibraryLibraryMainBox.SetVExpand(true) LibraryPodcastMainBox.SetVExpand(true) PlayListListBox.SetVAlign(gtk.AlignFill) LibraryStarredListBox.SetVAlign(gtk.AlignFill) QueueListBoxLibrary.SetVAlign(gtk.AlignFill) LibraryPodcastListBox.SetVAlign(gtk.AlignFill) PlayListListBox.SetHAlign(gtk.AlignFill) LibraryStarredListBox.SetHAlign(gtk.AlignFill) QueueListBoxLibrary.SetHAlign(gtk.AlignFill) LibraryPodcastListBox.SetHAlign(gtk.AlignFill) LibraryPlaylistMainControlGrid.SetHAlign(gtk.AlignEnd) LibraryPlaylistMainControlGrid.SetVAlign(gtk.AlignFill) LibraryStarredMainControlGrid.SetHAlign(gtk.AlignEnd) LibraryStarredMainControlGrid.SetVAlign(gtk.AlignFill) LibraryLibraryMainControlGrid.SetHAlign(gtk.AlignEnd) LibraryLibraryMainControlGrid.SetVAlign(gtk.AlignFill) LibraryPodcastMainControlGrid.SetHAlign(gtk.AlignEnd) LibraryPodcastMainControlGrid.SetVAlign(gtk.AlignFill) LibraryFlowBox1.SetMaxChildrenPerLine(1) LibraryFlowBox1.SetMinChildrenPerLine(0) LibraryFlowBox2.SetMaxChildrenPerLine(1) LibraryFlowBox2.SetMinChildrenPerLine(0) LibraryFlowBox3.SetMaxChildrenPerLine(1) LibraryFlowBox3.SetMinChildrenPerLine(0) LibraryFlowBox4.SetMaxChildrenPerLine(1) LibraryFlowBox4.SetMinChildrenPerLine(0) // Settings page SettingsAccountFlowboxChild1.SetHExpand(true) SettingsAccountFlowboxChild1.SetVExpand(true) SettingsAccountFlowboxChild2.SetHExpand(true) SettingsAccountFlowboxChild2.SetVExpand(true) SettingsAccountUserListbox.SetHExpand(true) SettingsAccountUserListbox.SetVExpand(true) SettingsAccountLoginGrid.SetHExpand(true) SettingsAccountLoginGrid.SetVExpand(true) SettingsAccountUserListbox.SetHExpand(true) SettingsAccountUserListbox.SetVExpand(true) SettingsAccountScrolledWindow.SetChild(SettingsAccountsFlowBox) SettingsAppScrolledWindow.SetChild(SettingsAppFlowBox) SettingsCreditsScrolledWindow.SetChild(SettingsCreditsFlowBox) MainNotebook.AppendPage(SettingsNotebook, gtk.NewLabel("⚙")) SettingsNotebook.AppendPage(SettingsAccountScrolledWindow, gtk.NewLabel("Account")) SettingsNotebook.AppendPage(SettingsAppScrolledWindow, gtk.NewLabel("App")) SettingsNotebook.AppendPage(SettingsCreditsScrolledWindow, gtk.NewLabel("Credits")) SettingsAccountsFlowBox.SetSelectionMode(gtk.SelectionNone) SettingsAppFlowBox.SetSelectionMode(gtk.SelectionNone) SettingsCreditsFlowBox.SetSelectionMode(gtk.SelectionNone) SettingsAccountsFlowBox.SetMaxChildrenPerLine(1) SettingsAccountsFlowBox.SetMinChildrenPerLine(0) SettingsAccountsFlowBox.SetHAlign(gtk.AlignFill) SettingsAccountsFlowBox.SetVAlign(gtk.AlignFill) SettingsAccountFlowboxChild1.SetVAlign(gtk.AlignFill) SettingsAccountFlowboxChild1.SetHAlign(gtk.AlignCenter) SettingsAccountFlowboxChild2.SetHExpand(true) SettingsAccountTestButton.SetLabel("Test") SettingsAccountSaveButton.SetLabel("Save") SettingsAccountLoadButton.SetLabel("Load") SettingsAppFlowBox.SetMaxChildrenPerLine(1) SettingsAppFlowBox.SetMinChildrenPerLine(0) SettingsCreditsFlowBox.SetMaxChildrenPerLine(1) SettingsCreditsFlowBox.SetMinChildrenPerLine(0) SettingsAccountBox.Append(SettingsAccountLoginGrid) SettingsAccountBox.Append(SettingsAccountButtonsGrid) SettingsAccountFlowboxChild1.SetChild(SettingsAccountBox) SettingsAccountFlowboxChild2.SetChild(SettingsAccountUserListbox) SettingsAccountsFlowBox.Insert(SettingsAccountFlowboxChild1, 0) SettingsAccountsFlowBox.Insert(SettingsAccountFlowboxChild2, 1) SettingsAccountLoginGrid.Attach(SettingsTabUserUsernameEntry, 1, 0, 1, 1) SettingsAccountLoginGrid.Attach(SettingsTabUserPasswordEntry, 1, 1, 1, 1) SettingsAccountLoginGrid.Attach(SettingsTabUserDeviceNameEntry, 1, 2, 1, 1) SettingsAccountLoginGrid.Attach(SettingsTabUserServerEntry, 1, 3, 1, 1) SettingsAccountLoginGrid.Attach(SettingsAccountUsernameLabel, 0, 0, 1, 1) SettingsAccountLoginGrid.Attach(SettingsAccountPasswordLabel, 0, 1, 1, 1) SettingsAccountLoginGrid.Attach(SettingsAccountPLayerNameLabel, 0, 2, 1, 1) SettingsAccountLoginGrid.Attach(SettingsAccountServerLabel, 0, 3, 1, 1) SettingsAccountButtonsGrid.Attach(SettingsTabUserStatusLabel, 0, 0, 1, 1) SettingsAccountButtonsGrid.Attach(SettingsAccountTestButton, 1, 0, 1, 1) SettingsAccountButtonsGrid.Attach(SettingsAccountSaveButton, 2, 0, 1, 1) SettingsAccountButtonsGrid.Attach(SettingsAccountLoadButton, 3, 0, 1, 1) SettingsTabUserPasswordEntry.SetInputPurpose(gtk.InputPurposePassword) SettingsTabUserPasswordEntry.SetInvisibleChar('●') SettingsTabUserPasswordEntry.SetVisibility(false) SettingsTabAppAuthMetadataProxySwitch.SetHAlign(gtk.AlignEnd) SettingsTabAppAuthStreamingProxySwitch.SetHAlign(gtk.AlignEnd) SettingsTabAppDeleteSwitch.SetHAlign(gtk.AlignEnd) SettingsTabAppHideHeaderBarSwitch.SetHAlign(gtk.AlignEnd) SettingsTabAppMetadataProxySwitch.SetHAlign(gtk.AlignEnd) SettingsTabAppStreamingProxySwitch.SetHAlign(gtk.AlignEnd) SettingsTabAppAuthMetadataProxySwitch.SetHExpand(false) SettingsTabAppAuthStreamingProxySwitch.SetHExpand(false) SettingsTabAppDeleteSwitch.SetHExpand(false) SettingsTabAppHideHeaderBarSwitch.SetHExpand(false) SettingsTabAppMetadataProxySwitch.SetHExpand(false) SettingsTabAppStreamingProxySwitch.SetHExpand(false) SettingsAppLabelGrid1DeleteOnClose.SetHAlign(gtk.AlignStart) SettingsAppLabelGrid1CoverSideSize.SetHAlign(gtk.AlignStart) SettingsAppLabelGrid1BackgroundBlurRadius.SetHAlign(gtk.AlignStart) SettingsAppLabelHideHeaderBar.SetHAlign(gtk.AlignStart) SettingsAppLabelGrid2Codec.SetHAlign(gtk.AlignStart) SettingsAppLabelGrid2Bitrate.SetHAlign(gtk.AlignStart) SettingsAppLabelGrid2DownloadBufferSize.SetHAlign(gtk.AlignStart) SettingsAppLabelGrid3UseProxyForStreaming.SetHAlign(gtk.AlignStart) SettingsAppLabelGrid3UseProxyForMetadata.SetHAlign(gtk.AlignStart) SettingsAppLabelGrid3AuthenticateMetadataProxy.SetHAlign(gtk.AlignStart) SettingsAppLabelGrid3AuthenticateStreamingProxy.SetHAlign(gtk.AlignStart) SettingsAppLabelGrid4Metadata.SetHAlign(gtk.AlignStart) SettingsAppLabelGrid1DeleteOnClose.SetHExpand(true) SettingsAppLabelGrid1CoverSideSize.SetHExpand(true) SettingsAppLabelGrid1BackgroundBlurRadius.SetHExpand(true) SettingsAppLabelHideHeaderBar.SetHExpand(true) SettingsAppLabelGrid2Codec.SetHExpand(true) SettingsAppLabelGrid2Bitrate.SetHExpand(true) SettingsAppLabelGrid2DownloadBufferSize.SetHExpand(true) SettingsAppLabelGrid3UseProxyForStreaming.SetHExpand(true) SettingsAppLabelGrid3UseProxyForMetadata.SetHExpand(true) SettingsAppLabelGrid3AuthenticateMetadataProxy.SetHExpand(true) SettingsAppLabelGrid3AuthenticateStreamingProxy.SetHExpand(true) SettingsAppLabelGrid4Metadata.SetHExpand(true) SettingsAppFlowBox.Insert(SettingsAppFlowBoxChild1, 0) SettingsAppFlowBox.Insert(SettingsAppFlowBoxChild2, 1) SettingsAppFlowBox.Insert(SettingsAppFlowBoxChild4, 2) SettingsAppFlowBox.Insert(SettingsAppFlowBoxChild3, 3) SettingsAppFlowBoxChild1.SetChild(SettingsAppGrid1) SettingsAppFlowBoxChild2.SetChild(SettingsAppGrid2) SettingsAppFlowBoxChild3.SetChild(SettingsAppGrid3) SettingsAppFlowBoxChild4.SetChild(SettingsAppGrid4) SettingsAppGrid1.Attach(SettingsAppLabelGrid1, 0, 0, 2, 1) SettingsAppGrid1.Attach(SettingsAppLabelGrid1DeleteOnClose, 0, 1, 1, 1) SettingsAppGrid1.Attach(SettingsAppLabelGrid1CoverSideSize, 0, 2, 1, 1) SettingsAppGrid1.Attach(SettingsAppLabelGrid1BackgroundBlurRadius, 0, 3, 1, 1) SettingsAppGrid1.Attach(SettingsTabAppDeleteSwitch, 1, 1, 1, 1) SettingsAppGrid1.Attach(SettingsTabAppCoverSizeEntry, 1, 2, 1, 1) SettingsAppGrid1.Attach(SettingsTabAppBlurRadiusEntry, 1, 3, 1, 1) SettingsAppGrid1.Attach(SettingsAppLabelHideHeaderBar, 0, 4, 1, 1) SettingsAppGrid1.Attach(SettingsTabAppHideHeaderBarSwitch, 1, 4, 1, 1) SettingsAppGrid2.Attach(SettingsAppLabelGrid2, 0, 0, 2, 1) SettingsAppGrid2.Attach(SettingsAppLabelGrid2Codec, 0, 1, 1, 1) SettingsAppGrid2.Attach(SettingsAppLabelGrid2Bitrate, 0, 2, 1, 1) SettingsAppGrid2.Attach(SettingsAppLabelGrid2DownloadBufferSize, 0, 3, 1, 1) SettingsAppGrid2.Attach(SettingsTabAppCodecComboBoxTest, 1, 1, 1, 1) SettingsAppGrid2.Attach(SettingsTabAppBitrateEntry, 1, 2, 1, 1) SettingsAppGrid2.Attach(SettingsTabAppBufferSizeEntry, 1, 3, 1, 1) SettingsAppGrid3.Attach(SettingsAppLabelGrid3, 0, 0, 2, 1) SettingsAppGrid3.Attach(SettingsTabAppStreamingProxySwitch, 1, 1, 1, 1) SettingsAppGrid3.Attach(SettingsAppLabelGrid3UseProxyForStreaming, 0, 1, 1, 1) SettingsAppGrid3.Attach(SettingsTabAppStreamingProxyEntry, 0, 2, 2, 1) SettingsAppGrid3.Attach(SettingsAppLabelGrid3AuthenticateStreamingProxy, 0, 3, 1, 1) SettingsAppGrid3.Attach(SettingsTabAppAuthStreamingProxySwitch, 1, 3, 1, 1) SettingsAppGrid3.Attach(SettingsTabAppStreamingProxyUsernameEntry, 0, 4, 1, 1) SettingsAppGrid3.Attach(SettingsTabAppStreamingProxyPassEntry, 1, 4, 1, 1) SettingsTabAppMetadataComboBoxTest.InsertText(0, "None") SettingsTabAppMetadataComboBoxTest.InsertText(1, "Server") SettingsTabAppMetadataComboBoxTest.InsertText(2, "Sonically") SettingsAppGrid4.Attach(SettingsAppLabelGrid4, 0, 0, 2, 1) SettingsAppGrid4.Attach(SettingsAppLabelGrid4Metadata, 0, 1, 1, 1) SettingsAppGrid4.Attach(SettingsTabAppMetadataComboBoxTest, 1, 1, 1, 1) SettingsAppGrid4.Attach(SettingsAppLabelGrid3UseProxyForMetadata, 0, 2, 1, 1) SettingsAppGrid4.Attach(SettingsTabAppMetadataProxySwitch, 1, 2, 1, 1) SettingsAppGrid4.Attach(SettingsTabAppMetadataProxyEntry, 0, 3, 2, 1) SettingsAppGrid4.Attach(SettingsAppLabelGrid3AuthenticateMetadataProxy, 0, 4, 1, 1) SettingsAppGrid4.Attach(SettingsTabAppAuthMetadataProxySwitch, 1, 4, 1, 1) SettingsAppGrid4.Attach(SettingsTabAppMetadataProxyUsernameEntry, 0, 5, 1, 1) SettingsAppGrid4.Attach(SettingsTabAppMetadataProxyPassEntry, 1, 5, 1, 1) SettingsCreditsFlowBoxChild1 = gtk.NewFlowBoxChild() SettingsCreditsLabel1 = gtk.NewLabel("") // "Website: https://git.itmodulo.eu/LinuxOnMobile/Sonically \nIssue Tracker: https://codeberg.org/LinuxOnMobile/Sonically/issues \nLicense: GPL3.0 \nAuthor: https://itmodulo.eu/" SettingsCreditsFlowBox.Insert(SettingsCreditsFlowBoxChild1, 0) SettingsCreditsFlowBoxChild1.SetChild(SettingsCreditsLabel1) SettingsTabAppCodecComboBoxTest.InsertText(0, "opus") SettingsTabAppCodecComboBoxTest.InsertText(1, "flac") SettingsTabAppCodecComboBoxTest.InsertText(2, "ogg") SettingsTabAppCodecComboBoxTest.InsertText(3, "mp3") SettingsTabUserUsernameEntry.SetPlaceholderText("Sonic user") SettingsTabUserServerEntry.SetPlaceholderText("https://my-sonic.server") SettingsTabUserDeviceNameEntry.SetPlaceholderText("Sonically") SettingsTabUserPasswordEntry.SetPlaceholderText("●●●●●●●●●●") SettingsTabAppCoverSizeEntry.SetPlaceholderText("600") SettingsTabAppBlurRadiusEntry.SetPlaceholderText("12") SettingsTabAppBitrateEntry.SetPlaceholderText("128") SettingsTabAppBufferSizeEntry.SetPlaceholderText("4096") SettingsTabAppStreamingProxyEntry.SetPlaceholderText("https://my-proxy.server") SettingsTabAppStreamingProxyUsernameEntry.SetPlaceholderText("Proxy username") SettingsTabAppStreamingProxyPassEntry.SetPlaceholderText("●●●●●●●●●●") SettingsTabAppMetadataProxyEntry.SetPlaceholderText("socks5://my-proxy.server") SettingsTabAppMetadataProxyUsernameEntry.SetPlaceholderText("Proxy username") SettingsTabAppMetadataProxyPassEntry.SetPlaceholderText("●●●●●●●●●●") SettingsTabAppStreamingProxyPassEntry.SetInputPurpose(gtk.InputPurposePassword) SettingsTabAppStreamingProxyPassEntry.SetInvisibleChar('●') SettingsTabAppStreamingProxyPassEntry.SetVisibility(false) SettingsTabAppMetadataProxyPassEntry.SetInputPurpose(gtk.InputPurposePassword) SettingsTabAppMetadataProxyPassEntry.SetInvisibleChar('●') SettingsTabAppMetadataProxyPassEntry.SetVisibility(false) // SettingsTabAppCodecComboBoxTest.AddAttribute(gtk.CellRendererFocused) // Signals MainPlayPauseButton.ConnectClicked(MainPlayPauseButtonClicked) MainPreviousButton.ConnectClicked(MainPreviousButtonClicked) MainNextButton.ConnectClicked(MainNextButtonClicked) QueueClearButton.ConnectClicked(ClearQueue) QueueSaveButton.ConnectClicked(CacheAllQueue) SettingsAccountTestButton.ConnectClicked(TestConnButtonClicked) SettingsAccountSaveButton.ConnectClicked(SettingsTabUserSaveButtonClicked) SearchTabSearchEntry.ConnectSearchChanged(SearchTabSearchButtonClicked) LibraryLibraryBackButton.ConnectClicked(LibraryTabBackButtonClicked) LibraryLibraryRefreshButton.ConnectClicked(LibraryTabRefreshButtonClicked) LibraryPlaylistBackButton.ConnectClicked(LibraryTabLibraryBackButton) LibraryPlaylistRefreshButton.ConnectClicked(LibraryTabLibraryRefreshButton) // MainScale.ConnectValueChanged(ValueChanged) } func CreateImagelessSongListBoxRow(lBox *gtk.ListBox, title string, artist string, duration string, postition int, id string) { MainListboxRow := gtk.NewListBoxRow() MainGrid := gtk.NewGrid() Frame := gtk.NewFrame("") QueueButton := gtk.NewButton() PLaybutton := gtk.NewButton() TitleScrolledWindow := gtk.NewScrolledWindow() ArtistScrolledWindow := gtk.NewScrolledWindow() TitleLabel := gtk.NewLabel(title) ArtistLabel := gtk.NewLabel(artist) DurationLabel := gtk.NewLabel(duration) PLaybutton.SetLabel("▶") QueueButton.SetLabel("☰") MainListboxRow.SetSizeRequest(150, 30) MainGrid.Attach(DurationLabel, 0, 0, 1, 2) MainGrid.Attach(TitleScrolledWindow, 1, 0, 1, 1) MainGrid.Attach(ArtistScrolledWindow, 1, 1, 1, 1) TitleScrolledWindow.SetChild(TitleLabel) ArtistScrolledWindow.SetChild(ArtistLabel) MainGrid.Attach(QueueButton, 2, 0, 1, 2) MainGrid.Attach(PLaybutton, 3, 0, 1, 2) QueueButton.SetSizeRequest(15, 30) PLaybutton.SetSizeRequest(15, 30) DurationLabel.SetSizeRequest(30, 30) DurationLabel.SetHAlign(gtk.AlignCenter) DurationLabel.SetVAlign(gtk.AlignCenter) TitleLabel.SetHAlign(gtk.AlignStart) ArtistLabel.SetHAlign(gtk.AlignStart) TitleLabel.SetSizeRequest(150, 15) ArtistLabel.SetSizeRequest(150, 15) TitleScrolledWindow.SetHExpand(true) ArtistScrolledWindow.SetHExpand(true) // MainListboxRow.SetSizeRequest(300,50) MainListboxRow.SetHAlign(gtk.AlignFill) MainGrid.SetHAlign(gtk.AlignFill) MainListboxRow.SetHExpand(true) MainGrid.SetHExpand(true) TitleScrolledWindow.SetSizeRequest(110, 15) ArtistScrolledWindow.SetSizeRequest(110, 15) QueueButton.SetHAlign(gtk.AlignEnd) PLaybutton.SetHAlign(gtk.AlignEnd) // TitleScrolledWindow.SetHAlign(gtk.AlignStart) // ArtistScrolledWindow.SetHAlign(gtk.AlignStart) // Signals var PlayButtonClicked = func() { var upstream = func() { if !SliceContains(MainQueue, id) { // fmt.Println(len(MainQueue)) // MainQueue.Add(id) MainQueue = append(MainQueue, id) // fmt.Println(MainQueue.Size()) // fmt.Println(MainQueue) NowPlayingIndex = SliceIndexOf(MainQueue, id) go StartCaching(id) CreateImagelessQueueListBoxRow(QueueListBox, title, artist, duration, NowPlayingIndex, id) // CreateQueueChild(ttl, "album", artst, durat, id) PlayAudio = false EndPlayer = true go PlayPort() select { case AudioControlChan <- true: } } } glib.IdleAdd(upstream) } var QueueButtonClicked = func() { var upstream = func() { if !SliceContains(MainQueue, id) { MainQueue = append(MainQueue, id) // NowPlayingIndex = MainQueue.IndexOf(id) if SliceIndexOf(MainQueue, id)-1 == NowPlayingIndex || SliceIndexOf(MainQueue, id)-2 == NowPlayingIndex { fmt.Println("Song is next or 2 next in queue, caching") go StartCaching(id) } CreateImagelessQueueListBoxRow(QueueListBox, title, artist, duration, NowPlayingIndex, id) } } glib.IdleAdd(upstream) } PLaybutton.ConnectClicked(PlayButtonClicked) QueueButton.ConnectClicked(QueueButtonClicked) MainListboxRow.SetChild(Frame) Frame.SetChild(MainGrid) lBox.Append(MainListboxRow) } func CreateImagelessQueueListBoxRow(lBox *gtk.ListBox, title string, artist string, duration string, postition int, id string) { MainListboxRow := gtk.NewListBoxRow() MainGrid := gtk.NewGrid() Frame := gtk.NewFrame("") DelButton := gtk.NewButton() PLaybutton := gtk.NewButton() ArrUPButton := gtk.NewButton() ArrDownButton := gtk.NewButton() TitleScrolledWindow := gtk.NewScrolledWindow() ArtistScrolledWindow := gtk.NewScrolledWindow() TitleLabel := gtk.NewLabel(title) ArtistLabel := gtk.NewLabel(artist) DurationLabel := gtk.NewLabel(duration) DelButton.SetLabel("✗") PLaybutton.SetLabel("▶") ArrUPButton.SetLabel("▲") ArrDownButton.SetLabel("▼") Frame.SetChild(MainGrid) MainListboxRow.SetChild(Frame) MainGrid.Attach(DurationLabel, 0, 0, 1, 2) MainGrid.Attach(TitleScrolledWindow, 1, 0, 3, 1) MainGrid.Attach(ArtistScrolledWindow, 1, 1, 1, 1) MainGrid.Attach(DelButton, 2, 1, 1, 1) MainGrid.Attach(PLaybutton, 3, 1, 1, 1) MainGrid.Attach(ArrUPButton, 4, 0, 1, 1) MainGrid.Attach(ArrDownButton, 4, 1, 1, 1) TitleScrolledWindow.SetChild(TitleLabel) ArtistScrolledWindow.SetChild(ArtistLabel) TitleScrolledWindow.SetHExpand(true) ArtistScrolledWindow.SetHExpand(true) // MainListboxRow.SetSizeRequest(300,50) MainListboxRow.SetHAlign(gtk.AlignFill) MainGrid.SetHAlign(gtk.AlignFill) MainListboxRow.SetHExpand(true) MainGrid.SetHExpand(true) TitleScrolledWindow.SetSizeRequest(110, 25) ArtistScrolledWindow.SetSizeRequest(110, 25) // Frame.SetChild(MainListboxRow) var PlayButtonClicked = func() { var upstream = func() { MainQueue = append(MainQueue, id) // MasterStramSlice[id] // go StartCaching(id) // MainQueue.Add(id) // NowPlayingIndex = MainQueue.IndexOf(id) NowPlayingIndex = SliceIndexOf(MainQueue, id) PlayAudio = false EndPlayer = true go PlayPort() select { case AudioControlChan <- true: } } glib.IdleAdd(upstream) } var UpButtonClicked = func() { var show = func() { indx := SliceIndexOf(MainQueue, id) rowId := MainListboxRow.Index() if rowId > 0 { SliceSwapAtIndexes(MainQueue, indx, (indx - 1)) QueueListBox.Remove(MainListboxRow) QueueListBox.Insert(MainListboxRow, rowId-1) if indx == NowPlayingIndex { NowPlayingIndex-- } } } go glib.IdleAdd(show) } var DownButtonClicked = func() { var show = func() { indx := SliceIndexOf(MainQueue, id) rowId := MainListboxRow.Index() if !(indx+1 > len(MainQueue)-1) { if indx == NowPlayingIndex { NowPlayingIndex++ } SliceSwapAtIndexes(MainQueue, indx, (indx + 1)) QueueListBox.Remove(MainListboxRow) QueueListBox.Insert(MainListboxRow, rowId+1) } } go glib.IdleAdd(show) } var RemoveButtonClicked = func() { var rm = func() { if SliceIndexOf(MainQueue, id) == NowPlayingIndex { PlayAudio = false EndPlayer = true } // MainQueue.Remove(MainQueue.IndexOf(id)) SliceRemove(MainQueue, id) QueueListBox.Remove(MainListboxRow) } go glib.IdleAdd(rm) } PLaybutton.ConnectClicked(PlayButtonClicked) ArrUPButton.ConnectClicked(UpButtonClicked) ArrDownButton.ConnectClicked(DownButtonClicked) DelButton.ConnectClicked(RemoveButtonClicked) lBox.Append(MainListboxRow) } // func ValueChanged(){ // PlayAudio = false // if MainScale.Value() > TimeInPrecent { // // CurrentStream.Stop() // for (TimeInPrecent < MainScale.Value() && TimeInPrecent < float64(TotalTime)) { // _, _ = OpusStr.Read(Out) // DrawnTime += float64(1920 / rate / 2) // TimeInPrecent = float64(DrawnTime / float64(TotalTime)) // } // // CurrentStream.Start() // CurrentStream.Write() // glib.IdleAdd(UpdatePBar()) // PlayAudio = true // } else { // fmt.Println("Not yet implemented") // MainScale.SetValue(TimeInPrecent) // PlayAudio = true // } // } func CreatelessListArtistBoxRow(lBox *gtk.ListBox, name string, postition int, albums []*subsonic.AlbumID3, itemid string) { MainListboxRow := gtk.NewListBoxRow() MainGrid := gtk.NewGrid() Frame := gtk.NewFrame("") InfoButton := gtk.NewButton() NameScrolledWindow := gtk.NewScrolledWindow() NameLabel := gtk.NewLabel(name) MainGrid.Attach(NameScrolledWindow, 0, 0, 1, 1) MainGrid.Attach(InfoButton, 1, 0, 1, 1) NameScrolledWindow.SetChild(NameLabel) Frame.SetChild(MainGrid) MainListboxRow.SetChild(Frame) InfoButton.SetLabel("i") MainListboxRow.SetSizeRequest(150, 30) InfoButton.SetSizeRequest(15, 30) NameLabel.SetHAlign(gtk.AlignStart) NameLabel.SetSizeRequest(150, 15) NameScrolledWindow.SetHExpand(true) // MainListboxRow.SetSizeRequest(300,50) MainListboxRow.SetHAlign(gtk.AlignFill) MainGrid.SetHAlign(gtk.AlignFill) MainListboxRow.SetHExpand(true) MainGrid.SetHExpand(true) NameScrolledWindow.SetSizeRequest(110, 15) InfoButton.SetHAlign(gtk.AlignEnd) var InfoButtonClicked = func() { TempArtist = "" var upstream = func() { for child := lBox.FirstChild(); child != nil; { lBox.Remove(child) child = lBox.FirstChild() } for i, album := range albums { alb, _ := CurrentClient.GetAlbum(album.ID) CreateImagelessAlbumListBoxRow(lBox, alb.Name, alb.Artist, DurationToReadable(alb.Duration), i, alb.Song) } } glib.IdleAdd(upstream) } InfoButton.ConnectClicked(InfoButtonClicked) lBox.Append(MainListboxRow) } func CreateImagelessAlbumListBoxRow(lBox *gtk.ListBox, title string, artist string, duration string, postition int, songs []*subsonic.Child) { MainListboxRow := gtk.NewListBoxRow() MainGrid := gtk.NewGrid() Frame := gtk.NewFrame("") QueueButton := gtk.NewButton() InfoButton := gtk.NewButton() PLaybutton := gtk.NewButton() TitleScrolledWindow := gtk.NewScrolledWindow() ArtistScrolledWindow := gtk.NewScrolledWindow() TitleLabel := gtk.NewLabel(title) ArtistLabel := gtk.NewLabel(artist) DurationLabel := gtk.NewLabel(duration) InfoButton.SetLabel("i") QueueButton.SetLabel("☰") PLaybutton.SetLabel("▶") MainGrid.Attach(DurationLabel, 0, 0, 1, 2) MainGrid.Attach(TitleScrolledWindow, 1, 0, 1, 1) MainGrid.Attach(ArtistScrolledWindow, 1, 1, 1, 1) MainGrid.Attach(InfoButton, 2, 0, 1, 2) MainGrid.Attach(QueueButton, 3, 0, 1, 2) MainGrid.Attach(PLaybutton, 4, 0, 1, 2) TitleScrolledWindow.SetChild(TitleLabel) ArtistScrolledWindow.SetChild(ArtistLabel) Frame.SetChild(MainGrid) MainListboxRow.SetChild(Frame) QueueButton.SetSizeRequest(15, 30) PLaybutton.SetSizeRequest(15, 30) DurationLabel.SetSizeRequest(30, 30) DurationLabel.SetHAlign(gtk.AlignCenter) DurationLabel.SetVAlign(gtk.AlignCenter) TitleLabel.SetHAlign(gtk.AlignStart) ArtistLabel.SetHAlign(gtk.AlignStart) TitleLabel.SetSizeRequest(150, 15) ArtistLabel.SetSizeRequest(150, 15) TitleScrolledWindow.SetHExpand(true) ArtistScrolledWindow.SetHExpand(true) // MainListboxRow.SetSizeRequest(300,50) MainListboxRow.SetHAlign(gtk.AlignFill) MainGrid.SetHAlign(gtk.AlignFill) MainListboxRow.SetHExpand(true) MainGrid.SetHExpand(true) TitleScrolledWindow.SetSizeRequest(110, 15) ArtistScrolledWindow.SetSizeRequest(110, 15) QueueButton.SetHAlign(gtk.AlignEnd) PLaybutton.SetHAlign(gtk.AlignEnd) InfoButton.SetSizeRequest(15, 30) InfoButton.SetHAlign(gtk.AlignEnd) var InfoButtonClicked = func() { // TempArtist = itemid var upstream = func() { for child := lBox.FirstChild(); child != nil; { lBox.Remove(child) child = lBox.FirstChild() } for i, song := range songs { chil, _ := CurrentClient.GetSong(song.ID) CreateImagelessSongListBoxRow(lBox, chil.Title, chil.Artist, DurationToReadable(chil.Duration), i, chil.ID) } } glib.IdleAdd(upstream) } var PlayButtonClicked = func() { var upstream = func() { PlayAudio = false EndPlayer = true NowPlayingIndex = 0 // MainQueue.Clear() //! MainQueue = SliceClear(MainQueue) for child := QueueListBox.FirstChild(); child != nil; { QueueListBox.Remove(child) child = QueueListBox.FirstChild() } for i, song := range songs { MainQueue = append(MainQueue, song.ID) // MainQueue.Add(song.ID) CreateImagelessQueueListBoxRow(QueueListBox, song.Title, song.Artist, DurationToReadable(song.Duration), i, song.ID) } // NowPlayingIndex = MainQueue.IndexOf(songs[0].ID) NowPlayingIndex = SliceIndexOf(MainQueue, songs[0].ID) go StartCaching(MainQueue[NowPlayingIndex]) if NowPlayingIndex+1 <= len(MainQueue)-1 { // fmt.Println(songdata.Title, " +1 needs to be downloaded") go CachingWaiter(MainQueue[NowPlayingIndex], MainQueue[NowPlayingIndex+1], 5) } if NowPlayingIndex+2 <= len(MainQueue)-1 { // fmt.Println(songdata.Title, " +2 needs to be downloaded") go CachingWaiter(MainQueue[NowPlayingIndex+1], MainQueue[NowPlayingIndex+2], 5) } go PlayPort() select { case AudioControlChan <- true: } } glib.IdleAdd(upstream) } var QueueButtonClicked = func() { var upstream = func() { var j = len(MainQueue) j-- for _, song := range songs { // MainQueue.Add(song.ID) MainQueue = append(MainQueue, song.ID) CreateImagelessQueueListBoxRow(QueueListBox, song.Title, song.Artist, DurationToReadable(song.Duration), j, song.ID) } } glib.IdleAdd(upstream) } InfoButton.ConnectClicked(InfoButtonClicked) PLaybutton.ConnectClicked(PlayButtonClicked) QueueButton.ConnectClicked(QueueButtonClicked) lBox.Append(MainListboxRow) } func CreateImagelessPlaylistListBoxRow(lBox *gtk.ListBox, title string, duration string, postition int, songs []*subsonic.Child) { MainListboxRow := gtk.NewListBoxRow() MainGrid := gtk.NewGrid() Frame := gtk.NewFrame("") InfoButton := gtk.NewButton() QueueButton := gtk.NewButton() PLaybutton := gtk.NewButton() TitleScrolledWindow := gtk.NewScrolledWindow() TitleLabel := gtk.NewLabel(title) DurationLabel := gtk.NewLabel(duration) QueueButton.SetLabel("☰") PLaybutton.SetLabel("▶") InfoButton.SetLabel("i") MainGrid.Attach(DurationLabel, 0, 0, 1, 2) MainGrid.Attach(TitleScrolledWindow, 1, 0, 1, 2) MainGrid.Attach(QueueButton, 3, 0, 1, 2) MainGrid.Attach(PLaybutton, 4, 0, 1, 2) MainGrid.Attach(InfoButton, 2, 0, 1, 2) TitleScrolledWindow.SetChild(TitleLabel) MainListboxRow.SetChild(Frame) Frame.SetChild(MainGrid) QueueButton.SetSizeRequest(15, 30) PLaybutton.SetSizeRequest(15, 30) DurationLabel.SetSizeRequest(30, 30) DurationLabel.SetHAlign(gtk.AlignCenter) DurationLabel.SetVAlign(gtk.AlignCenter) TitleLabel.SetHAlign(gtk.AlignStart) TitleLabel.SetSizeRequest(150, 15) InfoButton.SetSizeRequest(15, 30) InfoButton.SetHAlign(gtk.AlignEnd) TitleScrolledWindow.SetHExpand(true) // MainListboxRow.SetSizeRequest(300,50) MainListboxRow.SetHAlign(gtk.AlignFill) MainGrid.SetHAlign(gtk.AlignFill) MainListboxRow.SetHExpand(true) MainGrid.SetHExpand(true) TitleScrolledWindow.SetSizeRequest(110, 15) QueueButton.SetHAlign(gtk.AlignEnd) PLaybutton.SetHAlign(gtk.AlignEnd) var PlayButtonClicked = func() { var upstream = func() { PlayAudio = false EndPlayer = true NowPlayingIndex = 0 // MainQueue.Clear() //! MainQueue = SliceClear(MainQueue) for child := QueueListBox.FirstChild(); child != nil; { QueueListBox.Remove(child) child = QueueListBox.FirstChild() } for i, song := range songs { // MainQueue.Add(song.ID) MainQueue = append(MainQueue, song.ID) CreateImagelessQueueListBoxRow(QueueListBox, song.Title, song.Artist, DurationToReadable(song.Duration), i, song.ID) } // NowPlayingIndex = MainQueue.IndexOf(songs[0].ID) NowPlayingIndex = SliceIndexOf(MainQueue, songs[0].ID) go StartCaching(MainQueue[NowPlayingIndex]) if NowPlayingIndex+1 <= len(MainQueue)-1 { // fmt.Println(songdata.Title, " +1 needs to be downloaded") go CachingWaiter(MainQueue[NowPlayingIndex], MainQueue[NowPlayingIndex+1], 5) } if NowPlayingIndex+2 <= len(MainQueue)-1 { // fmt.Println(songdata.Title, " +2 needs to be downloaded") go CachingWaiter(MainQueue[NowPlayingIndex+1], MainQueue[NowPlayingIndex+2], 5) } go PlayPort() select { case AudioControlChan <- true: } } glib.IdleAdd(upstream) } var QueueButtonClicked = func() { var upstream = func() { var j = len(MainQueue) j-- for _, song := range songs { // MainQueue.Add(song.ID) MainQueue = append(MainQueue, song.ID) CreateImagelessQueueListBoxRow(QueueListBox, song.Title, song.Artist, DurationToReadable(song.Duration), j, song.ID) } } glib.IdleAdd(upstream) } var InfoButtonClicked = func() { var upstream = func() { for child := lBox.FirstChild(); child != nil; { lBox.Remove(child) child = lBox.FirstChild() } for i, song := range songs { chil, _ := CurrentClient.GetSong(song.ID) CreateImagelessSongListBoxRow(lBox, chil.Title, chil.Artist, DurationToReadable(chil.Duration), i, chil.ID) } } glib.IdleAdd(upstream) } InfoButton.ConnectClicked(InfoButtonClicked) PLaybutton.ConnectClicked(PlayButtonClicked) QueueButton.ConnectClicked(QueueButtonClicked) lBox.Append(MainListboxRow) } // var TestConnButtonClicked = func() { // // TestConnButtonClicked() // } var SettingsTabUserSaveButtonClicked = func() { CurrentClient = CreateUser(HttpSettings) usr := SettingsTabUserUsernameEntry.Text() serv := SettingsTabUserServerEntry.Text() plr := SettingsTabUserDeviceNameEntry.Text() coversize := SettingsTabAppCoverSizeEntry.Text() blur := SettingsTabAppBlurRadiusEntry.Text() bitr := SettingsTabAppBitrateEntry.Text() downbuff := SettingsTabAppBufferSizeEntry.Text() var streamURL, metaURL, streamUser, streamPass, metaUser, metaPass string if SettingsTabAppStreamingProxySwitch.Active() == true { streamURL = SettingsTabAppStreamingProxyEntry.Text() if SettingsTabAppAuthStreamingProxySwitch.Active() == true { streamUser = SettingsTabAppStreamingProxyUsernameEntry.Text() streamPass = SettingsTabAppStreamingProxyPassEntry.Text() keyring.Set(streamURL, streamUser, streamPass) } else { streamUser = "" streamPass = "" } } else { streamURL = "" streamUser = "" streamPass = "" } if SettingsTabAppMetadataProxySwitch.Active() == true { metaURL = SettingsTabAppMetadataProxyEntry.Text() if SettingsTabAppAuthMetadataProxySwitch.Active() == true { metaUser = SettingsTabAppMetadataProxyUsernameEntry.Text() metaPass = SettingsTabAppMetadataProxyPassEntry.Text() keyring.Set(metaURL, metaUser, metaPass) } } else { metaURL = "" metaUser = "" metaPass = "" } UserDeserialized = User{ User: usr, Url: serv, } UserList[0] = UserDeserialized var coversizeInt int16 fmt.Sscan(coversize, &coversizeInt) var blurInt int8 fmt.Sscan(blur, &blurInt) var bitrInt int16 fmt.Sscan(bitr, &bitrInt) var downbuffInt int16 fmt.Sscan(downbuff, &downbuffInt) MainSettings = Settings{ Users: UserList, PlayerName: plr, DeleteOnClose: SettingsTabAppDeleteSwitch.Active(), Coversize: coversizeInt, BlurRadius: blurInt, HideHeaderBar: SettingsTabAppHideHeaderBarSwitch.Active(), Codec: SettingsTabAppCodecComboBoxTest.ActiveText(), Bitrate: bitrInt, DownladBufferSize: downbuffInt, UseStreamingProxy: SettingsTabAppStreamingProxySwitch.Active(), StreamingProxy: streamURL, AuthStreamingProxy: SettingsTabAppAuthStreamingProxySwitch.Active(), StreamingProxyUser: streamUser, MetadataType: SettingsTabAppMetadataComboBoxTest.ActiveText(), UseMetadataProxy: SettingsTabAppMetadataProxySwitch.Active(), MetadataProxy: metaURL, AuthMetadataProxy: SettingsTabAppAuthMetadataProxySwitch.Active(), MetadataProxyUser: metaUser, } server := SettingsTabUserServerEntry.Text() username := SettingsTabUserUsernameEntry.Text() pass := SettingsTabUserPasswordEntry.Text() err := keyring.Set(server, username, pass) if err != nil { } fmt.Println("") fmt.Println(UserDeserialized) fmt.Println(MainSettings) fmt.Println(settingsPath) fmt.Println("") Serialize(MainSettings, settingsPath) } var SearchTabSearchButtonClicked = func() { Search() // fmt.Println("end searching") } var MainSliderUserValueChange = func() { } var MainPlayPauseButtonClicked = func() { // // if NowPlayingIndex == 0 && PlayAudio == false && TotalTime == 0 { // // go PlayPort() // // } PlayAudio = !PlayAudio if PlayAudio == true { MainPlayPauseButton.SetLabel("❚❚") } else { MainPlayPauseButton.SetLabel("▶") } } var LibraryTabBackButtonClicked = func() { // if TempArtist != "" { // var upstream = func() { // for child := QueueListBoxLibrary.FirstChild(); child != nil; { // QueueListBoxLibrary.Remove(child) // child = QueueListBoxLibrary.FirstChild() // } // artist, _ := CurrentClient.GetArtist(TempArtist) // albums := artist.Album // for i, album := range albums { // alb, _ := CurrentClient.GetAlbum(album.ID) // CreateImagelessAlbumListBoxRow(QueueListBoxLibrary, alb.Name, alb.Artist, DurationToReadable(alb.Duration), i, alb.Song) // } // } // glib.IdleAdd(upstream) // TempArtist = "" // } else { // GetLib() // } GetLib() } var LibraryTabRefreshButtonClicked = func() { GetLib() } var LibraryTabLibraryRefreshButton = func() { GetPlaylist() } var LibraryTabLibraryBackButton = func() { GetPlaylist() } var MainPreviousButtonClicked = func() { PlayAudio = false EndPlayer = true // CurrentStream = nil if NowPlayingIndex-1 >= 0 { NowPlayingIndex-- } notify.CloseNotification(MainNotification.ReplacesID) UpdatePBar() go PlayPort() } var MainNextButtonClicked = func() { PlayAudio = false EndPlayer = true // CurrentStream = nil if !(NowPlayingIndex+1 > (len(MainQueue) - 1)) { NowPlayingIndex++ go StartCaching(MainQueue[NowPlayingIndex]) if NowPlayingIndex+1 <= len(MainQueue)-1 { // fmt.Println(songdata.Title, " +1 needs to be downloaded") go CachingWaiter(MainQueue[NowPlayingIndex], MainQueue[NowPlayingIndex+1], 5) } if NowPlayingIndex+2 <= len(MainQueue)-1 { // fmt.Println(songdata.Title, " +2 needs to be downloaded") go CachingWaiter(MainQueue[NowPlayingIndex+1], MainQueue[NowPlayingIndex+2], 5) } } notify.CloseNotification(MainNotification.ReplacesID) UpdatePBar() go PlayPort() } // func MoveListBoxChildren(lb *gtk.ListBox, position int){ // // row := lb.RowAtIndex(position +1 ) // // lb.Remove(row) // // lb.Insert(row, position) // // position++ // for row := lb.RowAtIndex(position +1 ); position < len(MainQueue); { // lb.Remove(row) // lb.Insert(row, position) // position++ // } // } var ClearQueue = func() { PlayAudio = false EndPlayer = true NowPlayingIndex = 0 MainQueue = MainQueue[:0] SetZeroTime() for child := QueueListBox.FirstChild(); child != nil; { QueueListBox.Remove(child) child = QueueListBox.FirstChild() } } var CacheAllQueue = func() { StartCaching(MainQueue[0]) for i := 1; i < len(MainQueue); i++ { go CachingWaiter(MainQueue[i-1], MainQueue[i], 5) } }