Skip to content

About

No description, website, or topics provided.

Resources

Stars

49 stars

Watchers

2 watching

Forks

Latest commit

 

History

75 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Dynamic Island для Windows

Остров в духе iPhone у верхнего края экрана: музыка с текстом песен, таймер, запись OBS, полка для файлов и системные уведомления. По клику раскрывается в плеер.

Релиз Загрузки Windows 10 | 11 .NET 8 Без сторонних пакетов

Остров раскрывается в плеер с текстом песни

Скачать  ·  Что умеет  ·  Управление  ·  Сборка  ·  Конфиденциальность

Написан на WPF (.NET 8) без сторонних пакетов — только Windows API. Один exe, установка не нужна, обновляется сам.

Что умеет

Музыка и текст песен

Компактный остров с обложкой и эквалайзером
Обложка, название и живой эквалайзер
Раскрытый плеер с текстом песни
Плеер с синхронным текстом
  • Музыка. Обложка, название и эквалайзер для любого приложения с системной медиасессией (Spotify, браузер, Яндекс Музыка…). Цвет полосок берётся из обложки, и в тот же цвет окрашивается светлый ободок острова. При смене трека новая обложка выталкивает старую — влево для следующего трека, вправо для предыдущего. Обложка и полоски одни на остров, тост и плеер: между ними они не гаснут и не появляются заново, а переезжают и меняют размер вместе с формой острова.
  • Текст песни. Синхронные строки с LRCLIB прямо в компактном острове; он растягивается под длину строки.
  • Плеер. По клику — большая обложка, перемотка, «назад / пауза / вперёд» и подсветка в цветах обложки, которая движется под звук. На паузе обложка отступает — становится меньше — и возвращается с отскоком, когда музыка играет дальше. Треугольники кнопок «назад» и «вперёд» по нажатию сдвигаются на одно место в свою сторону: передний уходит в остриё, сзади вырастает новый. Если у трека есть текст, плеер становится выше и показывает три строки: та, что поётся, стоит посередине и заливается светом слева направо, соседние — меньше и не в фокусе. Строки прокручиваются не разом, а волной: каждая трогается чуть позже предыдущей. На проигрышах вместо строки — три точки: они «дышат» и гаснут по одной к следующей строке. Наведите указатель на текст — буквы под ним расступаются и обтекают его, а соседние строки прогибаются от него; так же расходятся и буквы строки в свёрнутом острове, если смена строки выбрана «волной». Выключается переключателем «Буквы расступаются» на странице «Текст песен» в настройках.
  • Текст у курсора. Строка, которая сейчас поётся, может следовать за указателем мыши по всему экрану. По умолчанию она стоит сбоку от указателя столбиком по слову: слово, которое поётся сейчас, крупное и яркое, спетые поднимаются выше и гаснут, следующие ждут ниже бледнее; столбик сдвигается на слово с лёгкой пружиной по ходу строки, а короткие слова вроде «и» и «в» держатся вместе со следующим. Так строка занимает пятачок у курсора, а не полэкрана. Можно выбрать и прежний вид — всю строку в одну линию. Она висит сбоку от указателя — справа, а если справа не хватает места, слева — и при смене стороны облетает его, уходя вглубь. Строка развёрнута в пространстве: ближний к указателю конец крупнее, дальний уходит в глубину, буквы мягко колышутся, а вся строка плавно покачивается. Её тянет за указателем с запаздыванием: на ходу дальние буквы отстают хвостом, строка поворачивается и кренится по движению и отступает вглубь, а остановившись, возвращается. Новая строка вылетает из глубины от указателя наружу, старая улетает назад. Над самим островом строка прячется — там её уже показывает остров — и всегда остаётся под ним. Строка не мешает кликам, гаснет на паузе, на проигрышах и на полном экране. Включается на странице «Текст песен» в настройках: в строке «У курсора» — «Столбик» или «Строка».
  • Несколько источников. Если музыка есть сразу в нескольких приложениях (Spotify и вкладка браузера), Ctrl + колесо над островом листает их по кругу; остров называет приложение, к которому перешёл. Выбор держится, пока играть не начнёт другое приложение.
  • Живой спектр. Полоски считаются по реальному выводу звука (WASAPI loopback), а не случайно.

Жесты и форма

Остров тянется вниз за указателем и раскрывается

  • Жесты. Остров можно взять мышью. Потянуть вниз — он тянется за указателем, чем дальше, тем неохотнее, и, отпущенный достаточно далеко или брошенный коротким рывком, раскрывается с той скоростью, с какой его отпустили; не дотянутый — пружинит обратно. Толкнуть вбок, пока играет музыка, — следующий трек (влево) или предыдущий (вправо).
  • Форма. Ширина и высота острова движутся порознь: раскрываясь, он сначала раздаётся вширь, чуть дальше своей ширины, и следом опускается; сворачиваясь — сначала подбирается вверх и потом сужается.

Таймер и пузыри

Таймер отделяется от острова пузырём

Настройка таймера
Настройка: от 1 до 99 минут
Раскрытый таймер
Кольцо остатка вокруг паузы
Строка песни, таймер и полка в пузыре
Строка песни в острове, таймер и полка — в пузыре рядом
  • Таймер. От 1 до 99 минут. Пока играет музыка, таймер отделяется в отдельный «пузырь» рядом — вытягивается из острова, как капля. В раскрытом таймере остаток времени идёт кольцом вокруг кнопки паузы. Последние 10 секунд отсчёт краснеет и пульсирует. По окончании звонит, пока не кликнете: колокольчик качается, остров подрагивает, ободок вспыхивает.

Запись в OBS

Запись OBS в острове

  • Запись в OBS. Пока OBS пишет, в острове горит красная точка и идёт время записи; если играет музыка, запись уходит в пузырь рядом, как таймер. По клику — кнопки «стоп» и «пауза», время крупно, размер файла и сцена; на паузе точка и цифры становятся оранжевыми. Из меню запись можно начать. Когда запись остановлена, остров сообщает, что она сохранена, и по клику открывает папку с файлом. Остров подключается к встроенному в OBS 28+ серверу WebSocket сам — порт и пароль берёт из настроек OBS; нужно только включить сервер: «Инструменты → Настройки сервера WebSocket».

Полка для файлов

Полка с файлами

  • Полка для файлов. Перетащите файлы на остров — он раскроется в полку и подержит их у себя; или нажмите «+» на полке (на пустой — саму полку) и выберите файлы в обычном окне. На полке — превью для фото и видео, иконки для остального. Пока на полке что-то лежит, рядом с островом висит пузырь с числом файлов. Файл с полки перетаскивается куда угодно — в папку, чат, письмо — и копируется туда, а оригинал остаётся на месте; положенный куда-то, он уходит с полки. Клик по файлу открывает его. Полка помнит файлы между запусками.

Погода

  • Погода. В раскрытых часах рядом с громкостью — значок неба и температура. В меню — страница «Погода»: температура крупно, «ощущается как», ветер и прогноз на пять ближайших часов. Место остров узнаёт у Windows, прогноз берёт у Open-Meteo и обновляет раз в четверть часа. Если доступ к местоположению выключен, страница скажет об этом и откроет нужные параметры Windows. Выключается переключателем «Погода» в настройках.

QR-код с экрана

  • QR-код с экрана. Строка «QR-код с экрана» в меню открывает два режима. «Весь экран» — остров сворачивается, снимает все мониторы и ищет код сам. «Выбрать область» — экран затемняется, и код обводится мышью: так находится мелкий код и нужный из нескольких; Esc или правая кнопка — отмена. Найденное копируется в буфер обмена и показывается уведомлением; если это ссылка, клик по уведомлению открывает её в браузере.

Часы, громкость и уведомления

Раскрытые часы
Часы, дата, громкость и заряд наушников
Индикатор громкости
Громкость
Уведомление о зарядке
Зарядка
  • Громкость. Индикатор при изменении громкости; колесо мыши над островом её меняет. На 0 и 100% полоска тянется дальше, как резинка, и возвращается. Волны у значка динамика появляются и гаснут по одной, а при выключенном звуке динамик перечёркивает черта. Над раскрытым плеером колесо меняет громкость только того приложения, которое играет, — как его ползунок в системном микшере; уровень на секунду появляется слева от кнопок.
  • Заряд наушников. Процент заряда Bluetooth-наушников — в раскрытом острове и в плеере, при подключении и отдельным предупреждением на 20% и 10%. При подключении и на низком заряде остров раскрывается, как уведомление: слева объёмная модель (вкладыши, накладные или колонка) падает сверху с разворотом и покачивается, рядом имя устройства и «Подключено», справа процент и батарейка, которая заполняется до уровня заряда. Когда заряд низкий, процент, батарейка и подпись «Низкий заряд» красные, а модель трясётся. Показывается для устройств, которые сообщают заряд Windows (тот же процент, что в «Параметрах»).
  • Уведомления. Подключение зарядки, смена аудиоустройства (наушники, Bluetooth), Wi-Fi / Ethernet, включение и отключение VPN, режим «Не беспокоить» — луна в острове, а пока режим включён, она стоит и рядом с датой в раскрытых часах. У каждого уведомления значок стоит на подложке своего цвета и появляется по-своему: дуги Wi-Fi загораются по одной, потерянную сеть перечёркивает черта, галочка VPN рисуется или стирается, наушники «надеваются», при зарядке бьёт молния.
  • Не мешает. Прячется, когда на весь экран открыта игра или видео, не появляется в Alt-Tab и не забирает фокус.

Меню, настройки и оформление

Меню острова
Меню по правому клику
Страница настроек
Настройки
Страница оформления
Оформление
Плеер на матовом стекле
Матовое стекло и звёздный фон плеера
  • Настройки. Цветной ободок, громкость приложения в плеере, уведомления о сети, погода, скрытие на полном экране и автозапуск выключаются на странице «Настройки» в меню. Всё, что касается текста песен, собрано на её странице «Текст песен»: сам текст, эффекты его строк в плеере (заливка, размер и размытие соседних), расступание букв под указателем, строка у курсора (выключена, столбиком по слову или строкой) и источники текста — кнопками, которые включаются и выключаются по клику; последний оставшийся источник выключить нельзя.
  • Оформление. На соседней странице меню — размер острова и отступ от верхнего края экрана (ползунком, чья ручка, пока её держат, превращается в линзу), матовое стекло под островом, вид эквалайзера (полоски или «матрица» точек), полоса трека (сплошная или по строкам песни), фон плеера (свечение, матрица, звёзды), смена строки текста (плавно, волной по буквам, барабаном по словам), отклик кнопок на указатель (диск, магнит, перетекание) и акцентный цвет вместо цветов обложки. Варианты с картинками показываются в полоске плиток, каждая играет свой вариант в миниатюре.
  • Обновление. Последняя строка страницы «Настройки» показывает версию острова — или новую, если она вышла на GitHub, — и ведёт на страницу обновления: крупно номер версии, список того, что в ней нового, и кнопка «Обновить и перезапустить». По ней остров скачивает новый exe, сверяет его хеш, встаёт на место старого и запускается заново. Пока exe скачивается, на месте кнопки заполняется кольцо; если остров свернуть, кольцо и проценты остаются в пилюле.

Управление

Действие Результат
Клик Раскрыть плеер или таймер, повторный клик — свернуть
Потянуть остров вниз Раскрыть то же, что и клик: оттянуть подальше и отпустить, или бросить коротким рывком
Толкнуть остров влево или вправо Следующий или предыдущий трек, пока играет музыка
Клик по обложке в плеере Открыть приложение, в котором играет музыка
Правый клик Меню: таймер, запись OBS, полка, настройки, оформление, закрыть остров; со страницы настроек или оформления — назад в меню
Клик колесом Спрятать остров на 5 секунд
Колесо мыши Громкость: общая, над раскрытым плеером — играющего приложения (в настройке таймера — минуты, на странице оформления — значение строки под курсором, на полке — листает файлы)
Ctrl + колесо Следующее или предыдущее приложение с музыкой
Клик по звонящему таймеру Выключить звонок
Клик по «Запись сохранена» Открыть папку с записью
Перетащить файлы на остров Положить их на полку
«+» на полке или клик по пустой полке Выбрать файлы для полки в обычном окне
Перетащить файл с полки Скопировать его туда, куда отпустили
Клик по файлу на полке Открыть его; крестик в углу — убрать с полки
Клик по пузырю Открыть запись, таймер или полку — ту часть, по которой кликнули

Скачать

Готовый DynamicIsland.exe лежит в релизах. Устанавливать ничего не нужно: скачайте и запустите. Дальше остров обновляется сам — из «Настроек» в меню. Подходит для 64-битных Windows 10 2004 (сборка 19041) и новее, Windows 11.

Note

Файл не подписан, поэтому при первом запуске SmartScreen может предупредить о неизвестном издателе: «Подробнее» → «Выполнить в любом случае».

Сборка из исходников

Нужен .NET 8 SDK.

git clone https://github.com/mihailkotovski/DynamicIsland.git
cd DynamicIsland
dotnet run -c Release

Один exe-файл, которому не нужен установленный .NET — так же собирается релиз:

dotnet publish -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true -p:EnableCompressionInSingleFile=true -o publish

Выпуск новой версии

Релиз собирает GitHub Actions (release.yml) — достаточно запушить тег:

git tag -a v1.1.0 -m "- Страница обновления
- Кольцо загрузки в пилюле"
git push origin v1.1.0

Сообщение тега становится описанием релиза, а его строки, начатые с - , остров показывает на странице обновления под «Что нового» (не больше шести). У тега без сообщения описание пишет GitHub, и списка на странице не будет.

Шрифты

Остров рисуется шрифтом SF Pro: файлы лежат в Fonts и встраиваются в exe при сборке. Из него же берутся иконки — символы SF Symbols, которые есть в шрифте, как в iOS. Шрифт и символы принадлежат Apple и распространяются на условиях её лицензии. Без этих файлов текст рисуется Segoe UI, а иконок не будет.

Модели наушников

Наушники и колонка в уведомлении о заряде — кадры поворота готовых 3D-моделей с Sketchfab, отрендеренные в Blender: по 81 кадру через 2° в Gadgets, они тоже встраиваются в exe. Модели распространяются по лицензии CC BY 4.0:

Чтобы перерендерить кадры, скачайте модель в glTF, распакуйте и запустите Blender 5 (кадры сделаны в 5.2):

blender --background --factory-startup --python Gadgets/render.py -- путь/к/scene.gltf earbuds Gadgets/Earbuds.png

Вместо earbuds — headphones или speaker; поза покоя, свет и экспозиция каждой модели заданы в начале скрипта.

Отладка

DynamicIsland.exe --view MediaBig
DynamicIsland.exe --timer 90
DynamicIsland.exe --headset 70 --view Headset

--view закрепляет одно состояние острова (Idle, Media, Timer, Record, Volume, Charge, Headset, Toast, Notice, MediaBig, IdleBig, TimerBig, TimerSet, RecordBig, RecordSet, Menu, Settings, Lyrics, Look, Weather, Qr, Update, Loading), --timer сразу запускает отсчёт на указанное число секунд, --headset показывает уведомление о заряде наушников с указанным процентом (--gadget Headphones или Speaker меняет модель).

Необработанные ошибки пишутся в %TEMP%\DynamicIsland.log.

Как устроено

Какой файл за что отвечает
Файл За что отвечает
MainWindow.xaml, MainWindow.xaml.cs Разметка всех состояний острова; окно, выбор состояния и переход к нему
MainWindow.Shape.cs, MainWindow.Transitions.cs Форма острова и пузыря; переходы между состояниями (страницы меню сдвигаются вбок, строки въезжают по очереди)
MainWindow.Pointer.cs Указатель и жесты
MainWindow.Media.cs, MainWindow.Seek.cs, MainWindow.Lyrics.cs Плеер: трек, обложка и полоски, перемотка, текст песни
MainWindow.Timer.cs, MainWindow.Shelf.cs, MainWindow.Menu.cs Таймер и пузырь, полка, меню со страницами настроек, оформления и обновления
MainWindow.Status.cs, MainWindow.Notices.cs Часы, громкость, зарядка, наушники, «Не беспокоить»; уведомления
MainWindow.Headset.cs Уведомление о заряде наушников при подключении и низком заряде
Spring.cs Пружина, на которой построено каждое движение
FrameLoop.cs, DelayedAction.cs, Motion.cs, Visuals.cs Покадровый цикл, отложенное действие и общие помощники анимации и рисования
Goo.cs Чёрное тело острова: пилюля, пузырь и перемычка, которая тянется между ними и рвётся; ободок и его вспышки, пока звонит таймер
Squircle.cs Контур со сглаженными углами: скругление плавно выходит из прямой, как у Apple
Icon.cs Иконки — символы SF Symbols из шрифта SF Pro; у громкости, Wi-Fi и VPN части появляются и меняются по одной, черта и галочка прорисовываются
MediaService.cs, CoverPalette.cs Текущий трек через системную медиасессию (GSMTC), выбор между несколькими приложениями; цвета из обложки
Cover.cs Обложка: новая выталкивает старую в сторону, куда листается плейлист
Skip.cs Треугольники кнопок «назад» и «вперёд», которые сдвигаются на одно место по нажатию
SourceApp.cs Приложение, в котором играет музыка: переход к его окну, имя, его процессы
LyricsService.cs Поиск и разбор синхронного текста с LRCLIB
Lyric.cs Строка текста в плеере, которая заливается светом, пока её поют; точки на проигрышах
MainWindow.PointerLyric.cs, PointerLyric.cs Строка у курсора: летает рядом с указателем в перспективе; рисуется системным композитором в неподвижном окне на весь экран, буквы — куски одной картинки строки
DesktopComposition.cs, DrawingSurfaces.cs Слой системного композитора поверх окна и перенос картинки WPF в его поверхность через Direct3D 11
SpectrumService.cs, SpectrumAnalyzer.cs Захват вывода звука и разложение по частотам
Equalizer.cs, Aura.cs Полоски и подсветка плеера
AudioService.cs, CoreAudio.cs Громкость — общая и отдельного приложения — и смена устройства вывода; объявления интерфейсов Core Audio
Headset.cs Заряд Bluetooth-наушников
Gadget.cs Наушники и колонка в уведомлении о заряде: кадр поворота по углу из листов в Gadgets, соседний подмешивается для плавности
NetworkService.cs Состояние сети и VPN
MainWindow.Record.cs, ObsService.cs Запись OBS в острове и пузыре; связь с OBS по WebSocket: подключение с паролем из настроек OBS, состояние записи, сцена, команды
MainWindow.Weather.cs, WeatherService.cs Погода в раскрытых часах и на своей странице; место от Windows, прогноз с Open-Meteo
MainWindow.Qr.cs, QrReader.cs, AreaPicker.cs QR-код с экрана: снимок всех мониторов или обведённой области и разбор библиотекой ZXing.Net; результат в буфер и в уведомление
Countdown.cs, Alarm.cs, Ring.cs, Digits.cs Отсчёт, звонок, кольцо и перелистывание цифр
Settings.cs, Autostart.cs, Toggle.cs Настройки и оформление из меню, автозапуск, переключатель
Updater.cs Проверка последнего релиза на GitHub, загрузка exe и замена им запущенного
RowList.cs Строки меню и подсветка, которая перетекает между ними за курсором
Native.cs Win32: поверх всех окон, полноэкранный режим, батарея, клавиши громкости и треков

Конфиденциальность

Сетевых запросов три. Поиск текста на lrclib.net: туда уходят название трека и исполнитель; если выключить «Текст песен» в меню, не будет и этого запроса. И проверка обновления на api.github.com — когда открывается страница «Настройки» или страница обновления, не чаще раза в полчаса; в запросе нет ничего, кроме версии острова. Сам exe скачивается с GitHub только по кнопке «Обновить и перезапустить». И прогноз погоды на api.open-meteo.com — раз в четверть часа: туда уходят широта и долгота, округлённые до сотых долей градуса (около километра); место остров спрашивает у службы определения местоположения Windows, и если выключить «Погода» в меню, не будет ни этого вопроса, ни запроса. Больше приложение ничего никуда не отправляет. Снимок экрана для поиска QR-кода делается только по строке меню, разбирается в памяти и никуда не сохраняется и не передаётся. С OBS остров говорит только внутри компьютера — по адресу 127.0.0.1, и только пока OBS запущен; порт и пароль сервера WebSocket он читает из %APPDATA%\obs-studio\plugin_config\obs-websocket\config.json и никуда их не передаёт, кроме самого OBS.

Автозапуск включается записью в HKCU\Software\Microsoft\Windows\CurrentVersion\Run и выключается тем же переключателем. Остальные переключатели меню и оформление хранятся в HKCU\Software\DynamicIsland.

About

No description, website, or topics provided.

Resources

Stars

49 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages