Розробка для SailfishOS: таймери і реалізація експорту в файл

Ми вже писали про досвід розробки нашого першого додатку для мобільної платформи Sailfish OS. Але на цьому вирішили не зупинятися і відразу взялися за друге. Метою було створити додаток, за допомогою якого користувач міг би вести облік свого робочого часу, планувати завдання та надавати інформацію про виконану роботу, іншими словами – розробити персональний мобільний тайм-трекер.

Опис програми

Додаток, природно, повинне вміти вести журнал завдань з можливість збереження часу, витраченого на них. Бажано було, щоб можна було виявляти з допомогою вбудованого таймера, а не тільки прописувати руками. Крім цього, планувалася можливість створення текстових звітів про виконану роботу, у вигляді таблиць, з подальшим відправленням їх роботодавцю.

Так як розробка самої структури програми та його інтерфейсу вже була описана в попередніх статтях циклу розробки для Sailfish OS (шлях від початку розробки до створення першого додатка ви можете відстежити тут і тут), то в цій статті буде описано тільки функціонал, який відрізняється від реалізованого раніше і найбільш цікавий з точки зору його реалізації. У нашому додатку — це таймери завдань і експорт списку завдань.

Таймер

Для вимірювання тривалості робіт в додатку використовується механізм таймера. Процес відліку часу здійснюється за допомогою стандартного елемента Qt Timer, у якого виставлений інтервал оновлення 1000 мілісекунд.

Timer {
id: секундомір
interval: 1000
repeat: true
running: true
triggeredOnStart: true
onTriggered: {
if (timerActive) {
var currentTime = new Date ();
var differeceInTime = (currentTime.getTime() - previousTime.getTime());
previousTime = currentTime;
updateData(differentInTime);
}
}
}

function updateData(usec) {
elapsedTime += usec;
taskTimerString = getTimeString(elapsedTime);
}

При кожному спрацьовуванні події onTriggered Timer відбувається обчислення часу таймера: з поточного часу віднімається час попереднього спрацювання. Така реалізація зручна тим, що при виході пристрою з неактивного режиму, час коректно буде оновлено.

Для управління таймером зроблені кнопки Старт та Скинути. Так само є можливість поставити активний таймер на паузу. Щоб зберегти заміряне час досить натиснути на кнопку Зберегти час, доступну в випадаючому меню. Завмер таймера автоматично додано до поточного часу, витраченого на виконання завдання.



Якщо користувач намагається запустити новий таймер, поки активний старий, то буде виведений діалог з можливістю вибрати, як вчинити зі старим таймером: скинути дані старого таймера і почати новий, зберегти дані старого таймера і почати новий, перейти до старого таймеру.



Також, якщо таймер активний, то він відображається на обкладинці програми.

Експорт звітів



У додатку також реалізована функція створення звітів. Звіт являє собою таблицю, що містить інформацію про всіх збережених у додатку завданнях. У таблицю записуються дати початку і закінчення завдання, її назву та опис, статус завдання, а також час, витрачений на неї. Список завдань береться безпосередньо з бази даних, при цьому завдання вибираються з проміжку, який користувач сам вказує на екрані створення звітів.

function selectByPeriod(beginning, end) {
var database = getDatabase();
queryResult.clear();
database.transaction(function(transaction) {
var tasks = transaction.executeSql('SELECT * FROM tasks WHERE startDate >= ? AND finishDate <= ?', [beginning, end]);
for (var i = 0; i < tasks.rows.length; i++) {
var element = tasks.rows.item(i);
var startDate = new Date (element.startDate);
var finishDate = new Date (element.finishDate);
convertDateToUTC(startDate);
convertDateToUTC(finishDate);
var idDone = element.taskDone === 0 ? false : true
queryResult.append({"startDate": startDate, "finishDate": finishDate, "taskName": element.taskName, "taskDescription": element.taskDescription, "taskDone": isDone, "spentTime": element.spentTime});
}
})
} 

Є можливість записувати звіти у файли двох типів: csv і html. Вибір формату вихідного файлу відбувається також на екрані створення звітів. Для кожного з типів реалізований c++ клас, який відповідає за створення відповідного файлу. Запис у файли csv здійснюється з допомогою текстового потоку QTextStream. Для коректного відображення кирилиці використовується кодування Windows-1251.

Q_INVOKABLE void writeLine(QVariantList taskInfo) {
QTextCodec *utf8 = QTextCodec::codecForName("Windows-1251");
QTextStream stream(&csvFile);
QStringList line;
stream.setCodec(utf8);
for(int i = 0; i < taskInfo.size(); i++) {
line << taskInfo[i].toString();
}
stream << line.join(",") << endl;
}

HTML звіти створюються за допомогою класу QTextDocument. Для створення таблиці з інформацією за завданнями використовується клас QTextTable. Він дозволяє задати стиль таблиці і тексту в ній.

Q_INVOKABLE void createDocument(int rows, QVariantList columns) {
report = new QTextDocument();
QTextCursor cursor(report);
table = cursor.insertTable(rows + 1, columns.length());
QTextCharFormat format;
format.setFontWeight(QFont::Bold);
QTextCharFormat cellFormat;
cellFormat.setBackground(QBrush(Qt::cyan));
for(int col = 0; col < table->columns(); col++) {
QTextTableCell cell = table->cellAt(0, col);
QTextCursor cellCursor = cell.firstCursorPosition();
cell.setFormat(cellFormat);
cellCursor.mergeCharFormat(format);
cellCursor.insertText(columns[col].toString());
}
QTextTableFormat tableFormat = cursor.currentTable()->format();
tableFormat.setCellSpacing(0);
table->setFormat(tableFormat);
}

Q_INVOKABLE void addRow(int row, QVariantList taskInfo) {
QTextCharFormat cellFormat;
cellFormat.setBackground(QBrush(Qt::darkCyan));
for(int col = 0; col < table->columns(); col++) {
QTextTableCell cell = table->cellAt(row, col);
QTextCursor cellCursor = cell.firstCursorPosition();
cellCursor.insertText(taskInfo[col].toString());
}
QTextTableCell indexCell = table->cellAt(row, 0);
indexCell.setFormat(cellFormat);
}

Висновок

В результаті було створено програму з зрозумілим і простим інтерфейсом, який дозволяє легко вести і відстежувати список справ. З раніше запланованого функціоналу була додана можливість фільтрувати завдання за статусом виконання, щоб можна було відсіювати виконані. Додаток було опубліковано в магазині додатків Jolla Harbour під назвою Report Card і доступно для скачування всім бажаючим. Вихідні коди програми доступні на GitHub.

Автор: Максим Костерін
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.