@@ -5,6 +5,7 @@ import androidx.compose.foundation.border
55import androidx.compose.foundation.layout.Arrangement
66import androidx.compose.foundation.layout.Box
77import androidx.compose.foundation.layout.BoxWithConstraints
8+ import androidx.compose.foundation.layout.Column
89import androidx.compose.foundation.layout.Row
910import androidx.compose.foundation.layout.fillMaxWidth
1011import androidx.compose.foundation.layout.height
@@ -14,7 +15,13 @@ import androidx.compose.foundation.layout.size
1415import androidx.compose.foundation.shape.CircleShape
1516import androidx.compose.foundation.shape.RoundedCornerShape
1617import androidx.compose.material.icons.Icons
18+ import androidx.compose.material.icons.twotone.ContentCopy
19+ import androidx.compose.material.icons.twotone.Delete
20+ import androidx.compose.material.icons.twotone.Edit
1721import androidx.compose.material.icons.twotone.MoreVert
22+ import androidx.compose.material.icons.twotone.Refresh
23+ import androidx.compose.material.icons.twotone.Share
24+ import androidx.compose.material.icons.twotone.Star
1825import androidx.compose.material3.Card
1926import androidx.compose.material3.CardDefaults
2027import androidx.compose.material3.DropdownMenu
@@ -31,12 +38,18 @@ import androidx.compose.runtime.remember
3138import androidx.compose.runtime.setValue
3239import androidx.compose.ui.Alignment
3340import androidx.compose.ui.Modifier
41+ import androidx.compose.ui.graphics.vector.ImageVector
3442import androidx.compose.ui.platform.LocalContext
3543import androidx.compose.ui.res.pluralStringResource
3644import androidx.compose.ui.res.stringResource
3745import androidx.compose.ui.unit.Dp
3846import androidx.compose.ui.unit.dp
47+ import eu.darken.butler.common.ca.CaString
48+ import eu.darken.butler.common.ca.toCaString
49+ import eu.darken.butler.common.compose.Preview2
50+ import eu.darken.butler.common.compose.PreviewWrapper
3951import eu.darken.butler.workspace.R
52+ import eu.darken.butler.common.R as CommonR
4053
4154/* *
4255 * Shared action bar for workspace modules
@@ -242,3 +255,100 @@ fun WorkspaceActionBar(
242255 }
243256 }
244257}
258+
259+ @Preview2
260+ @Composable
261+ private fun WorkspaceActionBarPreview () {
262+ PreviewWrapper {
263+ Column (
264+ verticalArrangement = Arrangement .spacedBy(16 .dp),
265+ modifier = Modifier .padding(16 .dp)
266+ ) {
267+ // Sample action implementation for preview
268+ data class SampleAction (
269+ override val icon : ImageVector ,
270+ override val label : CaString ,
271+ override val isVisible : Boolean = true ,
272+ override val isEnabled : Boolean = true ,
273+ override val isDestructive : Boolean = false ,
274+ override val group : WorkspaceAction .Group = WorkspaceAction .Group .PRIMARY ,
275+ override val badge : Boolean = false ,
276+ ) : WorkspaceAction
277+
278+ // Basic action bar with a few actions
279+ WorkspaceActionBar (
280+ actions = listOf (
281+ SampleAction (Icons .TwoTone .Share , CommonR .string.general_share_action.toCaString()),
282+ SampleAction (Icons .TwoTone .Edit , CommonR .string.general_edit_action.toCaString()),
283+ SampleAction (
284+ Icons .TwoTone .Delete ,
285+ CommonR .string.general_delete_action.toCaString(),
286+ isDestructive = true
287+ ),
288+ ),
289+ onActionClick = {},
290+ )
291+
292+ // With selection count (selection mode)
293+ WorkspaceActionBar (
294+ actions = listOf (
295+ SampleAction (Icons .TwoTone .ContentCopy , CommonR .string.general_copy_action.toCaString()),
296+ SampleAction (
297+ Icons .TwoTone .Delete ,
298+ CommonR .string.general_delete_action.toCaString(),
299+ isDestructive = true
300+ ),
301+ ),
302+ onActionClick = {},
303+ selectionCount = 5 ,
304+ )
305+
306+ // With overflow menu (more actions than fit)
307+ WorkspaceActionBar (
308+ actions = listOf (
309+ SampleAction (Icons .TwoTone .Share , CommonR .string.general_share_action.toCaString()),
310+ SampleAction (Icons .TwoTone .Edit , CommonR .string.general_edit_action.toCaString()),
311+ SampleAction (Icons .TwoTone .ContentCopy , CommonR .string.general_copy_action.toCaString()),
312+ SampleAction (
313+ Icons .TwoTone .Star ,
314+ CommonR .string.general_view_action.toCaString(),
315+ group = WorkspaceAction .Group .SECONDARY
316+ ),
317+ SampleAction (
318+ Icons .TwoTone .Refresh ,
319+ CommonR .string.general_refresh_action.toCaString(),
320+ group = WorkspaceAction .Group .SECONDARY
321+ ),
322+ SampleAction (
323+ Icons .TwoTone .Delete ,
324+ CommonR .string.general_delete_action.toCaString(),
325+ isDestructive = true
326+ ),
327+ ),
328+ onActionClick = {},
329+ )
330+
331+ // With badges and disabled action
332+ WorkspaceActionBar (
333+ actions = listOf (
334+ SampleAction (
335+ Icons .TwoTone .Refresh ,
336+ CommonR .string.general_refresh_action.toCaString(),
337+ badge = true
338+ ),
339+ SampleAction (
340+ Icons .TwoTone .Edit ,
341+ CommonR .string.general_edit_action.toCaString(),
342+ isEnabled = false
343+ ),
344+ SampleAction (
345+ Icons .TwoTone .Delete ,
346+ CommonR .string.general_delete_action.toCaString(),
347+ isDestructive = true
348+ ),
349+ ),
350+ onActionClick = {},
351+ )
352+ }
353+ }
354+ }
0 commit comments