teamsiso/src/TeamsISO.App
Zac Gaetano d02a2c059b refactor(viewmodels): split MainViewModel into themed partial classes
MainViewModel.cs was 1017 lines and 45KB — most of it was bulk-operation
loops, Teams UIA plumbing, and the auto-apply-last-preset state machine
sitting on top of the actual MainViewModel surface (constructor, props,
OnStatsTick). Splits the class via partial-class into themed siblings:

* MainViewModel.cs (was 1017L → now 699L) — fields, properties,
  constructor that wires every Command, OnStatsTick + Dispose. This
  remains the thin aggregator.
* MainViewModel.TeamsCommands.cs (130L, new) — MakeTeamsCommand helper,
  JoinPastedMeeting (body of JoinMeetingCommand), ExtractMeetingTitle
  (already-tested static), PollTeamsMeetingState (the 1Hz UIA probe
  formerly inlined in OnStatsTick).
* MainViewModel.PresetCommands.cs (108L, new) —
  RequestApplyPresetOnStartup (CLI hook), LoadPendingPresetFromPreferences
  (called by InitializeAsync), TryAutoApplyPendingPreset (the reconcile
  step), and the _pendingPreset* private-field set that backs the path.
* MainViewModel.BulkCommands.cs (149L, new) — EnableAllOnlineAsync,
  StopAllIsosAsync (with the default-No confirmation dialog),
  SnapshotAll. RecordingCommands.cs from the original punch list is
  intentionally absent — the recording surface was axed at 1d1ce6a;
  what remains here is bulk-state ops across the participants
  collection (note in the file header).

Why partial-class instead of helper-services or composed objects: every
extracted method touches the same private dispatcher / controller /
participants / toast state. Composing would require either passing
those references in (verbose call sites) or extracting them to a
shared private context object (boilerplate). Partial gives us
file-level separation without spreading the state contract.

ExtractMeetingTitle stays internal-static so the existing
MeetingTitleExtractionTests (10 cases) keep finding it. Build clean;
56 App + 104 Engine tests still pass.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 19:31:49 -04:00
..
Assets feat(ui): empty-state, pipeline error/no-signal indicators, JetBrains Mono, tooltips 2026-05-08 19:32:19 -04:00
Converters feat(wpf): v2 task 39+40 - studio table redesign + Ctrl+K command palette 2026-05-15 11:15:00 -04:00
Properties polish(mainwindow): empty state, table widths, strings, theme tooltip 2026-05-15 19:26:23 -04:00
Services feat: per-ISO framerate/resolution/aspect/audio overrides + thumbnail BMP 2026-05-15 15:31:32 -04:00
Themes feat(wpf): v2 task 39+40 - studio table redesign + Ctrl+K command palette 2026-05-15 11:15:00 -04:00
ViewModels refactor(viewmodels): split MainViewModel into themed partial classes 2026-05-15 19:31:49 -04:00
Views feat: per-ISO framerate/resolution/aspect/audio overrides + thumbnail BMP 2026-05-15 15:31:32 -04:00
AboutWindow.xaml feat(wpf): rollback to WPF host, axe recording, fix settings pane 2026-05-14 06:02:40 -04:00
AboutWindow.xaml.cs feat(wpf): rollback to WPF host, axe recording, fix settings pane 2026-05-14 06:02:40 -04:00
App.xaml feat(wpf): v2 'Studio Terminal' shell - theme system, header, transport strip, drawer 2026-05-14 12:46:24 -04:00
App.xaml.cs feat(web): topology + thumbnail endpoints, redesigned /ui control panel 2026-05-15 15:06:11 -04:00
GlobalUsings.cs feat(ui): system tray icon + WinForms/WPF namespace disambiguation 2026-05-10 09:41:33 -04:00
HelpWindow.xaml Numpad 1-9 hotkeys toggle Nth participant's ISO 2026-05-10 21:26:37 -04:00
HelpWindow.xaml.cs feat: window-scoped keyboard shortcuts + help cheat sheet (F1) 2026-05-10 09:41:31 -04:00
MainWindow.xaml polish(mainwindow): empty state, table widths, strings, theme tooltip 2026-05-15 19:26:23 -04:00
MainWindow.xaml.cs polish(mainwindow): empty state, table widths, strings, theme tooltip 2026-05-15 19:26:23 -04:00
NotesWindow.xaml feat(ui): notes viewer + Stop-All confirm + folder shortcuts + README 2026-05-10 09:41:32 -04:00
NotesWindow.xaml.cs feat(ui): notes viewer + Stop-All confirm + folder shortcuts + README 2026-05-10 09:41:32 -04:00
OnboardingWindow.xaml Onboarding step + Open /ui button + recording duration in footer 2026-05-10 21:05:30 -04:00
OnboardingWindow.xaml.cs feat(ui): crash diagnostics, first-launch welcome, reset-to-defaults 2026-05-10 09:41:29 -04:00
PresetsDialog.xaml feat: preset import / export bundles 2026-05-10 09:41:30 -04:00
PresetsDialog.xaml.cs feat: REST control surface + lift preset-apply into PresetApplier 2026-05-10 09:41:29 -04:00
PreviewWindow.xaml feat: persist UI prefs + preview window + sort + inline note input 2026-05-10 09:41:34 -04:00
PreviewWindow.xaml.cs feat: persist UI prefs + preview window + sort + inline note input 2026-05-10 09:41:34 -04:00
TeamsEmbedWindow.xaml Phase E.4 experimental: SetParent-embed Teams window inside TeamsISO 2026-05-10 21:14:42 -04:00
TeamsEmbedWindow.xaml.cs Phase E.4 experimental: SetParent-embed Teams window inside TeamsISO 2026-05-10 21:14:42 -04:00
TeamsISO.App.csproj polish(mainwindow): empty state, table widths, strings, theme tooltip 2026-05-15 19:26:23 -04:00