Как стать автором
Обновить

Готовим плагин для qutIM на дому

Время на прочтение6 мин
Количество просмотров864
Cегодня мы будем заниматься приготовлением плагина для qutIM'а, но не для того, который совсем недавно зарелизился, а для будущего, активная разработка которого сейчас идёт.
Для начала хотел бы сказать немного общих слов:
  1. В sdk03 мы постарались учесть все «ошибки бурной молодости»
  2. Оно полностью несовместимо со старым skd02
  3. Скорее всего, больше таких резких переходов в API между версиями не будет

И именно поэтому я рекомендую всем, кто ещё ни разу не писал плагины для Кутима, ориентироваться на sdk03
Хочу отметить немаловажный факт, что сейчас разработка ведется с использованием Qt 4.6, она предоставляет огромные дополнительные возможности, от которых просто грех отказываться.
Если вы горите желанием реализовать что-то интересное, но не знаете куда направить свою энергию, то эта статья для вас!

Ещё летом мы пришли к выводу, что текущая реализация плагинной системы завела программу в тупик:
Стало очень тяжело наращивать функционал, программа давно перестала быть легковесной и на слабых машинах, при загрузке длинного контакт листа, тормозила. На исправление багов уходило много времени.
Поэтому началась разработка libqutim, в которой мы постарались учесть все промахи старой плагинной системы, и сделать разработку Кутима максимально простой и приятной.
Структура нового qutIM'а:

  • Микроядро — в нём находится реализация менеджера модулей. Оно отвечает за загрузку и корректную работу всех частей qutIM'а. В нем имеется возможность выбора, какие модули грузить, а какие нет. Плюс в нем заложена возможность отслеживание зависимостей, что может быть незаменимо для модулей, которые в своей работе опираются на другие компоненты. Кроме того, активные модули можно переключать прямо в runtime'е, что, к примеру, активно используется в configbackend'ах
  • libqutim — в этой библиотеке хранятся интерфейсы всех модулей, а также набор наиболее полезных и часто используемых функций
  • corelayers — тот набор модулей, который компилируется непосредственно с приложением, при желании его можно легко менять, о чем будет сказано ниже
  • plugins — традиционные разделяемые библиотеки, которые на данный момент проще всего помещать в папку plugins рядом с исполняемым файлом, лучше всего подходит для протоколов


Первым делом необходимо установить библиотеку Qt4.6, для Windows и Macos X они есть на официальном сайте.
Пользователи Убунты могут воспользоваться репозиторием kubuntu-experimental, добавить её можно командой:
$add-apt-repository ppa:kubuntu-experimental
Гентушникам достаточно размаскировать соответствующие ebuild'ы. Для остальных не составит труда найти нужные пакеты или собрать их самостоятельно.
Исходный код забираем отсюда:
www.qutim.org/svn/qutim/branches/sdk03
После как обычно командуем в терминале
$ mkdir build && cd build && cmake ..
В результате cmake создаст вам Makefile, если окажется, что не все зависимости для сборки удовлетворены, то доустановите недостающие пакеты.
Прошу обратить внимание на строчки типа
+ layer KINETICPOPUPS added to build
+ layer XSETTINGSDIALOG added to build
+ layer ADIUMCHAT added to build

На сегодняшний день в cmake скрипте реализовано автоопределение используемых слоев. Вам достаточно положить исходные коды вашего плагина в scr/corelayers/имя_слоя, чтобы он был распознан системой. Это открывает огромные перспективы для создания собственных сборок, и упрощает разработку.
В данной статье я буду описывать, как реализовать диалог настроек:
Создаем в каталоге src/corelayers подкаталог simplesettingsdialog.
Создаем класс settingslayerimpl и наследуем его от класса SettingsLayer из libqutim'а, как показано ниже:
settingslayeriml.h
#include "libqutim/settingslayer.h"

class SettingsDialog;
using namespace qutim_sdk_0_3;

class SettingsLayerImpl : public SettingsLayer
{
  Q_OBJECT
public:
  SettingsLayerImpl();
  virtual ~SettingsLayerImpl();
  virtual void close();
  virtual void show ( const SettingsItemList& settings );
private:
  QPointer<SettingsDialog> m_dialog;
};


* This source code was highlighted with Source Code Highlighter.

settingslayeriml.cpp

Внимание: если вы вкомпиливаете модуль прямо в бинарный файл, то подключать заголовочные файлы нужно так, как показано в примере. Если вы выносите его в плагин, то нужно <libqutim/> заменить на <qutim/>
Работа слоя очень проста: по запросу show передается список настроек, которые необходимо вывести
settingslayeriml.cpp
#include "settingslayerimpl.h"
#include "settingsdialog.h"
#include "modulemanagerimpl.h"
#include <libqutim/icon.h>
static Core::CoreModuleHelper<SettingsLayerImpl> settings_layer_static( //регистрируем наш модуль, теперь он станет видимым для менеджера модулей
    QT_TRANSLATE_NOOP("Plugin", "Simple Settings dialog"), //описание, макрос QT_TRANSLATE_NOOP позволяет делать его переводимым на разные языки
    QT_TRANSLATE_NOOP("Plugin", "SDK03 example")
    );

void SettingsLayerImpl::show (const SettingsItemList& settings )
{
  if (m_dialog.isNull())
    m_dialog = new SettingsDialog(settings); //создаем диалог, которому передаем наш список настроек
  m_dialog->show();
}


* This source code was highlighted with Source Code Highlighter.

В реализации диалога настроек тоже нет ничего хитрого, важно лишь помнить, что SettingsItem генерирует виджет настроек лишь по запросу, чтобы минимизировать затраты памяти.
Далее создаем сам диалог:
settingsdialog.cpp

#include "settingsdialog.h"
#include "ui_settingsdialog.h"
#include <libqutim/settingswidget.h>
SettingsDialog::SettingsDialog ( const qutim_sdk_0_3::SettingsItemList& settings)
: ui (new Ui::SettingsDialog)
{
  m_setting_list = settings;
  ui->setupUi(this);

  foreach (SettingsItem *settings_item, m_setting_list) //заполняем список настроек самым бесхистростным образом без деления на категории
  {
    QListWidgetItem *list_item = new QListWidgetItem (settings_item->icon(),
                             settings_item->text(),
                             ui->listWidget
                             );
  }
  connect(ui->listWidget,SIGNAL(currentRowChanged(int)),SLOT(currentRowChanged(int)));//навигация по списку настроек
  ui->listWidget->setCurrentRow(0);
}

void SettingsDialog::currentRowChanged ( int index)
{
  SettingsWidget *widget = m_setting_list.at(index)->widget();//генерируем виджет или даем указатель на него, если он существует
  if (widget == 0)
    return;
  if (ui->stackedWidget->indexOf(widget) == -1) //если виджет не добавлен в стек, то добавляем его
  {
    widget->load();
    ui->stackedWidget->addWidget(widget);
  }
  ui->stackedWidget->setCurrentWidget(widget);//просим показать текущий виджет
}

SettingsDialog::~SettingsDialog()
{
  delete ui;
}

* This source code was highlighted with Source Code Highlighter.


После добавления файлов не забудьте опять выполнить команду:
$ cmake ..
Если в выводе появилась строчка, которая приведена ниже, то вы сделали всё правильно.
+ layer SIMPLESETTINGSDIALOG added to build
Теперь нужно добавить куда-нибудь вызов функции Settings:showWidget(), я обычно её добавляю в конструктор одного из слоев.
Когда все соберется, можно запускать приложение. В конечном итоге появится вот такое симпатичное окошко.



Надеюсь, вы убедились, что писать плагины теперь весьма просто. Как можно заметить, настроек пока не густо, поэтому дерзайте, заполняйте пробелы, а лучшие плагины попадут в ядро!
Я надеюсь, что это не последняя статья о разработке нового Кутима, в дальнейшем я планирую рассказать о работе движка настроек, о том, насколько удобен формат json для их хранения, и о многом другом.

Благодарю всех за внимание, Исходный код можно скачать здесь
Теги:
Хабы:
Всего голосов 30: ↑20 и ↓10+10
Комментарии18

Публикации

Истории

Работа

QT разработчик
12 вакансий

Ближайшие события

27 августа – 7 октября
Премия digital-кейсов «Проксима»
МоскваОнлайн
28 – 29 сентября
Конференция E-CODE
МоскваОнлайн
28 сентября – 5 октября
О! Хакатон
Онлайн
30 сентября – 1 октября
Конференция фронтенд-разработчиков FrontendConf 2024
МоскваОнлайн
3 – 18 октября
Kokoc Hackathon 2024
Онлайн
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн