├── .gitignore ├── _config.yml ├── app.ico ├── myapp.icns ├── preview.gif ├── icons ├── app.png ├── dna.png ├── ucsc.png ├── ensembl.png ├── search.png └── squares.gif ├── win32 ├── libhts.a ├── libhts-0.dll └── libhts.dll.a ├── fonts └── fontawesome.ttf ├── CHANGELOG ├── .gitmodules ├── QFontIcon ├── QFontIcon.pri ├── qfonticon.h └── qfonticon.cpp ├── README ├── .travis.yml ├── AUTHORS ├── files.qrc ├── aboutdialog.h ├── infowidget.h ├── createindexdialog.h ├── samplewidget.h ├── main.cpp ├── README.md ├── CuteVcf.pro ├── vcfheader.h ├── createindexdialog.cpp ├── qtabix.h ├── mainwindow.h ├── vcfline.h ├── vcfmodel.h ├── infowidget.cpp ├── aboutdialog.cpp ├── samplewidget.cpp ├── vcfheader.cpp ├── qtabix.cpp ├── vcfline.cpp ├── vcfmodel.cpp ├── design └── icons.svg ├── mainwindow.cpp └── LICENSE /.gitignore: -------------------------------------------------------------------------------- 1 | *.pro.user 2 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-slate -------------------------------------------------------------------------------- /app.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsquare/CuteVCF/HEAD/app.ico -------------------------------------------------------------------------------- /myapp.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsquare/CuteVCF/HEAD/myapp.icns -------------------------------------------------------------------------------- /preview.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsquare/CuteVCF/HEAD/preview.gif -------------------------------------------------------------------------------- /icons/app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsquare/CuteVCF/HEAD/icons/app.png -------------------------------------------------------------------------------- /icons/dna.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsquare/CuteVCF/HEAD/icons/dna.png -------------------------------------------------------------------------------- /icons/ucsc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsquare/CuteVCF/HEAD/icons/ucsc.png -------------------------------------------------------------------------------- /win32/libhts.a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsquare/CuteVCF/HEAD/win32/libhts.a -------------------------------------------------------------------------------- /icons/ensembl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsquare/CuteVCF/HEAD/icons/ensembl.png -------------------------------------------------------------------------------- /icons/search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsquare/CuteVCF/HEAD/icons/search.png -------------------------------------------------------------------------------- /icons/squares.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsquare/CuteVCF/HEAD/icons/squares.gif -------------------------------------------------------------------------------- /win32/libhts-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsquare/CuteVCF/HEAD/win32/libhts-0.dll -------------------------------------------------------------------------------- /win32/libhts.dll.a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsquare/CuteVCF/HEAD/win32/libhts.dll.a -------------------------------------------------------------------------------- /fonts/fontawesome.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsquare/CuteVCF/HEAD/fonts/fontawesome.ttf -------------------------------------------------------------------------------- /CHANGELOG: -------------------------------------------------------------------------------- 1 | ## (0.1.0) 2 | 3 | - Reading vcf.gz with htslib 4 | - compile on windows, mac and linux -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "htslib"] 2 | path = htslib 3 | url = https://github.com/samtools/htslib.git 4 | -------------------------------------------------------------------------------- /QFontIcon/QFontIcon.pri: -------------------------------------------------------------------------------- 1 | HEADERS += \ 2 | $$PWD/qfonticon.h 3 | 4 | SOURCES += \ 5 | $$PWD/qfonticon.cpp 6 | 7 | 8 | INCLUDEPATH += $$PWD 9 | -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- 1 | CuteVCF is a genomics variant viewer according to the VCF specification. . You can open vcf.gz file and read all information related to a variant. 2 | GUI is made with Qt 5.7 and vcf are reading with htslib. 3 | CuteVCF is under GPL3 license. You can download the code source from github . 4 | 5 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: cpp 2 | dist: trusty 3 | compiler: g++ 4 | sudo: required 5 | 6 | before_install: 7 | - sudo add-apt-repository ppa:beineri/opt-qt57-trusty -y 8 | - sudo apt-get update 9 | 10 | install: 11 | - sudo apt-get install qt57base qt57charts-no-lgpl 12 | - source /opt/qt57/bin/qt57-env.sh 13 | 14 | 15 | script: 16 | - /opt/qt57/bin/qmake 17 | - make 18 | -------------------------------------------------------------------------------- /AUTHORS: -------------------------------------------------------------------------------- 1 | CuteVCF is a free software created by labsquare team. Labsquare is a community of developers which aims to develop bioinformatics user interface for clinical usage. 2 | Here is the list of authors and contributor of CuteVCF. 3 | 4 | Sacha Schutz 5 | Jérémie Roquet 6 | Eugene Trounev 7 | Anne-Sophie Denommé 8 | Olivier Gueudelot 9 | -------------------------------------------------------------------------------- /files.qrc: -------------------------------------------------------------------------------- 1 | 2 | 3 | LICENSE 4 | AUTHORS 5 | README 6 | CHANGELOG 7 | fonts/fontawesome.ttf 8 | icons/app.png 9 | icons/ensembl.png 10 | icons/search.png 11 | icons/squares.gif 12 | icons/ucsc.png 13 | icons/dna.png 14 | 15 | 16 | -------------------------------------------------------------------------------- /aboutdialog.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of CuteVCF. 3 | 4 | Foobar is free software: you can redistribute it and/or modify 5 | it under the terms of the GNU General Public License as published by 6 | the Free Software Foundation, either version 3 of the License, or 7 | (at your option) any later version. 8 | 9 | Foobar is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | GNU General Public License for more details. 13 | 14 | You should have received a copy of the GNU General Public License 15 | along with Foobar. If not, see . 16 | 17 | @author : Sacha Schutz 18 | */ 19 | 20 | #ifndef ABOUTDIALOG_H 21 | #define ABOUTDIALOG_H 22 | #include 23 | 24 | class AboutDialog : public QDialog 25 | { 26 | Q_OBJECT 27 | public: 28 | explicit AboutDialog(QWidget *parent = 0); 29 | 30 | public Q_SLOTS: 31 | void openGithub(); 32 | 33 | protected: 34 | void appendTab(const QString& filename, const QString& label); 35 | 36 | 37 | private: 38 | QTabWidget * mTabWidget; 39 | QDialogButtonBox * mButtons; 40 | 41 | QPushButton * mCancelButton; 42 | QPushButton * mGithubButton; 43 | 44 | 45 | }; 46 | 47 | #endif // ABOUTDIALOG_H 48 | -------------------------------------------------------------------------------- /infowidget.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of CuteVCF. 3 | 4 | Foobar is free software: you can redistribute it and/or modify 5 | it under the terms of the GNU General Public License as published by 6 | the Free Software Foundation, either version 3 of the License, or 7 | (at your option) any later version. 8 | 9 | Foobar is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | GNU General Public License for more details. 13 | 14 | You should have received a copy of the GNU General Public License 15 | along with Foobar. If not, see . 16 | 17 | @author : Sacha Schutz 18 | */ 19 | 20 | #ifndef INFOWIDGET_H 21 | #define INFOWIDGET_H 22 | 23 | #include 24 | #include 25 | #include 26 | #include "vcfline.h" 27 | #include "vcfmodel.h" 28 | class InfoWidget : public QWidget 29 | { 30 | Q_OBJECT 31 | public: 32 | explicit InfoWidget(VcfModel * vcfModel, QWidget *parent = 0); 33 | public Q_SLOTS: 34 | void setLine(const QModelIndex& index); 35 | void clear(); 36 | 37 | private: 38 | QStandardItemModel * mModel; 39 | QTableView * mView; 40 | VcfModel * mVcfModel; 41 | }; 42 | 43 | #endif // INFOWIDGET_H 44 | -------------------------------------------------------------------------------- /createindexdialog.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of CuteVCF. 3 | 4 | Foobar is free software: you can redistribute it and/or modify 5 | it under the terms of the GNU General Public License as published by 6 | the Free Software Foundation, either version 3 of the License, or 7 | (at your option) any later version. 8 | 9 | Foobar is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | GNU General Public License for more details. 13 | 14 | You should have received a copy of the GNU General Public License 15 | along with Foobar. If not, see . 16 | 17 | @author : Sacha Schutz 18 | */ 19 | 20 | #ifndef CREATEINDEXDIALOG_H 21 | #define CREATEINDEXDIALOG_H 22 | #include 23 | #include 24 | #include "qtabix.h" 25 | class CreateIndexDialog : public QProgressDialog 26 | { 27 | Q_OBJECT 28 | public: 29 | CreateIndexDialog(const QString& filename, QWidget * parent = 0); 30 | int exec() Q_DECL_OVERRIDE; 31 | 32 | protected Q_SLOTS: 33 | void cancelIndexBuilding(); 34 | void finishIndexBuilding(); 35 | 36 | 37 | private: 38 | QString mFilename; 39 | QFuture mFuture; 40 | QFutureWatcher mWatcher; 41 | }; 42 | 43 | #endif // CREATEINDEXDIALOG_H 44 | -------------------------------------------------------------------------------- /samplewidget.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of CuteVCF. 3 | 4 | Foobar is free software: you can redistribute it and/or modify 5 | it under the terms of the GNU General Public License as published by 6 | the Free Software Foundation, either version 3 of the License, or 7 | (at your option) any later version. 8 | 9 | Foobar is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | GNU General Public License for more details. 13 | 14 | You should have received a copy of the GNU General Public License 15 | along with Foobar. If not, see . 16 | 17 | @author : Sacha Schutz 18 | */ 19 | 20 | #ifndef SAMPLEWIDGET_H 21 | #define SAMPLEWIDGET_H 22 | #include 23 | #include "vcfline.h" 24 | #include "vcfmodel.h" 25 | class SampleWidget : public QWidget 26 | { 27 | Q_OBJECT 28 | public: 29 | explicit SampleWidget(VcfModel * vcfModel, QWidget *parent = 0); 30 | 31 | public Q_SLOTS: 32 | void setLine(const QModelIndex& index); 33 | void clear(); 34 | 35 | protected Q_SLOTS: 36 | void setSample(int id); 37 | private: 38 | QComboBox * mSampleBox; 39 | QTableView * mView; 40 | QStandardItemModel * mModel; 41 | VcfLine mCurrentLine; 42 | VcfModel * mVcfModel; 43 | 44 | }; 45 | 46 | #endif // SAMPLEWIDGET_H 47 | -------------------------------------------------------------------------------- /main.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of CuteVCF. 3 | 4 | Foobar is free software: you can redistribute it and/or modify 5 | it under the terms of the GNU General Public License as published by 6 | the Free Software Foundation, either version 3 of the License, or 7 | (at your option) any later version. 8 | 9 | Foobar is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | GNU General Public License for more details. 13 | 14 | You should have received a copy of the GNU General Public License 15 | along with Foobar. If not, see . 16 | 17 | @author : Sacha Schutz 18 | */ 19 | 20 | #include 21 | #include 22 | #include 23 | 24 | #include "mainwindow.h" 25 | #include "qfonticon.h" 26 | 27 | int main(int argc, char *argv[]) 28 | { 29 | 30 | QApplication app(argc, argv); 31 | 32 | QCoreApplication::setApplicationName("CuteVCF"); 33 | QCoreApplication::setOrganizationDomain("labsquare.org"); 34 | QCoreApplication::setOrganizationName("labsquare"); 35 | QCoreApplication::setApplicationVersion("0.2.0"); 36 | 37 | 38 | 39 | if (!QFontIcon::addFont(":/fonts/fontawesome.ttf")) 40 | qCritical()<<"Cannot add font"; 41 | 42 | 43 | 44 | MainWindow win; 45 | 46 | win.show(); 47 | 48 | return app.exec(); 49 | 50 | 51 | 52 | 53 | } 54 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CuteVCF ![Travis](https://api.travis-ci.org/labsquare/CuteVCF.svg?branch=master) 2 | simple GUI viewer for [vcf file](https://samtools.github.io/hts-specs/VCFv4.2.pdf) (variant call format) using htslib. 3 | 4 | ![preview](https://raw.githubusercontent.com/labsquare/CuteVCF/master/preview.gif) 5 | 6 | ## Prerequis 7 | ### Install Qt >5.7 8 | 9 | **From Qt website** : 10 | Download Qt > 5.7 from https://www.qt.io/. 11 | Don't forget to check QtChart module during installation. 12 | 13 | 14 | **From ubuntu** : Qt 5.7 is not yet avaible with ubuntu. But you can add PPA to your software system. 15 | For exemple for xenial 16 | 17 | sudo add-apt-repository ppa:beineri/opt-qt57-xenial 18 | sudo apt-get install qt57base qt57charts-no-lgpl 19 | source /opt/qt57/bin/qt57-env.shf 20 | 21 | **From fedora** : Qt 5.7 is avaible 22 | 23 | sudo dnf install qt5-qtbase-devel qt5-qtcharts-devel 24 | 25 | ### Compile CuteVCF 26 | **From Qt Creator:** 27 | Open the CuteVcf.pro from Qt creator 28 | Compile it and Run it 29 | 30 | **From Terminal:** 31 | Be sure you have the correct version of Qt (>5.7) by using qmake. You will find qmake in bin folder where you installed Qt. For exemple, if you installed Qt from ppa:beineri, you will find it under /opt/qt57/bin/qmake. Then launch the compilation from CuteVCF folder as follow. 32 | 33 | git clone --recursive git@github.com:labsquare/CuteVCF.git 34 | qmake --version 35 | qmake 36 | make 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /CuteVcf.pro: -------------------------------------------------------------------------------- 1 | #------------------------------------------------- 2 | # 3 | # Project created by QtCreator 2016-12-14T15:38:24 4 | # 5 | #------------------------------------------------- 6 | 7 | QT += core gui concurrent 8 | 9 | greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 10 | 11 | TARGET = CuteVCF 12 | TEMPLATE = app 13 | 14 | CONFIG(release, debug|release):DEFINES += QT_NO_DEBUG_OUTPUT 15 | 16 | # On linux, compile htslib 17 | unix { 18 | mytarget.target = $$PWD/htslib/libhts.so 19 | mytarget.commands = cd $$PWD/htslib; make -j4 20 | mytarget_clean.commands = cd $$PWD/htslib; make clean 21 | QMAKE_EXTRA_TARGETS += mytarget 22 | PRE_TARGETDEPS += $$PWD/htslib/libhts.so 23 | INCLUDEPATH+=$$PWD/htslib 24 | LIBS += -L$$PWD/htslib -lhts 25 | 26 | 27 | } 28 | 29 | # On windows use libhts.a made from msys2. 30 | win32{ 31 | LIBS += -L$$PWD/win32 -lhts 32 | 33 | INCLUDEPATH += $$PWD/htslib 34 | DEPENDPATH += $$PWD/htslib 35 | 36 | RC_ICONS = app.ico 37 | } 38 | 39 | 40 | include("QFontIcon/QFontIcon.pri") 41 | 42 | 43 | ICON = myapp.icns 44 | 45 | 46 | RESOURCES += files.qrc 47 | 48 | HEADERS += \ 49 | aboutdialog.h \ 50 | createindexdialog.h \ 51 | infowidget.h \ 52 | mainwindow.h \ 53 | qtabix.h \ 54 | samplewidget.h \ 55 | vcfheader.h \ 56 | vcfline.h \ 57 | vcfmodel.h 58 | 59 | SOURCES += \ 60 | aboutdialog.cpp \ 61 | createindexdialog.cpp \ 62 | infowidget.cpp \ 63 | mainwindow.cpp \ 64 | main.cpp \ 65 | qtabix.cpp \ 66 | samplewidget.cpp \ 67 | vcfheader.cpp \ 68 | vcfline.cpp \ 69 | vcfmodel.cpp 70 | -------------------------------------------------------------------------------- /vcfheader.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of CuteVCF. 3 | 4 | Foobar is free software: you can redistribute it and/or modify 5 | it under the terms of the GNU General Public License as published by 6 | the Free Software Foundation, either version 3 of the License, or 7 | (at your option) any later version. 8 | 9 | Foobar is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | GNU General Public License for more details. 13 | 14 | You should have received a copy of the GNU General Public License 15 | along with Foobar. If not, see . 16 | 17 | @author : Sacha Schutz 18 | */ 19 | 20 | #ifndef VCFHEADER_H 21 | #define VCFHEADER_H 22 | #include 23 | 24 | class VcfHeader 25 | { 26 | public: 27 | VcfHeader(); 28 | VcfHeader(const QByteArray& raw); 29 | 30 | void setRaw(const QByteArray& raw); 31 | const QByteArray& raw() const; 32 | 33 | QHash info(const QString& key) const; 34 | QHash format(const QString& key) const; 35 | const QHash& tags() const; 36 | const QStringList& colnames() const; 37 | 38 | 39 | protected: 40 | static QHash captureParams(const QString& line); 41 | 42 | 43 | private: 44 | QByteArray mRaw; 45 | QHash> mInfos; 46 | QHash> mFormats; 47 | QHash mTags; 48 | 49 | QStringList mColnames; 50 | }; 51 | 52 | #endif // VCFHEADER_H 53 | -------------------------------------------------------------------------------- /createindexdialog.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of CuteVCF. 3 | 4 | Foobar is free software: you can redistribute it and/or modify 5 | it under the terms of the GNU General Public License as published by 6 | the Free Software Foundation, either version 3 of the License, or 7 | (at your option) any later version. 8 | 9 | Foobar is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | GNU General Public License for more details. 13 | 14 | You should have received a copy of the GNU General Public License 15 | along with Foobar. If not, see . 16 | 17 | @author : Sacha Schutz 18 | */ 19 | #include "createindexdialog.h" 20 | 21 | CreateIndexDialog::CreateIndexDialog(const QString& filename,QWidget *parent) 22 | :QProgressDialog(parent) 23 | { 24 | mFilename = filename; 25 | 26 | setMinimum(0); 27 | setMaximum(0); 28 | 29 | setLabelText(tr("Creating index, please wait ...")); 30 | 31 | connect(this,SIGNAL(canceled()), this, SLOT(cancelIndexBuilding())); 32 | connect(&mWatcher,SIGNAL(finished()),this,SLOT(finishIndexBuilding())); 33 | 34 | } 35 | 36 | int CreateIndexDialog::exec() 37 | { 38 | 39 | mFuture = QtConcurrent::run(&QTabix::buildIndex, mFilename); 40 | mWatcher.setFuture(mFuture); 41 | return QProgressDialog::exec(); 42 | 43 | } 44 | 45 | void CreateIndexDialog::cancelIndexBuilding() 46 | { 47 | mFuture.cancel(); 48 | QFile::remove(QString("%1.tbi").arg(mFilename)); 49 | reject(); 50 | } 51 | 52 | void CreateIndexDialog::finishIndexBuilding() 53 | { 54 | setLabelText(tr("Creating index done!")); 55 | setMaximum(100); 56 | setValue(100); 57 | accept(); 58 | } 59 | 60 | -------------------------------------------------------------------------------- /qtabix.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of CuteVCF. 3 | 4 | Foobar is free software: you can redistribute it and/or modify 5 | it under the terms of the GNU General Public License as published by 6 | the Free Software Foundation, either version 3 of the License, or 7 | (at your option) any later version. 8 | 9 | Foobar is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | GNU General Public License for more details. 13 | 14 | You should have received a copy of the GNU General Public License 15 | along with Foobar. If not, see . 16 | 17 | @author : Sacha Schutz 18 | */ 19 | 20 | #ifndef QTABIX_H 21 | #define QTABIX_H 22 | 23 | #include 24 | #include "htslib/bgzf.h" 25 | #include "htslib/tbx.h" 26 | #include "htslib/kseq.h" 27 | 28 | class QTabix 29 | { 30 | public: 31 | explicit QTabix(); 32 | explicit QTabix(const QString& filename); 33 | ~QTabix(); 34 | 35 | void setRegion(const QString& region); 36 | const QString& region() const; 37 | 38 | 39 | const QString& filename() const; 40 | void setFilename(const QString &filename); 41 | 42 | const QByteArray& header() const; 43 | const QStringList& chromosoms() const; 44 | 45 | bool readLineInto(QByteArray& line); 46 | 47 | static void buildIndex(const QString& filename); 48 | 49 | bool open(); 50 | 51 | 52 | 53 | 54 | protected: 55 | bool readInfo(); 56 | 57 | private: 58 | QString mFilename; 59 | QStringList mChromosoms; 60 | QByteArray mHeaders; 61 | QString mRegions; 62 | htsFile* fp = NULL; 63 | tbx_t* tbx = NULL; 64 | hts_itr_t* iter = NULL; 65 | kstring_t str; 66 | 67 | 68 | }; 69 | 70 | #endif // QTABIX_H 71 | -------------------------------------------------------------------------------- /mainwindow.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of CuteVCF. 3 | 4 | Foobar is free software: you can redistribute it and/or modify 5 | it under the terms of the GNU General Public License as published by 6 | the Free Software Foundation, either version 3 of the License, or 7 | (at your option) any later version. 8 | 9 | Foobar is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | GNU General Public License for more details. 13 | 14 | You should have received a copy of the GNU General Public License 15 | along with Foobar. If not, see . 16 | 17 | @author : Sacha Schutz 18 | */ 19 | 20 | #ifndef MAINWINDOW_H 21 | #define MAINWINDOW_H 22 | 23 | #include 24 | #include 25 | #include "vcfmodel.h" 26 | #include "infowidget.h" 27 | #include "samplewidget.h" 28 | #include "aboutdialog.h" 29 | #include "createindexdialog.h" 30 | #include "qfonticon.h" 31 | 32 | class MainWindow : public QMainWindow 33 | { 34 | Q_OBJECT 35 | 36 | public: 37 | explicit MainWindow(QWidget *parent = 0); 38 | ~MainWindow(); 39 | 40 | public Q_SLOTS: 41 | void loadRegion(); 42 | void setFilename(const QString& filename); 43 | void openFile(); 44 | void focusRegionEdit(); 45 | void exportCsv(); 46 | void showAbout(); 47 | void showRawHeader(); 48 | void showInfo(); 49 | 50 | 51 | protected: 52 | void createMenuBar(); 53 | void setVariantCount(int count); 54 | void reset(); 55 | void addRecent(const QString& filename); 56 | QStringList loadRecent(); 57 | 58 | 59 | protected Q_SLOTS: 60 | void loadingChanged(); 61 | void onVariantContextMenu(const QPoint& pos); 62 | void recentClicked(); 63 | void chromboxChanged(); 64 | 65 | private: 66 | QTableView * mView; 67 | VcfModel * mModel; 68 | QLineEdit * mSearchEdit; 69 | InfoWidget * mInfoWidget; 70 | SampleWidget * mSampleWidget; 71 | QToolBar * mMainToolBar; 72 | 73 | QDockWidget * mInfoDock; 74 | QDockWidget * mSampleDock; 75 | QLabel * mVariantCount; 76 | QLabel * mLoadingLabel; 77 | QMovie * mLoadingAnimation; 78 | QComboBox * mChromBox; 79 | 80 | 81 | 82 | }; 83 | 84 | #endif // MAINWINDOW_H 85 | -------------------------------------------------------------------------------- /vcfline.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of CuteVCF. 3 | 4 | Foobar is free software: you can redistribute it and/or modify 5 | it under the terms of the GNU General Public License as published by 6 | the Free Software Foundation, either version 3 of the License, or 7 | (at your option) any later version. 8 | 9 | Foobar is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | GNU General Public License for more details. 13 | 14 | You should have received a copy of the GNU General Public License 15 | along with Foobar. If not, see . 16 | 17 | @author : Sacha Schutz 18 | */ 19 | 20 | #ifndef VCFLINE_H 21 | #define VCFLINE_H 22 | #include 23 | 24 | class VcfLine 25 | { 26 | public: 27 | VcfLine(); 28 | 29 | static VcfLine fromLine(const QByteArray& line); 30 | 31 | const QByteArray& chromosom() const; 32 | void setChromosom(const QByteArray &chromosom); 33 | 34 | quint64 position() const; 35 | void setPosition(const quint64 &position); 36 | 37 | const QByteArray& id() const; 38 | void setId(const QByteArray &id); 39 | 40 | const QByteArray& ref() const; 41 | void setRef(const QByteArray &ref); 42 | 43 | const QByteArray& alt() const; 44 | void setAlt(const QByteArray &alt); 45 | 46 | int qual() const; 47 | void setQual(int qual); 48 | 49 | const QByteArray& filter() const; 50 | void setFilter(const QByteArray &filter); 51 | 52 | const QByteArray& rawFormat() const; 53 | QByteArrayList formats() const; 54 | void setRawFormat(const QByteArray &rawFormat); 55 | 56 | const QByteArray& rawInfos() const; 57 | QHash infos() const; 58 | void setRawInfos(const QByteArray &rawInfos); 59 | 60 | QByteArray rawSample(int i) const; 61 | QHash sample(int i); 62 | void addRawSample(const QByteArray& rawSample); 63 | int sampleCount() const; 64 | 65 | QString location() const; 66 | 67 | 68 | private: 69 | QByteArray mChromosom; 70 | quint64 mPosition = 0; 71 | QByteArray mId; 72 | QByteArray mRef; 73 | QByteArray mAlt; 74 | int mQual = 0; 75 | QByteArray mFilter; 76 | QByteArray mFormat; 77 | QByteArray mInfos; 78 | QByteArrayList mSamples; 79 | 80 | }; 81 | 82 | #endif // VCFLINE_H 83 | -------------------------------------------------------------------------------- /vcfmodel.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of CuteVCF. 3 | 4 | Foobar is free software: you can redistribute it and/or modify 5 | it under the terms of the GNU General Public License as published by 6 | the Free Software Foundation, either version 3 of the License, or 7 | (at your option) any later version. 8 | 9 | Foobar is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | GNU General Public License for more details. 13 | 14 | You should have received a copy of the GNU General Public License 15 | along with Foobar. If not, see . 16 | 17 | @author : Sacha Schutz 18 | */ 19 | #ifndef VCFMODEL_H 20 | #define VCFMODEL_H 21 | #include 22 | #include 23 | #include 24 | #include 25 | #include "vcfline.h" 26 | #include "vcfheader.h" 27 | #include "qtabix.h" 28 | 29 | #define MAX_ITEMS 100000 30 | 31 | using namespace std; 32 | 33 | class VcfModel : public QAbstractListModel 34 | { 35 | Q_OBJECT 36 | Q_PROPERTY(bool loading READ isLoading WRITE setLoading NOTIFY loadingChanged) 37 | public: 38 | 39 | VcfModel(QObject * parent = Q_NULLPTR); 40 | 41 | void setRegion(const QString& region); 42 | QString filename() const; 43 | void setFilename(const QString &filename); 44 | const VcfLine& line(const QModelIndex& index); 45 | 46 | const VcfHeader& header() const; 47 | const QStringList& chromosoms() const; 48 | 49 | void exportCsv(const QString& filename) const; 50 | int count() const; 51 | quint64 realCount() const; 52 | 53 | void clear(); 54 | 55 | bool isLoading() const; 56 | 57 | Q_SIGNALS: 58 | void loadingChanged(); 59 | 60 | 61 | protected Q_SLOTS: 62 | void loaded(); 63 | 64 | protected: 65 | int rowCount(const QModelIndex &parent) const Q_DECL_OVERRIDE; 66 | int columnCount(const QModelIndex &parent) const Q_DECL_OVERRIDE; 67 | QVariant data(const QModelIndex &index, int role) const Q_DECL_OVERRIDE; 68 | QVariant headerData(int section, Qt::Orientation orientation, int role) const Q_DECL_OVERRIDE; 69 | 70 | void load(); 71 | void setLoading(bool enable); 72 | 73 | private: 74 | QVector mLines; 75 | QVector mTampons; 76 | 77 | VcfHeader mHeader; 78 | QString mFilename; 79 | QTabix mTabixFile; 80 | QHash mBaseColors; 81 | QString mRegion; 82 | QFuture mFuture; 83 | QFutureWatcher mFutureWatcher; 84 | bool mLoading; 85 | quint64 mRealCount; 86 | 87 | 88 | 89 | }; 90 | 91 | #endif // VCFMODEL_H 92 | -------------------------------------------------------------------------------- /infowidget.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of CuteVCF. 3 | 4 | Foobar is free software: you can redistribute it and/or modify 5 | it under the terms of the GNU General Public License as published by 6 | the Free Software Foundation, either version 3 of the License, or 7 | (at your option) any later version. 8 | 9 | Foobar is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | GNU General Public License for more details. 13 | 14 | You should have received a copy of the GNU General Public License 15 | along with Foobar. If not, see . 16 | 17 | @author : Sacha Schutz 18 | */ 19 | #include "infowidget.h" 20 | 21 | InfoWidget::InfoWidget(VcfModel * vcfModel, QWidget *parent) 22 | : QWidget(parent) 23 | { 24 | 25 | mModel = new QStandardItemModel; 26 | mView = new QTableView; 27 | mVcfModel = vcfModel; 28 | 29 | mModel->setColumnCount(2); 30 | mView->horizontalHeader()->hide(); 31 | mView->setSelectionBehavior(QAbstractItemView::SelectRows); 32 | mView->setModel(mModel); 33 | mView->verticalHeader()->setVisible(false); 34 | 35 | mView->horizontalHeader()->setSectionResizeMode(1,QHeaderView::Stretch); 36 | mView->setAlternatingRowColors(true); 37 | mView->horizontalHeader()->setHighlightSections(false); 38 | 39 | QVBoxLayout * cLayout = new QVBoxLayout; 40 | cLayout->addWidget(mView); 41 | cLayout->setContentsMargins(0,0,0,0); 42 | setLayout(cLayout); 43 | 44 | } 45 | 46 | void InfoWidget::setLine(const QModelIndex &index) 47 | { 48 | // avoid cliping with clear... Will probably change this with custom model 49 | int count = mModel->rowCount(); 50 | mModel->removeRows(0, count); 51 | mModel->setHorizontalHeaderLabels(QStringList()<horizontalHeader()->show(); 53 | 54 | VcfLine line = mVcfModel->line(index); 55 | 56 | QHash infos = line.infos(); 57 | 58 | for (QByteArray key : infos.keys()){ 59 | 60 | QStandardItem * keyItem = new QStandardItem(QString::fromUtf8(key)); 61 | QStandardItem * valItem = new QStandardItem(infos.value(key).toString()); 62 | 63 | keyItem->setEditable(false); 64 | valItem->setEditable(false); 65 | 66 | keyItem->setToolTip(mVcfModel->header().info(key).value("Description").toString()); 67 | 68 | QList row ; 69 | row.append(keyItem); 70 | row.append(valItem); 71 | 72 | mModel->appendRow(row); 73 | 74 | } 75 | 76 | mView->horizontalHeader()->setSectionResizeMode(1,QHeaderView::Stretch); 77 | 78 | } 79 | 80 | void InfoWidget::clear() 81 | { 82 | mModel->clear(); 83 | } 84 | -------------------------------------------------------------------------------- /QFontIcon/qfonticon.h: -------------------------------------------------------------------------------- 1 | /* 2 | MIT License 3 | 4 | Copyright (c) 2017 Sacha Schutz 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | SOFTWARE. 23 | */ 24 | 25 | #ifndef QFONTICON_H 26 | #define QFONTICON_H 27 | 28 | #include 29 | #include 30 | #include 31 | #include 32 | #include 33 | #include 34 | 35 | class QFontIcon; 36 | class QFontIconEngine; 37 | 38 | class QFontIconEngine : public QIconEngine 39 | { 40 | public: 41 | QFontIconEngine(); 42 | ~QFontIconEngine(); 43 | virtual void paint(QPainter * painter, const QRect& rect, QIcon::Mode mode, QIcon::State state)Q_DECL_OVERRIDE ; 44 | virtual QPixmap pixmap(const QSize &size, QIcon::Mode mode, QIcon::State state)Q_DECL_OVERRIDE; 45 | void setFontFamily(const QString& family); 46 | // define icon code using QChar or implicit using ushort ... 47 | void setLetter(const QChar& letter); 48 | // You can set a base color. I don't advice. Keep system color 49 | void setBaseColor(const QColor& baseColor); 50 | virtual QIconEngine* clone() const; 51 | 52 | private: 53 | QString mFontFamily; 54 | QChar mLetter; 55 | QColor mBaseColor; 56 | }; 57 | 58 | class QFontIcon : public QObject 59 | { 60 | Q_OBJECT 61 | 62 | public: 63 | // add Font. By default, the first one is used 64 | static bool addFont(const QString& filename); 65 | static QFontIcon * instance(); 66 | // main methods. Return icons from code 67 | static QIcon icon(const QChar& code, const QColor& baseColor = QColor(),const QString& family = QString()); 68 | // return added fonts 69 | const QStringList& families() const; 70 | 71 | protected: 72 | void addFamily(const QString& family); 73 | 74 | 75 | private: 76 | explicit QFontIcon(QObject *parent = 0); 77 | ~QFontIcon(); 78 | static QFontIcon * mInstance; 79 | QStringList mfamilies; 80 | 81 | 82 | }; 83 | 84 | #endif // QFONTICON_H 85 | -------------------------------------------------------------------------------- /aboutdialog.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of CuteVCF. 3 | 4 | Foobar is free software: you can redistribute it and/or modify 5 | it under the terms of the GNU General Public License as published by 6 | the Free Software Foundation, either version 3 of the License, or 7 | (at your option) any later version. 8 | 9 | Foobar is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | GNU General Public License for more details. 13 | 14 | You should have received a copy of the GNU General Public License 15 | along with Foobar. If not, see . 16 | 17 | @author : Sacha Schutz 18 | */ 19 | 20 | #include "aboutdialog.h" 21 | 22 | AboutDialog::AboutDialog(QWidget *parent) : QDialog(parent) 23 | { 24 | 25 | setWindowTitle(tr("About")); 26 | 27 | mTabWidget = new QTabWidget; 28 | 29 | QLabel * mIconLabel = new QLabel; 30 | QLabel * mTitleLabel = new QLabel; 31 | 32 | 33 | mCancelButton = new QPushButton(tr("Cancel")); 34 | mGithubButton = new QPushButton(tr("Github")); 35 | 36 | mIconLabel->setPixmap(QPixmap(":icons/app.png").scaledToHeight(64, Qt::SmoothTransformation)); 37 | mIconLabel->setFixedWidth(64); 38 | mTitleLabel->setText(qApp->applicationName()+" "+qApp->applicationVersion()); 39 | mTitleLabel->setAlignment(Qt::AlignLeft|Qt::AlignVCenter); 40 | QFont font; 41 | font.setPixelSize(25); 42 | mTitleLabel->setFont(font); 43 | 44 | QHBoxLayout * hLayout = new QHBoxLayout; 45 | hLayout->addWidget(mIconLabel); 46 | hLayout->addWidget(mTitleLabel); 47 | hLayout->setAlignment(mTitleLabel,Qt::AlignLeft); 48 | 49 | QHBoxLayout * bLayout = new QHBoxLayout; 50 | bLayout->addWidget(mGithubButton); 51 | bLayout->addStretch(); 52 | bLayout->addWidget(mCancelButton); 53 | 54 | 55 | QVBoxLayout * vLayout = new QVBoxLayout; 56 | vLayout->addLayout(hLayout); 57 | vLayout->addWidget(mTabWidget); 58 | vLayout->addLayout(bLayout); 59 | 60 | 61 | setLayout(vLayout); 62 | setFixedSize(500,500); 63 | 64 | appendTab(":README", tr("About")); 65 | appendTab(":CHANGELOG", tr("Version")); 66 | appendTab(":LICENSE", tr("License")); 67 | appendTab(":AUTHORS", tr("Authors")); 68 | 69 | 70 | connect(mCancelButton,SIGNAL(clicked(bool)),this,SLOT(close())); 71 | connect(mGithubButton,SIGNAL(clicked(bool)),this,SLOT(openGithub())); 72 | 73 | 74 | } 75 | 76 | void AboutDialog::openGithub() 77 | { 78 | QDesktopServices::openUrl(QUrl("http://github.com/labsquare/CuteVCF")); 79 | 80 | } 81 | 82 | void AboutDialog::appendTab(const QString &filename, const QString &label) 83 | { 84 | 85 | QFile file(filename); 86 | if (file.open(QIODevice::Text|QIODevice::ReadOnly)) 87 | { 88 | QPlainTextEdit * edit = new QPlainTextEdit; 89 | mTabWidget->addTab(edit, label); 90 | edit->setPlainText(file.readAll()); 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /samplewidget.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of CuteVCF. 3 | 4 | Foobar is free software: you can redistribute it and/or modify 5 | it under the terms of the GNU General Public License as published by 6 | the Free Software Foundation, either version 3 of the License, or 7 | (at your option) any later version. 8 | 9 | Foobar is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | GNU General Public License for more details. 13 | 14 | You should have received a copy of the GNU General Public License 15 | along with Foobar. If not, see . 16 | 17 | @author : Sacha Schutz 18 | */ 19 | #include "samplewidget.h" 20 | 21 | SampleWidget::SampleWidget(VcfModel * vcfModel,QWidget *parent) : QWidget(parent) 22 | { 23 | mSampleBox = new QComboBox; 24 | mView = new QTableView; 25 | mModel = new QStandardItemModel; 26 | mVcfModel = vcfModel; 27 | 28 | mView->setModel(mModel); 29 | mModel->setColumnCount(2); 30 | 31 | mView->setModel(mModel); 32 | mView->verticalHeader()->hide(); 33 | mView->horizontalHeader()->hide(); 34 | mView->horizontalHeader()->setSectionResizeMode(1,QHeaderView::Stretch); 35 | mView->setAlternatingRowColors(true); 36 | mView->setSelectionBehavior(QAbstractItemView::SelectRows); 37 | mView->horizontalHeader()->setHighlightSections(false); 38 | 39 | QVBoxLayout * cLayout = new QVBoxLayout; 40 | cLayout->addWidget(mSampleBox); 41 | cLayout->addWidget(mView); 42 | cLayout->setContentsMargins(0,0,0,0); 43 | 44 | setLayout(cLayout); 45 | 46 | connect(mSampleBox,SIGNAL(activated(int)),this,SLOT(setSample(int))); 47 | 48 | } 49 | 50 | void SampleWidget::setLine(const QModelIndex &index) 51 | { 52 | mCurrentLine = mVcfModel->line(index); 53 | mSampleBox->clear(); 54 | 55 | QStringList colnames = mVcfModel->header().colnames(); 56 | 57 | for (int i=9; iaddItem(colnames.at(i)); 59 | 60 | setSample(0); 61 | 62 | } 63 | 64 | void SampleWidget::setSample(int id) 65 | { 66 | mModel->clear(); 67 | 68 | mView->horizontalHeader()->show(); 69 | mModel->setHorizontalHeaderLabels(QStringList()< samples = mCurrentLine.sample(id); 74 | for (QByteArray key : samples.keys()){ 75 | 76 | QStandardItem * keyItem = new QStandardItem(QString::fromUtf8(key)); 77 | QStandardItem * valItem = new QStandardItem(samples.value(key).toString()); 78 | 79 | keyItem->setEditable(false); 80 | valItem->setEditable(false); 81 | 82 | keyItem->setToolTip(mVcfModel->header().format(key).value("Description").toString()); 83 | 84 | QList row ; 85 | row.append(keyItem); 86 | row.append(valItem); 87 | 88 | mModel->appendRow(row); 89 | 90 | } 91 | mView->horizontalHeader()->setSectionResizeMode(1,QHeaderView::Stretch); 92 | 93 | } 94 | 95 | void SampleWidget::clear() 96 | { 97 | mModel->clear(); 98 | } 99 | -------------------------------------------------------------------------------- /vcfheader.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of CuteVCF. 3 | 4 | Foobar is free software: you can redistribute it and/or modify 5 | it under the terms of the GNU General Public License as published by 6 | the Free Software Foundation, either version 3 of the License, or 7 | (at your option) any later version. 8 | 9 | Foobar is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | GNU General Public License for more details. 13 | 14 | You should have received a copy of the GNU General Public License 15 | along with Foobar. If not, see . 16 | 17 | @author : Sacha Schutz 18 | */ 19 | #include "vcfheader.h" 20 | 21 | VcfHeader::VcfHeader() 22 | { 23 | 24 | } 25 | 26 | VcfHeader::VcfHeader(const QByteArray &raw) 27 | { 28 | setRaw(raw); 29 | } 30 | 31 | 32 | 33 | void VcfHeader::setRaw(const QByteArray &raw) 34 | { 35 | mRaw = raw; 36 | mInfos.clear(); 37 | mFormats.clear(); 38 | mColnames.clear(); 39 | mTags.clear(); 40 | 41 | 42 | QByteArrayList lines = mRaw.split('\n'); 43 | 44 | for (QByteArray b_line : lines) 45 | { 46 | QString line(b_line); 47 | 48 | if (line.contains(QRegularExpression("^##[a-zA-Z0-9]+=[^<]"))){ 49 | 50 | QStringList lines = line.split("="); 51 | QString key = lines.at(0); 52 | QString value = lines.at(1); 53 | mTags.insert(key.replace("##",""), value); 54 | 55 | } 56 | 57 | 58 | if (line.startsWith("##INFO")){ 59 | QHash info = captureParams(line); 60 | QString id = info.value("ID","unknown").toString(); 61 | mInfos[id] = info; 62 | } 63 | 64 | if (line.startsWith("##FORMAT")){ 65 | QHash format = captureParams(line); 66 | QString id = format.value("ID","unknown").toString(); 67 | mFormats[id] = format; 68 | } 69 | 70 | if (line.startsWith("#CHROM")){ 71 | mColnames = line.split("\t"); 72 | } 73 | } 74 | 75 | } 76 | 77 | const QByteArray &VcfHeader::raw() const 78 | { 79 | return mRaw; 80 | } 81 | 82 | QHash VcfHeader::info(const QString &key) const 83 | { 84 | return mInfos.value(key); 85 | } 86 | 87 | QHash VcfHeader::format(const QString &key) const 88 | { 89 | return mFormats.value(key); 90 | } 91 | 92 | const QHash &VcfHeader::tags() const 93 | { 94 | return mTags; 95 | } 96 | 97 | const QStringList &VcfHeader::colnames() const 98 | { 99 | return mColnames; 100 | } 101 | 102 | QHash VcfHeader::captureParams(const QString &line) 103 | { 104 | QString src = line; 105 | QHash output; 106 | // Remove < and > at begin and end 107 | src = src.remove(QRegularExpression("^##\\w+=<")).remove(QRegularExpression(">$")); 108 | 109 | //capture key and value 110 | QRegularExpression re("([A-Za-z_0-9]+)=\"?([^,=<>\"]+)\"?"); 111 | 112 | QRegularExpressionMatchIterator i = re.globalMatch(src); 113 | while (i.hasNext()) 114 | { 115 | QRegularExpressionMatch match = i.next(); 116 | if (match.capturedTexts().count() == 3) 117 | { 118 | QString key = match.captured(1); 119 | QString val = match.captured(2); 120 | output.insert(key, val); 121 | } 122 | } 123 | 124 | return output; 125 | 126 | 127 | } 128 | -------------------------------------------------------------------------------- /qtabix.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of CuteVCF. 3 | 4 | Foobar is free software: you can redistribute it and/or modify 5 | it under the terms of the GNU General Public License as published by 6 | the Free Software Foundation, either version 3 of the License, or 7 | (at your option) any later version. 8 | 9 | Foobar is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | GNU General Public License for more details. 13 | 14 | You should have received a copy of the GNU General Public License 15 | along with Foobar. If not, see . 16 | 17 | @author : Sacha Schutz 18 | */ 19 | #include "qtabix.h" 20 | 21 | QTabix::QTabix() 22 | { 23 | 24 | } 25 | 26 | QTabix::QTabix(const QString &filename) 27 | { 28 | setFilename(filename); 29 | } 30 | 31 | QTabix::~QTabix() 32 | { 33 | 34 | } 35 | 36 | void QTabix::setRegion(const QString ®ion) 37 | { 38 | mRegions = region; 39 | } 40 | 41 | const QString &QTabix::region() const 42 | { 43 | return mRegions; 44 | } 45 | 46 | const QString &QTabix::filename() const 47 | { 48 | return mFilename; 49 | } 50 | 51 | void QTabix::setFilename(const QString &filename) 52 | { 53 | mFilename = filename; 54 | if (QFile::exists(mFilename)) 55 | readInfo(); 56 | } 57 | 58 | const QByteArray &QTabix::header() const 59 | { 60 | return mHeaders; 61 | } 62 | 63 | const QStringList &QTabix::chromosoms() const 64 | { 65 | return mChromosoms; 66 | } 67 | 68 | bool QTabix::readLineInto(QByteArray &line) 69 | { 70 | if (tbx_itr_next(fp, tbx, iter,&str) >= 0) 71 | { 72 | line = QByteArray(str.s); 73 | return true; 74 | } 75 | 76 | 77 | tbx_itr_destroy(iter); 78 | tbx_destroy(tbx); 79 | 80 | return false; 81 | 82 | } 83 | void QTabix::buildIndex(const QString &filename) 84 | { 85 | // build vcf.gz.tbi 86 | tbx_conf_t conf = tbx_conf_vcf; 87 | int min_shift = 0; 88 | tbx_index_build(filename.toStdString().c_str(), min_shift, &conf); 89 | } 90 | 91 | bool QTabix::open() 92 | { 93 | fp = NULL; 94 | tbx = NULL; 95 | iter = NULL; 96 | // open file 97 | 98 | fp = hts_open(mFilename.toStdString().c_str(),"r"); 99 | if (!fp){ 100 | qCritical()<conf = tbx_conf_vcf; 111 | str= {0,0,0}; 112 | 113 | // set region 114 | iter = tbx_itr_querys(tbx, mRegions.toStdString().c_str()); 115 | 116 | if (!iter){ 117 | qCritical()<<"could not query the region "<= 0 ) 156 | { 157 | if ( !str.l || str.s[0]!=tbx->conf.meta_char ) { 158 | break; 159 | } 160 | else { 161 | mHeaders.append(str.s); 162 | mHeaders.append('\n'); 163 | } 164 | 165 | } 166 | 167 | tbx_itr_destroy(iter); 168 | tbx_destroy(tbx); 169 | 170 | return true; 171 | } 172 | 173 | 174 | 175 | -------------------------------------------------------------------------------- /vcfline.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of CuteVCF. 3 | 4 | Foobar is free software: you can redistribute it and/or modify 5 | it under the terms of the GNU General Public License as published by 6 | the Free Software Foundation, either version 3 of the License, or 7 | (at your option) any later version. 8 | 9 | Foobar is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | GNU General Public License for more details. 13 | 14 | You should have received a copy of the GNU General Public License 15 | along with Foobar. If not, see . 16 | 17 | @author : Sacha Schutz 18 | */ 19 | #include "vcfline.h" 20 | 21 | VcfLine::VcfLine() 22 | { 23 | mChromosom="chr3"; 24 | mPosition = 10; 25 | } 26 | 27 | VcfLine VcfLine::fromLine(const QByteArray &line) 28 | { 29 | 30 | VcfLine out; 31 | QByteArrayList lines = line.split(QChar::Tabulation); 32 | 33 | 34 | if ( line.count() >= 9) 35 | { 36 | 37 | out.setChromosom(lines.at(0)); 38 | out.setPosition(lines.at(1).toUInt()); 39 | out.setId(lines.at(2)); 40 | out.setRef(lines.at(3)); 41 | out.setAlt(lines.at(4)); 42 | out.setQual(lines.at(5).toInt()); 43 | out.setFilter(lines.at(6)); 44 | out.setRawInfos(lines.at(7)); 45 | out.setRawFormat(lines.value(8)); 46 | 47 | for (int i=9; i VcfLine::infos() const 146 | { 147 | QHash out; 148 | for (QByteArray item : rawInfos().split(';')) 149 | { 150 | QByteArrayList duo = item.split('='); 151 | if (duo.size() == 2) 152 | out[duo.at(0)] = duo.at(1); 153 | } 154 | 155 | return out; 156 | } 157 | 158 | void VcfLine::setRawInfos(const QByteArray &infos) 159 | { 160 | mInfos = infos; 161 | } 162 | 163 | QByteArray VcfLine::rawSample(int i) const 164 | { 165 | return mSamples.value(i,QByteArray()); 166 | } 167 | 168 | QHash VcfLine::sample(int i) 169 | { 170 | QHash out; 171 | QByteArrayList format = formats(); 172 | 173 | qDebug()< 27 | #include 28 | QFontIcon * QFontIcon::mInstance = Q_NULLPTR; 29 | 30 | bool QFontIcon::addFont(const QString &filename) 31 | { 32 | qDebug()<<"add font"; 33 | int id = QFontDatabase::addApplicationFont(filename); 34 | 35 | if (id == -1){ 36 | qDebug()<<"Cannot load font"; 37 | return false; 38 | } 39 | 40 | QString family = QFontDatabase::applicationFontFamilies(id).first(); 41 | instance()->addFamily(family); 42 | return true; 43 | } 44 | 45 | QFontIcon *QFontIcon::instance() 46 | { 47 | if (!mInstance) 48 | mInstance = new QFontIcon; 49 | 50 | return mInstance; 51 | } 52 | 53 | QIcon QFontIcon::icon(const QChar &code, const QColor &baseColor, const QString &family) 54 | { 55 | if (instance()->families().isEmpty()) 56 | { 57 | qWarning()<families().first(); 64 | 65 | 66 | QFontIconEngine * engine = new QFontIconEngine; 67 | engine->setFontFamily(useFamily); 68 | engine->setLetter(code); 69 | engine->setBaseColor(baseColor); 70 | return QIcon(engine); 71 | 72 | 73 | } 74 | 75 | 76 | const QStringList &QFontIcon::families() const 77 | { 78 | return mfamilies; 79 | } 80 | 81 | void QFontIcon::addFamily(const QString &family) 82 | { 83 | mfamilies.append(family); 84 | } 85 | 86 | QFontIcon::QFontIcon(QObject *parent) 87 | :QObject(parent) 88 | { 89 | 90 | } 91 | 92 | QFontIcon::~QFontIcon() 93 | { 94 | 95 | } 96 | 97 | //======================================================================================================= 98 | 99 | 100 | QFontIconEngine::QFontIconEngine() 101 | :QIconEngine() 102 | { 103 | 104 | } 105 | 106 | QFontIconEngine::~QFontIconEngine() 107 | { 108 | } 109 | 110 | void QFontIconEngine::paint(QPainter *painter, const QRect &rect, QIcon::Mode mode, QIcon::State state) 111 | { 112 | Q_UNUSED(state); 113 | QFont font = QFont(mFontFamily); 114 | int drawSize = qRound(rect.height() *0.7); 115 | font.setPixelSize(drawSize); 116 | 117 | QColor penColor; 118 | if (!mBaseColor.isValid()) 119 | penColor = QApplication::palette("QWidget").color(QPalette::Normal,QPalette::ButtonText); 120 | else 121 | penColor = mBaseColor; 122 | 123 | if (mode == QIcon::Disabled) 124 | penColor = QApplication::palette("QWidget").color(QPalette::Disabled,QPalette::ButtonText); 125 | 126 | 127 | if (mode == QIcon::Selected) 128 | penColor = QApplication::palette("QWidget").color(QPalette::Active,QPalette::ButtonText); 129 | 130 | 131 | painter->save(); 132 | painter->setPen(QPen(penColor)); 133 | painter->setFont(font); 134 | painter->drawText(rect, Qt::AlignCenter|Qt::AlignVCenter, mLetter); 135 | painter->restore(); 136 | } 137 | 138 | QPixmap QFontIconEngine::pixmap(const QSize &size, QIcon::Mode mode, QIcon::State state) 139 | { 140 | QPixmap pix(size); 141 | pix.fill(Qt::transparent); 142 | 143 | QPainter painter(&pix); 144 | paint(&painter, QRect(QPoint(0,0),size), mode, state); 145 | return pix; 146 | 147 | } 148 | 149 | void QFontIconEngine::setFontFamily(const QString &family) 150 | { 151 | mFontFamily = family; 152 | } 153 | 154 | void QFontIconEngine::setLetter(const QChar &letter) 155 | { 156 | mLetter = letter; 157 | } 158 | 159 | void QFontIconEngine::setBaseColor(const QColor &baseColor) 160 | { 161 | mBaseColor = baseColor; 162 | } 163 | 164 | 165 | QIconEngine *QFontIconEngine::clone() const 166 | { 167 | QFontIconEngine * engine = new QFontIconEngine; 168 | engine->setFontFamily(mFontFamily); 169 | engine->setBaseColor(mBaseColor); 170 | return engine; 171 | } 172 | 173 | -------------------------------------------------------------------------------- /vcfmodel.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of CuteVCF. 3 | 4 | Foobar is free software: you can redistribute it and/or modify 5 | it under the terms of the GNU General Public License as published by 6 | the Free Software Foundation, either version 3 of the License, or 7 | (at your option) any later version. 8 | 9 | Foobar is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | GNU General Public License for more details. 13 | 14 | You should have received a copy of the GNU General Public License 15 | along with Foobar. If not, see . 16 | 17 | @author : Sacha Schutz 18 | */ 19 | #include "vcfmodel.h" 20 | 21 | VcfModel::VcfModel(QObject * parent): 22 | QAbstractListModel(parent) 23 | { 24 | 25 | mBaseColors['A'] = QColor("#71E096"); 26 | mBaseColors['C'] = QColor("#668DE5"); 27 | mBaseColors['G'] = QColor("#4E4E56"); 28 | mBaseColors['T'] = QColor("#ed6d79"); 29 | 30 | connect(&mFutureWatcher, SIGNAL(finished()), this,SLOT(loaded())); 31 | 32 | } 33 | 34 | int VcfModel::rowCount(const QModelIndex &parent) const 35 | { 36 | Q_UNUSED(parent) 37 | return mLines.count(); 38 | } 39 | 40 | int VcfModel::columnCount(const QModelIndex &parent) const 41 | { 42 | Q_UNUSED(parent) 43 | return 7; 44 | } 45 | 46 | QVariant VcfModel::data(const QModelIndex &index, int role) const 47 | { 48 | if (!index.isValid()) 49 | return QVariant(); 50 | 51 | VcfLine line = mLines.at(index.row()); 52 | 53 | if ( role == Qt::DisplayRole) 54 | { 55 | switch (index.column()) 56 | { 57 | case 0 : return line.chromosom(); 58 | case 1 : return line.position(); 59 | case 2 : return line.id(); 60 | case 3 : return line.ref(); 61 | case 4 : return line.alt(); 62 | case 5 : return line.qual(); 63 | case 6 : return line.filter(); 64 | default : return QVariant(); 65 | 66 | } 67 | 68 | } 69 | return QVariant(); 70 | } 71 | 72 | QVariant VcfModel::headerData(int section, Qt::Orientation orientation, int role) const 73 | { 74 | if ( orientation == Qt::Horizontal) 75 | { 76 | if (role == Qt::DisplayRole || role == Qt::EditRole) 77 | { 78 | switch (section) 79 | { 80 | case 0 : return tr("Chromosom"); 81 | case 1 : return tr("Position"); 82 | case 2 : return tr("Identifier"); 83 | case 3 : return tr("Reference"); 84 | case 4 : return tr("Alternatif"); 85 | case 5 : return tr("Quality"); 86 | case 6 : return tr("Filter"); 87 | default : return QVariant(); 88 | 89 | } 90 | } 91 | } 92 | return QVariant(); 93 | } 94 | 95 | void VcfModel::load() 96 | { 97 | // this methods is called async by setRegion 98 | setLoading(true); 99 | mTampons.clear(); 100 | 101 | QByteArray line; 102 | mRealCount = 0; 103 | 104 | if (mTabixFile.open()) 105 | { 106 | while (mTabixFile.readLineInto(line)) 107 | { 108 | // if (mRealCount < MAX_ITEMS) 109 | // { 110 | VcfLine item = VcfLine::fromLine(line) ; 111 | mTampons.append(item); 112 | // } 113 | mRealCount++; 114 | } 115 | } 116 | 117 | 118 | setLoading(false); 119 | 120 | } 121 | 122 | void VcfModel::setLoading(bool enable) 123 | { 124 | mLoading = enable; 125 | emit loadingChanged(); 126 | } 127 | 128 | 129 | void VcfModel::setRegion(const QString ®ion) 130 | { 131 | // launch async data load 132 | mFuture.cancel(); 133 | mFuture.waitForFinished(); 134 | mTabixFile.setRegion(region); 135 | mFuture = QtConcurrent::run(this, &VcfModel::load); 136 | mFutureWatcher.setFuture(mFuture); 137 | } 138 | 139 | QString VcfModel::filename() const 140 | { 141 | return mFilename; 142 | } 143 | 144 | void VcfModel::setFilename(const QString &filename) 145 | { 146 | mFilename = filename; 147 | mLines.clear(); 148 | mTabixFile.setFilename(filename); 149 | mHeader.setRaw(mTabixFile.header()); 150 | 151 | } 152 | 153 | const VcfLine &VcfModel::line(const QModelIndex &index) 154 | { 155 | return mLines.at(index.row()); 156 | } 157 | 158 | const VcfHeader &VcfModel::header() const 159 | { 160 | return mHeader; 161 | } 162 | 163 | const QStringList &VcfModel::chromosoms() const 164 | { 165 | return mTabixFile.chromosoms(); 166 | } 167 | 168 | void VcfModel::exportCsv(const QString &filename) const 169 | { 170 | QFile file(filename); 171 | 172 | if (file.open(QIODevice::WriteOnly)) 173 | { 174 | QTextStream stream(&file); 175 | 176 | for (VcfLine line : mLines) 177 | { 178 | 179 | stream< 2 | 3 | 4 | 20 | 22 | 25 | 29 | 33 | 34 | 44 | 54 | 64 | 74 | 77 | 81 | 85 | 86 | 96 | 99 | 103 | 107 | 108 | 109 | 129 | 131 | 132 | 134 | image/svg+xml 135 | 137 | 138 | 139 | 140 | 141 | 146 | 153 | 160 | 166 | V 178 | 179 | 180 | -------------------------------------------------------------------------------- /mainwindow.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of CuteVCF. 3 | 4 | Foobar is free software: you can redistribute it and/or modify 5 | it under the terms of the GNU General Public License as published by 6 | the Free Software Foundation, either version 3 of the License, or 7 | (at your option) any later version. 8 | 9 | Foobar is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | GNU General Public License for more details. 13 | 14 | You should have received a copy of the GNU General Public License 15 | along with Foobar. If not, see . 16 | 17 | @author : Sacha Schutz 18 | */ 19 | #include "mainwindow.h" 20 | 21 | MainWindow::MainWindow(QWidget *parent) : 22 | QMainWindow(parent) 23 | { 24 | mView = new QTableView; 25 | mModel = new VcfModel; 26 | mSearchEdit = new QLineEdit; 27 | mInfoWidget = new InfoWidget(mModel); 28 | mSampleWidget = new SampleWidget(mModel); 29 | mVariantCount = new QLabel(this); 30 | mLoadingLabel = new QLabel(this); 31 | mLoadingAnimation = new QMovie(":icons/squares.gif"); 32 | mChromBox = new QComboBox; 33 | 34 | 35 | setWindowIcon(QIcon(":icons/app.png")); 36 | 37 | // set the main table view properties 38 | mView->setModel(mModel); 39 | mView->horizontalHeader()->setStretchLastSection(true); 40 | mView->setAlternatingRowColors(true); 41 | mView->setSelectionBehavior(QAbstractItemView::SelectRows); 42 | mView->verticalHeader()->hide(); 43 | mView->horizontalHeader()->setHighlightSections(false); 44 | mView->setContextMenuPolicy(Qt::CustomContextMenu); 45 | 46 | // set the searchbar properties 47 | mSearchEdit->setPlaceholderText(tr("Select a region... or ")); 48 | mSearchEdit->setCompleter(new QCompleter); 49 | mSearchEdit->completer()->setCaseSensitivity(Qt::CaseInsensitive); 50 | QAction * searchAction = mSearchEdit->addAction(QFontIcon::icon(0xf002),QLineEdit::TrailingPosition); 51 | 52 | 53 | mLoadingLabel->setMovie(mLoadingAnimation); 54 | mLoadingAnimation->jumpToNextFrame(); 55 | 56 | // mSearchEdit is inside a QtoolBar 57 | mMainToolBar = new QToolBar("main toolbar"); 58 | mMainToolBar->setFloatable(false); 59 | mMainToolBar->setAllowedAreas(Qt::TopToolBarArea); 60 | mMainToolBar->setMovable(false); 61 | mMainToolBar->setToolButtonStyle(Qt::ToolButtonFollowStyle); 62 | 63 | mMainToolBar->addWidget(mChromBox); 64 | mMainToolBar->addWidget(mSearchEdit); 65 | mMainToolBar->addWidget(mLoadingLabel); 66 | 67 | 68 | addToolBar(Qt::TopToolBarArea, mMainToolBar); 69 | 70 | 71 | 72 | 73 | 74 | 75 | // Create info Dock 76 | mInfoDock = new QDockWidget(tr("Infos fields")); 77 | mInfoDock->setWidget(mInfoWidget); 78 | mInfoDock->setFeatures(QDockWidget::DockWidgetMovable); 79 | addDockWidget(Qt::RightDockWidgetArea, mInfoDock); 80 | 81 | // Create Sample Dock 82 | mSampleDock= new QDockWidget(tr("Sample fields")); 83 | mSampleDock->setWidget(mSampleWidget); 84 | mSampleDock->setFeatures(QDockWidget::DockWidgetMovable); 85 | addDockWidget(Qt::RightDockWidgetArea, mSampleDock); 86 | 87 | connect(mSearchEdit,SIGNAL(returnPressed()),this,SLOT(loadRegion())); 88 | connect(searchAction,SIGNAL(triggered(bool)),this,SLOT(loadRegion())); 89 | connect(mView->selectionModel(),SIGNAL(currentRowChanged(QModelIndex,QModelIndex)),mInfoWidget,SLOT(setLine(QModelIndex))); 90 | connect(mView->selectionModel(),SIGNAL(currentRowChanged(QModelIndex,QModelIndex)),mSampleWidget,SLOT(setLine(QModelIndex))); 91 | connect(mModel,SIGNAL(loadingChanged()),this,SLOT(loadingChanged())); 92 | connect(mView, SIGNAL(customContextMenuRequested(QPoint)),this,SLOT(onVariantContextMenu(QPoint))); 93 | connect(mChromBox,SIGNAL(currentIndexChanged(int)),this,SLOT(chromboxChanged())); 94 | 95 | createMenuBar(); 96 | statusBar()->addPermanentWidget(mVariantCount); 97 | 98 | 99 | setCentralWidget(mView); 100 | 101 | 102 | 103 | resize(800,600); 104 | 105 | // setStyleSheet("QMainWindow::separator{margin:0px;padding:0px; width:3px}"); 106 | // setStyleSheet("QDockWidget::title{margin:0px;}"); 107 | // setStyleSheet("QTableView{margin:0px;}"); 108 | // setStyleSheet("QDockWidget{margin:0px;}"); 109 | 110 | // setStyleSheet("QTableView::item { border-left: 0px }"); 111 | 112 | } 113 | 114 | MainWindow::~MainWindow() 115 | { 116 | delete mView; 117 | delete mModel; 118 | delete mSearchEdit; 119 | delete mInfoWidget; 120 | delete mSampleWidget; 121 | delete mInfoDock; 122 | delete mSampleDock; 123 | delete mVariantCount; 124 | } 125 | 126 | void MainWindow::loadRegion() 127 | { 128 | 129 | QString region = mSearchEdit->text(); 130 | 131 | // this methodes is asynchronious .. 132 | mModel->setRegion(region); 133 | } 134 | 135 | 136 | 137 | void MainWindow::setFilename(const QString &filename) 138 | { 139 | if (filename.isEmpty()) 140 | return; 141 | 142 | // if index doesn't exists, create it 143 | if (!QFile::exists(filename+QString(".tbi"))){ 144 | 145 | int ret = QMessageBox::question(this,tr("index is missing"),tr("Index file doesn't exist. Would you like to create it ?")); 146 | if (ret == QMessageBox::Yes) 147 | { 148 | CreateIndexDialog dialog(filename,this); 149 | if ( dialog.exec() == QDialog::Rejected) 150 | return; 151 | } 152 | else 153 | return; 154 | } 155 | 156 | // set model with filename and reset the view. 157 | 158 | if ( QFile::exists(filename)) 159 | { 160 | mModel->setFilename(filename); 161 | addRecent(filename); 162 | 163 | reset(); 164 | if (!mModel->chromosoms().isEmpty()){ 165 | mSearchEdit->completer()->setModel(new QStringListModel(mModel->chromosoms())); 166 | mChromBox->setModel(new QStringListModel(mModel->chromosoms())); 167 | 168 | // by defaut, set to the chromosom 1 169 | // mSearchEdit->setText(mModel->chromosoms().last()); 170 | 171 | loadRegion(); 172 | 173 | statusBar()->showMessage(QString("%1 loaded").arg(filename)); 174 | QFileInfo info(filename); 175 | setWindowTitle(info.fileName()); 176 | } 177 | } 178 | else 179 | { 180 | QMessageBox::warning(this,tr("cannot open"),"Cannot open the file"); 181 | } 182 | 183 | } 184 | 185 | void MainWindow::openFile() 186 | { 187 | QString fileName = QFileDialog::getOpenFileName(this, tr("Open Vcf file"), QDir::homePath(), tr("Vcf Files (*.vcf.gz)")); 188 | setFilename(fileName); 189 | } 190 | 191 | void MainWindow::focusRegionEdit() 192 | { 193 | // focus on region edit ! This is called by the shortcut Ctrl + F 194 | mSearchEdit->selectAll(); 195 | mSearchEdit->setFocus(); 196 | } 197 | 198 | void MainWindow::exportCsv() 199 | { 200 | QString fileName = QFileDialog::getSaveFileName(this, tr("Open Vcf file"), QDir::homePath(), tr("Csv file(*.csv)")); 201 | mModel->exportCsv(fileName); 202 | 203 | } 204 | 205 | void MainWindow::showAbout() 206 | { 207 | AboutDialog dialog; 208 | dialog.exec(); 209 | } 210 | 211 | void MainWindow::showRawHeader() 212 | { 213 | 214 | // show a simple dialog of raw headers 215 | QDialog * dialog = new QDialog; 216 | QPlainTextEdit * mEdit = new QPlainTextEdit(dialog); 217 | mEdit->setReadOnly(true); 218 | QVBoxLayout * vLayout = new QVBoxLayout; 219 | QDialogButtonBox * buttonBox = new QDialogButtonBox(QDialogButtonBox::Close); 220 | vLayout->addWidget(mEdit); 221 | vLayout->addWidget(buttonBox); 222 | dialog->setLayout(vLayout); 223 | 224 | QObject::connect(buttonBox,SIGNAL(rejected()),dialog,SLOT(close())); 225 | mEdit->setPlainText(mModel->header().raw()); 226 | dialog->resize(600,400); 227 | dialog->setWindowTitle(tr("Raw header")); 228 | dialog->exec(); 229 | delete dialog; 230 | 231 | 232 | 233 | } 234 | 235 | void MainWindow::showInfo() 236 | { 237 | // show a simple dialog of raw headers 238 | QDialog * dialog = new QDialog; 239 | QVBoxLayout * dLayout = new QVBoxLayout(dialog); 240 | QTabWidget * tabWidget = new QTabWidget(dialog); 241 | QDialogButtonBox * buttonBox = new QDialogButtonBox(QDialogButtonBox::Close); 242 | 243 | dLayout->addWidget(tabWidget); 244 | dLayout->addWidget(buttonBox); 245 | dialog->setLayout(dLayout); 246 | 247 | QObject::connect(buttonBox,SIGNAL(rejected()),dialog,SLOT(close())); 248 | QTreeWidget * tagsView = new QTreeWidget(dialog); 249 | tagsView->setColumnCount(2); 250 | tagsView->setHeaderLabels(QStringList()<<"Key"<<"Value"); 251 | for (QString key : mModel->header().tags().keys()) 252 | { 253 | QTreeWidgetItem * item = new QTreeWidgetItem; 254 | item->setText(0, key); 255 | item->setText(1, mModel->header().tags().value(key).toString()); 256 | tagsView->addTopLevelItem(item); 257 | } 258 | 259 | 260 | tagsView->header()->setSectionResizeMode(QHeaderView::ResizeToContents); 261 | tabWidget->addTab(tagsView, tr("Tags")); 262 | dialog->setWindowTitle(tr("Information")); 263 | 264 | dialog->resize(500,500); 265 | dialog->exec(); 266 | 267 | 268 | 269 | delete dialog; 270 | 271 | } 272 | 273 | 274 | void MainWindow::setVariantCount(int count) 275 | { 276 | if (count == 0) 277 | mVariantCount->setText(QString()); 278 | else 279 | mVariantCount->setText(QString("Total: %1").arg(mModel->count())); 280 | } 281 | 282 | void MainWindow::reset() 283 | { 284 | mInfoWidget->clear(); 285 | mSampleWidget->clear(); 286 | mModel->clear(); 287 | mSearchEdit->clear(); 288 | } 289 | 290 | void MainWindow::addRecent(const QString &filename) 291 | { 292 | QSettings settings; 293 | QStringList paths = loadRecent(); 294 | 295 | // Don't save if it already exists 296 | if (paths.contains(filename)) 297 | return; 298 | 299 | paths.append(filename); 300 | 301 | // 30 maximum file in recent menu 302 | if (paths.size() > 30) 303 | paths.removeFirst(); 304 | 305 | settings.beginWriteArray("recent"); 306 | int i = 0; 307 | 308 | for (QString path : paths) 309 | { 310 | settings.setArrayIndex(i); 311 | settings.setValue("path", path); 312 | ++i; 313 | } 314 | 315 | settings.endArray(); 316 | 317 | 318 | 319 | } 320 | 321 | QStringList MainWindow::loadRecent() 322 | { 323 | QSettings settings; 324 | QStringList paths; 325 | int size = settings.beginReadArray("recent"); 326 | 327 | for (int i = 0; i < size; ++i) { 328 | settings.setArrayIndex(i); 329 | QString filename = settings.value("path").toString(); 330 | if (QFile::exists(filename)) 331 | paths.append(filename); 332 | } 333 | settings.endArray(); 334 | 335 | return paths; 336 | 337 | 338 | } 339 | 340 | void MainWindow::createMenuBar() 341 | { 342 | QMenuBar * bar = new QMenuBar; 343 | 344 | // File menu 345 | QMenu * fileMenu = bar->addMenu(tr("&File")); 346 | fileMenu->addAction(QFontIcon::icon(0xf115), tr("&Open of vcf file"),this,SLOT(openFile()),QKeySequence::Open); 347 | 348 | QMenu * recentFile = new QMenu(tr("&Recent files")); 349 | for (QString recent : loadRecent()) 350 | recentFile->addAction(recent,this,SLOT(recentClicked())); 351 | 352 | fileMenu->addMenu(recentFile); 353 | 354 | 355 | fileMenu->addAction(QFontIcon::icon(0xf0c7),tr("&Export to CSV"),this,SLOT(exportCsv()),QKeySequence::Save); 356 | fileMenu->addAction(QFontIcon::icon(0xf08b),tr("&Quit"),qApp, SLOT(closeAllWindows()), QKeySequence::Quit); 357 | 358 | 359 | 360 | // Edit menu 361 | QMenu * editMenu = bar->addMenu(tr("&Edit")); 362 | editMenu->addAction(QFontIcon::icon(0xf002),tr("Set region ..."), this, SLOT(focusRegionEdit()), QKeySequence::Find); 363 | 364 | 365 | // Window menu 366 | QMenu * viewMenu = bar->addMenu(tr("&Window")); 367 | QAction * infoAction = viewMenu->addAction(tr("Show Info fields"),mInfoDock,SLOT(setVisible(bool))); 368 | infoAction->setCheckable(true); 369 | infoAction->setChecked(true); 370 | 371 | QAction * sampleAction = viewMenu->addAction(tr("Show sample fields"),mSampleDock,SLOT(setVisible(bool))); 372 | sampleAction->setCheckable(true); 373 | sampleAction->setChecked(true); 374 | 375 | viewMenu->addSeparator(); 376 | viewMenu->addAction(QFontIcon::icon(0xf06e),tr("Show raw header"),this, SLOT(showRawHeader())); 377 | viewMenu->addAction(QFontIcon::icon(0xf06e),tr("Show information"),this, SLOT(showInfo())); 378 | 379 | 380 | 381 | // Help menu 382 | QMenu * helpMenu = bar->addMenu(tr("&Help")); 383 | helpMenu->addAction(QFontIcon::icon(0xf129),tr("About %1").arg(qApp->applicationName()),this,SLOT(showAbout())); 384 | helpMenu->addAction(QFontIcon::icon(0xf129),tr("About Qt"),qApp,SLOT(aboutQt())); 385 | 386 | 387 | setMenuBar(bar); 388 | 389 | 390 | // QWidget * empty = new QWidget; 391 | // empty->setMinimumWidth(50); 392 | // empty->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding); 393 | // mMainToolBar->addWidget(empty); 394 | 395 | 396 | 397 | 398 | } 399 | 400 | void MainWindow::loadingChanged() 401 | { 402 | 403 | bool enable = mModel->isLoading(); 404 | 405 | if (enable){ 406 | mLoadingAnimation->start(); 407 | } 408 | else{ 409 | mLoadingAnimation->stop(); 410 | mVariantCount->setText(QString("Total: %1").arg(mModel->realCount())); 411 | 412 | } 413 | 414 | mView->setDisabled(enable); 415 | mInfoDock->setDisabled(enable); 416 | mSampleDock->setDisabled(enable); 417 | mSearchEdit->setDisabled(enable); 418 | } 419 | 420 | void MainWindow::onVariantContextMenu(const QPoint &pos) 421 | { 422 | // show a context menu when right click on a variant 423 | 424 | qDebug()<<"click"; 425 | QMenu variantMenu; 426 | 427 | QAction * ucsc = variantMenu.addAction(QIcon(":/ucsc.png"),tr("Open with UCSC")); 428 | QAction * ensembl = variantMenu.addAction(QIcon(":/ensembl.png"),tr("Open with Ensembl")); 429 | QAction * copyLoc = variantMenu.addAction(tr("Copy location")); 430 | 431 | 432 | QModelIndex index =mView->indexAt(pos); 433 | QAction * rep = nullptr; 434 | 435 | 436 | if (index.isValid()) 437 | rep = variantMenu.exec(mView->mapToGlobal(pos)); 438 | else 439 | return; 440 | 441 | if (rep == copyLoc) 442 | { 443 | QApplication::clipboard()->setText(mModel->line(index).location()); 444 | return; 445 | } 446 | 447 | 448 | QString url; 449 | if (rep == ucsc) 450 | url = QString("http://genome.ucsc.edu/cgi-bin/hgTracks?org=%1&db=%2&position=%3").arg("human").arg("hg19").arg(mModel->line(index).location()); 451 | 452 | 453 | if (rep == ensembl) 454 | url = QString("http:/www.ensembl.org/%1/Location/View?r=%2").arg("human").arg(mModel->line(index).location()); 455 | 456 | 457 | 458 | QDesktopServices::openUrl(QUrl(url)); 459 | 460 | } 461 | 462 | void MainWindow::recentClicked() 463 | { 464 | QAction * action = qobject_cast(sender()); 465 | 466 | if (action) 467 | setFilename(action->text()); 468 | 469 | } 470 | 471 | void MainWindow::chromboxChanged() 472 | { 473 | 474 | mSearchEdit->setText(mChromBox->currentText()); 475 | loadRegion(); 476 | 477 | } 478 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | 635 | Copyright (C) 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | Copyright (C) 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . --------------------------------------------------------------------------------