Skip to content

Commit

Permalink
add url patterns to category
Browse files Browse the repository at this point in the history
  • Loading branch information
amir1376 committed Oct 17, 2024
1 parent 8ff630e commit e0ca693
Show file tree
Hide file tree
Showing 15 changed files with 240 additions and 47 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -134,12 +134,15 @@ val downloadSystemModule = module {
}
)
}
single {
DownloadManagerCategoryItemProvider(get())
}.bind<ICategoryItemProvider>()
single {
CategoryManager(
categoryStorage = get(),
scope = get(),
defaultCategoriesFactory = get(),
downloadManager = get(),
categoryItemProvider = get(),
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import com.abdownloadmanager.desktop.pages.addDownload.multiple.AddMultiItemSave
import com.abdownloadmanager.desktop.utils.asState
import com.abdownloadmanager.utils.FileIconProvider
import com.abdownloadmanager.utils.category.Category
import com.abdownloadmanager.utils.category.CategoryItem
import com.abdownloadmanager.utils.category.CategoryManager
import com.abdownloadmanager.utils.category.CategorySelectionMode
import com.arkivanov.decompose.ComponentContext
Expand Down Expand Up @@ -179,13 +180,19 @@ class AddMultiDownloadComponent(

private fun getFolderForItem(
categorySelectionMode: CategorySelectionMode?,
url: String,
fleName: String,
defaultFolder: String,
): String {
return when (categorySelectionMode) {
CategorySelectionMode.Auto -> {
downloadSystem.categoryManager
.getCategoryOfFileName(fleName)?.path
.getCategoryOf(
CategoryItem(
url = url,
fileName = fleName,
)
)?.path
?: defaultFolder
}

Expand Down Expand Up @@ -224,6 +231,7 @@ class AddMultiDownloadComponent(
id = -1,
folder = getFolderForItem(
categorySelectionMode = categorySelectionMode,
url = it.credentials.value.link,
fleName = it.name.value,
defaultFolder = it.folder.value
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
import com.abdownloadmanager.utils.FileIconProvider
import com.abdownloadmanager.utils.category.Category
import com.abdownloadmanager.utils.category.CategoryItem
import com.abdownloadmanager.utils.category.CategoryManager

sealed interface AddSingleDownloadPageEffects {
Expand Down Expand Up @@ -128,9 +129,15 @@ class AddSingleDownloadComponent(
)
.onEachLatest { onDuplicateStrategy.update { null } }
.launchIn(scope)

name.onEach {
val category = categoryManager.getCategoryOfFileName(it)
combine(
name, credentials.map { it.link }
) { name, link ->
val category = categoryManager.getCategoryOf(
CategoryItem(
fileName = name,
url = link,
)
)
if (category == null) {
setUseCategory(false)
} else {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.abdownloadmanager.desktop.pages.category

import arrow.core.split
import com.abdownloadmanager.desktop.repository.AppRepository
import com.abdownloadmanager.desktop.utils.BaseComponent
import com.abdownloadmanager.utils.category.Category
Expand Down Expand Up @@ -40,6 +39,8 @@ class CategoryComponent(
setIcon(category.iconSource())
setName(category.name)
setTypes(category.acceptedFileTypes.joinToString(" "))
setUrlPatternsEnabled(category.acceptedUrlPatterns.isNotEmpty())
setUrlPatterns(category.acceptedUrlPatterns.joinToString(" "))
setPath(category.path)
}
}
Expand All @@ -62,6 +63,18 @@ class CategoryComponent(
_types.value = types
}

private val _urlPatternsEnabled = MutableStateFlow(false)
val urlPatternsEnabled = _urlPatternsEnabled.asStateFlow()
fun setUrlPatternsEnabled(urlPatterns: Boolean) {
_urlPatternsEnabled.value = urlPatterns
}

private val _urlPatterns = MutableStateFlow("")
val urlPatterns = _urlPatterns.asStateFlow()
fun setUrlPatterns(urlPatterns: String) {
_urlPatterns.value = urlPatterns
}

private val _path = MutableStateFlow("")
val path = _path.asStateFlow()
fun setPath(path: String) {
Expand Down Expand Up @@ -101,6 +114,10 @@ class CategoryComponent(
.value!!
.uriOrNull()!!,
path = path,
acceptedUrlPatterns = urlPatterns.value
.split(" ")
.filterNot { it.isBlank() }
.distinct(),
items = emptyList() // ignored!
)
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,13 @@ fun NewCategory(
onTypesChanged = categoryComponent::setTypes
)
Spacer(Modifier.height(12.dp))
CategoryAutoUrls(
urlPatterns = categoryComponent.urlPatterns.collectAsState().value,
onUrlPatternChanged = categoryComponent::setUrlPatterns,
enabled = categoryComponent.urlPatternsEnabled.collectAsState().value,
setEnabled = categoryComponent::setUrlPatternsEnabled
)
Spacer(Modifier.height(12.dp))
CategoryDefaultPath(
path = categoryComponent.path.collectAsState().value,
onPathChanged = categoryComponent::setPath,
Expand Down Expand Up @@ -152,8 +159,30 @@ fun CategoryAutoTypes(
modifier = Modifier.fillMaxWidth(),
placeholder = "ext1 ext2 ext3 (separate with space)",
singleLine = false,
minLines = 2,
maxLines = 2,
)
}
}

@Composable
fun CategoryAutoUrls(
enabled: Boolean,
setEnabled: (Boolean) -> Unit,
urlPatterns: String,
onUrlPatternChanged: (String) -> Unit,
) {
OptionalWithLabel(
label = "URL patterns",
helpText = "Automatically put download from these URLs to this category. (when you add new download)\nSeparate URLs with space, you can also use * for wildcard",
enabled = enabled,
setEnabled = setEnabled
) {
CategoryPageTextField(
text = urlPatterns,
onTextChange = onUrlPatternChanged,
modifier = Modifier.fillMaxWidth(),
placeholder = "dl.example.com/pics example.com/*/path",
enabled = enabled,
singleLine = false,
)
}
}
Expand Down Expand Up @@ -197,6 +226,37 @@ private fun WithLabel(
}
}

@Composable
private fun OptionalWithLabel(
label: String,
modifier: Modifier = Modifier,
enabled: Boolean,
setEnabled: (Boolean) -> Unit,
helpText: String? = null,
content: @Composable () -> Unit,
) {
Column(modifier) {
Row(verticalAlignment = Alignment.CenterVertically) {
Row(
modifier = Modifier.onClick {
setEnabled(!enabled)
},
verticalAlignment = Alignment.CenterVertically,
) {
CheckBox(enabled, setEnabled, size = 16.dp)
Spacer(Modifier.width(8.dp))
Text(label)
}
helpText?.let {
Spacer(Modifier.width(8.dp))
Help(helpText)
}
}
Spacer(Modifier.height(8.dp))
content()
}
}

@Composable
private fun CategoryIcon(
iconSource: IconSource?,
Expand Down Expand Up @@ -328,6 +388,7 @@ private fun CategoryPageTextField(
singleLine: Boolean = true,
maxLines: Int = if (singleLine) 1 else Int.MAX_VALUE,
minLines: Int = 1,
enabled: Boolean = true,
start: @Composable (() -> Unit)? = null,
end: @Composable (() -> Unit)? = null,
) {
Expand All @@ -351,6 +412,7 @@ private fun CategoryPageTextField(
background = myColors.surface / 50,
interactionSource = interactionSource,
shape = RoundedCornerShape(6.dp),
enabled = enabled,
start = start?.let {
{
WithContentAlpha(0.5f) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,23 +12,23 @@ import com.abdownloadmanager.desktop.ui.customwindow.CustomWindow
fun ShowCategoryDialogs(dialogManager: CategoryDialogManager) {
val dialogs by dialogManager.openedCategoryDialogs.collectAsState()
for (d in dialogs) {
CustomWindow(
onCloseRequest = {
d.close()
},
alwaysOnTop = true,
state = rememberWindowState(
size = DpSize(350.dp, 350.dp)
)
) {
CategoryDialog(d)
}
CategoryDialog(d)
}
}

@Composable
private fun CategoryDialog(
component: CategoryComponent,
) {
NewCategory(component)
CustomWindow(
onCloseRequest = {
component.close()
},
alwaysOnTop = true,
state = rememberWindowState(
size = DpSize(350.dp, 400.dp)
)
) {
NewCategory(component)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import com.abdownloadmanager.desktop.pages.category.CategoryDialogManager
import com.abdownloadmanager.desktop.storage.AppSettingsStorage
import com.abdownloadmanager.utils.FileIconProvider
import com.abdownloadmanager.utils.category.Category
import com.abdownloadmanager.utils.category.CategoryItemWithId
import com.abdownloadmanager.utils.category.CategoryManager
import com.abdownloadmanager.utils.category.DefaultCategories
import com.arkivanov.decompose.ComponentContext
Expand Down Expand Up @@ -465,7 +466,13 @@ class HomeComponent(
}
categoryManager
.autoAddItemsToCategoriesBasedOnFileNames(
unCategorizedItems.map { it.id to it.name }
unCategorizedItems.map {
CategoryItemWithId(
id = it.id,
fileName = it.name,
url = it.downloadLink,
)
}
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
import androidx.compose.ui.draw.clip
import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester
Expand All @@ -47,7 +48,7 @@ fun MyTextField(
modifier: Modifier,
background: Color = myColors.surface,
contentColor: Color = myColors.getContentColorFor(background).takeIf { it.isSpecified }
?: LocalContentColor.current,
?: LocalContentColor.current,
focusedBorderColor: Color = myColors.primary,
borderColor: Color = myColors.onBackground / 0.1f,
shape: Shape = RoundedCornerShape(12.dp),
Expand All @@ -70,10 +71,16 @@ fun MyTextField(
val textSize = fontSize.takeOrElse { LocalTextStyle.current.fontSize }
Row(
modifier
.ifThen(!enabled) {
alpha(0.5f)
}
.clip(shape)
.height(IntrinsicSize.Max)
// .height(32.dp)
.pointerHoverIcon(PointerIcon.Text)
.pointerHoverIcon(
if (enabled) PointerIcon.Text
else PointerIcon.Default
)
.onKeyEvent {
if (it.key == Key.Escape) {
fm.clearFocus()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.abdownloadmanager.desktop.utils

import com.abdownloadmanager.utils.category.CategoryItemWithId
import com.abdownloadmanager.utils.category.CategoryManager
import com.abdownloadmanager.utils.category.CategorySelectionMode
import ir.amirab.downloader.DownloadManager
Expand Down Expand Up @@ -68,7 +69,12 @@ class DownloadSystem(
CategorySelectionMode.Auto -> {
categoryManager.autoAddItemsToCategoriesBasedOnFileNames(
createdIds.mapIndexed { index: Int, id: Long ->
id to newItemsToAdd.get(index).name
val downloadItem = newItemsToAdd[index]
CategoryItemWithId(
id = id,
fileName = downloadItem.name,
url = downloadItem.link,
)
}
)
}
Expand Down Expand Up @@ -105,15 +111,15 @@ class DownloadSystem(
}

suspend fun removeDownload(id: Long, alsoRemoveFile: Boolean) {
downloadManager.deleteDownload(id, alsoRemoveFile,RemovedBy(User))
downloadManager.deleteDownload(id, alsoRemoveFile, RemovedBy(User))
categoryManager.removeItemInCategories(listOf(id))
}

suspend fun manualResume(id: Long): Boolean {
// if (mainDownloadQueue.isQueueActive) {
// return false
// }
downloadManager.resume(id,ResumedBy(User))
downloadManager.resume(id, ResumedBy(User))
return true
}

Expand All @@ -131,7 +137,7 @@ class DownloadSystem(
}

suspend fun startQueue(
queueId: Long
queueId: Long,
) {
val queue = queueManager.getQueue(queueId)
if (queue.isQueueActive) {
Expand All @@ -149,7 +155,7 @@ class DownloadSystem(
}

suspend fun stopQueue(
queueId: Long
queueId: Long,
) {
queueManager.getQueue(queueId)
.stop()
Expand Down
Loading

0 comments on commit e0ca693

Please sign in to comment.