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

dynamic color example not working #1727

Open
Epierre31 opened this issue Aug 12, 2024 · 0 comments
Open

dynamic color example not working #1727

Epierre31 opened this issue Aug 12, 2024 · 0 comments

Comments

@Epierre31
Copy link

Epierre31 commented Aug 12, 2024

context:
kivy 2.3
kivyMD 2.0.1dev0
python 3.11
desktop : Windows 10

chapter 'dynamic_color'
when trying to run the example:"Example of dynamic color from the list of standard color schemes", not color scheme change when selectting various color from "set palette menu"

after numerous tests, it seems that

  • in def build: function
    • setting theme_cls.dynamic_color to True will prevent the change, and
    • setting theme_cls.dynamic_color to False let the color scheme being computed again.
  1. I don't know if this is the expected behavior
    dynamic_color = True ==> change only through path_to_wallpaper (2nd example)
    dynamic_color = False ==> change only through assigning new primary_palette
  2. fact is : First example is not working on my desktop

correct code (with some comments)

from kivy.clock import Clock
from kivy.lang import Builder
from kivy.properties import StringProperty, ColorProperty
from kivy.uix.boxlayout import BoxLayout
from kivy.utils import hex_colormap
from kivymd.dynamic_color import DynamicColor

from kivymd.uix.menu import MDDropdownMenu
from kivymd.app import MDApp

KV = '''

orientation: "vertical"

MDLabel:
    text: root.text
    color: "grey"
    adaptive_height: True

MDCard:
    theme_bg_color: "Custom"
    md_bg_color: root.bg_color

MDScreen:
md_bg_color: app.theme_cls.backgroundColor

MDIconButton:
    on_release: app.open_menu(self)
    pos_hint: {"top": .98}
    x: "12dp"
    icon: "menu"

MDRecycleView:
    id: card_list
    viewclass: "ColorCard"
    bar_width: 0
    size_hint_y: None
    height: root.height - dp(68)

    RecycleGridLayout:
        cols: 3
        spacing: "16dp"
        padding: "16dp"
        default_size: None, dp(56)
        default_size_hint: 1, None
        size_hint_y: None
        height: self.minimum_height

'''

class ColorCard(BoxLayout):
text = StringProperty()
bg_color = ColorProperty()

class Example(MDApp):
menu: MDDropdownMenu = None

def build(self):
    # if dynamic_color = True, the color scheme may be changed but while using the path_to_wallpaper only
    # if dynamic_color = True, the color scheme may be changed by assigning primary_palette with a new color name
    self.theme_cls.dynamic_color = False
    self.theme_cls.theme_style = "Dark"
    return Builder.load_string(KV)

def get_instance_from_menu(self, name_item):
    index = 0
    rv = self.menu.ids.md_menu
    opts = rv.layout_manager.view_opts
    datas = rv.data[0]

    for data in rv.data:
        if data["text"] == name_item:
            index = rv.data.index(data)
            break

    instance = rv.view_adapter.get_view(
        index, datas, opts[index]["viewclass"]
    )

    return instance

def open_menu(self, menu_button):
    menu_items = []
    for item, method in {
        "Set palette": lambda: self.set_palette(),
        "Switch theme style": lambda: self.theme_switch(),
    }.items():
        menu_items.append({"text": item, "on_release": method})
    self.menu = MDDropdownMenu(
        caller=menu_button,
        items=menu_items,
    )
    self.menu.open()

def set_palette(self):
    instance_from_menu = self.get_instance_from_menu("Set palette")
    available_palettes = [
        name_color.capitalize() for name_color in hex_colormap.keys()
    ]

    menu_items = []
    for name_palette in available_palettes:
        menu_items.append(
            {
                "text": name_palette,
                "on_release": lambda x=name_palette: self.switch_palette(x),
            }
        )
    MDDropdownMenu(
        caller=instance_from_menu,
        items=menu_items,
    ).open()

def switch_palette(self, selected_palette):
    self.theme_cls.primary_palette = selected_palette
    Clock.schedule_once(self.generate_cards, 0.5)

def theme_switch(self) -> None:
    self.theme_cls.switch_theme()
    Clock.schedule_once(self.generate_cards, 0.5)

def generate_cards(self, *args):
    self.root.ids.card_list.data = []
    __schemes_name_colors = []
    for property_name in dir(DynamicColor):
        if '_' not in property_name:
            __schemes_name_colors.append(property_name)
    for color in __schemes_name_colors:
        value = color
        self.root.ids.card_list.data.append(
            {
                "bg_color": getattr(self.theme_cls, value),
                "text": value,
            }
        )
    #     print(f"bg_color: {getattr(self.theme_cls, value)} value {value}")
    # print (f"generation of card with palette {self.theme_cls.primary_palette}")

def on_start(self):
    Clock.schedule_once(self.generate_cards)

Example().run()

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

No branches or pull requests

1 participant