#1 08.08.2011 16:32:16

xwicked
Administrator
Зарегистрирован: 02.08.2011
Сообщений: 114
IP-адрес

Программа для создания электронных книг, Обсуждение программы и кода

Здравствуйте! Вот вторая моя программа, написанная на C++(Qt). Выношу на обсуждение её и исходник - 0.0.7.

Ссылка на SourceForge.net. Код под GNU GPL v2 - OpenSource.

Она предназначена для создания электронных книг, с централизованным хранением в базе данных SQLite3.

Этот код публикуется впервые. Его не было нигде, включая репозиторий программ Sisyphus от дистрибутива AltLinux. Там был только Клёст-кроссворд(0.1.9, 0.2.0). Комментируем Linux-версия. Qt-4.5.3.

Описание:
Страница книги представляет собой одну переменную QString Page.
Текст книги отображается в компоненте QTextEdit TextBook.
Текст в компоненте TextBook имеет форматирование документа HTML. Поэтому редактирование текста страницы осуществляется редактированием html-кода.

Стандартное сохранение идёт в базу данных. Но есть и возможность экспорта в файл.

Изображения хранятся, как в обычной html-странице - отдельно от текста в папке "temp". В тексте указывается путь.
При загрузке книги - во всех страницах происходит перезапись тегов изображения "<img src=":

QString str1;
int iFirst,
    iLast,
    iLength,
    iSearch;
    for(int i = 0; i < ListPages.count(); i++)
        {
            str1 = ListPages.at(i);
                if(str1.indexOf("<img src=\"") != -1)
                    {
                         int z = 1;
                         iSearch = 0;
                             while(str1.indexOf("<img src=\"", iSearch) != -1)
                                 {
                                          if(z == 1) iSearch = -1;
                                          if(iSearch == -1)
                                              {
                                                   iFirst = str1.indexOf("<img src=\"", 0);
                                                   iLast = str1.indexOf("/temp/Image", 0);
                                                   z++;
                                              }
                                          else
                                              {
                                                   iFirst = str1.indexOf("<img src=\"", iSearch);
                                                   iLast = str1.indexOf("/temp/Image", iFirst);
                                              }
                                      iFirst += 10;
                                      iLength = iLast - iFirst;
                                      str1.remove(iFirst, iLength);
                                      str1.insert(iFirst, "/tmp/xwel");
                                      ListPages.replace(i, str1);
                                      iSearch = iLast;
                                 }
                    }
        }
Это актуально для переносимой версии. В этом случае необходимо будет поменять строку:
str1.insert(iFirst, "/tmp/xwel");
на
str1.insert(iFirst, QApplication::applicationDirPath());//Текущая папка, из которой запущено приложение
Пароль книги хранится в открытом виде в переменной QString Password.
Список страниц хранится в списке строк QStringList ListPages.
Изображения хранятся в массиве QByteArray ListImages[255]. Здесь видно, что изображений на всю книгу 255.

Сохранение в базу происходит обычными SQL-запросами:
strBook = "DROP TABLE Table" + sNumBook + ";";
QueryBook.exec(strBook);
strBook = "CREATE TABLE Table" + sNumBook + " (Pages VARCHAR, Images BLOB);";
QueryBook.exec(strBook);
...
//Сохранение страниц
if(ListPages.count() != 0)
    for(int i = 0; i < ListPages.count(); i++)
        {
           QueryBook.prepare("INSERT INTO Table" + sNumBook + " (Pages) VALUES (?);");
           QueryBook.bindValue(0, ListPages.at(i));
           QueryBook.exec(/*strBook*/);
        }
//Сохранение изображений
    for(int i = 0; i < 75; i++)//Здесь видно - что сохраняются только 75 изображений(!) из 255 :(
        {
              if(ListImages[i].count() != 0)
                 {
                    QueryBook.prepare("INSERT INTO Table" + sNumBook + " (Images) VALUES (?);");
                    QueryBook.bindValue(0, ListImages[i]);
                    QueryBook.exec(/*strBook*/);
                 }
             else break;
}

#2 09.08.2011 19:43:04

xwicked
Administrator
Зарегистрирован: 02.08.2011
Сообщений: 114
IP-адрес

Программа для создания электронных книг, Обсуждение программы и кода

Вот спекфайл, по которому можно собрать rpm-пакет для дистрибутива AltLinux или своего, основанного на rpm:

Summary: Qt program for creating and reading electronic books.

Summary(ru): Qt программа для создания и чтения электронных книг.

%define version 0.0.7

Group: Education

Name: klen-library

BuildRequires: gcc-c++, libqt4-sql-sqlite >= 4.4.3, libqtgui4 >= 4.4.3, libqt4-core >= 4.4.3

BuildArch: %ix86

Provides: klen-library

Release: alt1

Source: klen-library-%{version}.tar.gz

Url: http://labfreetech.org/index_e.html

Version: %{version}

License: GPLv2

Packager: LabFreeTech.org admin@labfreetech.org

%description
Qt program for creating and reading electronic books.
Supported features: - Creation of a textbook; - Editing of the textbook; - Reading the textbook; - Adding / removing books from the database; - Editing the font of the textbook; - Export and import of books in the file.

%description -l ru
Qt программа для создания и чтения электронных книг.
Поддерживаемые функции: - Создание учебника; - Редактирование учебника; - Чтение учебника; - Добавление/удаление учебников из базы данных; - Редактирование шрифта учебника; - Экспорт и импорт учебников в файл.

%prep

%setup -q

%build
%make_build
#cp -f klen-library debian/klen/opt/klen-library/

%install

cp -Rv klen/ %buildroot/

#rm -rf $RPM_BUILD_ROOT

%clean

rm -rf $RPM_BUILD_ROOT

%files

/usr/bin/*
/usr/share/*

%post

test -e /usr/bin/xwel-0.0.7 || ln -s /usr/bin/xwel-0.0.7 /usr/bin/klen-library-0.0.7
test -e $HOME/Desktop/xwel.desktop || cp -r /usr/share/applications/xwel.desktop $HOME/Desktop/klen-library.desktop

%postun

test -L /usr/bin/klen-library-0.0.7 && rm -r /usr/bin/klen-library-0.0.7
test -e $HOME/Desktop/klen-library.desktop && rm -r $HOME/Desktop/klen-library.desktop
И вот архив, подготовленный для сборки. Он включает несколько изменений в оформлении кода: ссылка. Этот спекфайл находится внутри архива. Для сборки необходим пакет rpm-build, Команда для сборки двоичного пакета:
$rpmbuild -bb /home/username/RPM/SPECS/xwel-0.0.7-alt.spec
Оставляем комментарии, ищем ошибки.

#3 12.08.2011 18:15:27

xwicked
Administrator
Зарегистрирован: 02.08.2011
Сообщений: 114
IP-адрес

Программа для создания электронных книг, Обсуждение программы и кода

#4 14.08.2011 17:21:46

xwicked
Administrator
Зарегистрирован: 02.08.2011
Сообщений: 114
IP-адрес

Программа для создания электронных книг, Обсуждение программы и кода

Теперь и счастливым обладателям дистрибутивов GNU / Linux Debian и его производным(Ubuntu), предоставилась возможность попробовать себя в качестве разработчиков ПО.

Новая версия электронной библиотеки 0.0.9. Исходный код + сборки.

Серьёзным изменением в данной версии является ускорение загрузки книги из базы данных. Это связано с выгрузкой изображений из базы на диск в папку. Сначала я не знал, как сделать лучше, поэтому сделал выгрузку по одному байту, что занимало большой промежуток времени.

При использовании объекта QImage - этот процесс уcкорился на моей тестовой машине раз в 20(!). Код ниже:

              for(int i = 0; i < 75; i++)
                  if(ListImages[i].count() != 0)
                      {
                          QString sNumImage;
                          QByteArray sByteImage;
                          sByteImage.clear();
                          sNumImage.setNum(i);

                              if(i >= 0 && i <= 9) sNumImage.insert(0,"0");
                                  ifile.setFileName("/tmp/xwel/temp/Image" + sNumImage + ".png");

                          QDataStream sifile(&ifile);
                          uchar cdata;
                          ifile.open(QIODevice::WriteOnly);
                          sByteImage.append(ListImages[i]);

                              while(sByteImage.count() != 0)
                                  {
                                      cdata = uchar(sByteImage.at(0));
                                      sifile << cdata;
                                      sByteImage.remove(0, 1);
                                  }

                              if(i > SelectWordDialog->value()) SelectWordDialog->setValue(i);

                          QApplication::processEvents();

                              if(SelectWordDialog->wasCanceled()) break;

                      }
            for(int i = 0; i < CountImages; i++)
                if(ListImages[i].count() != 0)
                    {
                        QString sNumImage;
                        QByteArray sByteImage;
                        sByteImage.clear();
                        sNumImage.setNum(i);

                            if(i >= 0 && i <= 9) sNumImage.insert(0,"0");

                        sByteImage.append(ListImages[i]);
                        QImage ImageSave;
                        ImageSave.loadFromData(sByteImage);
                        ImageSave.save("/tmp/xwel/temp/Image" + sNumImage, "PNG");

                            if(i > SelectWordDialog->value()) SelectWordDialog->setValue(i);

                        QApplication::processEvents();

                            if(SelectWordDialog->wasCanceled()) break;

                    }

Для сборки deb-пакета необходимо наличие установленных пакетов: autotools-dev, dh-make, fakeroot и другие.
Команда сборки:
user@pc:/klen-library-0.0.9-deb$ dpkg-buildpackage -rfakeroot

#5 15.08.2011 03:20:52

xwicked
Administrator
Зарегистрирован: 02.08.2011
Сообщений: 114
IP-адрес

Программа для создания электронных книг, Обсуждение программы и кода

Здравствуйте!

В этой версии я сделал одно важное изменение, на которое хотел бы обратить Ваше особое внимание. Это функция "int slotChangeFont()". Там я копирую в переменную QString sText всё выделение:

sText = TextBook->textCursor().selection().toHtml();

Потом заменяю все вхождения модификаторов шрифта: "font-family:", "font-size:", "font-style:", "font-weight:" на значения из диалога шрифта.

Так вот, там должен быть способ в одну единственную строчку. Я даже нашёл его - записал в свою амбарную тетрадь, а сейчас найти не могу sad . Прошу помочь в нахождении этого способа, так как "int slotChangeFont()" занимает не много не мало, аж 195 строк(!). Буду благодарен.

Исходный код + сборки. Версия 0.1.0.

Что изменилось:
- Добавлены значки "Oxygen", распространяемые по лицензии GNU GPL;
- При редактировании шрифта, он изменяется теперь, не для всего текста страницы, а по частям(словам, предложениям, абзацами и т. д.);
- Улучшен импорт HTML-документов, включая копирование изображений, которые преобразуются в формат PNG;
- Изменена стандартная панель - добавлены несколько новых действий;
- Добавлена панель редактирования, в которой продублированы действия из меню "Редактирование", для более удобной работы.
- Счётчик страниц переместился со стандартной панели в строку состояния.

#6 17.08.2011 18:16:45

xwicked
Administrator
Зарегистрирован: 02.08.2011
Сообщений: 114
IP-адрес

Программа для создания электронных книг, Обсуждение программы и кода

Здравствуйте! Вот новая версия 0.1.1 - исходный код + сборки.

Внешний вид:


Одно из добавлений - это функция поиска текста по книге:

           while(iNumberPage < ListPages.count())
               {
                 lFind:
                    if(TextBook->find(sFindText) == false)
                        {
                            slotNextPage(); //iNumberPage++

                                if(iNumberPage == ListPages.count() - 1) break;

                            goto lFind;
                        }
                    else break;
               }
QString sFindText - искомый текст;
int iNumberPage - текущая страница
QStringList ListPages - список страниц с текстом.

Для поиска используется "TextBook->find(sFindText)" - будет ли выгода, если использовать функцию поиска в QString непосредственно или использовать контейнер для ускорения? Предполагаю, что сейчас тратится дополнительное время для прорисовки QTextEdit TextBook.

Все новинки:
- Добавлена возможность импорта / экспорта простого кодированного текста в формате utf-8;
- Добавлена функция поиска слов по книге;
- Добавлена возможность расширенного редактирования вставленного простого текста;
- Исправлена ошибка, при ответе "Отмена", вопроса о сохранении, при выходе;
- Добавлена панель поиска, с дубликатами команд из меню "Поиск";
- Исправлено несколько ошибок с кнопками панелей;
- Исправлены несколько ошибок при импорте файлов.

#7 17.08.2011 20:21:58

voral
Administrator
Зарегистрирован: 23.02.2010
Сообщений: 1 964
IP-адрес

Программа для создания электронных книг, Обсуждение программы и кода

Одно из добавлений - это функция поиска текста по книге:

Очень странный код. Зачем там метка и лишнее условие?
Почему не так.

while ((iNumberPage < ListPages.count())&&(TextBook->find(sFindText)))
{
    slotNextPage(); //iNumberPage++
}

Надо еще и код предваряющий посмотреть - имхо, что то тут не так....

#8 18.08.2011 04:36:04

xwicked
Administrator
Зарегистрирован: 02.08.2011
Сообщений: 114
IP-адрес

Программа для создания электронных книг, Обсуждение программы и кода

...Очень странный код. Зачем там метка и лишнее условие?
...
Надо еще и код предваряющий посмотреть - имхо, что то тут не так....

Согласен, если по всему моему коду пройтись с оптимизацией - он превратится в картинку. А это просто то, что первое в голову пришло, для решения задачи поиска :)

#9 27.08.2011 17:55:01

xwicked
Administrator
Зарегистрирован: 02.08.2011
Сообщений: 114
IP-адрес

Программа для создания электронных книг, Обсуждение программы и кода

...
Так вот, там должен быть способ в одну единственную строчку. Я даже нашёл его ...
Вот он:
         QFont TextFont;
         TextFont = QFontDialog::getFont(&Accept, TextFont);
         QTextCharFormat tcf;
         tcf.setFont(TextFont);
         TextBook->textCursor().setCharFormat(tcf);
--------------------------
В версии 0.1.2, была реализована возможность добавления в базу данных библиотеки произвольной информации, в виде ссылок на отдельные файлы. Что представляет собой достаточно хорошее улучшение, так как преподавателю можно будет совершать меньше движений, при создании учебника.

Эта возможность позволит не только сократить время создания учебника, но и послужит отличным расширением возможностей программы, при использовании материалов, содержащихся в отдельных ссылках на файлы, как дополнение к создаваемому учебнику. Например, к книге о художнике, можно будет хранить галерею с изображениями(его работами) в разделе "Фотографии".

Все изменения:
- Появилась возможность добавления дополнительной информации произвольного содержания, в виде ссылок на отдельные файлы;
- Добавлена возможность выбора пользователем варианта сохранения книги с паролем или без него;
- Добавлена защита режима редактирования программы отдельным паролем, с возможностью его будущего изменения;
- Добавлена возможность сохранения состояния показа инструментальных панелей после выхода из программы;
- Исправлена ошибка отсутствия изображений, при импорте книги из формата XWB;
- Исправлена ошибка неэкспортирования в форматы XWB, HTML, импортированной книги;
- Исправлена ошибка отсутствия расширения .txt, когда оно явно не указано, при экспорте в текстовый формат.
Исходник + сборки. Дабы быть уверенным в том, что файлы не побились, при закачке, я добавил текстовик с md5-контрольными суммами.
Git-репозиторий:
git://klen-library.git.sourceforge.net/gitroot/klen-library/klen-library (read-only)

#10 29.08.2011 07:52:12

mogul82
Administrator
Зарегистрирован: 09.03.2010
Сообщений: 1 987
IP-адрес

Программа для создания электронных книг, Обсуждение программы и кода

deb пакетов нет?

#11 29.08.2011 08:19:33

xwicked
Administrator
Зарегистрирован: 02.08.2011
Сообщений: 114
IP-адрес

Программа для создания электронных книг, Обсуждение программы и кода

deb пакетов нет?

Нет. Я стал собирать пакеты, начиная с версии 0.1.8.
Необходимо доставить следующие пакеты, чтобы программа заработала:
libqt4-sql (>= 4.4.3),
libqt4-sql-sqlite (>= 4.4.3),
libqtgui4 (>= 4.4.3),
libqtcore4(>= 4.4.3),
libc6 (>= 2.7),
libstdc++6 (>= 4.3.2),
libpcre3 (>= 7.6),
libxcb1 (>= 1.1),
libxdmcp6 (>= 1:1.0.2)
В исходниках есть файлы needed-packages.txt и lib-lin-x64.txt(полный список зависимых библиотек).

#12 23.09.2011 13:37:44

xwicked
Administrator
Зарегистрирован: 02.08.2011
Сообщений: 114
IP-адрес

Программа для создания электронных книг, Обсуждение программы и кода

voral Ваш код работает лучше(быстрее) моего! Я добавил отрицание(!TextBook->find(sFindText)) и он заменил мой вариант в версии 0.2.5, которая готовится к релизу:

while ((iNumberPage < ListPages.count())&&(!TextBook->find(sFindText)))
{
    slotNextPage(); //iNumberPage++
}
Благодарю!

Есть ещё просьба. Нашёл косяк в обратном поиске - пропускает страницы, штук по 3-5(!):
       void KlenLibrary::slotFindPrevious()
       {
           if(sFindText == "") return;

           while(iNumberPage > 0)
               {
                 lFind:
                    if(TextBook->find(sFindText, QTextDocument::FindBackward) == false)
                        {
                            slotPreviousPage();

                                while(TextBook->find(sFindText) == true)
                                    {
                                        //TextBook->find(sFindText);
                                    };

                            //TextBook->find(sFindText, QTextDocument::FindBackward);

                                if(iNumberPage == 1) break;

                            goto lFind;
                        }
                    else break;
               }
       }
Нужно это как-то оптимизировать.

#13 23.09.2011 13:56:14

voral
Administrator
Зарегистрирован: 23.02.2010
Сообщений: 1 964
IP-адрес

Программа для создания электронных книг, Обсуждение программы и кода

Нужно это как-то оптимизировать.

Это нужно переписать. Вы хоть опишите что хотите..
Но так на вскидку.
1. Если выполняется условие (TextBook->find(sFindText, QTextDocument::FindBackward) == false) то цикл работает, если не выполняетя то цикл прерывается. Следовательно писать это условие нужно как и полагается в while (добавив его к уже существующему).
2. с меткой здесь чего то невменяемое сооружено.
Брр... Не давайте сначала опишите, что здесь вообще задумано .

#14 23.09.2011 17:54:56

xwicked
Administrator
Зарегистрирован: 02.08.2011
Сообщений: 114
IP-адрес

Программа для создания электронных книг, Обсуждение программы и кода

Хочу я того же самого. Вот это:

           while((iNumberPage > 0)&&(!TextBook->find(sFindText, QTextDocument::FindBackward)))
           {
               slotPreviousPage();//iNumberPage--
           }
Работает отлично на одной странице, но перелистывать почему-то не хочет. Тупо зависает и не может выйти из цикла. Непонятно :( .
Если я с этим сегодня не разберусь придётся откладывать до версии 0.3.7...

#15 23.09.2011 20:11:33

voral
Administrator
Зарегистрирован: 23.02.2010
Сообщений: 1 964
IP-адрес

Программа для создания электронных книг, Обсуждение программы и кода

Значит проблему надо искать в slotPreviousPage();

#16 24.09.2011 06:34:45

xwicked
Administrator
Зарегистрирован: 02.08.2011
Сообщений: 114
IP-адрес

Программа для создания электронных книг, Обсуждение программы и кода

Значит проблему надо искать в slotPreviousPage();
Поменял 0 на 1 и пролистывание заработало:
iNumberPage > 1
Точнее он доходит до первой страницы, цикл завершается, но ничего не находит, а вперёд находил около 30-ти вхождений слова на 20-ти страницах. Может там как-то специфически нужно настроить обратный поиск. Поэтому сам я чуть позже буду в этом разбираться.

#17 16.10.2011 09:20:03

xwicked
Administrator
Зарегистрирован: 02.08.2011
Сообщений: 114
IP-адрес

Программа для создания электронных книг, Обсуждение программы и кода

Здравствуйте! Версия 0.1.3 содержит добавление защиты документов дополнительной информации от случайного изменения в режиме просмотра:

              connect(ListAdditionallyWidget, SIGNAL(doubleClicked(QModelIndex)), SLOT(slotRunFile()));
       
          void ListAdditionally::slotRunFile()
          {
              if(*sItem == tr("Documents") && gRegime == true)
                  {
                      QString sTmp;
                      sTmp = ListAdditionallyWidget->item(ListAdditionallyWidget->currentRow())->text();
                      int ipos = sTmp.lastIndexOf("/") + 1;
                      sTmp.remove(0, ipos);
                      QFile ifile(ListAdditionallyWidget->item(ListAdditionallyWidget->currentRow())->text());
                      QDataStream idata(&ifile);
                      QByteArray bfile;
                      ifile.open(QIODevice::ReadOnly);
                      bfile = ifile.readAll();
                      QFile ofile("/tmp/xwel/tempfile/" + sTmp);
                      QDataStream odata(&ofile);
                      ofile.open(QIODevice::WriteOnly);
                      ofile.write(bfile);
                      ifile.close();
                      ofile.close();
                      QDesktopServices::openUrl(QUrl::fromLocalFile("/tmp/xwel/tempfile/" + sTmp));//Открытие копии документа
                  }
               else
      //Открытие оригинала документа
               QDesktopServices::openUrl(QUrl::fromLocalFile(ListAdditionallyWidget->item(ListAdditionallyWidget->currentRow())->text()));
          }
То бишь, происходит простое копирование во временный файл документа и его запуск. Но, есть одно небольшое ограничение, при использовании такого подхода(bfile = ifile.readAll();) - файл читается в переменную полностью и он не должен быть слишком большим. А все изменения выглядят вот так:
- Исправлена ошибка возможной потери пароля, при экспорте;
- Добавлена защита документов дополнительной информации в режиме просмотра от случайного изменения;
- Появилась функция экспорта всех книг;
- Исправлена ошибка неполного показа длинных названий книг или издательств в списке книг;
- В окне "О программе" все ссылки, для удобного поиска, изменили цвет на синий;
- Исправлена ошибка возможности редактирования списка книг в режиме просмотра;
- В таблицу списка книг добавлены пункты: "Категория", "Подкатегория";
- Исправлена ошибка неудаления книги из базы, при удалении её из списка книг;
- В меню "Помощь" добавились пункты: "Пожертвовать" и "Получить исходный код".

#18 20.11.2011 16:22:34

xwicked
Administrator
Зарегистрирован: 02.08.2011
Сообщений: 114
IP-адрес

Программа для создания электронных книг, Обсуждение программы и кода

В версии 0.1.4 добавилась функция печати:

void ElectronicLibrary::slotPrint()
{
    QPrinter printer;
    QPrintDialog *pPrintDialog = new QPrintDialog(&printer);

    if(pPrintDialog->exec() == QDialog::Accepted)
    {
        QPainter painter(&printer);
        QRect r(painter.viewport());

        if(ListPages.count() > 0)
        {

            for(int i = 0; i < ListPages.count(); i++)
            {
                TextBook->setHtml(ListPages.at(i));
                painter.drawText(r, TextBook->toPlainText());
                printer.newPage();
            }

            painter.end();
        }

        TextBook->setHtml(ListPages.at(0));
        sbNumberPage.setValue(1);
    }

    delete pPrintDialog;
}
Такой вариант печатает простой текст, без форматирования и изображений.

Все изменения:
- Добавлен модуль тестирования "LabFreeTech Тест", для проверки знаний;
- Добавлена функция печати книги;
- Добавлена возможность выравнивания и изменения регистра текста.

#19 31.01.2012 18:52:36

xwicked
Administrator
Зарегистрирован: 02.08.2011
Сообщений: 114
IP-адрес

Программа для создания электронных книг, Обсуждение программы и кода

Здравствуйте! Версия 0.1.8

//Изменение таблицы
void KlenLibrary::slotResizeTable()
{
    if(gRegimeViewing == true) return;

    InputParametrTable FormInputParametrTable;
    FormInputParametrTable.setWindowTitle(tr("Change table parametrs"));

    if(FormInputParametrTable.exec() == QDialog::Accepted)
    {
        if(FormInputParametrTable.SpinColumnCount->value() > 0
                && FormInputParametrTable.SpinColumnCount->value() > 0)
        {
            TextBook->textCursor().currentTable()->resize(FormInputParametrTable.SpinRowCount->value(),
                                                          FormInputParametrTable.SpinColumnCount->value());
        }
    }
}
currentTable() позволяет работать с таблицей, по текущей позиции курсора в тексте.
Все изменения:
- Добавилась возможность создания и редактирования таблиц;
- Исправлена ошибка, не позволяющая сохранять дополнительную информацию, при редактировании;
- Добавлена возможность ввода имени пользователя;
- Добавлен учёт времени работы пользователя с книгой;
- Добавились горячие клавиши;
- Модуль "LabFreeTech Тест" изменил своё название на "Шёлковый тест" и обновился до версии 0.4.1;
- Добавился пункт меню "Сервис", в котором теперь находятся элементы: "Статистика", "Дополнительно", "Тест";
Хочу сообщить о том, что начиная с версии >1.0.0, 30% работы будет сосредоточено на оптимизацию под ООП стандарты :) для лучшей поддержки другими программистами.

P.S. Ещё один очень важный момент: версии 0.1.8 и 0.1.9 - сборки являются минимальными. То есть, чтобы посмотреть на все функции, необходимо программу собрать из исходника . Это делалось для проверки аудитории пользователей на заинтересованность в программе, путем отправки мне запроса на получение исходного кода. Что было не очень удачной идеей и, с версии 0.2.5, сборки программы уже снова полнофункциональны. Прошу извинить меня за данное неудобство :o .

#20 11.02.2012 20:04:42

xwicked
Administrator
Зарегистрирован: 02.08.2011
Сообщений: 114
IP-адрес

Программа для создания электронных книг, Обсуждение программы и кода

В версии 0.1.9 добавлена работа с несколькими библиотеками-базами(как и в тесте ;) ) и возможность резервировать со сжатием:

void KlenLibrary::slotBackupLibrary()
{
    QString sNameBackupLibrary = QFileDialog::getSaveFileName(0, tr("Backup library"), "", "*.xwlbz");

    if(sNameBackupLibrary == "") return;
    if(sNameBackupLibrary.indexOf(".xwlbz") == -1) sNameBackupLibrary += ".xwlbz";

    QFile ifile(sNameLibrary);
    ifile.open(QIODevice::ReadOnly);
    QByteArray baExport;
    baExport = ifile.readAll();
    ifile.close();
    baExport = qCompress(baExport, 9);//Сжатие данных - 9-ая степень
    QFile ofile(sNameBackupLibrary);
    ofile.open(QIODevice::WriteOnly);
    ofile.write(baExport);
    ofile.close();
}

void KlenLibrary::slotRestoreLibrary()
{
    QString sNameBackupLibrary = QFileDialog::getOpenFileName(0, tr("Open backup"), "", "*.xwlbz");

    if(sNameBackupLibrary == "") return;

    QFile ifile(sNameBackupLibrary);
    ifile.open(QIODevice::ReadOnly);
    QByteArray baImport;
    baImport = ifile.readAll();
    ifile.close();
    baImport = qUncompress(baImport);//Извлечение данных из архива

    sNameBackupLibrary = QFileDialog::getSaveFileName(0, tr("Restore library"), "", "*.xwlb");

    if(sNameBackupLibrary.indexOf(".xwlb") == -1) sNameBackupLibrary += ".xwlb";
    if(sNameBackupLibrary == "") return;

    QFile ofile(sNameBackupLibrary);
    ofile.open(QIODevice::WriteOnly);
    ofile.write(baImport);
    ofile.close();
}
Несколько изменений:
- Добавилась возможность резервировать базу данных библиотеки(со сжатием до 5-ти раз(!));
- Добавлена возможность работы с несколькими библиотеками;
- Добавлена поддержка полного форматирования текста при печати книги;
- Добавлено cжатие(до 5-ти раз(!)) импортированной книги в формате xwb.
- Изменились несколько элементов меню;
Скачать

#21 17.02.2012 18:40:37

xwicked
Administrator
Зарегистрирован: 02.08.2011
Сообщений: 114
IP-адрес

Программа для создания электронных книг, Обсуждение программы и кода

Здравствуйте! Оптимизирована функция изменения шрифта:

        bool Accept;
        QFont TextFont;
        TextFont = TextQuestion->textCursor().charFormat().font();
        TextFont = QFontDialog::getFont(&Accept, TextFont);

        if(Accept)
        {
            QTextCharFormat tcf;
            tcf.setFont(TextFont);
            TextQuestion->textCursor().setCharFormat(tcf);
            cbFont.setCurrentFont(TextFont);
        }
        else return 1;
и другие изменения.
Скачать
Это последняя версия. В Git создана ветка current теперь, все свежие изменения будут там.

#22 03.04.2012 17:10:43

xwicked
Administrator
Зарегистрирован: 02.08.2011
Сообщений: 114
IP-адрес

Программа для создания электронных книг, Обсуждение программы и кода

Здравствуйте! Новый код. Версия 1.0.0 - это первая версия, в которой можно нормально работать с изображениями. Их количество теперь будет ровно таким, каким и должно быть, не больше.
Повышена безопасность программы перемещением некоторых переменных в секцию private: Теперь доступ к ним осуществляется из методов:

...

int TTextBook::isCountPages() const
{
    return ListPages.count();
}

int TTextBook::isNumberBook() const
{
    return i_NumberBook;
}

void TTextBook::setNumberBook(int iNumberBook)
{
    i_NumberBook = iNumberBook;
}

int TTextBook::isYear() const
{
    return i_Year;
}

void TTextBook::setYear(int iYear)
{
    i_Year = iYear;
    sYear.setNum(iYear);
}

int TTextBook::isCurrentPage() const
{
    return i_CurrentPage;
}

void TTextBook::setCurrentPage(int iCurrentPage)
{
    i_CurrentPage = iCurrentPage;
}

int TTextBook::isModeWork() const
{
    return b_ModeWork;
}

void TTextBook::setModeWork(bool bModeWork)
{
    b_ModeWork = bModeWork;
}

QByteArray TTextBook::isPassword() const
{
    return ba_Password;
}

void TTextBook::setPassword(QByteArray baPassword)
{
    ba_Password = baPassword;
}
...

//Исправлена печать - печатается весь текст :)
void TTextBook::slotPrint()
{
    QPrinter printer;
    QPrintDialog *pPrintDialog = new QPrintDialog(&printer);
    QTextDocument *textDoc = new QTextDocument;
    QString sPrint;

    if(pPrintDialog->exec() == QDialog::Accepted)
    {
        sPrint = makeOneHTML();

        QImage textImage;

        for (int i = 0; i < ListImages.count(); i++)
        {
            textImage.loadFromData(ListImages.at(i));
            textDoc->addResource(QTextDocument::ImageResource, QUrl(slNumberImages.at(i)), textImage);
        }

        textDoc->setHtml(sPrint);
        textDoc->print(&printer);
    }

    delete textDoc;
    delete pPrintDialog;
}
- Оптимизирована скорость загрузки книги до 10 раз;
- Исправлена невозможность нормальной работы с изображениями в книге;
- Добавлен экспорт книги в PDF, PostScript, RTF;
- Исправлена печать книги, теперь печатается весь текст;
- Добавлено шифрование файла книги в формате xwb;
- Модуль Шёлковый тест обновился до версии 1.0.0;
- Добавлена возможность проверки наличия новой версии через интернет
Всего 27 изменений. Скачать:
Теперь исходник одним файлом. Вся информация по сборке rpm и deb-пакетов находится внутри.

#23 02.02.2013 19:11:59

xwicked
Administrator
Зарегистрирован: 02.08.2011
Сообщений: 114
IP-адрес

Программа для создания электронных книг, Обсуждение программы и кода

Здравствуйте!

Новая версия. 1.0.5. Тут прошу особо протестировать Mac- и Linux-установщики, так как Linux-пакетов больше нет. Скачать

Quote by Изменения
- Исправлена ошибка исчезновения всех изображений, при вставке новой страницы;
- Исправлена ошибка когда, при повторном открытии книги, страницы книг объединялись;
- Исправлена ошибка невозможности создания новой книги из списка книг;
- Добавлен пакетный импорт всех книг из указанной папки в базу библиотеки;
- Добавлено сохранение положений панелей инструментов при выходе из программы;
- Удалена совместимость с базами библиотеки версий 0.1.9 и 0.2.5;
- Из сборки удалён модуль «Шёлковый тест». Его теперь нужно скачивать отдельно;

Благодарю!

#24 26.05.2013 05:07:01

romkaromka
Administrator
Зарегистрирован: 22.02.2010
Сообщений: 883
IP-адрес

Программа для создания электронных книг, Обсуждение программы и кода

Ошибки:
- неверная версия, что приводит к нерабочему запуску из Меню: sed -i -e "s/1.0.0/1.0.5/g" ./klen-library/klen-library.pro
- не определяет русский язык автоматом при первом запуске.
Требуется небольшая доработка.
Тестовые пакеты готовы ftp://ftp.mageialinux.ru/mageia2/construct/

#25 14.05.2014 12:47:36

romkaromka
Administrator
Зарегистрирован: 22.02.2010
Сообщений: 883
IP-адрес

Программа для создания электронных книг, Обсуждение программы и кода

xwicked, привет, чего по проекту klen-library?

#26 23.05.2014 17:18:43

xwicked
Administrator
Зарегистрирован: 02.08.2011
Сообщений: 114
IP-адрес

Программа для создания электронных книг, Обсуждение программы и кода

xwicked, привет, чего по проекту klen-library?
Привет!
Глухо. В этом году не выйдет ни одной версии.
Ошибки:
- неверная версия, что приводит к нерабочему запуску из Меню: sed -i -e "s/1.0.0/1.0.5/g" ./klen-library/klen-library.pro
- не определяет русский язык автоматом при первом запуске.
Требуется небольшая доработка.
Тестовые пакеты готовы ftp://ftp.mageialinux.ru/mageia2/construct/
С языком как в Шёлковом тесте временное решение пойдёт?

#27 23.05.2014 18:02:40

romkaromka
Administrator
Зарегистрирован: 22.02.2010
Сообщений: 883
IP-адрес

Программа для создания электронных книг, Обсуждение программы и кода

xwicked, неа. Тогда klen-library подождет, сначала Шёлковый тест жду новой версии.

#28 23.05.2014 18:30:35

drBatty
Administrator
Зарегистрирован: 20.02.2010
Сообщений: 17 053
IP-адрес

Программа для создания электронных книг, Обсуждение программы и кода

xwicked, а можно странный вопрос? Что это вообще такое?

PS: можно туда что-то засунуть, а потом читать где-нибудь на нетбуке? Или я не угадал?

Было-бы классно, если-бы раз в СУБД, то с поиском. Например стандарт сишки засунуть, другие справочники...

PPS: а, там README есть. Классная вещь, пойду собирать.

Board footer