Pull to refresh

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

Reading time6 min
Views852
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 для их хранения, и о многом другом.

Благодарю всех за внимание, Исходный код можно скачать здесь
Tags:
Hubs:
+10
Comments18

Articles

Change theme settings