Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Еще один гайд по созданию плазмоида: конфигурация, события и уведомления

Anna | 24.06.2014 | нет комментариев

На прогре теснее писали про то, что все плазмоиды необходимо портировать на QML/JS, но я все равно продолжаю измываться над трупом CPP и пишу виджеты для плазмы на плюсах. Но, допустимо, не все так нехорошо, %username%?

Для больше простого примера написания плазмоида на C дозволено обратиться к этой статье. В настоящей же статье на нагой виджет мы испробуем добавить немножко фич (в порядке возрастания) — конфигурационный интерфейс, обработку некоторых событий и уведомления.
Если кого заинтересовало — продолжение ниже.

Идея виджета

Так как задачка для меня была экстраординарно учебно-самообразовательной, то идея виджета примитивна: возьмем и форкнем виджет Oblique Strategies для GNOME. Таким образом, в нашем виджете будет:

  • Label с текстом с карточек
  • Label с копирайтом (служит в первую очередь для указания нынешней редакции)
  • Конфигурационный интерфейс, включающий в себя настройку текста и выбор редакции
  • Обновление текста по клику мышкой
  • Опциональная функция автообновления
  • Опциональная функция итога нынешнего сообщения при механической смене в типовые уведомления

Компоненты

Виджет

Хидер

#ifndef OBLIKUESTRATEGIES_H
#define OBLIKUESTRATEGIES_H

#include <Plasma/Applet>
#include <Plasma/Label>

#include <ui_configwindow.h>

class QGraphicsLinearLayout;

class oblikuestrategies : public Plasma::Applet
{
  Q_OBJECT
public:
  oblikuestrategies(QObject *parent, const QVariantList &args);
  ~oblikuestrategies();
  int setMessagesText();
  void init();

public slots:
  int autoUpdateEvent();
  int sendNotification(QString eventId, int num);
  int updateEvent();
  void mousePressEvent(QGraphicsSceneMouseEvent *event);
  // for configuration interface
  int setAutoUpdate();
  void configAccepted();
  void configChanged();

protected:
  void createConfigurationInterface(KConfigDialog *parent);

private:
  // ui
  Plasma::Label *main_label;
  Plasma::Label *info_label;
  QTimer *timer;
  // variables
  bool autoUpdate_bool, notify_bool;
  int autoUpdate_int, edition, fontSize, fontWeight;
  QString fontFamily, fontColor, fontStyle;
  QStringList formatLine, copyright;
  QList<QStringList> mess;
  // configuration interface
  Ui::ConfigWindow uiConfig;
};

K_EXPORT_PLASMA_APPLET(oblikue-strategies, oblikuestrategies)
#endif /* OBLIKUESTRATEGIES_H */

Это будет этакая «карта». Суть K_EXPORT_PLASMA_APPLET рассказана в указанной выше статье (это исключительная твердо значимая штука в хидере). Подключим изначальные библиотеки, объявим класс и деструктор

#include "oblikue-strategies.h"
#include <QGraphicsLinearLayout>
#include <plasma/theme.h>

oblikuestrategies::oblikuestrategies(QObject *parent, const QVariantList &args) :
  Plasma::Applet(parent, args)
{
  setBackgroundHints(DefaultBackground);
  setHasConfigurationInterface(true);
}

oblikuestrategies::~oblikuestrategies()
{
  delete info_label;
  delete main_label;
  delete timer;
}

ничего особенно увлекательно. Подмечу только, что мы здесь установили, что у апплета есть конфигурационный интерфейс. Суть переменных будет ясна чуть ниже. Дальше соберем функцию инициализации:

void oblikuestrategies::init()
{
  if (setMessagesText() != 0)
    return;

  // generate ui
  // layout
  QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(this);
  layout->setOrientation(Qt::Vertical);
  // label
  layout->addStretch(1);
  main_label = new Plasma::Label(this);
  main_label->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
  main_label->setToolTip(qApp->translate("tooltip", "Click here to update message"));
  layout->addItem(main_label);
  layout->addStretch(1);
  // copyright label
  info_label = new Plasma::Label(this);
  layout->addItem(info_label);
}

Функция int setMessagesText() забиваеlqvmk!/pre>
Первое — всеобщие настройки, их дозволено оставить без комментариев. Дальше идет перечисление событий и что они из себя представляют. Сейчас возвратимся к исходникам. Один исключительный способ:

int oblikuestrategies::sendNotification(QString eventId, int num)
{
  // send notification
  KNotification *notification = new KNotification(eventId);
  notification->setComponentData(KComponentData("plasma_applet_oblikue-strategies"));
  notification->setTitle(QString(i18n("Oblikue Strategies")));
  notification->setText(mess[edition-1][num]);
  notification->sendEvent();
  delete notification;
  return 0;
}

eventId — собственно наш эвент. В способе setComponentData указываем имя апплета (чтоб не путаться и для облегчения). Ставим подпись, текст и отправляем сообщение в систему.

Сборка

ls -1 sources

CMakeLists.txt
configwindow.ui
oblikue-strategies.cpp
oblikue-strategies.h
oblikue-strategies.png
plasma-applet-oblikue-strategies.desktop
plasma_applet_oblikue-strategies.notifyrc

CMakeLists.txt

project (plasma_applet_oblikue-strategies)

find_package (KDE4 REQUIRED)
include (KDE4Defaults)

add_definitions (${QT_DEFINITIONS} 
                 ${KDE4_DEFINITIONS})
include_directories (${CMAKE_SOURCE_DIR} 
                     ${CMAKE_BINARY_DIR} 
                     ${KDE4_INCLUDES})

set (PLUGIN_NAME ${PROJECT_NAME})
file (GLOB PROJECT_DESKTOP *.desktop)
file (GLOB PROJECT_ICON *.png)
file (GLOB PROJECT_NOTIFY *.notifyrc)
file (GLOB PROJECT_SOURCE *.cpp)
file (GLOB PROJECT_UI *.ui)

kde4_add_ui_files (PROJECT_SOURCE ${PROJECT_UI})
kde4_add_plugin (${PLUGIN_NAME} ${PROJECT_SOURCE})
target_link_libraries (${PLUGIN_NAME} ${KDE4_PLASMA_LIBS} ${KDE4_KDEUI_LIBS})

# install
install (TARGETS ${PLUGIN_NAME} DESTINATION ${PLUGIN_INSTALL_DIR})
install (FILES ${PROJECT_DESKTOP} DESTINATION ${SERVICES_INSTALL_DIR})
install (FILES ${PROJECT_ICON} DESTINATION ${ICON_INSTALL_DIR})
install (FILES ${PROJECT_NOTIFY} DESTINATION ${DATA_INSTALL_DIR}/${PLUGIN_NAME})

Файлик не вовсе верный (с точки зрения человеческого фактора, скажем), но многофункциональный (поменять только имя плана на необходимое). Из различий от обыкновенных файлов сборок — вызовkde4_add_ui_files для создания конфигурационного интерфейса. И установка файла с нотификациями.

Постскриптум

Исходники этого безобразия.
Что получилось:

По материалам

Спасибо за внимание!

 

Источник: programmingmaster.ru

 

Оставить комментарий
БАЗА ЗНАНИЙ
СЛУЧАЙНАЯ СТАТЬЯ
СЛУЧАЙНЫЙ БЛОГ
СЛУЧАЙНЫЙ МОД
СЛУЧАЙНЫЙ СКИН
НОВЫЕ МОДЫ
НОВЫЕ СКИНЫ
НАКОПЛЕННЫЙ ОПЫТ
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB