Nickolay.info. Тексты. Делаем виджет для Оперы 9 или 10

Виджеты (иногда видгеты, англ. widgets) позиционируются разработчиками 9-й версии браузера Opera как "одно из самых заметных и интересных нововведений". На самом деле это просто упакованные в архив ZIP мини-программки на HTML+CSS+JavaScript, сделать которые может каждый. Удобство виджета состоит в том, что он, при запущенной "Опере", может исполняться не только поверх остальных окон, но и непосредственно на Рабочем Столе (правая кнопка на любом запущенном виджете).

Давайте пошагово сделаем несложный виджет. На его основе Вы легко сможете склепать и собственные творения. Собственно говоря, сайт widgets.opera.com предлагает мастер для добавления собственных виджетов, но мы, как обычно, стандартных путей не ищем.

Сначала создадим папку с названием simple_clock.ru (наш виджет будет представлять собой простые идущие часы) и в ней - файл с именем config.xml и следующим содержимым:

<?xml version="1.0" encoding="utf-8"?>
<widget network="public">
   <widgetname>simple_clock.ru</widgetname>
   <description>Simple clock with russian interface</description>
   <id>
     <host>my.opera.com</host>
     <name>simple_clock.ru</name>
     <revised>2009_09</revised>
   </id>
   <icon>./img/widget.ico</icon>
   <width>101</width>
   <height>39</height>
   <author>
     <name>PerS</name>
     <link>http://nickolay.info</link>
     <organization>PerS</organization>
   </author>
</widget>

Как видите, мы переписали имя виджета в поля widgetname и name XML-файла. Ширина и высота окна виджета заданы свойствами width и height.

Основой виджета будет служить обычный HTML-файл с именем index.html. В него потребуется включить, как минимум, стилевое описание виджета, JavaScript-код для обеспечения его функциональности и HTML-код, который расставит элементы HTML внутри окна. Разработанный стиль включает в себя всего 6 классов:

<style>
body{
 display: block;
 background: transparent url(img/back.png) 0px 0px no-repeat;
 font-family: sans-serif;
 opacity: 0.8;
}
.dateid{
 font-family: sans-serif;
 font-size: 9px;
 color: #CCCCFF;
 background: #333333;
 vertical-align: middle;
}
.timeid{
 font-family: sans-serif;
 font-size: 9px;
 color: #CCCCFF;
 background: #333333;
 vertical-align: middle;
}
.closeButton {
 position: absolute;
 top: 2px;
 left: 85px;
 width: 15px;
 height: 15px;
 background: transparent url(img/close.png) no-repeat;
 list-style-type: none;
 z-index: 3;
}
.button:hover {
 background-position: 0 50%;
}
.button:active {
 background-position: 0 100%;
}
</style>

В классе body мы определили основной шрифт и прозрачность, а также фоновый рисунок окна виджета (соответственно, создадим внутри папки simple_clock.ru папку img и поместим туда рисунок back.png размером 101x39 пикселов, созданный в PhotoShop).

Классы dateid и timeid задают шрифт и цвета для вывода полей текущих даты и времени, класс closeButton описывает позицию, фоновый рисунок и размеры кнопки закрытия окна виджета, а дополнительные определения button:hover и button:active позволяют задать изменение цвета кнопки при наведении на неё курсора мыши и нажатии. Это достигается простым смещением вниз позиции рисунка кнопки (см. свойство background-position в стиле). Соответственно, при размере кнопки 15x15 пикселов нужно нарисовать 3 расположенных друг под другом изображения кнопки, что даст картинку размером 15x45. Эта картинка, как легко увидеть из стиля, сохранена под именем close.png в той же папке img.

Теперь у нас есть стиль, напишем функции JavaScript, обеспечивающие корректную работу часов.

<script>
 function myclock() {
  mydate   = new Date();
  hours = mydate.getHours();
  minutes = mydate.getMinutes();
  seconds = mydate.getSeconds();
  if ((hours==0) && (minutes==0) && (seconds<2)) addDate();
  mytime = (hours<10 ?  "0" : "")+hours + ":" +
   (minutes<10 ? "0" : "")+minutes + "." +
   (seconds<10 ? "0" : "")+seconds;
  document.all.timeid.innerText=mytime;
  window.setTimeout("myclock();",1000);
 }
 function addDate() {
  var dayNames = new Array("Вс","Пн","Вт","Ср","Чт","Пт","Сб");
  monthNames = new Array("янв","фев","мар","апр","май","июн","июл","авг","сен","окт","ноя","дек");
  myDate  = new Date();
  var year = myDate.getFullYear();
  d = (dayNames[myDate.getDay()] + ", " + myDate.getDate() +" "+ monthNames[myDate.getMonth()] +", "+year);
  document.all.dateid.innerText=d;
 }
</script>

Здесь файл показан в кодировке Windows, на самом деле нужно сохранить его в Юникоде (UTF-8), раз мы указали это в конфигурации виджета. Да и вообще, корректно будет работать во всех версиях "Оперы" только с Юникодом.

Функция myclock() получает и форматирует системное время, не забывая о том, что при работе часов возможен переход через сутки, а функция addDate() получает и форматирует текущую дату. Для обеспечения обновления показаний часов каждую секунду, myclock() вызывает себя стандартным методом window.setTimeout.

Осталось подготовить элементы HTML, которые будут всё это отображать. В тело документа-виджета index.html поместим следующий код:

<div class="body" style="position:absolute; top:0px; left:0px; width:100px; height:32px; visibility:visible;">
 <ul>
  <li class="closeButton button" onclick="window.close()"></li>
 </ul>
</div>
<div>
 <div class="dateid" id="dateid" valign="middle" align="center" 
  style="position:absolute; top:2px; left:2px; width:82px; height:16px;"></div>
 <div class="timeid" id="timeid" valign="middle" align="center" 
  style="position:absolute; top:20px; left:2px; width:82px; height:16px;"></div>
</div>

Разумеется, это не единственно возможное решение. Главное, чтобы атрибуты class элементов соответствовали названиям применяемых стилей, а поля для вывода даты и времени, которые будут обновляться через JavaScript, имели те же атрибуты id, что указаны в коде функций myclock и addDate. Эти же функции стоит вызвать и при загрузке виджета:

<body onload="myclock(); addDate();">

Теперь запакуем содержимое папки simple_clock.ru в ZIP-архив таким образом, чтобы в корне архива лежала именно эта папка, а уже внутри неё - файлы config.xml, index.html и вложенная папка img с рисунками. Кстати, для полноты картины можно сделать к виджету и иконку в формате ICO 24 бита размером 32x32 бита. Ничего, кроме PhotoShop для этого не понадобится, подробности в этой заметке. При установленном WinRAR или другом подобном архиваторе нужный нам архив легче всего сделать, щёлкнув на папке правой кнопкой мыши и выбрав из меню команду "Добавить к архиву..." - проверьте только, чтоб формат архива был именно ZIP. Потом в любом файловом менеджере меняем тип файла .zip на .wgt, выполняем этот файл двойным щелчком. При установленной "Опере" 9 или 10 она запустится и запустит виджет. Проверено в версиях 9.64 и 10.0, всё работает.

Виджеты в "Опере" 9-10 лежат по адресу
C:\Documents and Settings\[ВАШ_ПРОФИЛЬ]\Application Data\Opera\Opera\profile\widgets\

Папка Application Data - скрытая, так что смотреть этот путь нужно при включенном показе скрытых папок (в Windows XP - Мой Компьютер, Сервис, Свойства папки, вкладка Вид, папка Файлы и папки, папка Скрытые файлы и папки, выбрать "Показывать...") или в файл-менеджере, который их показывает по умолчанию (Far Manager).

В "Опере" 11 виджеты стали располагаться в
C:\Documents and Settings\11111\Local Settings\Application Data\

- причём, каждый в своей папке. Также теперь какие-то проблемы с иконками виджетов - не всё показывается.

 Скачать виджет simple_clock.ru.wgt (5 Кб)

По той же несложной схеме - сделав config.xml и запаковав папку скрипта WinZip'ом со сменой расширения .zip на .wgt, можно получить виджет практически из любого JavaScripta. Правда, быстродействие "оперной" JavaScript-машины оставляет желать лучшего и более-менее сложные скрипты будут подтормаживать. Тем не менее, на изготовление виждет-версии моей популярной игры Lines (новое окно) у меня ушло минуты 2.

Рейтинг@Mail.ru

вверх гостевая; E-mail