From a6f21fede14a51ac845382546b7c444bc663c80c Mon Sep 17 00:00:00 2001 From: end-4 <97237370+end-4@users.noreply.github.com> Date: Sun, 6 Apr 2025 12:28:32 +0200 Subject: [PATCH] sideleft: remember last used page --- .../modules/.commonwidgets/tabcontainer.js | 14 +++- .../.configuration/default_options.jsonc | 4 +- .config/ags/modules/sideleft/apiwidgets.js | 68 ++++++++++++------- .config/ags/modules/sideleft/sideleft.js | 18 +++-- 4 files changed, 70 insertions(+), 34 deletions(-) diff --git a/.config/ags/modules/.commonwidgets/tabcontainer.js b/.config/ags/modules/.commonwidgets/tabcontainer.js index a55ce9812..1e252f57e 100644 --- a/.config/ags/modules/.commonwidgets/tabcontainer.js +++ b/.config/ags/modules/.commonwidgets/tabcontainer.js @@ -1,3 +1,4 @@ +import * as Utils from 'resource:///com/github/Aylur/ags/utils.js'; import Variable from 'resource:///com/github/Aylur/ags/variable.js'; import Widget from 'resource:///com/github/Aylur/ags/widget.js'; const { Box, Button, EventBox, Label, Overlay, Stack } = Widget; @@ -7,12 +8,13 @@ import { setupCursorHover } from '../.widgetutils/cursorhover.js'; import { DoubleRevealer } from '../.widgethacks/advancedrevealers.js'; export const TabContainer = ({ - icons, names, children, + icons, names, children, initIndex = 0, className = '', setup = () => { }, + onChange = () => { }, extraTabStripWidgets = [], ...rest }) => { - const shownIndex = Variable(0); + const shownIndex = Variable(initIndex); let previousShownIndex = 0; const count = Math.min(icons.length, names.length, children.length); const tabs = Box({ @@ -72,6 +74,8 @@ export const TabContainer = ({ }) })] }); + + shownIndex.setValue(initIndex) const contentStack = Stack({ transition: 'slide_left_right', children: children.reduce((acc, currentValue, index) => { @@ -82,6 +86,7 @@ export const TabContainer = ({ self.shown = `${shownIndex.value}`; }), }); + const mainBox = Box({ attribute: { children: children, @@ -94,9 +99,11 @@ export const TabContainer = ({ self.pack_start(tabSection, false, false, 0); self.pack_end(contentStack, true, true, 0); setup(self); + self.hook(shownIndex, (self) => onChange(self, shownIndex.value)); }, ...rest, }); + mainBox.nextTab = () => shownIndex.value = Math.min(shownIndex.value + 1, count - 1); mainBox.prevTab = () => shownIndex.value = Math.max(shownIndex.value - 1, 0); mainBox.cycleTab = () => shownIndex.value = (shownIndex.value + 1) % count; @@ -107,11 +114,12 @@ export const TabContainer = ({ export const IconTabContainer = ({ iconWidgets, names, children, className = '', + initIndex = 0, setup = () => { }, onChange = () => { }, tabsHpack = 'center', tabSwitcherClassName = '', ...rest }) => { - const shownIndex = Variable(0); + const shownIndex = Variable(initIndex); let previousShownIndex = 0; const count = Math.min(iconWidgets.length, names.length, children.length); const tabs = Box({ diff --git a/.config/ags/modules/.configuration/default_options.jsonc b/.config/ags/modules/.configuration/default_options.jsonc index 6a1db468d..932e6a1a3 100644 --- a/.config/ags/modules/.configuration/default_options.jsonc +++ b/.config/ags/modules/.configuration/default_options.jsonc @@ -123,13 +123,15 @@ "apis", "tools" ], + "defaultPage": "apis", "apis": { "order": [ "gemini", "gpt", "waifu", "booru" - ] + ], + "defaultPage": "gemini" } }, "quickToggles": { diff --git a/.config/ags/modules/sideleft/apiwidgets.js b/.config/ags/modules/sideleft/apiwidgets.js index e2352c8cf..17b7576ab 100644 --- a/.config/ags/modules/sideleft/apiwidgets.js +++ b/.config/ags/modules/sideleft/apiwidgets.js @@ -17,8 +17,10 @@ const TextView = Widget.subclass(Gtk.TextView, "AgsTextView"); import { widgetContent } from './sideleft.js'; import { IconTabContainer } from '../.commonwidgets/tabcontainer.js'; +import { updateNestedProperty } from '../.miscutils/objects.js'; const EXPAND_INPUT_THRESHOLD = 30; +const AGS_CONFIG_FILE = `${App.configDir}/user_options.jsonc`; export const chatEntry = TextView({ hexpand: true, @@ -69,40 +71,44 @@ export const chatEntry = TextView({ const APILIST = { 'gemini': { - name: 'Assistant (Gemini Pro)', - sendCommand: geminiSendMessage, - contentWidget: GeminiView(chatEntry), - commandBar: geminiCommands, - tabIcon: geminiTabIcon, - placeholderText: getString('Message Gemini...'), + "name": 'Assistant (Gemini Pro)', + "sendCommand": geminiSendMessage, + "contentWidget": GeminiView(chatEntry), + "commandBar": geminiCommands, + "tabIcon": geminiTabIcon, + "placeholderText": getString('Message Gemini...'), }, 'gpt': { - name: 'Assistant (GPTs)', - sendCommand: chatGPTSendMessage, - contentWidget: ChatGPTView(chatEntry), - commandBar: chatGPTCommands, - tabIcon: chatGPTTabIcon, - placeholderText: getString('Message the model...'), + "name": 'Assistant (GPTs)', + "sendCommand": chatGPTSendMessage, + "contentWidget": ChatGPTView(chatEntry), + "commandBar": chatGPTCommands, + "tabIcon": chatGPTTabIcon, + "placeholderText": getString('Message the model...'), }, 'waifu': { - name: 'Waifus', - sendCommand: waifuSendMessage, - contentWidget: WaifuView(chatEntry), - commandBar: waifuCommands, - tabIcon: waifuTabIcon, - placeholderText: getString('Enter tags'), + "name": 'Waifus', + "sendCommand": waifuSendMessage, + "contentWidget": WaifuView(chatEntry), + "commandBar": waifuCommands, + "tabIcon": waifuTabIcon, + "placeholderText": getString('Enter tags'), }, 'booru': { - name: 'Booru', - sendCommand: booruSendMessage, - contentWidget: BooruView(chatEntry), - commandBar: booruCommands, - tabIcon: booruTabIcon, - placeholderText: getString('Enter tags and/or page number'), + "name": 'Booru', + "sendCommand": booruSendMessage, + "contentWidget": BooruView(chatEntry), + "commandBar": booruCommands, + "tabIcon": booruTabIcon, + "placeholderText": getString('Enter tags and/or page number'), }, } -const APIS = userOptions.sidebar.pages.apis.order.map((apiName) => APILIST[apiName]); -let currentApiId = 0; +const APIS = userOptions.sidebar.pages.apis.order.map((apiName) => { + const obj = { ...APILIST[apiName] }; + obj["id"] = apiName; + return obj; +}); +let currentApiId = APIS.findIndex(obj => obj.id === userOptions.sidebar.pages.apis.defaultPage); function apiSendMessage(textView) { // Get text @@ -198,11 +204,21 @@ export const apiContentStack = IconTabContainer({ iconWidgets: APIS.map((api) => api.tabIcon), names: APIS.map((api) => api.name), children: APIS.map((api) => api.contentWidget), + initIndex: currentApiId, onChange: (self, id) => { apiCommandStack.shown = APIS[id].name; chatPlaceholder.label = APIS[id].placeholderText; currentApiId = id; + const pageName = APIS[id].id; + const option = 'sidebar.pages.apis.defaultPage'; + updateNestedProperty(userOptions, option, pageName); + execAsync(['bash', '-c', `${App.configDir}/scripts/ags/agsconfigurator.py \ + --key ${option} \ + --value ${pageName} \ + --file ${AGS_CONFIG_FILE}` + ]).catch(print); } + }); function switchToTab(id) { diff --git a/.config/ags/modules/sideleft/sideleft.js b/.config/ags/modules/sideleft/sideleft.js index fe63f71db..0b276d0af 100644 --- a/.config/ags/modules/sideleft/sideleft.js +++ b/.config/ags/modules/sideleft/sideleft.js @@ -11,6 +11,9 @@ import apiWidgets from './apiwidgets.js'; import { chatEntry } from './apiwidgets.js'; import { TabContainer } from '../.commonwidgets/tabcontainer.js'; import { checkKeybind } from '../.widgetutils/keybind.js'; +import { updateNestedProperty } from '../.miscutils/objects.js'; + +const AGS_CONFIG_FILE = `${App.configDir}/user_options.jsonc`; const SIDEBARTABS = { 'apis': { @@ -85,10 +88,17 @@ export const widgetContent = TabContainer({ names: CONTENTS.map((item) => item.friendlyName), children: CONTENTS.map((item) => item.content), className: 'sidebar-left spacing-v-10', - // setup: (self) => self.hook(App, (self, currentName, visible) => { - // if (currentName === 'sideleft') - // self.toggleClassName('sidebar-pinned', pinButton.attribute.enabled && visible); - // }), + initIndex: CONTENTS.findIndex(obj => obj.name === userOptions.sidebar.pages.defaultPage), + onChange: (self, index) => { + const pageName = CONTENTS[index].name; + const option = 'sidebar.pages.defaultPage'; + updateNestedProperty(userOptions, option, pageName); + execAsync(['bash', '-c', `${App.configDir}/scripts/ags/agsconfigurator.py \ + --key ${option} \ + --value ${pageName} \ + --file ${AGS_CONFIG_FILE}` + ]).catch(print); + }, extraTabStripWidgets: [ // pinButton, expandButton,