Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Save color palette as resources to reuse later #91604

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

nongvantinh
Copy link
Contributor

@nongvantinh nongvantinh commented May 5, 2024

Close godotengine/godot-proposals#7946

The lack of a palette library slows down development time because swatches contain many colors that may not match the mood an artist is trying to achieve. This can hinder their workflow as they search for the right color within a large set of mostly irrelevant options.

Untitled.video.-.Made.with.Clipchamp.mp4

scene/gui/color_picker.cpp Outdated Show resolved Hide resolved
scene/gui/color_picker.cpp Outdated Show resolved Hide resolved
@AThousandShips AThousandShips changed the title [feat] Save color palette as resources to reuse later Save color palette as resources to reuse later May 6, 2024
@AThousandShips
Copy link
Member

This should use icons available at runtime, not editor icons, there are some appropriate ones available, and otherwise they should be added, this shouldn't depend on the editor

@nongvantinh nongvantinh force-pushed the implement-7946 branch 2 times, most recently from 7c37110 to 0839503 Compare May 6, 2024 14:49
@fire
Copy link
Member

fire commented May 6, 2024

I approve of allowing saving the color pallete from a usability team perspective.

@fire fire requested a review from a team May 6, 2024 14:54
@nongvantinh
Copy link
Contributor Author

Update:

  • Use FileDialog instead of EditorFileDialog.
  • Save the palette in the user:// path instead of placing it in the project folder.
  • Remove the Palette resource class because it doesn't need anymore.

@AThousandShips What do you mean when you say use icons available at runtime? I couldn't find the correct function to call.

@AThousandShips
Copy link
Member

Icons available at runtime are those which aren't editor specific, meant in running projects not running the program itself sorry for confusion

AThousandShips
AThousandShips previously approved these changes May 6, 2024
scene/gui/color_picker.cpp Outdated Show resolved Hide resolved
scene/gui/color_picker.cpp Outdated Show resolved Hide resolved
scene/gui/color_picker.cpp Outdated Show resolved Hide resolved
scene/gui/color_picker.cpp Outdated Show resolved Hide resolved
scene/gui/color_picker.cpp Outdated Show resolved Hide resolved
scene/gui/color_picker.cpp Outdated Show resolved Hide resolved
@nongvantinh nongvantinh force-pushed the implement-7946 branch 2 times, most recently from 04ebe85 to acdd5f8 Compare May 6, 2024 15:11
@AThousandShips AThousandShips dismissed their stale review May 6, 2024 15:12

Accidental approval

@nongvantinh
Copy link
Contributor Author

Sorry for the annoying force push. I wasn't familiar with the TTR part. I need one more favor. I couldn't find the correct icon to use in the function get_theme_icon.

@AThousandShips
Copy link
Member

AThousandShips commented May 6, 2024

If it isn't in the default theme scene/theme/icons/ then you can add them from the editor or create new ones, and then you need to add them to the default theme, see in scene/theme/default_theme.cpp for details

But I think the normal folder icon is sufficient

Gonna test this one probably tomorrow but code looks good, got some final remarks I'll add when I've tested it out

@Calinou
Copy link
Member

Calinou commented May 6, 2024

I wonder if it should be possible to give a name to each color, and have the name displayed in a tooltip when hovering the color in the ColorPicker's swatch list.

It's common for designers to assign names to colors to make slightly different colors easier to distinguish from each other, or even to refer to them in natural language. If I refer to "lime 800" from Tailwind's color palette, you can immediately know it's #3f6212.

This could be left to a future PR, but we should make sure this feature can be implemented in the future without breaking compatibility (i.e. without changing the data structure in the resource).

@nongvantinh nongvantinh force-pushed the implement-7946 branch 2 times, most recently from 768da7a to 10f2235 Compare May 6, 2024 23:22
@AThousandShips
Copy link
Member

AThousandShips commented May 7, 2024

Tested and it works as expected, however I don't think the list of resources allowed makes sense, it should probably just limit to res and tres because it currently allows you to save as things like animtex and mesh, which don't make sense

Edit: correction, it shouldn't even be that, it should be some binary format dedicated to this, it doesn't actually store a res or tres file either, so that needs to be fixed

@Calinou
Copy link
Member

Calinou commented May 7, 2024

I suggest using ConfigFile to save palettes as opposed to FileAccess, so you have a text format that is friendly to version control. I'd also give them a custom file extension so they can be targeted more specifically, e.g. cpl.

A similar approach is used for script editor syntax themes, which use a tet file extension.

@nongvantinh nongvantinh force-pushed the implement-7946 branch 2 times, most recently from feca7e7 to 1e0de24 Compare May 8, 2024 12:42
@nongvantinh nongvantinh force-pushed the implement-7946 branch 2 times, most recently from 0b1cb4e to 640ac77 Compare May 25, 2024 16:39
@KoBeWi

This comment was marked as resolved.

scene/gui/color_picker.cpp Outdated Show resolved Hide resolved
scene/gui/color_picker.cpp Outdated Show resolved Hide resolved
scene/gui/color_picker.cpp Outdated Show resolved Hide resolved
@KoBeWi

This comment was marked as resolved.

@KoBeWi

This comment was marked as resolved.

editor/editor_node.cpp Outdated Show resolved Hide resolved
scene/gui/color_picker.cpp Outdated Show resolved Hide resolved
scene/gui/color_picker.cpp Outdated Show resolved Hide resolved
@@ -857,10 +976,17 @@ void ColorPicker::add_preset(const Color &p_color) {
_add_preset_button(_get_preset_size(), p_color);
}

if (palette_name->get_text().size()) {
palette_name->set_text(vformat("%s*", palette_name->get_text().replace("*", "")));
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is the replace() for? If you want to remove ending *, use trim_suffix("*").

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd also suggest (*) to match the scene tabs in the editor as well as the script editor

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think it is related to the editor or script editor, and it might unnecessarily confuse users who keep pressing Ctrl+S to save changes, but the color picker doesn't respond and keeps showing the (*) on these editors.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't see how that'd be any more or less confusing because of that

scene/gui/color_picker.cpp Outdated Show resolved Hide resolved
scene/gui/color_picker.cpp Outdated Show resolved Hide resolved
@nongvantinh
Copy link
Contributor Author

When the palette has too many colors, it will overflow the screen. I need to wrap it inside a scroll container. However, should I wrap the entire color picker in a scroll container or only the palette? Any suggestions?

image

@KoBeWi
Copy link
Member

KoBeWi commented May 28, 2024

I think only the palette, because it's foldable. Although if you simply put a ScrollContainer it will likely be too small. Not sure how to solve that.

@nongvantinh
Copy link
Contributor Author

nongvantinh commented May 28, 2024

I could introduce a foldable left side panel to the color picker, which will have a height equal to the ColorPicker's height. With the space acquired, I could implement the ability to give a name to each color. Perhaps, I could also allow users to dynamically resize this panel.

With that, I could also allow users to load multiple palettes simultaneously.

Edit:

Please note, I have a personal workload that will end in August, which requires me to put all my effort into it. Therefore, I will take a break from this and come back when it's done.

options_menu = memnew(PopupMenu);
add_child(options_menu, false, INTERNAL_MODE_FRONT);
options_menu->force_parent_owned();
options_menu->connect("id_pressed", callable_mp(this, &ColorPicker::_options_menu_cbk));
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
options_menu->connect("id_pressed", callable_mp(this, &ColorPicker::_options_menu_cbk));
options_menu->connect(SceneStringName(id_pressed), callable_mp(this, &ColorPicker::_options_menu_cbk));

New constant

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Add Save and Load ability to swatches
7 participants