Moonlight Animate: wybierasz kolor, a program cały się przemalowuje
W preferencjach Moonlight Animate od dawna stały dwa ustawienia wyglądu: tryb — jasny albo ciemny — i kolor akcentu do wyboru z czterech. Wyglądało to jak obietnica ośmiu wyglądów programu. W praktyce obietnica była pusta.
Właściciel projektu ustawił „Ciemny + Czerwony", spojrzał na ekran i napisał krótko: „mam dark red, a to jest nadal granatowy". Miał rację. Czerwone robiły się guziki, ramka aktywnej próbki i podświetlenie zaznaczenia. Cała reszta — rama okna, tła paneli, pola tekstowe, obszar wokół płótna — zostawała dokładnie taka sama, granatowa. Wybór koloru zmieniał kilka akcentów w niebieskim programie zamiast dawać czerwony program.
Dlaczego tak było
Paleta ciemna miała wpisane wprost konkretne kolory: ta ciemna granatowa rama, te granatowe panele, te granatowe obramowania. Z wybranego przez użytkownika odcienia liczyła się wyłącznie „rodzina akcentu" — sam akcent i jego odmiany na najechanie i wciśnięcie. Powierzchnie były zamrożone. Nie dało się ich zmienić żadnym ustawieniem, bo nic ich z ustawieniem nie łączyło.
Teraz jest odwrotnie. W palecie zapisane są już tylko proporcje — jak bardzo dany element jest nasycony i jak jasny — a odcień podstawia się z wybranego akcentu. Ta sama rampa, ten sam kontrast, ten sam rytm jasności między ramą, panelem i polem tekstowym; zmienia się tylko kolor, w którym wszystko jest utrzymane.
Efekt: „Czerwony" to ciemna bordowa rama i bordowe panele. „Zielony" to głęboka butelkowa zieleń. „Fioletowy" — śliwka. W trybie jasnym te same cztery odcienia dają bardzo jasne, delikatnie zabarwione tła. A „Niebieski" wygląda tak, jak program wyglądał zawsze — bo to jego odcień był tym zamrożonym granatem.
Trudniejsza połowa roboty
Arkusz stylów to jedno. Znacznie więcej kolorów mieszka w kodzie, który rysuje elementy własnoręcznie: siatka przekształcania na płótnie, uchwyty i kursor tekstu, wykres krzywych, edytor stopni gradientu, wskaźniki warstw, obramowania suwaków koloru, tła skopów wideo, podgląd miejsca zadokowania panelu, arkusz ekspozycyjny animacji. Tych miejsc żadne ustawienie nigdy nie dotykało.
Przy poprzedniej przebudowie wyglądu szukaliśmy ich po zapisie koloru — i przegapiliśmy kilkadziesiąt, bo ten sam błękit potrafi być zapisany na pięć różnych sposobów, a część z nich wygląda w kodzie zupełnie niepodobnie do pozostałych. Tym razem poszliśmy inaczej: policzyliśmy odcień każdego koloru w całym kodzie i wypisaliśmy wszystko, co wpada w zakres błękitów i fioletów albo wygląda na szarość interfejsu. Wyszło ponad pięćset trafień, z czego około stu pięćdziesięciu okazało się chromem, który powinien iść za motywem. Wszystkie przeszły.
Czego kolor motywu nie rusza — i dlaczego
To była najciekawsza decyzja w całej zmianie. Nie każdy kolor w programie jest dekoracją; znaczna część niesie informację, a przemalowanie jej na kolor motywu byłoby zamianą komunikatu na ozdobę.
Dlatego przy każdym z tych kolorów zapadła świadoma decyzja, że zostaje:
- czerwień błędu — przy czerwonym akcencie komunikat o awarii musi nadal wyglądać na awarię, a nie wtapiać się w resztę okna;
- kanały R/G/B na histogramie i skopach wideo, osie X/Y/Z w dopasowaniu perspektywy — ich kolory są umowne i czytelne od dziesięcioleci;
- kolory typów klipów na osi czasu i kategorii w edytorze węzłów — po nich rozpoznajesz, na co patrzysz, zanim przeczytasz nazwę;
- asystenci rysowania i kości rigu — żółty znaczy „zaznaczona", zielony „sprzężona", pomarańczowy „efektor"; gdyby wszystkie zrobiły się czerwone, płótno przestałoby cokolwiek mówić;
- kolory, które ustawiasz sam — linie pomocnicze, kratka przezroczystości, tło sceny.
Zasada jest prosta i będzie obowiązywać dalej: powierzchnia i chrom idą za motywem, znaczenie zostaje przy swoim kolorze.
Co z tego masz
Osiem wyglądów, które naprawdę są ośmioma wyglądami. Wybierasz kolor w Preferencjach → Wygląd i program przemalowuje się od razu, bez restartu — razem z oknem preferencji, w którym właśnie klikasz. A jeśli lubisz to, co było, nie musisz robić nic: niebieski to dokładnie ten wygląd, który znasz.