Skip to content

Commit e8facfc

Browse files
authored
Merge branch 'main' into gfx1150-comfy
2 parents acc8b81 + 58ec939 commit e8facfc

File tree

15 files changed

+710
-59
lines changed

15 files changed

+710
-59
lines changed

StabilityMatrix.Avalonia/Controls/FADownloadableComboBox.cs

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,17 @@
22
using System.Threading.Tasks;
33
using AsyncAwaitBestPractices;
44
using Avalonia.Controls;
5+
using Avalonia.Controls.Primitives;
6+
using Avalonia.Input;
7+
using Avalonia.Interactivity;
8+
using Avalonia.VisualTree;
59
using CommunityToolkit.Mvvm.Input;
610
using FluentAvalonia.UI.Controls;
711
using Microsoft.Extensions.DependencyInjection;
812
using StabilityMatrix.Avalonia.Services;
913
using StabilityMatrix.Avalonia.ViewModels.Base;
1014
using StabilityMatrix.Avalonia.ViewModels.Dialogs;
15+
using StabilityMatrix.Core.Helper;
1116
using StabilityMatrix.Core.Models;
1217

1318
namespace StabilityMatrix.Avalonia.Controls;
@@ -17,6 +22,66 @@ public partial class FADownloadableComboBox : FAComboBox
1722
{
1823
protected override Type StyleKeyOverride => typeof(FAComboBox);
1924

25+
private Popup? dropDownPopup;
26+
private IDisposable? openSubscription;
27+
28+
protected override void OnApplyTemplate(TemplateAppliedEventArgs e)
29+
{
30+
base.OnApplyTemplate(e);
31+
32+
CleanupSubscription();
33+
DropDownOpened -= OnDropDownOpenedHandler;
34+
DropDownClosed -= OnDropDownClosedHandler;
35+
36+
// Template part name is "Popup" per FAComboBox.properties.cs (s_tpPopup = "Popup")
37+
dropDownPopup = e.NameScope.Find<Popup>("Popup");
38+
39+
DropDownOpened += OnDropDownOpenedHandler;
40+
DropDownClosed += OnDropDownClosedHandler;
41+
}
42+
43+
private void OnDropDownOpenedHandler(object? sender, EventArgs e)
44+
{
45+
CleanupSubscription();
46+
47+
if (dropDownPopup?.Child is not Control popupChild)
48+
return;
49+
50+
var scrollViewer = popupChild.GetVisualDescendants().OfType<ScrollViewer>().FirstOrDefault();
51+
52+
if (scrollViewer == null)
53+
return;
54+
55+
// On Unix-like systems, overlay popups share the same TopLevel visual root as the main window.
56+
// FAComboBox.OnPopupOpened adds a TopLevel tunnel handler that marks all wheel eventsas handled while the dropdown is open,
57+
// which inadvertently blocks scroll-wheelevents in popup menus in Inference model cards.
58+
// Resetting e.Handled on the ScrollViewer's tunnel phase counters this.
59+
if (!Compat.IsUnix)
60+
return;
61+
62+
openSubscription = scrollViewer.AddDisposableHandler(
63+
PointerWheelChangedEvent,
64+
static (_, ev) =>
65+
{
66+
if (ev.Handled)
67+
ev.Handled = false;
68+
},
69+
RoutingStrategies.Tunnel,
70+
handledEventsToo: true
71+
);
72+
}
73+
74+
private void OnDropDownClosedHandler(object? sender, EventArgs e)
75+
{
76+
CleanupSubscription();
77+
}
78+
79+
private void CleanupSubscription()
80+
{
81+
openSubscription?.Dispose();
82+
openSubscription = null;
83+
}
84+
2085
static FADownloadableComboBox()
2186
{
2287
SelectionChangedEvent.AddClassHandler<FADownloadableComboBox>(

StabilityMatrix.Avalonia/Languages/Resources.Designer.cs

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

StabilityMatrix.Avalonia/Languages/Resources.ja-JP.resx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,9 @@
231231
<data name="Label_UpdateAvailable" xml:space="preserve">
232232
<value>更新あり</value>
233233
</data>
234+
<data name="Label_EarlyAccessUpdateAvailable" xml:space="preserve">
235+
<value>Early Accessの更新あり</value>
236+
</data>
234237
<data name="Label_BecomeAPatron" xml:space="preserve">
235238
<value>Patreonになる</value>
236239
</data>
@@ -1432,4 +1435,4 @@ Sparkは兆レベルのパラメータを持つ基盤モデルで、膨大なパ
14321435
### 🔒 プライバシーファースト
14331436
私たちはプライバシーを最優先に考えています。([生成AI利用規約](https://lykos.ai/gen-ai-terms)) **あなたのプロンプトや出力内容は、Lykos AIや必要なクラウドインフラパートナーによるAI学習には一切使用されません。** 処理はお客様の質問に対する返答を生成するためだけに安全を重視して使われ、**その後はプロンプト内容そのものではなく、メタデータ(タイムスタンプやトークン数など)のみを保存します。** あなたのデータが販売や共有されることは決してありません。</value>
14341437
</data>
1435-
</root>
1438+
</root>

StabilityMatrix.Avalonia/Languages/Resources.resx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,9 @@
231231
<data name="Label_UpdateAvailable" xml:space="preserve">
232232
<value>Update Available</value>
233233
</data>
234+
<data name="Label_EarlyAccessUpdateAvailable" xml:space="preserve">
235+
<value>Early Access Update Available</value>
236+
</data>
234237
<data name="Label_BecomeAPatron" xml:space="preserve">
235238
<value>Become a Patron</value>
236239
</data>

StabilityMatrix.Avalonia/Styles/Card.axaml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,15 @@
9494
</Style>
9595
</Style>
9696

97+
<!-- Early Access -->
98+
<Style Selector="controls|Card.early-access">
99+
<Setter Property="Background" Value="{DynamicResource ThemeDeepOrangeColorTransparent}" />
100+
<Setter Property="BorderBrush" Value="{DynamicResource ThemeDeepOrangeColorTransparent}" />
101+
<Style Selector="^ /template/ ContentPresenter#PART_ContentPresenter">
102+
<Setter Property="Foreground" Value="{DynamicResource ButtonForeground}" />
103+
</Style>
104+
</Style>
105+
97106
<!-- Info -->
98107
<Style Selector="controls|Card.info">
99108
<Setter Property="Background" Value="{DynamicResource ThemeDarkBlueColorTransparent}" />
Lines changed: 47 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
<ResourceDictionary xmlns="https://github.com/avaloniaui"
2-
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
3-
xmlns:sty="clr-namespace:FluentAvalonia.Styling;assembly=FluentAvalonia">
4-
<!-- Static colors -->
1+
<ResourceDictionary
2+
xmlns="https://github.com/avaloniaui"
3+
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4+
xmlns:sty="clr-namespace:FluentAvalonia.Styling;assembly=FluentAvalonia">
5+
<!-- Static colors -->
56
<Color x:Key="ThemePrimaryColor">#333333</Color>
67
<Color x:Key="ThemeDarkDarkRedColor">#952923</Color>
78
<Color x:Key="ThemeDarkRedColor">#C2362E</Color>
@@ -32,58 +33,59 @@
3233
<Color x:Key="ThemeAmberColor">#FFC107</Color>
3334
<Color x:Key="ThemeOrangeColor">#FF9800</Color>
3435
<Color x:Key="ThemeDeepOrangeColor">#FF5722</Color>
36+
<Color x:Key="ThemeDeepOrangeColorTransparent">#AAFF5722</Color>
3537
<Color x:Key="ThemeEldenRingOrangeColor">#FF4F00</Color>
3638
<Color x:Key="ThemeBrownColor">#795548</Color>
3739
<Color x:Key="ThemeGreyColor">#9E9E9E</Color>
3840
<Color x:Key="ThemeLightGreyColor">#C0C0C0</Color>
3941
<Color x:Key="ThemeBlueGreyColor">#607D8B</Color>
40-
41-
<!-- Dark / light dynamic colors -->
42+
43+
<!-- Dark / light dynamic colors -->
4244
<ResourceDictionary.ThemeDictionaries>
4345
<ResourceDictionary x:Key="Default">
44-
<SolidColorBrush x:Key="ThemeBackgroundBrush" Color="#AAAAAA"/>
45-
<SolidColorBrush x:Key="ThemeDarkAccentForegroundBrush" Color="#AAAAAA"/>
46-
<SolidColorBrush x:Key="ThemeDarkAccentBackgroundBrush" Color="#686868"/>
47-
<SolidColorBrush x:Key="RegionColor" Color="#AAAAAA"/>
48-
49-
<SolidColorBrush x:Key="CompletionBorderBrush" Color="#43454A"/>
50-
<SolidColorBrush x:Key="CompletionBackgroundBrush" Color="#2B2D30"/>
51-
<SolidColorBrush x:Key="CompletionSecondaryBackgroundBrush" Color="#393B40"/>
52-
<SolidColorBrush x:Key="CompletionForegroundBrush" Color="#B4B8BF"/>
53-
<SolidColorBrush x:Key="CompletionSecondaryForegroundBrush" Color="#878B8D"/>
54-
<SolidColorBrush x:Key="CompletionSelectionBackgroundBrush" Color="#2E436E"/>
55-
<SolidColorBrush x:Key="CompletionSelectionForegroundBrush" Color="#5389F4"/>
46+
<SolidColorBrush x:Key="ThemeBackgroundBrush" Color="#AAAAAA" />
47+
<SolidColorBrush x:Key="ThemeDarkAccentForegroundBrush" Color="#AAAAAA" />
48+
<SolidColorBrush x:Key="ThemeDarkAccentBackgroundBrush" Color="#686868" />
49+
<SolidColorBrush x:Key="RegionColor" Color="#AAAAAA" />
50+
51+
<SolidColorBrush x:Key="CompletionBorderBrush" Color="#43454A" />
52+
<SolidColorBrush x:Key="CompletionBackgroundBrush" Color="#2B2D30" />
53+
<SolidColorBrush x:Key="CompletionSecondaryBackgroundBrush" Color="#393B40" />
54+
<SolidColorBrush x:Key="CompletionForegroundBrush" Color="#B4B8BF" />
55+
<SolidColorBrush x:Key="CompletionSecondaryForegroundBrush" Color="#878B8D" />
56+
<SolidColorBrush x:Key="CompletionSelectionBackgroundBrush" Color="#2E436E" />
57+
<SolidColorBrush x:Key="CompletionSelectionForegroundBrush" Color="#5389F4" />
5658
</ResourceDictionary>
57-
59+
5860
<ResourceDictionary x:Key="Dark">
59-
<SolidColorBrush x:Key="ThemeBackgroundBrush" Color="#282828"/>
60-
<SolidColorBrush x:Key="ThemeDarkAccentForegroundBrush" Color="#AAAAAA"/>
61-
<SolidColorBrush x:Key="ThemeDarkAccentBackgroundBrush" Color="#252525"/>
62-
<SolidColorBrush x:Key="RegionColor" Color="#282828"/>
63-
64-
<SolidColorBrush x:Key="CompletionBorderBrush" Color="#43454A"/>
65-
<SolidColorBrush x:Key="CompletionBackgroundBrush" Color="#2B2D30"/>
66-
<SolidColorBrush x:Key="CompletionSecondaryBackgroundBrush" Color="#393B40"/>
67-
<SolidColorBrush x:Key="CompletionForegroundBrush" Color="#B4B8BF"/>
68-
<SolidColorBrush x:Key="CompletionSecondaryForegroundBrush" Color="#878B8D"/>
69-
<SolidColorBrush x:Key="CompletionSelectionBackgroundBrush" Color="#2E436E"/>
70-
<SolidColorBrush x:Key="CompletionSelectionForegroundBrush" Color="#5389F4"/>
61+
<SolidColorBrush x:Key="ThemeBackgroundBrush" Color="#282828" />
62+
<SolidColorBrush x:Key="ThemeDarkAccentForegroundBrush" Color="#AAAAAA" />
63+
<SolidColorBrush x:Key="ThemeDarkAccentBackgroundBrush" Color="#252525" />
64+
<SolidColorBrush x:Key="RegionColor" Color="#282828" />
65+
66+
<SolidColorBrush x:Key="CompletionBorderBrush" Color="#43454A" />
67+
<SolidColorBrush x:Key="CompletionBackgroundBrush" Color="#2B2D30" />
68+
<SolidColorBrush x:Key="CompletionSecondaryBackgroundBrush" Color="#393B40" />
69+
<SolidColorBrush x:Key="CompletionForegroundBrush" Color="#B4B8BF" />
70+
<SolidColorBrush x:Key="CompletionSecondaryForegroundBrush" Color="#878B8D" />
71+
<SolidColorBrush x:Key="CompletionSelectionBackgroundBrush" Color="#2E436E" />
72+
<SolidColorBrush x:Key="CompletionSelectionForegroundBrush" Color="#5389F4" />
7173
</ResourceDictionary>
72-
74+
7375
<ResourceDictionary x:Key="{x:Static sty:FluentAvaloniaTheme.HighContrastTheme}">
74-
<SolidColorBrush x:Key="ThemeBackgroundBrush" Color="#AAAAAA"/>
75-
<SolidColorBrush x:Key="ThemeDarkAccentForegroundBrush" Color="#AAAAAA"/>
76-
<SolidColorBrush x:Key="ThemeDarkAccentBackgroundBrush" Color="#686868"/>
77-
<SolidColorBrush x:Key="RegionColor" Color="#AAAAAA"/>
78-
79-
<SolidColorBrush x:Key="CompletionBorderBrush" Color="#43454A"/>
80-
<SolidColorBrush x:Key="CompletionBackgroundBrush" Color="#2B2D30"/>
81-
<SolidColorBrush x:Key="CompletionSecondaryBackgroundBrush" Color="#393B40"/>
82-
<SolidColorBrush x:Key="CompletionForegroundBrush" Color="#B4B8BF"/>
83-
<SolidColorBrush x:Key="CompletionSecondaryForegroundBrush" Color="#878B8D"/>
84-
<SolidColorBrush x:Key="CompletionSelectionBackgroundBrush" Color="#2E436E"/>
85-
<SolidColorBrush x:Key="CompletionSelectionForegroundBrush" Color="#5389F4"/>
76+
<SolidColorBrush x:Key="ThemeBackgroundBrush" Color="#AAAAAA" />
77+
<SolidColorBrush x:Key="ThemeDarkAccentForegroundBrush" Color="#AAAAAA" />
78+
<SolidColorBrush x:Key="ThemeDarkAccentBackgroundBrush" Color="#686868" />
79+
<SolidColorBrush x:Key="RegionColor" Color="#AAAAAA" />
80+
81+
<SolidColorBrush x:Key="CompletionBorderBrush" Color="#43454A" />
82+
<SolidColorBrush x:Key="CompletionBackgroundBrush" Color="#2B2D30" />
83+
<SolidColorBrush x:Key="CompletionSecondaryBackgroundBrush" Color="#393B40" />
84+
<SolidColorBrush x:Key="CompletionForegroundBrush" Color="#B4B8BF" />
85+
<SolidColorBrush x:Key="CompletionSecondaryForegroundBrush" Color="#878B8D" />
86+
<SolidColorBrush x:Key="CompletionSelectionBackgroundBrush" Color="#2E436E" />
87+
<SolidColorBrush x:Key="CompletionSelectionForegroundBrush" Color="#5389F4" />
8688
</ResourceDictionary>
8789
</ResourceDictionary.ThemeDictionaries>
88-
90+
8991
</ResourceDictionary>

StabilityMatrix.Avalonia/ViewModels/CheckpointManager/CheckpointFileViewModel.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ namespace StabilityMatrix.Avalonia.ViewModels.CheckpointManager;
2525
public partial class CheckpointFileViewModel : SelectableViewModelBase
2626
{
2727
[ObservableProperty]
28+
[NotifyPropertyChangedFor(nameof(HasEarlyAccessUpdateOnly))]
29+
[NotifyPropertyChangedFor(nameof(HasStandardUpdate))]
2830
private LocalModelFile checkpointFile;
2931

3032
[ObservableProperty]
@@ -64,6 +66,8 @@ public partial class CheckpointFileViewModel : SelectableViewModelBase
6466
public bool CanShowTriggerWords => CheckpointFile.ConnectedModelInfo?.TrainedWords?.Length > 0;
6567
public string BaseModelName => CheckpointFile.ConnectedModelInfo?.BaseModel ?? string.Empty;
6668
public CivitModelType ModelType => CheckpointFile.ConnectedModelInfo?.ModelType ?? CivitModelType.Unknown;
69+
public bool HasEarlyAccessUpdateOnly => CheckpointFile.HasEarlyAccessUpdateOnly;
70+
public bool HasStandardUpdate => CheckpointFile.HasUpdate && !CheckpointFile.HasEarlyAccessUpdateOnly;
6771

6872
/// <inheritdoc/>
6973
public CheckpointFileViewModel(

StabilityMatrix.Avalonia/Views/CheckpointsPage.axaml

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -629,7 +629,7 @@
629629
HorizontalAlignment="Left"
630630
VerticalAlignment="Top"
631631
Classes="success"
632-
IsVisible="{Binding CheckpointFile.HasUpdate}">
632+
IsVisible="{Binding HasStandardUpdate}">
633633

634634
<TextBlock
635635
HorizontalAlignment="Center"
@@ -640,6 +640,24 @@
640640
<Run Text="{Binding CheckpointFile.LatestModelInfo.LatestVersionCreatedAt}" />
641641
</TextBlock>
642642
</controls:Card>
643+
<controls:Card
644+
Height="24"
645+
Margin="4,8,0,0"
646+
Padding="4"
647+
HorizontalAlignment="Left"
648+
VerticalAlignment="Top"
649+
Classes="early-access"
650+
IsVisible="{Binding HasEarlyAccessUpdateOnly}">
651+
652+
<TextBlock
653+
HorizontalAlignment="Center"
654+
VerticalAlignment="Center"
655+
FontSize="11"
656+
FontWeight="Medium">
657+
<Run Text="{x:Static lang:Resources.Label_EarlyAccessUpdateAvailable}" />
658+
<Run Text="{Binding CheckpointFile.LatestModelInfo.LatestVersionCreatedAt}" />
659+
</TextBlock>
660+
</controls:Card>
643661
</WrapPanel>
644662
</LayoutTransformControl>
645663

StabilityMatrix.Core/Models/Database/LocalModelFile.cs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,18 @@ public bool Equals(LocalModelFile? x, LocalModelFile? y)
2424
return false;
2525
return x.RelativePath == y.RelativePath
2626
&& Equals(x.ConnectedModelInfo, y.ConnectedModelInfo)
27-
&& x.HasUpdate == y.HasUpdate;
27+
&& x.HasUpdate == y.HasUpdate
28+
&& x.HasEarlyAccessUpdateOnly == y.HasEarlyAccessUpdateOnly;
2829
}
2930

3031
public int GetHashCode(LocalModelFile obj)
3132
{
32-
return HashCode.Combine(obj.RelativePath, obj.ConnectedModelInfo, obj.HasUpdate);
33+
return HashCode.Combine(
34+
obj.RelativePath,
35+
obj.ConnectedModelInfo,
36+
obj.HasUpdate,
37+
obj.HasEarlyAccessUpdateOnly
38+
);
3339
}
3440
}
3541

@@ -44,12 +50,13 @@ public virtual bool Equals(LocalModelFile? other)
4450
return true;
4551
return RelativePath == other.RelativePath
4652
&& ConnectedModelInfo == other.ConnectedModelInfo
47-
&& HasUpdate == other.HasUpdate;
53+
&& HasUpdate == other.HasUpdate
54+
&& HasEarlyAccessUpdateOnly == other.HasEarlyAccessUpdateOnly;
4855
}
4956

5057
public override int GetHashCode()
5158
{
52-
return HashCode.Combine(RelativePath, ConnectedModelInfo, HasUpdate);
59+
return HashCode.Combine(RelativePath, ConnectedModelInfo, HasUpdate, HasEarlyAccessUpdateOnly);
5360
}
5461

5562
/// <summary>
@@ -88,6 +95,11 @@ public override int GetHashCode()
8895
/// </summary>
8996
public bool HasUpdate { get; set; }
9097

98+
/// <summary>
99+
/// Whether updates are limited to Early Access versions only.
100+
/// </summary>
101+
public bool HasEarlyAccessUpdateOnly { get; set; }
102+
91103
/// <summary>
92104
/// Last time this model was checked for an update
93105
/// </summary>

0 commit comments

Comments
 (0)