From bb6487f6b6f507d2a9ab3e40cc77ef810909b25f Mon Sep 17 00:00:00 2001 From: "Darryl L. Pierce" Date: Fri, 18 Jul 2025 08:00:32 -0400 Subject: [PATCH] Changed the main user interface and icons [#66] * Changed Android to use NavigationSuiteScaffold. * Changed all icons to use project-specific SVG images. --- androidVariant/build.gradle.kts | 1 - .../variant/android/MainActivity.kt | 60 +++++- .../variant/android/view/AppDestination.kt | 10 +- .../variant/android/view/HomeView.kt | 190 ++++++++++++------ .../variant/android/view/VariantAppTopBar.kt | 35 +--- .../android/view/comics/ComicBookListView.kt | 6 +- .../android/view/reading/ReadingPageView.kt | 10 +- .../android/view/server/BrowseServerView.kt | 5 +- .../variant/android/view/server/ServerView.kt | 49 ++--- .../{server => settings}/EditServerView.kt | 10 +- .../android/view/settings/SettingsView.kt | 32 ++- .../src/main/res/drawable-anydpi/ic_back.xml | 11 + .../main/res/drawable-anydpi/ic_cancel.xml | 17 ++ .../src/main/res/drawable-anydpi/ic_close.xml | 23 +++ .../main/res/drawable-anydpi/ic_next_page.xml | 14 ++ .../res/drawable-anydpi/ic_previous_page.xml | 14 ++ .../src/main/res/drawable-anydpi/ic_save.xml | 14 ++ .../src/main/res/drawable-hdpi/ic_back.png | Bin 0 -> 393 bytes .../src/main/res/drawable-hdpi/ic_cancel.png | Bin 0 -> 924 bytes .../src/main/res/drawable-hdpi/ic_close.png | Bin 0 -> 1037 bytes .../main/res/drawable-hdpi/ic_next_page.png | Bin 0 -> 1006 bytes .../res/drawable-hdpi/ic_previous_page.png | Bin 0 -> 1028 bytes .../src/main/res/drawable-hdpi/ic_save.png | Bin 0 -> 884 bytes .../src/main/res/drawable-mdpi/ic_back.png | Bin 0 -> 227 bytes .../src/main/res/drawable-mdpi/ic_cancel.png | Bin 0 -> 540 bytes .../src/main/res/drawable-mdpi/ic_close.png | Bin 0 -> 573 bytes .../main/res/drawable-mdpi/ic_next_page.png | Bin 0 -> 586 bytes .../res/drawable-mdpi/ic_previous_page.png | Bin 0 -> 583 bytes .../src/main/res/drawable-mdpi/ic_save.png | Bin 0 -> 573 bytes .../src/main/res/drawable-xhdpi/ic_back.png | Bin 0 -> 365 bytes .../src/main/res/drawable-xhdpi/ic_cancel.png | Bin 0 -> 1020 bytes .../src/main/res/drawable-xhdpi/ic_close.png | Bin 0 -> 1277 bytes .../main/res/drawable-xhdpi/ic_next_page.png | Bin 0 -> 1164 bytes .../res/drawable-xhdpi/ic_previous_page.png | Bin 0 -> 1146 bytes .../src/main/res/drawable-xhdpi/ic_save.png | Bin 0 -> 1078 bytes .../src/main/res/drawable-xxhdpi/ic_back.png | Bin 0 -> 465 bytes .../main/res/drawable-xxhdpi/ic_cancel.png | Bin 0 -> 1749 bytes .../src/main/res/drawable-xxhdpi/ic_close.png | Bin 0 -> 2086 bytes .../main/res/drawable-xxhdpi/ic_next_page.png | Bin 0 -> 1983 bytes .../res/drawable-xxhdpi/ic_previous_page.png | Bin 0 -> 1986 bytes .../src/main/res/drawable-xxhdpi/ic_save.png | Bin 0 -> 1848 bytes gradle/libs.versions.toml | 5 +- iosVariant/Variant.xcodeproj/project.pbxproj | 6 +- .../back.imageset/Contents.json | 21 ++ .../reshot-icon-angle-back-8E4DS2MACR.svg | 1 + .../browse_library.imageset/Contents.json | 21 ++ .../reshot-icon-cloud-8FZ46C952V.svg | 1 + .../close.imageset/Contents.json | 21 ++ .../reshot-icon-close-PTL63WY9KD.svg | 41 ++++ .../comic_library.imageset/Contents.json | 21 ++ .../reshot-icon-library-539WBKTVCD.svg | 3 + .../delete_selections.imageset/Contents.json | 21 ++ .../reshot-icon-trash-EQVMX5TB72.svg | 1 + .../next_page.imageset/Contents.json | 21 ++ .../reshot-icon-next-circle-C6SMFYQZW9.svg | 1 + .../previous_page.imageset/Contents.json | 21 ++ .../reshot-icon-back-circle-JYQ7GC5DF8.svg | 1 + .../save.imageset/Contents.json | 21 ++ .../reshot-icon-check-mark-GTKPVL654M.svg | 1 + .../settings.imageset/Contents.json | 21 ++ .../reshot-icon-setting-E4QJBWP6Z9.svg | 1 + iosVariant/iosVariant/HomeView.swift | 6 +- .../Views/Comics/ComicBooksView.swift | 2 +- .../Views/Reading/ReadingPageView.swift | 4 +- .../BrowseServerView.swift | 6 +- .../DirectoryItemView.swift | 0 .../{Servers => Server}/FileItemView.swift | 0 .../{Servers => Server}/ServerView.swift | 0 .../Views/Settings/EditServerView.swift | 2 +- 69 files changed, 586 insertions(+), 186 deletions(-) rename androidVariant/src/main/java/org/comixedproject/variant/android/view/{server => settings}/EditServerView.kt (93%) create mode 100644 androidVariant/src/main/res/drawable-anydpi/ic_back.xml create mode 100644 androidVariant/src/main/res/drawable-anydpi/ic_cancel.xml create mode 100644 androidVariant/src/main/res/drawable-anydpi/ic_close.xml create mode 100644 androidVariant/src/main/res/drawable-anydpi/ic_next_page.xml create mode 100644 androidVariant/src/main/res/drawable-anydpi/ic_previous_page.xml create mode 100644 androidVariant/src/main/res/drawable-anydpi/ic_save.xml create mode 100644 androidVariant/src/main/res/drawable-hdpi/ic_back.png create mode 100644 androidVariant/src/main/res/drawable-hdpi/ic_cancel.png create mode 100644 androidVariant/src/main/res/drawable-hdpi/ic_close.png create mode 100644 androidVariant/src/main/res/drawable-hdpi/ic_next_page.png create mode 100644 androidVariant/src/main/res/drawable-hdpi/ic_previous_page.png create mode 100644 androidVariant/src/main/res/drawable-hdpi/ic_save.png create mode 100644 androidVariant/src/main/res/drawable-mdpi/ic_back.png create mode 100644 androidVariant/src/main/res/drawable-mdpi/ic_cancel.png create mode 100644 androidVariant/src/main/res/drawable-mdpi/ic_close.png create mode 100644 androidVariant/src/main/res/drawable-mdpi/ic_next_page.png create mode 100644 androidVariant/src/main/res/drawable-mdpi/ic_previous_page.png create mode 100644 androidVariant/src/main/res/drawable-mdpi/ic_save.png create mode 100644 androidVariant/src/main/res/drawable-xhdpi/ic_back.png create mode 100644 androidVariant/src/main/res/drawable-xhdpi/ic_cancel.png create mode 100644 androidVariant/src/main/res/drawable-xhdpi/ic_close.png create mode 100644 androidVariant/src/main/res/drawable-xhdpi/ic_next_page.png create mode 100644 androidVariant/src/main/res/drawable-xhdpi/ic_previous_page.png create mode 100644 androidVariant/src/main/res/drawable-xhdpi/ic_save.png create mode 100644 androidVariant/src/main/res/drawable-xxhdpi/ic_back.png create mode 100644 androidVariant/src/main/res/drawable-xxhdpi/ic_cancel.png create mode 100644 androidVariant/src/main/res/drawable-xxhdpi/ic_close.png create mode 100644 androidVariant/src/main/res/drawable-xxhdpi/ic_next_page.png create mode 100644 androidVariant/src/main/res/drawable-xxhdpi/ic_previous_page.png create mode 100644 androidVariant/src/main/res/drawable-xxhdpi/ic_save.png create mode 100644 iosVariant/iosVariant/Assets.xcassets/back.imageset/Contents.json create mode 100644 iosVariant/iosVariant/Assets.xcassets/back.imageset/reshot-icon-angle-back-8E4DS2MACR.svg create mode 100644 iosVariant/iosVariant/Assets.xcassets/browse_library.imageset/Contents.json create mode 100644 iosVariant/iosVariant/Assets.xcassets/browse_library.imageset/reshot-icon-cloud-8FZ46C952V.svg create mode 100644 iosVariant/iosVariant/Assets.xcassets/close.imageset/Contents.json create mode 100644 iosVariant/iosVariant/Assets.xcassets/close.imageset/reshot-icon-close-PTL63WY9KD.svg create mode 100644 iosVariant/iosVariant/Assets.xcassets/comic_library.imageset/Contents.json create mode 100644 iosVariant/iosVariant/Assets.xcassets/comic_library.imageset/reshot-icon-library-539WBKTVCD.svg create mode 100644 iosVariant/iosVariant/Assets.xcassets/delete_selections.imageset/Contents.json create mode 100644 iosVariant/iosVariant/Assets.xcassets/delete_selections.imageset/reshot-icon-trash-EQVMX5TB72.svg create mode 100644 iosVariant/iosVariant/Assets.xcassets/next_page.imageset/Contents.json create mode 100644 iosVariant/iosVariant/Assets.xcassets/next_page.imageset/reshot-icon-next-circle-C6SMFYQZW9.svg create mode 100644 iosVariant/iosVariant/Assets.xcassets/previous_page.imageset/Contents.json create mode 100644 iosVariant/iosVariant/Assets.xcassets/previous_page.imageset/reshot-icon-back-circle-JYQ7GC5DF8.svg create mode 100644 iosVariant/iosVariant/Assets.xcassets/save.imageset/Contents.json create mode 100644 iosVariant/iosVariant/Assets.xcassets/save.imageset/reshot-icon-check-mark-GTKPVL654M.svg create mode 100644 iosVariant/iosVariant/Assets.xcassets/settings.imageset/Contents.json create mode 100644 iosVariant/iosVariant/Assets.xcassets/settings.imageset/reshot-icon-setting-E4QJBWP6Z9.svg rename iosVariant/iosVariant/Views/{Servers => Server}/BrowseServerView.swift (97%) rename iosVariant/iosVariant/Views/{Servers => Server}/DirectoryItemView.swift (100%) rename iosVariant/iosVariant/Views/{Servers => Server}/FileItemView.swift (100%) rename iosVariant/iosVariant/Views/{Servers => Server}/ServerView.swift (100%) diff --git a/androidVariant/build.gradle.kts b/androidVariant/build.gradle.kts index fa350fa6..8c7f041d 100644 --- a/androidVariant/build.gradle.kts +++ b/androidVariant/build.gradle.kts @@ -44,7 +44,6 @@ dependencies { implementation(libs.bundles.android.compose) implementation(libs.compose.ui) implementation(libs.compose.ui.tooling.preview) - implementation(libs.compose.material3) implementation(libs.androidx.activity.compose) debugImplementation(libs.compose.ui.tooling) diff --git a/androidVariant/src/main/java/org/comixedproject/variant/android/MainActivity.kt b/androidVariant/src/main/java/org/comixedproject/variant/android/MainActivity.kt index e757e075..c05afedf 100644 --- a/androidVariant/src/main/java/org/comixedproject/variant/android/MainActivity.kt +++ b/androidVariant/src/main/java/org/comixedproject/variant/android/MainActivity.kt @@ -24,11 +24,19 @@ import androidx.activity.compose.setContent import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch import org.comixedproject.variant.android.view.HomeView +import org.comixedproject.variant.platform.Log import org.comixedproject.variant.viewmodel.VariantViewModel import org.koin.androidx.compose.koinViewModel +private const val TAG = "MainActivity" + class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -40,11 +48,61 @@ class MainActivity : ComponentActivity() { variantViewModel.setLibraryDirectory(directory) VariantTheme { + val comicBook by variantViewModel.comicBook.collectAsState() + val comicBookList by variantViewModel.comicBookList.collectAsState() + val loading by variantViewModel.loading.collectAsState() + val browsingState by variantViewModel.browsingState.collectAsState() + val selectionMode by variantViewModel.selectionMode.collectAsState() + val selectionList by variantViewModel.selectionList.collectAsState() + + val coroutineScope = rememberCoroutineScope() + Surface( modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background ) { - HomeView() + HomeView( + comicBook, + comicBookList, + browsingState, + loading, + selectionMode, + selectionList, + variantViewModel.address, + variantViewModel.username, + variantViewModel.password, + onLoadDirectory = { path, reload -> + coroutineScope.launch(Dispatchers.IO) { + Log.debug(TAG, "Loading directory: ${path} reload=${reload}") + variantViewModel.loadDirectory(path, reload) + } + }, + onDownloadFile = { path, filename -> + coroutineScope.launch(Dispatchers.IO) { + Log.debug(TAG, "Downloading file: ${path} filename=${filename}") + variantViewModel.downloadFile(path, filename) + } + }, + onReadComicBook = { comicBook -> + variantViewModel.readComicBook(comicBook) + }, + onSetSelectionMode = { enabled -> + variantViewModel.setSelectMode(enabled) + }, + onUpdateSelection = { comicBook -> + variantViewModel.updateSelectionList(comicBook.path) + }, + onDeleteSelections = { + coroutineScope.launch(Dispatchers.Unconfined) { + variantViewModel.deleteSelections() + } + }, + onSaveSettings = { address, username, password -> + variantViewModel.address = address + variantViewModel.username = username + variantViewModel.password = password + } + ) } } } diff --git a/androidVariant/src/main/java/org/comixedproject/variant/android/view/AppDestination.kt b/androidVariant/src/main/java/org/comixedproject/variant/android/view/AppDestination.kt index 725469ab..6fdf3800 100644 --- a/androidVariant/src/main/java/org/comixedproject/variant/android/view/AppDestination.kt +++ b/androidVariant/src/main/java/org/comixedproject/variant/android/view/AppDestination.kt @@ -18,8 +18,10 @@ package org.comixedproject.variant.android.view -enum class AppDestination { - COMICS, - BROWSE, - SETTINGS +import org.comixedproject.variant.android.R + +enum class AppDestination(val icon: Int, val label: Int) { + COMICS(R.drawable.ic_comic_library, R.string.comicsDestinationLabel), + BROWSE(R.drawable.ic_browse_library, R.string.browseServerDestinationLabel), + SETTINGS(R.drawable.ic_settings, R.string.settingsDestinationLabel) } \ No newline at end of file diff --git a/androidVariant/src/main/java/org/comixedproject/variant/android/view/HomeView.kt b/androidVariant/src/main/java/org/comixedproject/variant/android/view/HomeView.kt index 183f7096..3137216c 100644 --- a/androidVariant/src/main/java/org/comixedproject/variant/android/view/HomeView.kt +++ b/androidVariant/src/main/java/org/comixedproject/variant/android/view/HomeView.kt @@ -18,105 +18,161 @@ package org.comixedproject.variant.android.view +import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Icon import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.adaptive.navigationsuite.NavigationSuiteScaffold import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch +import org.comixedproject.variant.android.COMIC_BOOK_LIST import org.comixedproject.variant.android.VariantTheme import org.comixedproject.variant.android.view.comics.ComicBookView import org.comixedproject.variant.android.view.reading.ReadingView import org.comixedproject.variant.android.view.server.ServerView import org.comixedproject.variant.android.view.settings.SettingsView +import org.comixedproject.variant.model.library.ComicBook import org.comixedproject.variant.platform.Log -import org.comixedproject.variant.viewmodel.VariantViewModel -import org.koin.androidx.compose.koinViewModel +import org.comixedproject.variant.viewmodel.BrowsingState private const val TAG = "HomeView" @Composable -fun HomeView() { - val variantViewModel: VariantViewModel = koinViewModel() +fun HomeView( + comicBook: ComicBook?, + comicBookList: List, + browsingState: BrowsingState, + loading: Boolean, + selectionMode: Boolean, + selectionList: List, + address: String, username: String, password: String, + onLoadDirectory: (String, Boolean) -> Unit, + onDownloadFile: (String, String) -> Unit, + onReadComicBook: (ComicBook?) -> Unit, + onSetSelectionMode: (Boolean) -> Unit, + onUpdateSelection: (ComicBook) -> Unit, + onDeleteSelections: () -> Unit, + onSaveSettings: (String, String, String) -> Unit +) { var currentDestination by remember { mutableStateOf(AppDestination.COMICS) } - val coroutineScope = rememberCoroutineScope() - val comicBookList by variantViewModel.comicBookList.collectAsState() - val selectionMode by variantViewModel.selectionMode.collectAsState() - val selectionList by variantViewModel.selectionList.collectAsState() - val comicBook by variantViewModel.comicBook.collectAsState() Scaffold( - topBar = { - VariantTopAppBar( - onBrowseComics = { currentDestination = AppDestination.COMICS }, - onBrowseServer = { - coroutineScope.launch(Dispatchers.IO) { - variantViewModel.loadDirectory( - variantViewModel.browsingState.value.currentPath, - false - ) - } - currentDestination = AppDestination.BROWSE - }, - onUpdateSettings = { currentDestination = AppDestination.SETTINGS }) - }, + topBar = { VariantTopAppBar() }, content = { padding -> - when (currentDestination) { - AppDestination.COMICS -> - if (comicBook != null) { - ReadingView( - comicBook!!, - modifier = Modifier.padding(padding), - onStopReading = { variantViewModel.readComicBook(null) } - ) - } else { - ComicBookView( - comicBookList, - selectionMode, - selectionList, - onSetSelectionMode = { - Log.info(TAG, "Setting selection mode: ${it}") - variantViewModel.setSelectMode(it) + NavigationSuiteScaffold( + navigationSuiteItems = { + AppDestination.entries.forEach { + item( + icon = { + Icon( + painterResource(it.icon), + contentDescription = stringResource(it.label) + ) }, - onComicBookClicked = { comicBook -> - if (selectionMode) { - Log.info( - TAG, - "Toggling comic book selection: ${comicBook.path}" - ) - variantViewModel.updateSelectionList(comicBook.path) - } else { - Log.info(TAG, "Reading comic book: ${comicBook.filename}") - variantViewModel.readComicBook(comicBook) + label = { Text(stringResource(it.label)) }, + selected = it == currentDestination, + onClick = { + if (it == AppDestination.BROWSE + ) { + onLoadDirectory(browsingState.currentPath, false) } - }, - onDeleteComics = { - coroutineScope.launch(Dispatchers.IO) { - variantViewModel.deleteSelections() - } - }, - modifier = Modifier.padding(padding) + currentDestination = it + } ) } + }, + modifier = Modifier.padding(padding) + ) { + when (currentDestination) { + AppDestination.COMICS -> + if (comicBook != null) { + ReadingView( + comicBook, + onStopReading = { onReadComicBook(null) }, + modifier = Modifier + .fillMaxSize() + ) + } else { + ComicBookView( + comicBookList, + selectionMode, + selectionList, + onSetSelectionMode = { + Log.info(TAG, "Setting selection mode: ${it}") + onSetSelectionMode(it) + }, + onComicBookClicked = { comicBook -> + if (selectionMode) { + Log.info( + TAG, + "Toggling comic book selection: ${comicBook.path}" + ) + onUpdateSelection(comicBook) + } else { + Log.info(TAG, "Reading comic book: ${comicBook.filename}") + onReadComicBook(comicBook) + } + }, + onDeleteComics = { onDeleteSelections() }, + modifier = Modifier + .fillMaxSize() + ) + } + + AppDestination.BROWSE -> ServerView( + browsingState, comicBookList, loading, + onLoadDirectory = { path, reload -> onLoadDirectory(path, reload) }, + onDownloadFile = { path, filename -> onDownloadFile(path, filename) }, + modifier = Modifier + .fillMaxSize() + ) - AppDestination.BROWSE -> ServerView(modifier = Modifier.padding(padding)) - AppDestination.SETTINGS -> SettingsView(onCloseSettings = { - currentDestination = AppDestination.COMICS - }, modifier = Modifier.padding(padding)) + AppDestination.SETTINGS -> SettingsView( + address, username, password, + onSaveSettings = { address, username, password -> + Log.info( + TAG, + "Updating server settings: address=${address} username=${username} password=${ + password.first() + }*****" + ) + onSaveSettings(address, username, password) + currentDestination = AppDestination.COMICS + }, + modifier = Modifier + .fillMaxSize() + ) + } } - } - ) + }) } @Composable @Preview fun HomeViewPreview() { - VariantTheme { HomeView() } + VariantTheme { + HomeView( + COMIC_BOOK_LIST.get(0), + COMIC_BOOK_LIST, + BrowsingState("", "", "", listOf(), listOf()), + false, + false, + listOf(), + "http://www.comixedproject.org:7171", "reader@comixedproject.org", "my!password", + onLoadDirectory = { _, _ -> }, + onDownloadFile = { _, _ -> }, + onReadComicBook = { _ -> }, + onSetSelectionMode = { _ -> }, + onUpdateSelection = { _ -> }, + onDeleteSelections = { }, onSaveSettings = { _, _, _ -> } + ) + } } \ No newline at end of file diff --git a/androidVariant/src/main/java/org/comixedproject/variant/android/view/VariantAppTopBar.kt b/androidVariant/src/main/java/org/comixedproject/variant/android/view/VariantAppTopBar.kt index cc835a91..2e3a8231 100644 --- a/androidVariant/src/main/java/org/comixedproject/variant/android/view/VariantAppTopBar.kt +++ b/androidVariant/src/main/java/org/comixedproject/variant/android/view/VariantAppTopBar.kt @@ -19,52 +19,22 @@ package org.comixedproject.variant.android.view import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview -import org.comixedproject.variant.android.R import org.comixedproject.variant.android.VariantTheme @OptIn(ExperimentalMaterial3Api::class) @Composable fun VariantTopAppBar( - onBrowseComics: () -> Unit, - onBrowseServer: () -> Unit, - onUpdateSettings: () -> Unit, modifier: Modifier = Modifier ) { TopAppBar( title = { Text("Variant") }, - actions = { - IconButton(onClick = { onBrowseComics() }) { - Icon( - painterResource(R.drawable.ic_comic_library), - contentDescription = stringResource(R.string.browseServerDestinationLabel) - ) - } - - IconButton(onClick = { onBrowseServer() }) { - Icon( - painterResource(R.drawable.ic_browse_library), - contentDescription = stringResource(R.string.browseServerDestinationLabel) - ) - } - - IconButton(onClick = { onUpdateSettings() }) { - Icon( - painterResource(R.drawable.ic_settings), - contentDescription = stringResource(R.string.settingsDestinationLabel) - ) - } - }, modifier = modifier ) } @@ -73,9 +43,6 @@ fun VariantTopAppBar( @Preview fun VariantTopAppBarPreview() { VariantTheme { - VariantTopAppBar( - onBrowseComics = {}, - onBrowseServer = {}, - onUpdateSettings = {}) + VariantTopAppBar() } } \ No newline at end of file diff --git a/androidVariant/src/main/java/org/comixedproject/variant/android/view/comics/ComicBookListView.kt b/androidVariant/src/main/java/org/comixedproject/variant/android/view/comics/ComicBookListView.kt index 94a7b435..d8299615 100644 --- a/androidVariant/src/main/java/org/comixedproject/variant/android/view/comics/ComicBookListView.kt +++ b/androidVariant/src/main/java/org/comixedproject/variant/android/view/comics/ComicBookListView.kt @@ -50,8 +50,10 @@ fun ComicBookListView( Scaffold( topBar = { Text( - pluralStringResource(R.plurals.comicBookListTitle, comicBookList.size, - comicBookList.size), + pluralStringResource( + R.plurals.comicBookListTitle, comicBookList.size, + comicBookList.size + ), style = MaterialTheme.typography.headlineMedium ) }, diff --git a/androidVariant/src/main/java/org/comixedproject/variant/android/view/reading/ReadingPageView.kt b/androidVariant/src/main/java/org/comixedproject/variant/android/view/reading/ReadingPageView.kt index f079e2a6..c7e2e4dc 100644 --- a/androidVariant/src/main/java/org/comixedproject/variant/android/view/reading/ReadingPageView.kt +++ b/androidVariant/src/main/java/org/comixedproject/variant/android/view/reading/ReadingPageView.kt @@ -25,9 +25,6 @@ import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.automirrored.filled.ArrowBack -import androidx.compose.material.icons.automirrored.filled.ArrowForward import androidx.compose.material3.BottomAppBar import androidx.compose.material3.Icon import androidx.compose.material3.IconButton @@ -44,6 +41,7 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.asImageBitmap +import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview @@ -103,7 +101,7 @@ fun ReadingPageView( } ) { Icon( - Icons.AutoMirrored.Filled.ArrowBack, + painterResource(R.drawable.ic_close), contentDescription = stringResource(R.string.stopReadingLabel) ) } @@ -125,7 +123,7 @@ fun ReadingPageView( onChangePage(currentPage - 1) }, enabled = (currentPage > 0)) { Icon( - imageVector = Icons.AutoMirrored.Filled.ArrowBack, + painterResource(R.drawable.ic_previous_page), contentDescription = stringResource(R.string.previousPageLabel) ) } @@ -146,7 +144,7 @@ fun ReadingPageView( onChangePage(currentPage + 1) }, enabled = (currentPage < (totalPages - 1))) { Icon( - imageVector = Icons.AutoMirrored.Filled.ArrowForward, + painterResource(R.drawable.ic_next_page), contentDescription = stringResource(R.string.nextPageLabel) ) } diff --git a/androidVariant/src/main/java/org/comixedproject/variant/android/view/server/BrowseServerView.kt b/androidVariant/src/main/java/org/comixedproject/variant/android/view/server/BrowseServerView.kt index 32c53458..8cc9aa46 100644 --- a/androidVariant/src/main/java/org/comixedproject/variant/android/view/server/BrowseServerView.kt +++ b/androidVariant/src/main/java/org/comixedproject/variant/android/view/server/BrowseServerView.kt @@ -24,8 +24,6 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.automirrored.filled.ArrowBack import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.IconButton @@ -37,6 +35,7 @@ import androidx.compose.material3.pulltorefresh.rememberPullToRefreshState import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview @@ -76,7 +75,7 @@ fun BrowseServerView( }, enabled = !parentPath.isEmpty() ) { - Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = parentPath) + Icon(painterResource(R.drawable.ic_back), contentDescription = parentPath) } val displayedTitle = when (title.isEmpty()) { diff --git a/androidVariant/src/main/java/org/comixedproject/variant/android/view/server/ServerView.kt b/androidVariant/src/main/java/org/comixedproject/variant/android/view/server/ServerView.kt index 7682a1ca..d1d4d436 100644 --- a/androidVariant/src/main/java/org/comixedproject/variant/android/view/server/ServerView.kt +++ b/androidVariant/src/main/java/org/comixedproject/variant/android/view/server/ServerView.kt @@ -19,29 +19,24 @@ package org.comixedproject.variant.android.view.server import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState -import androidx.compose.runtime.getValue -import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch +import org.comixedproject.variant.android.COMIC_BOOK_LIST import org.comixedproject.variant.android.VariantTheme -import org.comixedproject.variant.platform.Log -import org.comixedproject.variant.viewmodel.VariantViewModel -import org.koin.androidx.compose.koinViewModel +import org.comixedproject.variant.model.library.ComicBook +import org.comixedproject.variant.viewmodel.BrowsingState private const val TAG = "ServerView" @Composable -fun ServerView(modifier: Modifier = Modifier) { - val variantViewModel: VariantViewModel = koinViewModel() - val browsingState by variantViewModel.browsingState.collectAsState() - val comicBookList by variantViewModel.comicBookList.collectAsState() - val loading by variantViewModel.loading.collectAsState() - - val coroutineScope = rememberCoroutineScope() - +fun ServerView( + browsingState: BrowsingState, + comicBookList: List, + loading: Boolean, + onLoadDirectory: (String, Boolean) -> Unit, + onDownloadFile: (String, String) -> Unit, + modifier: Modifier = Modifier +) { BrowseServerView( browsingState.currentPath, browsingState.title, @@ -51,21 +46,21 @@ fun ServerView(modifier: Modifier = Modifier) { browsingState.downloadingState, loading, modifier = modifier, - onLoadDirectory = { path, reload -> - coroutineScope.launch(Dispatchers.IO) { - Log.debug(TAG, "Loading directory: ${path} reload=${reload}") - variantViewModel.loadDirectory(path, reload) - } - }, - onDownloadFile = { path, filename -> - Log.debug(TAG, "Downloading file: ${path} -> ${filename}") - variantViewModel.downloadFile(path, filename) - }, + onLoadDirectory = { path, reload -> onLoadDirectory(path, reload) }, + onDownloadFile = { path, filename -> onDownloadFile(path, filename) }, ) } @Composable @Preview fun ServerViewPreview() { - VariantTheme { ServerView() } + VariantTheme { + ServerView( + BrowsingState("", "", "", listOf(), listOf()), + COMIC_BOOK_LIST, + false, + onLoadDirectory = { _, _ -> }, + onDownloadFile = { _, _ -> } + ) + } } \ No newline at end of file diff --git a/androidVariant/src/main/java/org/comixedproject/variant/android/view/server/EditServerView.kt b/androidVariant/src/main/java/org/comixedproject/variant/android/view/settings/EditServerView.kt similarity index 93% rename from androidVariant/src/main/java/org/comixedproject/variant/android/view/server/EditServerView.kt rename to androidVariant/src/main/java/org/comixedproject/variant/android/view/settings/EditServerView.kt index d3429feb..2dc71f07 100644 --- a/androidVariant/src/main/java/org/comixedproject/variant/android/view/server/EditServerView.kt +++ b/androidVariant/src/main/java/org/comixedproject/variant/android/view/settings/EditServerView.kt @@ -16,15 +16,12 @@ * along with this program. If not, see */ -package org.comixedproject.variant.android.view.server +package org.comixedproject.variant.android.view.settings import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Clear -import androidx.compose.material.icons.filled.Done import androidx.compose.material3.Button import androidx.compose.material3.Icon import androidx.compose.material3.Text @@ -35,6 +32,7 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import org.comixedproject.variant.android.R @@ -94,7 +92,7 @@ fun EditServerView( onSave(addressValue, usernameValue, passwordValue) }, enabled = validForm) { Icon( - imageVector = Icons.Default.Done, + painterResource(R.drawable.ic_save), contentDescription = stringResource(R.string.saveButton) ) } @@ -105,7 +103,7 @@ fun EditServerView( passwordValue = password }, enabled = validForm) { Icon( - imageVector = Icons.Default.Clear, + painterResource(R.drawable.ic_cancel), contentDescription = stringResource(R.string.cancelButton) ) } diff --git a/androidVariant/src/main/java/org/comixedproject/variant/android/view/settings/SettingsView.kt b/androidVariant/src/main/java/org/comixedproject/variant/android/view/settings/SettingsView.kt index 73fd745f..6a53b678 100644 --- a/androidVariant/src/main/java/org/comixedproject/variant/android/view/settings/SettingsView.kt +++ b/androidVariant/src/main/java/org/comixedproject/variant/android/view/settings/SettingsView.kt @@ -23,34 +23,24 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import org.comixedproject.variant.android.VariantTheme -import org.comixedproject.variant.android.view.server.EditServerView -import org.comixedproject.variant.platform.Log -import org.comixedproject.variant.viewmodel.VariantViewModel -import org.koin.androidx.compose.koinViewModel private val TAG = "SettingsView" @Composable fun SettingsView( - onCloseSettings: () -> Unit, + address: String, + username: String, + password: String, + onSaveSettings: (String, String, String) -> Unit, modifier: Modifier = Modifier ) { - val variantViewModel: VariantViewModel = koinViewModel() - Column(modifier = modifier) { EditServerView( - variantViewModel.address, - variantViewModel.username, - variantViewModel.password, + address, + username, + password, onSave = { address, username, password -> - Log.debug( - TAG, - "Updating server settings: address=$address, username=$username, password=$password" - ) - variantViewModel.address = address - variantViewModel.username = username - variantViewModel.password = password - onCloseSettings() + onSaveSettings(address, username, password) } ) } @@ -60,6 +50,10 @@ fun SettingsView( @Preview fun SettingsViewPreview() { VariantTheme { - SettingsView(onCloseSettings = { }) + SettingsView( + "http://www.comixedproject.org:7171", + "reader@comixedproject.org", + "my!password", + onSaveSettings = { _, _, _ -> }) } } \ No newline at end of file diff --git a/androidVariant/src/main/res/drawable-anydpi/ic_back.xml b/androidVariant/src/main/res/drawable-anydpi/ic_back.xml new file mode 100644 index 00000000..ecde333d --- /dev/null +++ b/androidVariant/src/main/res/drawable-anydpi/ic_back.xml @@ -0,0 +1,11 @@ + + + diff --git a/androidVariant/src/main/res/drawable-anydpi/ic_cancel.xml b/androidVariant/src/main/res/drawable-anydpi/ic_cancel.xml new file mode 100644 index 00000000..2683e239 --- /dev/null +++ b/androidVariant/src/main/res/drawable-anydpi/ic_cancel.xml @@ -0,0 +1,17 @@ + + + + + diff --git a/androidVariant/src/main/res/drawable-anydpi/ic_close.xml b/androidVariant/src/main/res/drawable-anydpi/ic_close.xml new file mode 100644 index 00000000..7c5f4779 --- /dev/null +++ b/androidVariant/src/main/res/drawable-anydpi/ic_close.xml @@ -0,0 +1,23 @@ + + + + + + + diff --git a/androidVariant/src/main/res/drawable-anydpi/ic_next_page.xml b/androidVariant/src/main/res/drawable-anydpi/ic_next_page.xml new file mode 100644 index 00000000..ffb8434c --- /dev/null +++ b/androidVariant/src/main/res/drawable-anydpi/ic_next_page.xml @@ -0,0 +1,14 @@ + + + + diff --git a/androidVariant/src/main/res/drawable-anydpi/ic_previous_page.xml b/androidVariant/src/main/res/drawable-anydpi/ic_previous_page.xml new file mode 100644 index 00000000..df6851be --- /dev/null +++ b/androidVariant/src/main/res/drawable-anydpi/ic_previous_page.xml @@ -0,0 +1,14 @@ + + + + diff --git a/androidVariant/src/main/res/drawable-anydpi/ic_save.xml b/androidVariant/src/main/res/drawable-anydpi/ic_save.xml new file mode 100644 index 00000000..1adbbabe --- /dev/null +++ b/androidVariant/src/main/res/drawable-anydpi/ic_save.xml @@ -0,0 +1,14 @@ + + + + diff --git a/androidVariant/src/main/res/drawable-hdpi/ic_back.png b/androidVariant/src/main/res/drawable-hdpi/ic_back.png new file mode 100644 index 0000000000000000000000000000000000000000..758a37bb6471003c8460b7d784b9fd34f15b0193 GIT binary patch literal 393 zcmV;40e1e0P)5 zJDUXpf#1=#?Ojn63;cZ&x~@Cx`~CxZPSbRe*Ihwnj^|;%gm7~{e(a>HRnad5PnA niPt9qm3oMxXqmqU0{@Or3f#veZA$n{00000NkvXXu0mjfEETm6 literal 0 HcmV?d00001 diff --git a/androidVariant/src/main/res/drawable-hdpi/ic_cancel.png b/androidVariant/src/main/res/drawable-hdpi/ic_cancel.png new file mode 100644 index 0000000000000000000000000000000000000000..a594bd5224513eec8ff511b721d1ddd7cf20978d GIT binary patch literal 924 zcmV;N17rM&P)VZpM-aU7D@4hWbrFuZMTJluwkBcnljm3%&bO#R0KM)q2rnqbr$D9Lqvo-Py$8OVNL zGS-KZ4dU~++L=H%u5r48mIujgK}MlUD|ZK^;pdUr%7B)j+o$A6=&0aeS~+n6KNIR# zIiW!CSvIoiS5B`$nXk$~zbPjG1b@H=a8OpxZgC!vnHpA36SgS1)@a{UPEx=Ta*g6_ z<#M^h%CQ}_PE$Fn`lNvvpDC&JfD#?&IOBkF4 z%0b@?;e1dI13s4>w_dMb37k6^%|$g(*vZQQ;c&v~(0(Vnr)(PrBwQo@oK4wJ*HJ7M zPpCl{VECK^+pIvwq_3+x%Pw3>XvGp*cO5v34yi#DY-TtC7R+?lR}E(TfU`q;!#Xzo z>}w_Ni_(A?H*3Rjsq>9Eqt{L1MH5I&9aqjh7!801_~HGdc`%j-hYBSa!l-ZpDO=QQm+EaJph+A zbP_x|!u`?>C?_f4?76_P@XS7{oF=MrX~M9moZX^IuhXuo0fPlLum`zvdIbj9dVBfF zEGj1qX*M!JlAn|m7YIJ3ep7LNy&{P(l9XM5k5ln3V7oX+eOsQHuclLSN5FVkN98BC zVT&FQx>L3w-JcECwmxt!c@cj$bUNoc!hXb6=|#}1n2$KGiH?9%`@`y&2I?fRnZ_IG yjQUFyIOYd!H*#6*aD!MWmu>xFcb-+dZtxF@Xc&QF>nTqF0000rWF=5XD;o-x?p$gxC)xR!bY~W4CG)jc7zoG#W*N3Gs_!ViX_52MQP>k01pqs3`om zoE;^ygR+3Jq zJIxO4P#d##v33Sj?*}@#syZc#4?%^7;rpdViGyw*r>jO80M^(Qv*^dwW?=yO!1ub^ zlw>lw3w^CKhpLi?7v#Ce&ld#gV<2>L5Z4j{kEstADz~=r*?{z`kHP^U`6pgo-LnSk z>l_1MBnhj-^BjVIw9mMIhtB8ivuoaUsD7{2`N6}NYiaYLtE+1_9{z|=4ah#nj=Q_N zkE#uNo++d7d5wNn)SgPE4w$6Qs?7_h4VSomZu8iDL9jPLM*=Ga`}dfqLkp)5_EFU< z92EMv!J8?_HFfZVQvxZeJ_si1ozgJici-Vg;gsPWvtJ#8;AjzOP4x<=5`J%09|Zil zMoY|W5c7Xb9l~HB$fD{ktRkma^8bf~3?T3^aU&fXk}4z_tW=sroR`XOdNA z<9Udq4nd&Nh}o4}7O)4tJXg3-)er=Hvm6K$`pO?q>fnc|%#!MZ;M8#=sNN6w-Gt2Y zj2Xbqh&m{o0?4ZB3G_3pwCV{f6=gla=LM?&koO&C3Iag|^Q}G@-O5Q_IS<(&7QQCv z(@Q@z?6f*lnd+Mw_aERhXP>cij z#vse|F$1`*J_^?v{D!LveovVU>%Kzxlfnd=RGS4plk`EKx76lCJEv>Q&mXREC?C}* z1BeocyGC_>z;6&TrFybCk9?J=p;efvUl06%M1}hOc1o+@4n@p9)z^T8KD#0BsU{Ie zWfmDr4Zd)Zp+R-~HXH6xC+dfyg}aE`H*kKpf%%l?K^pjh5DK>MQ?td-tF2Mc$0c(V z45_Ulc=V%_-{|nC6Y-a&7jAz}k6ZaWCh`x#x}aJao)@NK-*Eo`*E8TSu6!SM@ZNk7 z4B&Z&zC0wG@OMr)OoRcs9&lZAE1$!ZHR#H?PICa-E(-qud;A#4Z2Hp500000NkvXX Hu0mjfH9hM$ literal 0 HcmV?d00001 diff --git a/androidVariant/src/main/res/drawable-hdpi/ic_next_page.png b/androidVariant/src/main/res/drawable-hdpi/ic_next_page.png new file mode 100644 index 0000000000000000000000000000000000000000..355286831a62aa3798168ac095a3ba214b88240b GIT binary patch literal 1006 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 LNkvXXu0mjf(%1;M literal 0 HcmV?d00001 diff --git a/androidVariant/src/main/res/drawable-mdpi/ic_next_page.png b/androidVariant/src/main/res/drawable-mdpi/ic_next_page.png new file mode 100644 index 0000000000000000000000000000000000000000..c861a08de9575de801f7343742532d56c3c722cf GIT binary patch literal 586 zcmV-Q0=4~#P)&9?$E7Y&N@GC={y2V(}TzHwxb&ceGi4WaRVt9R&G^BIH{Cwn!ur6L5HU zj_<+>=d%^NPl#vlP= zvDg5f=dwnCGvD_I+a*BYIqDgk3F=`a!Uh0$!F|c!I@3M^m!M9k*G{AmTQ4d+h>`%( z{MQ7G%?)|#MAEiDjHtl`w_KpA$uJUyo6KV>YraE<+9fEJN>kJ`Hg|m0C8$}Vt&}a} zOV3)n_8}O{C0Gd*Zqe~WgVPaIePMR3`|+U>{H$G)6UF7s`GcvV=y|OdIQy&7ow|a) zt_n|GcD%5(;Wyw#Dbw)uWk;Cn`qxPibX)mPTYCVsw=N{SU&iC{QOmKw2^$0VN(Jxy zFJX2W7oWK{zszJZIZK=2hF5NZiuxh@QdKuW;62Zru*ksPEFsx7<{907*qoM6N<$f_)xCgh^kLP`v z!se$_tNNMilC2M--Qb>S%*Sy^`gIx&2P##hz>OsmUI4QVL{uJy8`drh#n>qiJoQ!I6nHR%>uP365%_Q?x%g+<|u?;V}X}eBsFxk16OBM-1-y} zd;Zq~)aHiVw<1~l!-(oEa48**M3IEp3*Lz-)^d}}u(9G z>$vzEHu+?x)9FdZ95=di4|LQG+t#ky8HBfx*5!3#0edsUV+p&1*t6IzeT;d&#|Jb7 V8heD|wFUqH002ovPDHLkV1n_o7=Qo( literal 0 HcmV?d00001 diff --git a/androidVariant/src/main/res/drawable-mdpi/ic_save.png b/androidVariant/src/main/res/drawable-mdpi/ic_save.png new file mode 100644 index 0000000000000000000000000000000000000000..e032e409041b217255822e6f4d3a551789b9f73e GIT binary patch literal 573 zcmV-D0>b@?P)eX9%iRT5NP$;aG%jHI;QhCMqlY_r8>a=NoXp~B&1BiTu8RTmJfk>y*GjQmN zW4Bl=HgdV#qULc8wx-L?X0y|p_X}{S*{sltQ;3Xfjs`j4o>@O=Y-x@`KA&H3NHuK_ z0xH{>2(d*rCQ=y+x z2vAD`Y?uX^47zAMj&IT`cR%{#&qX76ttH5X!*vlTY=LC1MC-_1_a8fMu4{+_K9sf_ zp57<*Tt^N9(S2vH=C$1bhHZy*ol2!9HAf?vOiqD&<0LoyzXXJYZ5O}A0e_j9OlFBT z#Z72lUm&9~j1!wx(BL8QA{>NYz}~DN*j>5zEVnuM8=|+gX}-oc2Cm^BRFDOO00000 LNkvXXu0mjf0Otkx literal 0 HcmV?d00001 diff --git a/androidVariant/src/main/res/drawable-xhdpi/ic_back.png b/androidVariant/src/main/res/drawable-xhdpi/ic_back.png new file mode 100644 index 0000000000000000000000000000000000000000..aa2ec58e4b7021a3ff293b364520b7a37c84d690 GIT binary patch literal 365 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 literal 0 HcmV?d00001 diff --git a/androidVariant/src/main/res/drawable-xhdpi/ic_next_page.png b/androidVariant/src/main/res/drawable-xhdpi/ic_next_page.png new file mode 100644 index 0000000000000000000000000000000000000000..ce7976bd139164a6498edd115e44b116a10dfb8c GIT binary patch literal 1164 zcmV;71atd|P))CweaRX<>XAZ?{~ z0YObl_-{F5{G8$ExzAtE&XI=Lo^xjA&ilCc-AAcZ5Z2e%KW;P{KR27rec6FNAL{RG zv+m~u^XcVl!ExP@=Ew zlwk6r%wlUGx0!chDDXKZquKeb@^|VT*a*q13pk&KRe9Q!y$@h6_ zymQ#Dp)VNE#XWAdT1ym-1O>X5Dt=>Q<1_Ndg~ek0Y!GT-gZ!bO?rbuknF9VoZc$Ld zzcQbh)k1DAs@3YnsPiKS8Uvb7t}(CGVl|N)LLFY@oyG#lu8=z|SS~iOJ1H)b+XsOGfJ+hnRWtiuwqwl|wltIDQGu~B!{z0%g z!R5I`e+H`oHN7rHGqxPxakS)k1cNK*$C8G<9{E8V~a6C&;(kZO^H${e|Q^P8)&&BU79|O1@JL zKfpq$(a1hQAtxitK@?2d`<#HB z9hTgpkN#fZ95nFo)LHCl0FV5Sw%nyKLaG2Q%sy127xcUMU+3xbpa$)EjlMsyAGtQK zP#9rQ0UE^hoTJfa)JITrE_+SqY+<)3N@2(XY;t@~Ze$du;5Ame4d8InK!bD|#3k}+ z)TH1ws{Oyd8I^(*#wkDv?@>33-rzNz8GObA_<_1n^oG6x*kPD7&>)@GdKL0%)TH1w zol|HA7x6Q4Bcm_{ujyRGyp7rgM^S`91t`wWOm3t4=b`_xpo#2&ewTDFPoD?zzDKMF zg)SxPIa`j3d$hE))O%i_|0Hr6TuRu6a>o$_D{L{>wXH#V`UAv^IfIh_?Hw9fA}e^nYez2qge^@xUo}7PIrXLR2bxCC9;tzR`UGZ;NmwmpF$-|6m<8-Y6dJyh&g zz<>WiNgdk_NJ(%8*Y{T|D=Qz6mx9;ZXZk%@mzwk~Ifjw8Rs22KIz;~%v&_(HJRLJ@=48}B`h|RO%rGA{FnX9Vum$o|C!(#Di-Qs exp4~r-R3RpZ-OVPuo8p0MvwP2d%$=E?*;zd=A(YGI6V+<6NRx>x^hw_uEKwlP4Gswno|Mox8ggCZ z#s(ZuX)qOzZv?-OVNpXU{JAZL`D78pwl*j^MTmD>Z5ei#)PS@J&6+eOU- zvZ=f-Akk}Tga$Q~H!5(I)_fqV%JY%Yp@Zw!O7a2Sw8PD-z8{cW*|(pYn>(g@AIw2= z+V-p!8;aZ7TIINK8{2jo37CurbeQ70sXP~&7e>lW<%}tbi;R+7C|~s!5crX>gSc?1plS?)ZV~^X@i!X66d=u3xVkjC=?3&tOO}soZ9>T zK>ILM<>jfh*@MFu?oDoY)zE^K0RG<9`@SIfCVJ&in0-H>Fl(+2uAlLy?#&}T(=~x0 zX>SQu`q``Af<6pdqXhvr26aSe0+t}aN6%Vxyk2|N2f?*r?rgwTTt}A7&(DYUr1DiC z1lI<+|Lj^(hjru%x_M2x7SvAlL2zwaJAnVb0qlmjjw~735K40rLq2$EPhx$H;(A(* zENB8jlKNv5|2%hZ##zXa>_ffp3#)};bvVqvAHaLy+O!t3q_+|?GcyPE!Qcyf166z+ zW*-LKO7K9rr7)bu-prve*OlYQmfll)1NLT)K*heg3bZV#?eusxq3tyMTz2`$`BO)U zi&S4|P!OJy^&}nDo>0D?3|g<0OD;j7eAOEmL!r8MzESP1cMH#br6kZrcMMV>+=<#+ z5hH?=ye@NqLs)q(G%pnQmU4)Jj#b=eGJmVSACSb=DE7$VjpSq>s}LZpYHK+^ls76^ z2U}=t;K5c4y0xHG_uyy|6aTD{$A`3m4FW%aQ0TYNddm!X*>$o5#>e#9M-I!pwuE9eno|@ zvQDuWd${C%@XLtK2?>(QM?S_3JGCANwSQl2ni@m`Ci$6llQGpkHrUl+y%AU7`*+=V z`AHfX?&&pnTxlOU+AC~I;8uAV@?DdODzN<)V-6(?R4`lJga2;x7yrICT^qSXKmY&$ M07*qoM6N<$g4in@hyVZp literal 0 HcmV?d00001 diff --git a/androidVariant/src/main/res/drawable-xhdpi/ic_save.png b/androidVariant/src/main/res/drawable-xhdpi/ic_save.png new file mode 100644 index 0000000000000000000000000000000000000000..07d1038290d111fc6bc9bb0796c94afcf7214ec3 GIT binary patch literal 1078 zcmV-61j+k}P)`Na+kr))BLX2rHyRkvMRiTI?qJqBZgGxogH}U$URYCDmvDo@=JtywQ z$;nK*m)W!jKAP;D@B7X-GdnvwX%KiqyWKtHp_`Hd~TeSG|2HWs?t=sKZ z)PFZH2O(!5=tHm9`;*7$%NUHM!OO%fl0H;1MU62TTa$SO5?$kz(B!_1u~EoX&081< zyr{|4IKPqn9;U@{^-sVya>!MGwOXyVsQ$TtWJi#ATN5OPw(~*0Im~<+Y#-FY2VCOO^KIqs1k-=8tte6e z&w})t0`s<`!f9E1KEYT49ELmvp!aT&&)(Ix1nglIUPL@$#u-eZJU20XuA4r#BEX4M zc$~DQ+$=C-VFbR7Eu;AE+*A?h)dMOj_8aypU--3MIeB1NM&Gl5r{={p4>H}qm;zy; zUZ)l9d7>u|GQ?cVy_MiRR*^0%GUrX`R-&665^KUBv^?v)3+VmJ68qh-5d{=_p|OpG$DSWR<9FqZ%JxdhbNkf5QaZeOeT&EHb5`{Q z<|`$EA-ZcJWdeJ}$7-WcU6?U9l|$^+W0hB;$$qRtfH3mj89VH$gDu|7${T@hEn=rV zakPle{HnY$R4Ntg;ck|fj-qgg-*UX{j{_^pL5kKODB_}WeFJ&M4zZ}EUa#+0?nH1! z(LiyqH_G(|#D1&!;+*+bHaJGMk)TB$55M#&YY5-w3z70OfxnFCJt0X-`H_z~IhEBZ z7ovZ^+H7bNN$BloR<4B1ss4q*p`J7vMGdik*^^I9f%SW2Ls9|ItFt#Qu6LXyZ wurDemt-<#**8FpfrNO5Tz8!_T@b5N%0Sypokal7aLjV8(07*qoM6N<$g5b6Yg8%>k literal 0 HcmV?d00001 diff --git a/androidVariant/src/main/res/drawable-xxhdpi/ic_back.png b/androidVariant/src/main/res/drawable-xxhdpi/ic_back.png new file mode 100644 index 0000000000000000000000000000000000000000..b5364d4b71a05c454fba35484862640f73590eeb GIT binary patch literal 465 zcmV;?0WSWDP)U%Y#w=FCjG@#okrrM6m+sU>6t&*?qDFV6V5r#oUw9tZ_ehNGisVSwAGSS+Nx?G%j6u} z=%e3!NivmFV~$MDv5mg_&6gyTb8NE*zxk3>+N!n6dG?zxNhasim?M*O2HI+!nt@Et zIU$+K8Nr|cv{-Mjbgn@P|Q!}__eynC{B7n^8j!ez7FS&N(mTLfR+6UmV zPZ=H@MxfmS)C_L9oKzD5$VmawZUK>#0#dA`O%Wg|{S9~`oRgB`AIUS;IuG8ExjNxj z5x!X)+&wR|{NN)%&+AZs$tERUs9VR(x%9^X00000;6L#N>L%`efY=Gq00000NkvXX Hu0mjf^8ekg literal 0 HcmV?d00001 diff --git a/androidVariant/src/main/res/drawable-xxhdpi/ic_cancel.png b/androidVariant/src/main/res/drawable-xxhdpi/ic_cancel.png new file mode 100644 index 0000000000000000000000000000000000000000..8711b8a0ed6884f3b3af6d7acaccc56089867c94 GIT binary patch literal 1749 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 Rr=$P?002ovPDHLkV1oYL$kqS= literal 0 HcmV?d00001 diff --git a/androidVariant/src/main/res/drawable-xxhdpi/ic_previous_page.png b/androidVariant/src/main/res/drawable-xxhdpi/ic_previous_page.png new file mode 100644 index 0000000000000000000000000000000000000000..76283516f65756fbab24238a70705c9574470b53 GIT binary patch literal 1986 zcmV;z2R-d@q>>T1w}rfLNGBw1aVi; zf9p9*)mnR|s^<3e%xo{=Bqs~q_nx}9y1E|S)zfN?9}jf9-NpI&`LptO_AoMPRuTxtK+cZD|d(Z-IYI4ISTN=yK z@*9h}xw$2@mRp+0sL3+fQZ=5&0Kv7{e`w(2CSzbM8sA1@8-n^%1KnscCdQ`0jup87 zKi0r3gx@c?%I|^Qg@uLvM~)nMOtoibW_Iu#ZrKIe(nobHL`9uY?U4h8ZU=wUUB!H87(+P1pYH_o2S%&RG6KeeVS!z94VrrUQ+*|0K!vRm=ZzW#@|Wx9Tym*kD({F zn5fX_)wdSV8m6@nB?3DS)2-^e0pO^5UgJ|TCv_YMY`!Y4#7Oh9`fW52(<>UM5*4{y z{VD;S+JmJIndhdark+s0rofMQ+4woBMEnn_pBWIiuA&iFQuCLlf%7TGnutH}n);Z4 zn*Ssrwn{%_?ogkmg0c2#Nhj5(2;N#MB7(IieB%cCq$f3xn9NyyvOsMwt3V*my{7h? z1zhcGK7qLCf2n;E?RI-nogJ$ZWyJcJ*<4S#|{y274?FIo7e4C?>>f`vgYMTM)N!iJy8m|KjSBEHoDYef50sO80 zJf?P4fR+7T=w#Pj{sNkSmhyu72jUKTOYPUt%?yVq{3o?7A$5g$Ozo`Tt*v^>s`@U! zc3V-~Rlwmu!g!UOO{;wg!>S<6vyPT-hdTOP*{en%pF^pAcH~0A*VVQk>Q)ekT=ZF2 zRHMWy`T@xKhU$2&o)K-E8U+sW*rHAaaa~uM)a7W^k5O7@w&DSaa~n1Ah4$2>1%p(O zpY8stepdF=&w)9rme+fA%_uiFfYBF`mKjwm2<4wr`y8QjCDp=8`XxZ?E7kIP|IhjK zWMs5G(lWzZK{$3GcLkO7=kQ!b-vZ{SS|l$*u-U3717o2oFeI=Q|Nl~LazwCaB43Ms zC8$1B+efSD4}wnSl@jZQ%L4A4=sC%EQ7U9b zDgicGR=OU~5%zDYZa_-EP6gqjy{~#chBGWIIp4tXjtW_kO2A6ra<`~vjFf(z3PMFV z)$^KHSlI7+f~-1wj*&{BAAJimy=_S8$DL|bKyRPwk*phbP{{>g%eZn+A(cRh+6nhV zO21|WB}X#wW_F38B2|z|AVt{SnwXe)ME(0ArC+Cl2-WkN%gMq>6{v!orWBs-g!>_- zKZ*)+e1wuJj8uUt$Z5vhBo%b${w?OAdR}w6)JYG#T_lx2iH+{0U1pfCvsEOOKtDEi zn0NQcM6pfC;ZI&xAuCb| z@EFe>K74pGbv{LQlFqnTty4j4DXK?ejW);g8}Yb<&H8h-$x%D;lzyEGQmw#N*zZJf zJxQjno&~7{w1T|dK4;u?PXE#avq39}J5*GwN6%&6JHhC?NXv{=0;viLaO+=F7s*>c zbwLNMAeY&VhU4efjB>lN*at*fW>l>p0)xdK*!-b>Rt{Q0%u%&S-8I*k*FLcOAk{+p z(W)P#&ugFc`z>AO;kn~vsUqrB5W(dK?60auiBH<2pPcnJ0 zH~y1M+NtkQU};Gtg1p4%JL*3w@R5u&?mcR^+b^pBP{BUQa+SzVgFXvq%#2+%Mg`vI z<}JINr6Ra*YJL9baq!^5hp9zPEhk6VUu_xJkwXOv|44(ekhdWCE^dw4(lmkRXhU1; zEu_S){-NrQ8~1wo}{Ipe#oVbYhmr13Ns95Fg~f26G^ znPHM;uq-WqGlAci^1H9|rFD^&)PUAGYEoMZyBEMt{ixr-ez|M>nLuA5WAAkT1Is8| UaqqvLb^rhX07*qoM6N<$f{a1aKL7v# literal 0 HcmV?d00001 diff --git a/androidVariant/src/main/res/drawable-xxhdpi/ic_save.png b/androidVariant/src/main/res/drawable-xxhdpi/ic_save.png new file mode 100644 index 0000000000000000000000000000000000000000..02e76661ff6c57d698c63d4cad8bc22a2e0fa0d9 GIT binary patch literal 1848 zcmV-82gmq{P)S}w6kOXFPzVHwIT8^t#$aRl*qvFg5$A#w1d2GsB@`hc;1gdE;E z|B(E@`E83f#(FeON7bjQ;3!WRNoUn37MxldL;?<+@D+`Pg@uQ-9WL2s^@#*}ds_ooqU;s5 z9~MCS8`>UAT=c)y-V5XsEp>K+oKyQ@Lm2bmj`w|P-vxDYI%l_5_T6zd;M0f5WKxX} z0YmUDb+BY6t@gtTtVgrjK1^!U$eJM3ugzcA=(EBiogJ3uEq=`rq* z*|geM5xm8~4fWglyAR0Wp3rt$@;Q{+NA6rq7S*Sug!=X_e|7>zrzDg|h}pn6^6qJOJCJ|NB!^)>!` z)@D=-E!{v>LXhxy6^;H;ed3`0PWwlBYthgGQ%NOrA8g~7RjcUksdEVUT-7)v`-T^pw*`rApQxBNwROaKzU!h)hcr5o_FUEsAF8?8s3P!#n2#S zAWV3@J;=0DXlxUInuF^XyGU~@^Azwk zNMA=q>h=0*jg_L4MuPn#zg;>knL(>lRtV#^`7pyok=eJ#apFZzH||DiFTP0~JP=|N zMKtOwEg*yBXDMBP&rcdhDqIs6j+|0Ehd@2=X}zZI&pCnuEg<{NG2r)$#u9Eiwz1O+ z+O9aEb3@cDg1$wTXZ^T?qav}BAZo+&yUX($I4^kW?hr*I9fKg^#XcHwj4j!0sh@DddWAvR9t7jxlAs>tE90F}$RSibR?Y2jq#tN7y4Ti); z*d@eX&;WUZZB!km?Ju}?xxV&E(@Ak@KwgMDURbm1k3|^$67BjS!~PJP2%_wwIuwC0 z;shOjzp1u0zHU`R%T}v(Tu&zF>?X%>)q}m^XI#{AXw`vu6 z3_BqDKR`vmc}1NpG5iY4Zu0`$pzX3ubp(%y$_-2>4f7#R?;#D+yK_Z>r_VKjOYQ*b zQ+1#NCbS(cYrQTX2zXY5xUBLg2nw|2nCcgPsy?Xz$H?Rk+!=<`_DP>2VA}nzKB>Xe z=V8QK4-eoH62yCg*$FRw!{EfQC&mRpYCnxV^thj7n8ScLw=`9h= z0;v2W6_bXXg5ViUjrq7Vfn~IzZQ3cML`Qz0af`Trade_Icons \ No newline at end of file diff --git a/iosVariant/iosVariant/Assets.xcassets/browse_library.imageset/Contents.json b/iosVariant/iosVariant/Assets.xcassets/browse_library.imageset/Contents.json new file mode 100644 index 00000000..14ebc31e --- /dev/null +++ b/iosVariant/iosVariant/Assets.xcassets/browse_library.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "reshot-icon-cloud-8FZ46C952V.svg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iosVariant/iosVariant/Assets.xcassets/browse_library.imageset/reshot-icon-cloud-8FZ46C952V.svg b/iosVariant/iosVariant/Assets.xcassets/browse_library.imageset/reshot-icon-cloud-8FZ46C952V.svg new file mode 100644 index 00000000..ed2ca669 --- /dev/null +++ b/iosVariant/iosVariant/Assets.xcassets/browse_library.imageset/reshot-icon-cloud-8FZ46C952V.svg @@ -0,0 +1 @@ +1.Cloud \ No newline at end of file diff --git a/iosVariant/iosVariant/Assets.xcassets/close.imageset/Contents.json b/iosVariant/iosVariant/Assets.xcassets/close.imageset/Contents.json new file mode 100644 index 00000000..ca77cff8 --- /dev/null +++ b/iosVariant/iosVariant/Assets.xcassets/close.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "reshot-icon-close-PTL63WY9KD.svg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iosVariant/iosVariant/Assets.xcassets/close.imageset/reshot-icon-close-PTL63WY9KD.svg b/iosVariant/iosVariant/Assets.xcassets/close.imageset/reshot-icon-close-PTL63WY9KD.svg new file mode 100644 index 00000000..c9049b71 --- /dev/null +++ b/iosVariant/iosVariant/Assets.xcassets/close.imageset/reshot-icon-close-PTL63WY9KD.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iosVariant/iosVariant/Assets.xcassets/comic_library.imageset/Contents.json b/iosVariant/iosVariant/Assets.xcassets/comic_library.imageset/Contents.json new file mode 100644 index 00000000..b31a75fe --- /dev/null +++ b/iosVariant/iosVariant/Assets.xcassets/comic_library.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "reshot-icon-library-539WBKTVCD.svg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iosVariant/iosVariant/Assets.xcassets/comic_library.imageset/reshot-icon-library-539WBKTVCD.svg b/iosVariant/iosVariant/Assets.xcassets/comic_library.imageset/reshot-icon-library-539WBKTVCD.svg new file mode 100644 index 00000000..4ce4f1cb --- /dev/null +++ b/iosVariant/iosVariant/Assets.xcassets/comic_library.imageset/reshot-icon-library-539WBKTVCD.svg @@ -0,0 +1,3 @@ + + + diff --git a/iosVariant/iosVariant/Assets.xcassets/delete_selections.imageset/Contents.json b/iosVariant/iosVariant/Assets.xcassets/delete_selections.imageset/Contents.json new file mode 100644 index 00000000..702e9a63 --- /dev/null +++ b/iosVariant/iosVariant/Assets.xcassets/delete_selections.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "reshot-icon-trash-EQVMX5TB72.svg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iosVariant/iosVariant/Assets.xcassets/delete_selections.imageset/reshot-icon-trash-EQVMX5TB72.svg b/iosVariant/iosVariant/Assets.xcassets/delete_selections.imageset/reshot-icon-trash-EQVMX5TB72.svg new file mode 100644 index 00000000..f52f5a27 --- /dev/null +++ b/iosVariant/iosVariant/Assets.xcassets/delete_selections.imageset/reshot-icon-trash-EQVMX5TB72.svg @@ -0,0 +1 @@ +70-Trash \ No newline at end of file diff --git a/iosVariant/iosVariant/Assets.xcassets/next_page.imageset/Contents.json b/iosVariant/iosVariant/Assets.xcassets/next_page.imageset/Contents.json new file mode 100644 index 00000000..253cbe35 --- /dev/null +++ b/iosVariant/iosVariant/Assets.xcassets/next_page.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "reshot-icon-next-circle-C6SMFYQZW9.svg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iosVariant/iosVariant/Assets.xcassets/next_page.imageset/reshot-icon-next-circle-C6SMFYQZW9.svg b/iosVariant/iosVariant/Assets.xcassets/next_page.imageset/reshot-icon-next-circle-C6SMFYQZW9.svg new file mode 100644 index 00000000..b691355d --- /dev/null +++ b/iosVariant/iosVariant/Assets.xcassets/next_page.imageset/reshot-icon-next-circle-C6SMFYQZW9.svg @@ -0,0 +1 @@ +next circle \ No newline at end of file diff --git a/iosVariant/iosVariant/Assets.xcassets/previous_page.imageset/Contents.json b/iosVariant/iosVariant/Assets.xcassets/previous_page.imageset/Contents.json new file mode 100644 index 00000000..69001d1a --- /dev/null +++ b/iosVariant/iosVariant/Assets.xcassets/previous_page.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "reshot-icon-back-circle-JYQ7GC5DF8.svg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iosVariant/iosVariant/Assets.xcassets/previous_page.imageset/reshot-icon-back-circle-JYQ7GC5DF8.svg b/iosVariant/iosVariant/Assets.xcassets/previous_page.imageset/reshot-icon-back-circle-JYQ7GC5DF8.svg new file mode 100644 index 00000000..bcbd2773 --- /dev/null +++ b/iosVariant/iosVariant/Assets.xcassets/previous_page.imageset/reshot-icon-back-circle-JYQ7GC5DF8.svg @@ -0,0 +1 @@ +back circle \ No newline at end of file diff --git a/iosVariant/iosVariant/Assets.xcassets/save.imageset/Contents.json b/iosVariant/iosVariant/Assets.xcassets/save.imageset/Contents.json new file mode 100644 index 00000000..063a1372 --- /dev/null +++ b/iosVariant/iosVariant/Assets.xcassets/save.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "reshot-icon-check-mark-GTKPVL654M.svg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iosVariant/iosVariant/Assets.xcassets/save.imageset/reshot-icon-check-mark-GTKPVL654M.svg b/iosVariant/iosVariant/Assets.xcassets/save.imageset/reshot-icon-check-mark-GTKPVL654M.svg new file mode 100644 index 00000000..3bc01d6a --- /dev/null +++ b/iosVariant/iosVariant/Assets.xcassets/save.imageset/reshot-icon-check-mark-GTKPVL654M.svg @@ -0,0 +1 @@ +4.Check mark \ No newline at end of file diff --git a/iosVariant/iosVariant/Assets.xcassets/settings.imageset/Contents.json b/iosVariant/iosVariant/Assets.xcassets/settings.imageset/Contents.json new file mode 100644 index 00000000..76251bf1 --- /dev/null +++ b/iosVariant/iosVariant/Assets.xcassets/settings.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "reshot-icon-setting-E4QJBWP6Z9.svg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iosVariant/iosVariant/Assets.xcassets/settings.imageset/reshot-icon-setting-E4QJBWP6Z9.svg b/iosVariant/iosVariant/Assets.xcassets/settings.imageset/reshot-icon-setting-E4QJBWP6Z9.svg new file mode 100644 index 00000000..04bdc1fc --- /dev/null +++ b/iosVariant/iosVariant/Assets.xcassets/settings.imageset/reshot-icon-setting-E4QJBWP6Z9.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/iosVariant/iosVariant/HomeView.swift b/iosVariant/iosVariant/HomeView.swift index 789e0890..bbae849d 100644 --- a/iosVariant/iosVariant/HomeView.swift +++ b/iosVariant/iosVariant/HomeView.swift @@ -77,7 +77,7 @@ struct HomeView: View { localized: "destination.comics.label", defaultValue: "Comics" ), - systemImage: "book.fill" + image: "comic_library" ) } @@ -121,7 +121,7 @@ struct HomeView: View { localized: "destination.browse-server.label", defaultValue: "Browse" ), - systemImage: "person.crop.circle.fill" + image: "browse_library" ) } @@ -147,7 +147,7 @@ struct HomeView: View { localized: "destination.settings.label", defaultValue: "Settings" ), - systemImage: "gearshape.fill" + image: "settings" ) } } diff --git a/iosVariant/iosVariant/Views/Comics/ComicBooksView.swift b/iosVariant/iosVariant/Views/Comics/ComicBooksView.swift index 63b30905..108039b9 100644 --- a/iosVariant/iosVariant/Views/Comics/ComicBooksView.swift +++ b/iosVariant/iosVariant/Views/Comics/ComicBooksView.swift @@ -57,7 +57,7 @@ struct ComicBooksView: View { Button { onDeleteComics() } label: { - Image(systemName: "trash.fill") + Image("delete_selections") } .disabled(selectionList.isEmpty) } else { diff --git a/iosVariant/iosVariant/Views/Reading/ReadingPageView.swift b/iosVariant/iosVariant/Views/Reading/ReadingPageView.swift index 630ecbd3..04fe980f 100644 --- a/iosVariant/iosVariant/Views/Reading/ReadingPageView.swift +++ b/iosVariant/iosVariant/Views/Reading/ReadingPageView.swift @@ -79,7 +79,7 @@ struct ReadingPageView: View { ) self.pageNumber = self.pageNumber - 1 } label: { - Image(systemName: "arrowshape.left.fill") + Image("previous_page") } .disabled(pageNumber == 0) @@ -101,7 +101,7 @@ struct ReadingPageView: View { Log().info(tag: TAG, message: "Going to next page") self.pageNumber = self.pageNumber + 1 } label: { - Image(systemName: "arrowshape.right.fill") + Image("next_page") } .disabled(pageNumber == (totalPages - 1)) } diff --git a/iosVariant/iosVariant/Views/Servers/BrowseServerView.swift b/iosVariant/iosVariant/Views/Server/BrowseServerView.swift similarity index 97% rename from iosVariant/iosVariant/Views/Servers/BrowseServerView.swift rename to iosVariant/iosVariant/Views/Server/BrowseServerView.swift index 5e563aea..c29f1fdd 100644 --- a/iosVariant/iosVariant/Views/Servers/BrowseServerView.swift +++ b/iosVariant/iosVariant/Views/Server/BrowseServerView.swift @@ -100,7 +100,7 @@ struct BrowseServerView: View { ) onLoadDirectory(parentPath, false) } label: { - Image(systemName: "arrow.backward") + Image("back") } } } @@ -112,9 +112,9 @@ struct BrowseServerView: View { #Preview("directories") { BrowseServerView( comicBookList: COMIC_BOOK_LIST, - path: "/reader/v1", + path: "/reader/v1/publishers", title: "", - parentPath: "", + parentPath: "/reader/v1", directoryContents: DIRECTORY_LIST.filter { $0.isDirectory }, downloadingState: [], loading: false, diff --git a/iosVariant/iosVariant/Views/Servers/DirectoryItemView.swift b/iosVariant/iosVariant/Views/Server/DirectoryItemView.swift similarity index 100% rename from iosVariant/iosVariant/Views/Servers/DirectoryItemView.swift rename to iosVariant/iosVariant/Views/Server/DirectoryItemView.swift diff --git a/iosVariant/iosVariant/Views/Servers/FileItemView.swift b/iosVariant/iosVariant/Views/Server/FileItemView.swift similarity index 100% rename from iosVariant/iosVariant/Views/Servers/FileItemView.swift rename to iosVariant/iosVariant/Views/Server/FileItemView.swift diff --git a/iosVariant/iosVariant/Views/Servers/ServerView.swift b/iosVariant/iosVariant/Views/Server/ServerView.swift similarity index 100% rename from iosVariant/iosVariant/Views/Servers/ServerView.swift rename to iosVariant/iosVariant/Views/Server/ServerView.swift diff --git a/iosVariant/iosVariant/Views/Settings/EditServerView.swift b/iosVariant/iosVariant/Views/Settings/EditServerView.swift index 1168aa7a..e3418d70 100644 --- a/iosVariant/iosVariant/Views/Settings/EditServerView.swift +++ b/iosVariant/iosVariant/Views/Settings/EditServerView.swift @@ -104,7 +104,7 @@ struct EditServerView: View { Button { onSaveChanges(addressValue, usernameValue, passwordValue) } label: { - Image(systemName: "checkmark.circle.fill") + Image("save") } } }.navigationViewStyle(StackNavigationViewStyle())