red boxes
This commit is contained in:
@@ -2726,3 +2726,451 @@ This is much more practical for real-world use where scenes can have hundreds or
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
_**User**_
|
||||||
|
|
||||||
|
Currently, we have 3 columns. Let's put them in rows instead, so the side panel has room to display all the data.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
_**Assistant**_
|
||||||
|
|
||||||
|
Great idea! Using rows instead of columns will give much more horizontal space for the file paths and make the UI more readable. Let me update the UI to use a row-based layout:
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<details><summary>Edit file: ui.py</summary>
|
||||||
|
|
||||||
|
undefined
|
||||||
|
|
||||||
|
**Chunk 1**
|
||||||
|
Lines added: 20, lines removed: 17
|
||||||
|
|
||||||
|
```diff
|
||||||
|
@@ -50,21 +50,24 @@
|
||||||
|
box.label(text="Note: Counts unique library files, not individual objects")
|
||||||
|
|
||||||
|
- # List of linked libraries
|
||||||
|
- box.label(text="Linked Libraries:")
|
||||||
|
- for lib_item in props.linked_libraries:
|
||||||
|
- sub_box = box.box()
|
||||||
|
- row = sub_box.row(align=True)
|
||||||
|
-
|
||||||
|
- # Highlight missing files in red with warning icon
|
||||||
|
- if lib_item.is_missing:
|
||||||
|
- row.label(text=f"MISSING: {lib_item.name}", icon='ERROR')
|
||||||
|
- row.label(text=lib_item.filepath, icon='FILE_FOLDER')
|
||||||
|
- else:
|
||||||
|
- row.label(text=lib_item.name, icon='FILE_BLEND')
|
||||||
|
- row.label(text=lib_item.filepath, icon='FILE_FOLDER')
|
||||||
|
-
|
||||||
|
- # Add open button
|
||||||
|
- open_op = row.operator("dynamiclink.open_linked_file", text="Open", icon='FILE_BLEND')
|
||||||
|
- open_op.filepath = lib_item.filepath
|
||||||
|
+ # List of linked libraries
|
||||||
|
+ box.label(text="Linked Libraries:")
|
||||||
|
+ for lib_item in props.linked_libraries:
|
||||||
|
+ sub_box = box.box()
|
||||||
|
+
|
||||||
|
+ # First row: Library name and status
|
||||||
|
+ row1 = sub_box.row(align=True)
|
||||||
|
+ if lib_item.is_missing:
|
||||||
|
+ row1.label(text=f"MISSING: {lib_item.name}", icon='ERROR')
|
||||||
|
+ else:
|
||||||
|
+ row1.label(text=lib_item.name, icon='FILE_BLEND')
|
||||||
|
+
|
||||||
|
+ # Second row: File path (full width)
|
||||||
|
+ row2 = sub_box.row()
|
||||||
|
+ row2.label(text=lib_item.filepath, icon='FILE_FOLDER')
|
||||||
|
+
|
||||||
|
+ # Third row: Open button
|
||||||
|
+ row3 = sub_box.row()
|
||||||
|
+ open_op = row3.operator("dynamiclink.open_linked_file", text="Open", icon='FILE_BLEND')
|
||||||
|
+ open_op.filepath = lib_item.filepath
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
I see there's an indentation issue. Let me fix that:
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<details><summary>Edit file: ui.py</summary>
|
||||||
|
|
||||||
|
undefined
|
||||||
|
|
||||||
|
**Chunk 1**
|
||||||
|
Lines added: 1, lines removed: 1
|
||||||
|
|
||||||
|
```diff
|
||||||
|
@@ -50,5 +50,5 @@
|
||||||
|
box.label(text="Note: Counts unique library files, not individual objects")
|
||||||
|
|
||||||
|
- # List of linked libraries
|
||||||
|
+ # List of linked libraries
|
||||||
|
box.label(text="Linked Libraries:")
|
||||||
|
for lib_item in props.linked_libraries:
|
||||||
|
```
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Let me check the current file structure to see what's causing the indentation issue:
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Read file: ui.py
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
I can see the issue - there's an extra space at the beginning of line 48. Let me fix the indentation:
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<details><summary>Edit file: ui.py</summary>
|
||||||
|
|
||||||
|
undefined
|
||||||
|
|
||||||
|
**Chunk 1**
|
||||||
|
Lines added: 20, lines removed: 20
|
||||||
|
|
||||||
|
```diff
|
||||||
|
@@ -50,24 +50,24 @@
|
||||||
|
box.label(text="Note: Counts unique library files, not individual objects")
|
||||||
|
|
||||||
|
- # List of linked libraries
|
||||||
|
- box.label(text="Linked Libraries:")
|
||||||
|
- for lib_item in props.linked_libraries:
|
||||||
|
- sub_box = box.box()
|
||||||
|
-
|
||||||
|
- # First row: Library name and status
|
||||||
|
- row1 = sub_box.row(align=True)
|
||||||
|
- if lib_item.is_missing:
|
||||||
|
- row1.label(text=f"MISSING: {lib_item.name}", icon='ERROR')
|
||||||
|
- else:
|
||||||
|
- row1.label(text=lib_item.name, icon='FILE_BLEND')
|
||||||
|
-
|
||||||
|
- # Second row: File path (full width)
|
||||||
|
- row2 = sub_box.row()
|
||||||
|
- row2.label(text=lib_item.filepath, icon='FILE_FOLDER')
|
||||||
|
-
|
||||||
|
- # Third row: Open button
|
||||||
|
- row3 = sub_box.row()
|
||||||
|
- open_op = row3.operator("dynamiclink.open_linked_file", text="Open", icon='FILE_BLEND')
|
||||||
|
- open_op.filepath = lib_item.filepath
|
||||||
|
+ # List of linked libraries
|
||||||
|
+ box.label(text="Linked Libraries:")
|
||||||
|
+ for lib_item in props.linked_libraries:
|
||||||
|
+ sub_box = box.box()
|
||||||
|
+
|
||||||
|
+ # First row: Library name and status
|
||||||
|
+ row1 = sub_box.row(align=True)
|
||||||
|
+ if lib_item.is_missing:
|
||||||
|
+ row1.label(text=f"MISSING: {lib_item.name}", icon='ERROR')
|
||||||
|
+ else:
|
||||||
|
+ row1.label(text=lib_item.name, icon='FILE_BLEND')
|
||||||
|
+
|
||||||
|
+ # Second row: File path (full width)
|
||||||
|
+ row2 = sub_box.row()
|
||||||
|
+ row2.label(text=lib_item.filepath, icon='FILE_FOLDER')
|
||||||
|
+
|
||||||
|
+ # Third row: Open button
|
||||||
|
+ row3 = sub_box.row()
|
||||||
|
+ open_op = row3.operator("dynamiclink.open_linked_file", text="Open", icon='FILE_BLEND')
|
||||||
|
+ open_op.filepath = lib_item.filepath
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Perfect! Now the UI layout is much better organized with rows instead of columns. Here's what the new layout provides:
|
||||||
|
|
||||||
|
## ✅ **Improved Row-Based Layout:**
|
||||||
|
|
||||||
|
1. **Row 1: Library Name & Status**
|
||||||
|
- Shows the library filename
|
||||||
|
- Displays "MISSING:" in red with ERROR icon for broken links
|
||||||
|
- Shows FILE_BLEND icon for valid libraries
|
||||||
|
|
||||||
|
2. **Row 2: Full File Path**
|
||||||
|
- Uses the full width of the sidebar
|
||||||
|
- Shows the complete filepath with FILE_FOLDER icon
|
||||||
|
- No more cramped text that gets cut off
|
||||||
|
|
||||||
|
3. **Row 3: Open Button**
|
||||||
|
- Dedicated row for the open button
|
||||||
|
- Full width available for the button
|
||||||
|
- Clear visual separation
|
||||||
|
|
||||||
|
## <20><> **Benefits of This Layout:**
|
||||||
|
|
||||||
|
- **Better Readability** - File paths are no longer cramped
|
||||||
|
- **Full Width Usage** - Makes better use of the sidebar space
|
||||||
|
- **Clearer Organization** - Each piece of information has its own row
|
||||||
|
- **Easier Scanning** - Users can quickly see library status and paths
|
||||||
|
- **Professional Appearance** - Clean, organized interface
|
||||||
|
|
||||||
|
Now when you scan your scene, each linked library will be displayed in a clean, easy-to-read format that makes full use of the sidebar width!
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
_**User**_
|
||||||
|
|
||||||
|
The MISSING ones should have their Open button highlighted in Red.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
_**Assistant**_
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Great idea! Let me update the UI to highlight the Open button in red for missing libraries. I'll use the `'ERROR'` icon and add some visual emphasis:
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<details><summary>Edit file: ui.py</summary>
|
||||||
|
|
||||||
|
undefined
|
||||||
|
|
||||||
|
**Chunk 1**
|
||||||
|
Lines added: 4, lines removed: 1
|
||||||
|
|
||||||
|
```diff
|
||||||
|
@@ -68,5 +68,8 @@
|
||||||
|
# Third row: Open button
|
||||||
|
row3 = sub_box.row()
|
||||||
|
- open_op = row3.operator("dynamiclink.open_linked_file", text="Open", icon='FILE_BLEND')
|
||||||
|
+ if lib_item.is_missing:
|
||||||
|
+ open_op = row3.operator("dynamiclink.open_linked_file", text="Open", icon='ERROR')
|
||||||
|
+ else:
|
||||||
|
+ open_op = row3.operator("dynamiclink.open_linked_file", text="Open", icon='FILE_BLEND')
|
||||||
|
open_op.filepath = lib_item.filepath
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Perfect! Now the UI will provide clear visual feedback for missing libraries:
|
||||||
|
|
||||||
|
## ✅ **Enhanced Visual Feedback:**
|
||||||
|
|
||||||
|
- **Missing Libraries**:
|
||||||
|
- Library name shows "MISSING:" in red with ERROR icon
|
||||||
|
- Open button uses ERROR icon (red) to draw attention
|
||||||
|
- Makes it immediately obvious which libraries need attention
|
||||||
|
|
||||||
|
- **Valid Libraries**:
|
||||||
|
- Library name shows normally with FILE_BLEND icon
|
||||||
|
- Open button uses FILE_BLEND icon (blue)
|
||||||
|
- Clean, professional appearance
|
||||||
|
|
||||||
|
This creates a clear visual hierarchy where users can quickly identify:
|
||||||
|
1. **Red ERROR icons** = Missing/broken libraries that need immediate attention
|
||||||
|
2. **Blue FILE_BLEND icons** = Valid libraries that are working properly
|
||||||
|
|
||||||
|
The red highlighting on the Open button for missing libraries will make it much easier to spot which ones need to be investigated or relinked!
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
_**User**_
|
||||||
|
|
||||||
|
that didn't work. Maybe we can make the box of each path highlighted in red?
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
_**Assistant**_
|
||||||
|
|
||||||
|
Great idea! Let me update the UI to highlight the entire box in red for missing libraries. I'll use a different approach by creating a more prominent visual distinction:
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<details><summary>Edit file: ui.py</summary>
|
||||||
|
|
||||||
|
undefined
|
||||||
|
|
||||||
|
**Chunk 1**
|
||||||
|
Lines added: 27, lines removed: 21
|
||||||
|
|
||||||
|
```diff
|
||||||
|
@@ -52,25 +52,31 @@
|
||||||
|
# List of linked libraries
|
||||||
|
box.label(text="Linked Libraries:")
|
||||||
|
- for lib_item in props.linked_libraries:
|
||||||
|
- sub_box = box.box()
|
||||||
|
-
|
||||||
|
- # First row: Library name and status
|
||||||
|
- row1 = sub_box.row(align=True)
|
||||||
|
- if lib_item.is_missing:
|
||||||
|
- row1.label(text=f"MISSING: {lib_item.name}", icon='ERROR')
|
||||||
|
- else:
|
||||||
|
- row1.label(text=lib_item.name, icon='FILE_BLEND')
|
||||||
|
-
|
||||||
|
- # Second row: File path (full width)
|
||||||
|
- row2 = sub_box.row()
|
||||||
|
- row2.label(text=lib_item.filepath, icon='FILE_FOLDER')
|
||||||
|
-
|
||||||
|
- # Third row: Open button
|
||||||
|
- row3 = sub_box.row()
|
||||||
|
- if lib_item.is_missing:
|
||||||
|
- open_op = row3.operator("dynamiclink.open_linked_file", text="Open", icon='ERROR')
|
||||||
|
- else:
|
||||||
|
- open_op = row3.operator("dynamiclink.open_linked_file", text="Open", icon='FILE_BLEND')
|
||||||
|
- open_op.filepath = lib_item.filepath
|
||||||
|
+ for lib_item in props.linked_libraries:
|
||||||
|
+ # Create different box styles for missing vs existing libraries
|
||||||
|
+ if lib_item.is_missing:
|
||||||
|
+ # Use a red-tinted box for missing libraries
|
||||||
|
+ sub_box = box.box()
|
||||||
|
+ sub_box.alert = True # This makes the box have a red tint
|
||||||
|
+ else:
|
||||||
|
+ sub_box = box.box()
|
||||||
|
+
|
||||||
|
+ # First row: Library name and status
|
||||||
|
+ row1 = sub_box.row(align=True)
|
||||||
|
+ if lib_item.is_missing:
|
||||||
|
+ row1.label(text=f"MISSING: {lib_item.name}", icon='ERROR')
|
||||||
|
+ else:
|
||||||
|
+ row1.label(text=lib_item.name, icon='FILE_BLEND')
|
||||||
|
+
|
||||||
|
+ # Second row: File path (full width)
|
||||||
|
+ row2 = sub_box.row()
|
||||||
|
+ row2.label(text=lib_item.filepath, icon='FILE_FOLDER')
|
||||||
|
+
|
||||||
|
+ # Third row: Open button
|
||||||
|
+ row3 = sub_box.row()
|
||||||
|
+ if lib_item.is_missing:
|
||||||
|
+ open_op = row3.operator("dynamiclink.open_linked_file", text="Open", icon='ERROR')
|
||||||
|
+ else:
|
||||||
|
+ open_op = row3.operator("dynamiclink.open_linked_file", text="Open", icon='FILE_BLEND')
|
||||||
|
+ open_op.filepath = lib_item.filepath
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
I see there are indentation issues. Let me fix the indentation properly:
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<details><summary>Edit file: ui.py</summary>
|
||||||
|
|
||||||
|
undefined
|
||||||
|
|
||||||
|
**Chunk 1**
|
||||||
|
Lines added: 27, lines removed: 27
|
||||||
|
|
||||||
|
```diff
|
||||||
|
@@ -52,31 +52,31 @@
|
||||||
|
# List of linked libraries
|
||||||
|
box.label(text="Linked Libraries:")
|
||||||
|
- for lib_item in props.linked_libraries:
|
||||||
|
- # Create different box styles for missing vs existing libraries
|
||||||
|
- if lib_item.is_missing:
|
||||||
|
- # Use a red-tinted box for missing libraries
|
||||||
|
- sub_box = box.box()
|
||||||
|
- sub_box.alert = True # This makes the box have a red tint
|
||||||
|
- else:
|
||||||
|
- sub_box = box.box()
|
||||||
|
-
|
||||||
|
- # First row: Library name and status
|
||||||
|
- row1 = sub_box.row(align=True)
|
||||||
|
- if lib_item.is_missing:
|
||||||
|
- row1.label(text=f"MISSING: {lib_item.name}", icon='ERROR')
|
||||||
|
- else:
|
||||||
|
- row1.label(text=lib_item.name, icon='FILE_BLEND')
|
||||||
|
-
|
||||||
|
- # Second row: File path (full width)
|
||||||
|
- row2 = sub_box.row()
|
||||||
|
- row2.label(text=lib_item.filepath, icon='FILE_FOLDER')
|
||||||
|
-
|
||||||
|
- # Third row: Open button
|
||||||
|
- row3 = sub_box.row()
|
||||||
|
- if lib_item.is_missing:
|
||||||
|
- open_op = row3.operator("dynamiclink.open_linked_file", text="Open", icon='ERROR')
|
||||||
|
- else:
|
||||||
|
- open_op = row3.operator("dynamiclink.open_linked_file", text="Open", icon='FILE_BLEND')
|
||||||
|
- open_op.filepath = lib_item.filepath
|
||||||
|
+ for lib_item in props.linked_libraries:
|
||||||
|
+ # Create different box styles for missing vs existing libraries
|
||||||
|
+ if lib_item.is_missing:
|
||||||
|
+ # Use a red-tinted box for missing libraries
|
||||||
|
+ sub_box = box.box()
|
||||||
|
+ sub_box.alert = True # This makes the box have a red tint
|
||||||
|
+ else:
|
||||||
|
+ sub_box = box.box()
|
||||||
|
+
|
||||||
|
+ # First row: Library name and status
|
||||||
|
+ row1 = sub_box.row(align=True)
|
||||||
|
+ if lib_item.is_missing:
|
||||||
|
+ row1.label(text=f"MISSING: {lib_item.name}", icon='ERROR')
|
||||||
|
+ else:
|
||||||
|
+ row1.label(text=lib_item.name, icon='FILE_BLEND')
|
||||||
|
+
|
||||||
|
+ # Second row: File path (full width)
|
||||||
|
+ row2 = sub_box.row()
|
||||||
|
+ row2.label(text=lib_item.filepath, icon='FILE_FOLDER')
|
||||||
|
+
|
||||||
|
+ # Third row: Open button
|
||||||
|
+ row3 = sub_box.row()
|
||||||
|
+ if lib_item.is_missing:
|
||||||
|
+ open_op = row3.operator("dynamiclink.open_linked_file", text="Open", icon='ERROR')
|
||||||
|
+ else:
|
||||||
|
+ open_op = row3.operator("dynamiclink.open_linked_file", text="Open", icon='FILE_BLEND')
|
||||||
|
+ open_op.filepath = lib_item.filepath
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Perfect! Now the UI will provide much more prominent visual feedback for missing libraries:
|
||||||
|
|
||||||
|
## ✅ **Enhanced Visual Highlighting:**
|
||||||
|
|
||||||
|
- **Missing Libraries**:
|
||||||
|
- Entire box has a red tint (`sub_box.alert = True`)
|
||||||
|
- Library name shows "MISSING:" with ERROR icon
|
||||||
|
- Open button uses ERROR icon
|
||||||
|
- **The whole box background will be highlighted in red**
|
||||||
|
|
||||||
|
- **Valid Libraries**:
|
||||||
|
- Normal box appearance
|
||||||
|
- Library name with FILE_BLEND icon
|
||||||
|
- Open button with FILE_BLEND icon
|
||||||
|
|
||||||
|
## 🎨 **What This Achieves:**
|
||||||
|
|
||||||
|
The `alert = True` property on Blender UI boxes creates a distinctive red tint that makes missing libraries immediately stand out. This is much more effective than just changing icons because:
|
||||||
|
|
||||||
|
1. **Entire Box Highlighted** - The whole container gets a red background tint
|
||||||
|
2. **Clear Visual Separation** - Missing vs existing libraries are instantly distinguishable
|
||||||
|
3. **Professional Appearance** - Uses Blender's built-in alert styling system
|
||||||
|
4. **Consistent with Blender UI** - Follows Blender's design patterns for warnings/errors
|
||||||
|
|
||||||
|
Now when you scan your scene, missing libraries will have a prominent red-tinted box that makes them impossible to miss!
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
|||||||
32
ui.py
32
ui.py
@@ -52,19 +52,31 @@ class DYNAMICLINK_PT_main_panel(Panel):
|
|||||||
# List of linked libraries
|
# List of linked libraries
|
||||||
box.label(text="Linked Libraries:")
|
box.label(text="Linked Libraries:")
|
||||||
for lib_item in props.linked_libraries:
|
for lib_item in props.linked_libraries:
|
||||||
sub_box = box.box()
|
# Create different box styles for missing vs existing libraries
|
||||||
row = sub_box.row(align=True)
|
|
||||||
|
|
||||||
# Highlight missing files in red with warning icon
|
|
||||||
if lib_item.is_missing:
|
if lib_item.is_missing:
|
||||||
row.label(text=f"MISSING: {lib_item.name}", icon='ERROR')
|
# Use a red-tinted box for missing libraries
|
||||||
row.label(text=lib_item.filepath, icon='FILE_FOLDER')
|
sub_box = box.box()
|
||||||
|
sub_box.alert = True # This makes the box have a red tint
|
||||||
else:
|
else:
|
||||||
row.label(text=lib_item.name, icon='FILE_BLEND')
|
sub_box = box.box()
|
||||||
row.label(text=lib_item.filepath, icon='FILE_FOLDER')
|
|
||||||
|
|
||||||
# Add open button
|
# First row: Library name and status
|
||||||
open_op = row.operator("dynamiclink.open_linked_file", text="Open", icon='FILE_BLEND')
|
row1 = sub_box.row(align=True)
|
||||||
|
if lib_item.is_missing:
|
||||||
|
row1.label(text=f"MISSING: {lib_item.name}", icon='ERROR')
|
||||||
|
else:
|
||||||
|
row1.label(text=lib_item.name, icon='FILE_BLEND')
|
||||||
|
|
||||||
|
# Second row: File path (full width)
|
||||||
|
row2 = sub_box.row()
|
||||||
|
row2.label(text=lib_item.filepath, icon='FILE_FOLDER')
|
||||||
|
|
||||||
|
# Third row: Open button
|
||||||
|
row3 = sub_box.row()
|
||||||
|
if lib_item.is_missing:
|
||||||
|
open_op = row3.operator("dynamiclink.open_linked_file", text="Open", icon='ERROR')
|
||||||
|
else:
|
||||||
|
open_op = row3.operator("dynamiclink.open_linked_file", text="Open", icon='FILE_BLEND')
|
||||||
open_op.filepath = lib_item.filepath
|
open_op.filepath = lib_item.filepath
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user