feat/redesign #1

Merged
rukira merged 20 commits from feat/redesign into main 2026-05-15 14:53:16 +01:00
Showing only changes of commit a4b2e69cc8 - Show all commits

View file

@ -8,5 +8,71 @@ This redesign of the Addon's window will start by following the following [desig
- They should be displayed in the same style as the announced rolls, even when the announce option is off - They should be displayed in the same style as the announced rolls, even when the announce option is off
- The log should store a maximum of 100 rolls - The log should store a maximum of 100 rolls
## Implementation details ## Implementation plan
TODO
### 1. Restructure the main window layout (UI.lua)
- Increase `WINDOW_WIDTH` to roughly double (≈660) to accommodate the two-column layout (left panel for tabs, right panel for the log)
- Replace `BasicFrameTemplateWithInset` or layer a new structure inside it:
- **Left column (~50% width):** contains two tabs ("Use Skills", "Build Skills") and their content panels
- **Right column (~50% width):** contains the "Log" header and a scrollable log list
- Keep the title bar ("AltSystem") and close button at the top spanning the full width
### 2. Implement the tab system (UI.lua)
- Create two tab buttons ("Use Skills" and "Build Skills") anchored at the top of the left column
- Use `PanelTemplates_SetNumTabs` / `PanelTemplates_SetTab` or manual highlight toggling to switch active tab styling
- **"Use Skills" tab content:** migrate all existing UI elements (Roll Type radios → Skill dropdown → Armor radios → Modifiers checkboxes → Announce dropdown → Roll button) into this tab's content frame
- Adapt the current layout from `CreateMainFrame` — re-parent all widgets to the tab content frame instead of `f` directly
- **"Build Skills" tab content:** create an empty placeholder frame (can show a "Coming soon" label)
- Toggling tabs shows/hides the corresponding content frame
### 3. Redesign the "Use Skills" tab to match the mockup (UI.lua)
- Replace the current separate Attack/Defense buttons with a **Roll Type** radio-button group ("Attack Roll" / "Defense Roll") that sets `AltSystem.State.rollType`
- Keep the **Skill** dropdown as-is (already matches the mockup)
- Replace the current Defense dropdown with an **Armor** radio-button group ("No Armor" / "Basic Armor (+1)" / "Heavy Armor (+2)")
- Map these to the existing `AltSystem.Data.Defenses` entries; show armor options only when Defense Roll is selected, or always visible per mockup
- Group **Shield** and **Pet** checkboxes under a "Modifiers (optional)" section header with a "Label" sub-header matching the mockup
- Replace the Announce checkbox + channel dropdown with a single **"Announce Roll"** dropdown whose options are "Self Roll" (no announce) plus the existing channel list (Emote, Party, Raid, Guild)
- "Self Roll" maps to `announceEnabled = false`; any other selection maps to `announceEnabled = true` with the corresponding channel index
- Add a single **"Roll $rollType"** button at the bottom (text dynamically reflects "Roll Attack" or "Roll Defense")
- Remove the old roll-result text area from this tab (results now go to the Log panel)
### 4. Build the Log panel (UI.lua)
- Create a right-side panel with a "Log" header label
- Inside, create a `ScrollFrame` (using `UIPanelScrollFrameTemplate` or a manual scroll child) to hold log entries
- Each log entry is a small frame/fontstring displaying the roll result in the same format as the announced message:
- `"[Name] rolled [d20 result] [modifiers] = [total]"` (reuse `BuildModifierString` from Roll.lua)
- Critical rolls show "rolled a Critical Failure!" or "rolled a Critical Success!"
- Entries are listed newest-first (most recent at top) in a vertically stacked layout
### 5. Implement the roll log data store (Core.lua / Roll.lua)
- Add `AltSystem.State.rollLog = {}` — an array of log entry tables, each containing: `{ text = "...", timestamp = time() }`
- In `Roll.lua`, after every roll result is calculated (in `CalculateAndDisplayResult`), build the log message string (same format as announce) and insert it into `AltSystem.State.rollLog`
- Cap the log at **100 entries**: if `#rollLog > 100`, remove the oldest entry (`table.remove(rollLog, 1)`)
- After inserting, call a UI refresh function to update the scroll frame content
- The log is **always populated**, regardless of the announce setting (per the requirement: "displayed in the same style as the announced rolls, even when the announce option is off")
- Log does **not** need to persist across sessions (not mentioned in requirements); keep it in memory only
### 6. Wire up the new Roll button (Roll.lua)
- The single "Roll $rollType" button calls `AltSystem:PerformRoll(state.rollType)` where `state.rollType` is set by the radio-button group ("attack" or "defense")
- Existing `PerformRoll` and `CalculateAndDisplayResult` logic remains largely unchanged; only the final display step changes from setting `ResultText` to appending to the log + refreshing the log UI
### 7. Update state persistence (Core.lua)
- Save/restore `rollType` selection (attack/defense) in `AltSystemDB`
- Update announce state handling to work with the new single-dropdown approach (save selected option index)
- Armor selection (radio group) replaces `selectedDefenseIndex` — reuse same key or migrate
### 8. Update the .toc file if needed (AltSystem.toc)
- No new Lua files are expected (all changes fit in existing files), but verify the load order is still correct
### 9. Testing checklist
- [ ] Window opens at new size, tabs switch correctly
- [ ] "Use Skills" tab shows all controls matching the mockup layout
- [ ] "Build Skills" tab is empty / shows placeholder
- [ ] Attack and Defense rolls work correctly via the new single Roll button
- [ ] Log panel populates with each roll, formatted like announce messages
- [ ] Log scrolls when entries exceed visible area
- [ ] Log caps at 100 entries, oldest removed first
- [ ] Log populates even when announce is set to "Self Roll" (off)
- [ ] Announce still works when a channel is selected
- [ ] State (roll type, armor, announce option) persists across sessions
- [ ] Window is draggable and clamps to screen