Skip to content

Commit 22a4fb1

Browse files
authored
Improved tabs (#573)
* unify tabs * move tabs to js * move currentTab to enum * move currentTab to enum * fix switching tabs * fix subtabs * add event in element * fix: infinite loop & tabs that aren't unlocked * draggable * draggable * fix: make arrow keys work with dragged elements * make corruptions tab draggable * feat: make tabs hideable
1 parent d4b9209 commit 22a4fb1

17 files changed

+548
-307
lines changed

index.html

-15
Original file line numberDiff line numberDiff line change
@@ -223,21 +223,6 @@
223223
</div>
224224
</div>
225225
<nav class="navbar">
226-
<div id="tabrow">
227-
<button id="buildingstab" i18n="tabs.main.buildings"></button>
228-
<button id="upgradestab" i18n="tabs.main.upgrades"></button>
229-
<button class="coinunlock4" id="achievementstab" i18n="tabs.main.achievements"></button>
230-
<button class="prestigeunlock" id="runestab" i18n="tabs.main.runes"></button>
231-
<button class="transcendunlock" id="challengetab" i18n="tabs.main.challenges"></button>
232-
<button class="reincarnationunlock" id="researchtab" i18n="tabs.main.research"></button>
233-
<button class="chal8" id="anttab" i18n="tabs.main.antHill"></button>
234-
<button class="chal10" id="cubetab" i18n="tabs.main.wowCubes"></button>
235-
<button class="chal11" id="traitstab" i18n="tabs.main.corruption"></button>
236-
<button class="singularity" id="singularitytab" i18n="tabs.main.singularity"></button>
237-
<button id="settingstab" i18n="tabs.main.settings"></button>
238-
<button class="reincarnationunlock" id="shoptab" i18n="tabs.main.shop"></button>
239-
<button class="isEvent" id="eventtab">UNSMITH</button>
240-
</div>
241226
</nav>
242227
</header>
243228
<div id="tabBorder" style="background-color: yellow;"></div>

src/Ants.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import { Synergism } from './Events'
1818
import type { ResetHistoryEntryAntSacrifice } from './History'
1919
import { buyResearch } from './Research'
2020
import { resetAnts } from './Reset'
21+
import { Tabs } from './Tabs'
2122
import { updateTalismanInventory } from './Talismans'
2223
import { clearInterval, setInterval } from './Timers'
2324
import type { FirstToEighth, ZeroToSeven } from './types/Synergism'
@@ -74,7 +75,7 @@ export const antRepeat = (i: number) => {
7475
}
7576

7677
export const updateAntDescription = (i: number) => {
77-
if (G.currentTab !== 'ant') {
78+
if (G.currentTab !== Tabs.AntHill) {
7879
return
7980
}
8081
const el = DOMCacheGetOrSet('anttierdescription')

src/EventListeners.ts

+9-27
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ import { buyGoldenQuarks, getLastUpgradeInfo, singularityPerks } from './singula
6464
import { displayStats } from './Statistics'
6565
import { generateExportSummary } from './Summary'
6666
import { player, resetCheck, saveSynergy } from './Synergism'
67-
import { changeSubTab, changeTab } from './Tabs'
67+
import { changeSubTab, Tabs } from './Tabs'
6868
import {
6969
buyAllTalismanResources,
7070
buyTalismanEnhance,
@@ -117,7 +117,7 @@ import {
117117
updateRuneBlessingBuyAmount
118118
} from './Toggles'
119119
import type { OneToFive, Player } from './types/Synergism'
120-
import { changeTabColor, Confirm } from './UpdateHTML'
120+
import { Confirm } from './UpdateHTML'
121121
import { shopMouseover } from './UpdateVisuals'
122122
import {
123123
buyConstantUpgrades,
@@ -215,29 +215,14 @@ export const generateEventHandlers = () => {
215215
DOMCacheGetOrSet('ascendChallengeBtn').addEventListener('click', () => resetCheck('ascensionChallenge'))
216216
DOMCacheGetOrSet('ascendbtn').addEventListener('click', () => resetCheck('ascension'))
217217
DOMCacheGetOrSet('singularitybtn').addEventListener('click', () => resetCheck('singularity'))
218-
// Part 2: Tabs (sucks)
219-
// Onmouseover Events
220-
DOMCacheGetOrSet('buildingstab').addEventListener('click', () => changeTab('buildings'))
221-
DOMCacheGetOrSet('upgradestab').addEventListener('click', () => changeTab('upgrades'))
222-
DOMCacheGetOrSet('settingstab').addEventListener('click', () => changeTab('settings'))
223-
DOMCacheGetOrSet('achievementstab').addEventListener('click', () => changeTab('achievements'))
224-
DOMCacheGetOrSet('runestab').addEventListener('click', () => changeTab('runes'))
225-
DOMCacheGetOrSet('challengetab').addEventListener('click', () => changeTab('challenge'))
226-
DOMCacheGetOrSet('researchtab').addEventListener('click', () => changeTab('research'))
227-
DOMCacheGetOrSet('shoptab').addEventListener('click', () => changeTab('shop'))
228-
DOMCacheGetOrSet('anttab').addEventListener('click', () => changeTab('ant'))
229-
DOMCacheGetOrSet('cubetab').addEventListener('click', () => changeTab('cube'))
230-
DOMCacheGetOrSet('traitstab').addEventListener('click', () => changeTab('traits'))
231-
DOMCacheGetOrSet('singularitytab').addEventListener('click', () => changeTab('singularity'))
232-
DOMCacheGetOrSet('eventtab').addEventListener('click', () => changeTab('event'))
233218

234219
// BUILDINGS TAB
235220
// Part 1: Upper portion (Subtab toggle)
236221
const buildingTypes = ['Coin', 'Diamond', 'Mythos', 'Particle', 'Tesseract']
237222
for (let index = 0; index < buildingTypes.length; index++) {
238223
DOMCacheGetOrSet(`switchTo${buildingTypes[index]}Building`).addEventListener(
239224
'click',
240-
() => changeSubTab('buildings', { page: index })
225+
() => changeSubTab(Tabs.Buildings, { page: index })
241226
)
242227
}
243228
// Part 2: Building Amount Toggles
@@ -377,7 +362,7 @@ export const generateEventHandlers = () => {
377362
for (let index = 0; index < 4; index++) {
378363
DOMCacheGetOrSet(`toggleRuneSubTab${index + 1}`).addEventListener(
379364
'click',
380-
() => changeSubTab('runes', { page: index })
365+
() => changeSubTab(Tabs.Runes, { page: index })
381366
)
382367
}
383368

@@ -563,7 +548,7 @@ export const generateEventHandlers = () => {
563548
for (let index = 0; index < 7; index++) {
564549
DOMCacheGetOrSet(`switchCubeSubTab${index + 1}`).addEventListener(
565550
'click',
566-
() => changeSubTab('cube', { page: index })
551+
() => changeSubTab(Tabs.WowCubes, { page: index })
567552
)
568553
}
569554

@@ -754,8 +739,8 @@ export const generateEventHandlers = () => {
754739

755740
// CORRUPTION TAB
756741
// Part 0: Subtabs
757-
DOMCacheGetOrSet('corrStatsBtn').addEventListener('click', () => changeSubTab('traits', { page: 0 }))
758-
DOMCacheGetOrSet('corrLoadoutsBtn').addEventListener('click', () => changeSubTab('traits', { page: 1 }))
742+
DOMCacheGetOrSet('corrStatsBtn').addEventListener('click', () => changeSubTab(Tabs.Corruption, { page: 0 }))
743+
DOMCacheGetOrSet('corrLoadoutsBtn').addEventListener('click', () => changeSubTab(Tabs.Corruption, { page: 1 }))
759744

760745
// Part 1: Displays
761746
DOMCacheGetOrSet('corruptionDisplays').addEventListener('click', () => corruptionDisplay(10))
@@ -770,7 +755,7 @@ export const generateEventHandlers = () => {
770755
// Part 0: Subtabs
771756
const settingSubTabs = Array.from<HTMLElement>(document.querySelectorAll('[id^="switchSettingSubTab"]'))
772757
for (const subtab of settingSubTabs) {
773-
subtab.addEventListener('click', () => changeSubTab('settings', { page: settingSubTabs.indexOf(subtab) }))
758+
subtab.addEventListener('click', () => changeSubTab(Tabs.Settings, { page: settingSubTabs.indexOf(subtab) }))
774759
}
775760

776761
const t = Array.from(document.querySelectorAll<HTMLElement>('button.statsNerds'))
@@ -969,13 +954,10 @@ TODO: Fix this entire tab it's utter shit
969954
for (let index = 0; index < 5; index++) {
970955
DOMCacheGetOrSet(`toggleSingularitySubTab${index + 1}`).addEventListener(
971956
'click',
972-
() => changeSubTab('singularity', { page: index })
957+
() => changeSubTab(Tabs.Singularity, { page: index })
973958
)
974959
}
975960

976-
const tabs = document.querySelectorAll<HTMLElement>('#tabrow > button')
977-
tabs.forEach((b) => b.addEventListener('click', () => changeTabColor()))
978-
979961
// EVENT TAB (Replace as events are created)
980962
DOMCacheGetOrSet('unsmith').addEventListener('click', () => clickSmith())
981963

src/Helper.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { quarkHandler } from './Quark'
1414
import { checkMaxRunes, redeemShards, unlockedRune } from './Runes'
1515
import { useConsumable } from './Shop'
1616
import { player } from './Synergism'
17+
import { Tabs } from './Tabs'
1718
import { buyAllTalismanResources } from './Talismans'
1819
import { visualUpdateAmbrosia, visualUpdateOcteracts, visualUpdateResearch } from './UpdateVisuals'
1920
import { Globals as G } from './Variables'
@@ -211,7 +212,7 @@ export const automaticTools = (input: AutoToolInput, time: number) => {
211212
// Add Obtainium
212213
player.researchPoints = Math.min(1e300, player.researchPoints + obtainiumGain * time * timeMultiplier)
213214
// Update visual displays if appropriate
214-
if (G.currentTab === 'research') {
215+
if (G.currentTab === Tabs.Research) {
215216
visualUpdateResearch()
216217
}
217218
break

src/Hotkeys.ts

+15-5
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@ import { DOMCacheGetOrSet } from './Cache/DOM'
44
import { promocodes } from './ImportExport'
55
import { useConsumable } from './Shop'
66
import { player, resetCheck, synergismHotkeys } from './Synergism'
7-
import { keyboardTabChange as kbTabChange } from './Tabs'
7+
import { keyboardTabChange as kbTabChange, tabRow, Tabs } from './Tabs'
88
import { confirmReply, toggleAutoChallengeRun, toggleCorruptionLevel } from './Toggles'
99
import { Alert, Confirm, Prompt } from './UpdateHTML'
1010
import { Globals as G } from './Variables'
1111

12-
export const defaultHotkeys = new Map<string, [string, () => unknown, boolean]>([
12+
export const defaultHotkeys = new Map<string, [string, () => unknown, /* hide during notification */ boolean]>([
1313
['A', ['Buy Accelerators', () => buyAccelerator(), false]],
1414
['B', ['Boost Accelerator', () => boostAccelerator(), false]],
1515
['C', ['Auto Challenge', () => {
@@ -39,7 +39,8 @@ export const defaultHotkeys = new Map<string, [string, () => unknown, boolean]>(
3939
['SHIFT+E', ['Exit Asc. Challenge', () => resetCheck('ascensionChallenge'), false]], // Its already checks if inside Asc. Challenge
4040
['SHIFT+O', ['Use Off. Potion', () => useConsumable('offeringPotion'), false]],
4141
['SHIFT+P', ['Use Obt. Potion', () => useConsumable('obtainiumPotion'), false]],
42-
['SHIFT+S', ['Reset Singularity', () => resetCheck('singularity'), false]]
42+
['SHIFT+S', ['Reset Singularity', () => resetCheck('singularity'), false]],
43+
['CTRL+B', ['Un-hide Tabs', () => tabRow.reappend(), false]]
4344
])
4445

4546
export let hotkeysEnabled = false
@@ -92,6 +93,7 @@ const eventHotkeys = (event: KeyboardEvent): void => {
9293
if (event.altKey) {
9394
keyPrefix += 'ALT+'
9495
}
96+
9597
const key = keyPrefix + event.key.toUpperCase()
9698

9799
// Disable the TAB key as it may allow unexpected operations
@@ -113,7 +115,7 @@ const eventHotkeys = (event: KeyboardEvent): void => {
113115
event.preventDefault()
114116
}
115117

116-
if (G.currentTab === 'settings' && player.subtabNumber === 6) {
118+
if (G.currentTab === Tabs.Settings && player.subtabNumber === 6) {
117119
DOMCacheGetOrSet('lastHotkey').textContent = key
118120
DOMCacheGetOrSet('lastHotkeyName').textContent = hotkeyName
119121
}
@@ -252,4 +254,12 @@ export const resetHotkeys = async () => {
252254
}
253255
}
254256

255-
document.addEventListener('keydown', eventHotkeys)
257+
export const pressedKeys = new Set<string>()
258+
259+
document.addEventListener('keydown', (event) => {
260+
eventHotkeys(event)
261+
262+
pressedKeys.add(event.code)
263+
})
264+
265+
document.addEventListener('keyup', (event) => pressedKeys.delete(event.code))

src/ImportExport.ts

+8-8
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import { shopData } from './Shop'
1414
import { singularityData } from './singularity'
1515
import { synergismStage } from './Statistics'
1616
import { blankSave, format, player, reloadShit, saveCheck, saveSynergy } from './Synergism'
17-
import { changeSubTab, changeTab } from './Tabs'
17+
import { changeSubTab, changeTab, Tabs } from './Tabs'
1818
import type { Player } from './types/Synergism'
1919
import { Alert, Confirm, Prompt } from './UpdateHTML'
2020
import { cleanString, getElementById, productContents, sumContents } from './Utility'
@@ -278,13 +278,13 @@ export const resetGame = async () => {
278278
codes: Array.from(blankSave.codes)
279279
}) as Player
280280
// Reset Displays
281-
changeTab('buildings')
282-
changeSubTab('buildings', { page: 0 })
283-
changeSubTab('runes', { page: 0 }) // Set 'runes' subtab back to 'runes' tab
284-
changeSubTab('cube', { page: 0 }) // Set 'cube tribues' subtab back to 'cubes' tab
285-
changeSubTab('traits', { page: 0 }) // set 'corruption main'
286-
changeSubTab('singularity', { page: 0 }) // set 'singularity main'
287-
changeSubTab('settings', { page: 0 }) // set 'statistics main'
281+
changeTab(Tabs.Buildings)
282+
changeSubTab(Tabs.Buildings, { page: 0 })
283+
changeSubTab(Tabs.Runes, { page: 0 }) // Set 'runes' subtab back to 'runes' tab
284+
changeSubTab(Tabs.WowCubes, { page: 0 }) // Set 'cube tribues' subtab back to 'cubes' tab
285+
changeSubTab(Tabs.Corruption, { page: 0 }) // set 'corruption main'
286+
changeSubTab(Tabs.Singularity, { page: 0 }) // set 'singularity main'
287+
changeSubTab(Tabs.Settings, { page: 0 }) // set 'statistics main'
288288
// Import Game
289289
await importSynergism(btoa(JSON.stringify(hold)), true)
290290
}

src/Plugins/Dashboard.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { DOMCacheGetOrSet } from '../Cache/DOM'
33
import { CalcCorruptionStuff } from '../Calculate'
44
import { platUpgradeBaseCosts } from '../Platonic'
55
import { format, player } from '../Synergism'
6+
import { Tabs } from '../Tabs'
67
import { toggleAntAutoSacrifice, toggleAutoChallengeRun, toggleAutoResearch, toggleAutoSacrifice } from '../Toggles'
78
import { visualUpdateCubes } from '../UpdateVisuals'
89
import { getElementById, stripIndents } from '../Utility'
@@ -198,7 +199,7 @@ const renderDashboardSlow = () => {
198199
}
199200

200201
const renderDashboardFast = () => {
201-
if (G.currentTab !== 'settings') {
202+
if (G.currentTab !== Tabs.Settings) {
202203
open = false
203204
return exitDashboard()
204205
}
@@ -209,12 +210,12 @@ const renderDashboardFast = () => {
209210
const openDashboard = () => {
210211
// compute blessings total amounts
211212
const n = player.subtabNumber
212-
G.currentTab = 'cube'
213+
G.currentTab = Tabs.WowCubes
213214
;[0, 1, 2, 3].forEach((i) => {
214215
player.subtabNumber = i
215216
visualUpdateCubes()
216217
})
217-
G.currentTab = 'settings'
218+
G.currentTab = Tabs.Settings
218219
player.subtabNumber = n
219220
// render and display dashboard
220221
renderDashboardFast()

src/Reset.ts

+8-8
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ import { resetofferings } from './Runes'
3939
import { resetShopUpgrades, shopData } from './Shop'
4040
import { calculateSingularityDebuff, getFastForwardTotalMultiplier } from './singularity'
4141
import { blankSave, format, player, saveSynergy, updateAll, updateEffectiveLevelMult } from './Synergism'
42-
import { changeSubTab, changeTab } from './Tabs'
42+
import { changeSubTab, changeTab, Tabs } from './Tabs'
4343
import { updateTalismanAppearance, updateTalismanInventory } from './Talismans'
4444
import { calculateTesseractBlessings } from './Tesseracts'
4545
import { IconSets } from './Themes'
@@ -1188,13 +1188,13 @@ export const singularity = async (setSingNumber = -1): Promise<void> => {
11881188
}) as Player
11891189

11901190
// Reset Displays
1191-
changeTab('buildings')
1192-
changeSubTab('buildings', { page: 0 })
1193-
changeSubTab('runes', { page: 0 }) // Set 'runes' subtab back to 'runes' tab
1194-
changeSubTab('cube', { page: 0 }) // Set 'cube tribues' subtab back to 'cubes' tab
1195-
changeSubTab('traits', { page: 0 }) // set 'corruption main'
1196-
changeSubTab('singularity', { page: 0 }) // set 'singularity main'
1197-
changeSubTab('settings', { page: 0 }) // set 'statistics main'
1191+
changeTab(Tabs.Buildings)
1192+
changeSubTab(Tabs.Buildings, { page: 0 })
1193+
changeSubTab(Tabs.Runes, { page: 0 }) // Set 'runes' subtab back to 'runes' tab
1194+
changeSubTab(Tabs.WowCubes, { page: 0 }) // Set 'cube tribues' subtab back to 'cubes' tab
1195+
changeSubTab(Tabs.Corruption, { page: 0 }) // set 'corruption main'
1196+
changeSubTab(Tabs.Singularity, { page: 0 }) // set 'singularity main'
1197+
changeSubTab(Tabs.Settings, { page: 0 }) // set 'statistics main'
11981198

11991199
hold.history.singularity = player.history.singularity
12001200
hold.totalQuarksEver = player.totalQuarksEver

0 commit comments

Comments
 (0)