|
|
@@ -101,6 +101,21 @@ enum FormsWidgetMode: Hashable, Sendable {
|
|
|
case dashboard
|
|
|
}
|
|
|
|
|
|
+enum SheetsWidgetMode: Hashable, Sendable {
|
|
|
+ /// Find + create shortcuts (sheets.new, templates, home); opens in-app browser.
|
|
|
+ case dashboard
|
|
|
+}
|
|
|
+
|
|
|
+enum SlidesWidgetMode: Hashable, Sendable {
|
|
|
+ /// Find + create shortcuts (slides.new, templates, home); opens in-app browser.
|
|
|
+ case dashboard
|
|
|
+}
|
|
|
+
|
|
|
+enum GooglePlayWidgetMode: Hashable, Sendable {
|
|
|
+ /// Medium: app search + shortcut to open the Play Store in-app browser.
|
|
|
+ case searchBar
|
|
|
+}
|
|
|
+
|
|
|
enum WidgetLayoutMode: Hashable {
|
|
|
case iconOnly(title: String)
|
|
|
case actionsRow
|
|
|
@@ -133,6 +148,12 @@ enum WidgetLayoutMode: Hashable {
|
|
|
case news(NewsWidgetMode)
|
|
|
/// Google Forms: large interactive dashboard; small/medium use default grids.
|
|
|
case forms(FormsWidgetMode)
|
|
|
+ /// Google Sheets: large dashboard like Forms.
|
|
|
+ case sheets(SheetsWidgetMode)
|
|
|
+ /// Google Slides: large dashboard like Forms.
|
|
|
+ case slides(SlidesWidgetMode)
|
|
|
+ /// Google Play: medium search bar + open store.
|
|
|
+ case googlePlay(GooglePlayWidgetMode)
|
|
|
}
|
|
|
|
|
|
struct WidgetVariant: Identifiable, Hashable {
|
|
|
@@ -202,42 +223,12 @@ enum WidgetTemplates {
|
|
|
case .sheets:
|
|
|
return [
|
|
|
v("sheets_small", "Sheets", .small, false, .iconOnly(title: "Sheets"), [a("home", "Open", "tablecells.fill", "/spreadsheets/u/0/")]),
|
|
|
- v("sheets_medium", "Sheets Shortcuts", .medium, true, .actionsGrid(columns: 2), [
|
|
|
- a("recent", "Recent", "clock.arrow.circlepath", "/spreadsheets/u/0/"),
|
|
|
- a("new", "New sheet", "plus", "/spreadsheets/create"),
|
|
|
- a("templates", "Templates", "square.grid.2x2", "/spreadsheets/u/0/templates"),
|
|
|
- a("search", "Search", "magnifyingglass", "/spreadsheets/u/0/search"),
|
|
|
- ]),
|
|
|
- v("sheets_large", "Sheets Hub", .large, true, .actionsGrid(columns: 2), [
|
|
|
- a("recent", "Recent", "clock.arrow.circlepath", "/spreadsheets/u/0/"),
|
|
|
- a("new", "New sheet", "plus", "/spreadsheets/create"),
|
|
|
- a("templates", "Templates", "square.grid.2x2", "/spreadsheets/u/0/templates"),
|
|
|
- a("starred", "Starred", "star", "/spreadsheets/u/0/starred"),
|
|
|
- a("shared", "Shared", "person.2", "/spreadsheets/u/0/shared-with-me"),
|
|
|
- a("trash", "Trash", "trash", "/spreadsheets/u/0/trash"),
|
|
|
- a("search", "Search", "magnifyingglass", "/spreadsheets/u/0/search"),
|
|
|
- a("offline", "Offline", "arrow.down.circle", "/spreadsheets/u/0/offline"),
|
|
|
- ]),
|
|
|
+ v("sheets_large", "Sheets dashboard", .large, false, .sheets(.dashboard), []),
|
|
|
]
|
|
|
case .slides:
|
|
|
return [
|
|
|
v("slides_small", "Slides", .small, false, .iconOnly(title: "Slides"), [a("home", "Open", "rectangle.on.rectangle.fill", "/presentation/u/0/")]),
|
|
|
- v("slides_medium", "Slides Shortcuts", .medium, true, .actionsGrid(columns: 2), [
|
|
|
- a("recent", "Recent", "clock.arrow.circlepath", "/presentation/u/0/"),
|
|
|
- a("new", "New deck", "plus", "/presentation/create"),
|
|
|
- a("templates", "Templates", "square.grid.2x2", "/presentation/u/0/templates"),
|
|
|
- a("search", "Search", "magnifyingglass", "/presentation/u/0/search"),
|
|
|
- ]),
|
|
|
- v("slides_large", "Slides Hub", .large, true, .actionsGrid(columns: 2), [
|
|
|
- a("recent", "Recent", "clock.arrow.circlepath", "/presentation/u/0/"),
|
|
|
- a("new", "New deck", "plus", "/presentation/create"),
|
|
|
- a("templates", "Templates", "square.grid.2x2", "/presentation/u/0/templates"),
|
|
|
- a("starred", "Starred", "star", "/presentation/u/0/starred"),
|
|
|
- a("shared", "Shared", "person.2", "/presentation/u/0/shared-with-me"),
|
|
|
- a("trash", "Trash", "trash", "/presentation/u/0/trash"),
|
|
|
- a("search", "Search", "magnifyingglass", "/presentation/u/0/search"),
|
|
|
- a("offline", "Offline", "arrow.down.circle", "/presentation/u/0/offline"),
|
|
|
- ]),
|
|
|
+ v("slides_large", "Slides dashboard", .large, false, .slides(.dashboard), []),
|
|
|
]
|
|
|
case .forms:
|
|
|
return [
|
|
|
@@ -355,12 +346,7 @@ enum WidgetTemplates {
|
|
|
case .play:
|
|
|
return [
|
|
|
v("play_small", "Play", .small, false, .iconOnly(title: "Play"), [a("store", "Store", "play.circle.fill", "/store/apps")]),
|
|
|
- v("play_medium", "Play Store", .medium, true, .actionsGrid(columns: 2), [
|
|
|
- a("apps", "Apps", "app.badge", "/store/apps"),
|
|
|
- a("games", "Games", "gamecontroller", "/store/games"),
|
|
|
- a("movies", "Movies", "film", "/store/movies"),
|
|
|
- a("books", "Books", "book", "/store/books"),
|
|
|
- ]),
|
|
|
+ v("play_medium", "Play search", .medium, false, .googlePlay(.searchBar), []),
|
|
|
]
|
|
|
case .news:
|
|
|
return [
|
|
|
@@ -592,6 +578,9 @@ extension WidgetLayoutMode {
|
|
|
case .youtube(.interactiveNav): true
|
|
|
case .news(_): true
|
|
|
case .forms(_): true
|
|
|
+ case .sheets(_): true
|
|
|
+ case .slides(_): true
|
|
|
+ case .googlePlay(_): true
|
|
|
case .meet: false
|
|
|
case .calendar: false
|
|
|
default: false
|
|
|
@@ -650,6 +639,12 @@ extension WidgetLayoutMode {
|
|
|
}
|
|
|
case .forms(.dashboard):
|
|
|
return CGSize(width: 440, height: 300)
|
|
|
+ case .sheets(.dashboard):
|
|
|
+ return CGSize(width: 440, height: 300)
|
|
|
+ case .slides(.dashboard):
|
|
|
+ return CGSize(width: 440, height: 300)
|
|
|
+ case .googlePlay(.searchBar):
|
|
|
+ return CGSize(width: 400, height: 168)
|
|
|
default:
|
|
|
return nil
|
|
|
}
|
|
|
@@ -706,6 +701,12 @@ extension WidgetLayoutMode {
|
|
|
}
|
|
|
case .forms(.dashboard):
|
|
|
return CGSize(width: 380, height: 280)
|
|
|
+ case .sheets(.dashboard):
|
|
|
+ return CGSize(width: 380, height: 280)
|
|
|
+ case .slides(.dashboard):
|
|
|
+ return CGSize(width: 380, height: 280)
|
|
|
+ case .googlePlay(.searchBar):
|
|
|
+ return CGSize(width: 360, height: 158)
|
|
|
default:
|
|
|
return nil
|
|
|
}
|