diff --git a/album.cpp b/album.cpp index d3a38f2..e1e06eb 100644 --- a/album.cpp +++ b/album.cpp @@ -1,10 +1,10 @@ #include "album.hpp" -Album::Album(const int year, const QString& title):Year(year), Title(title) +Album::Album(const int year, const QString& title):Year(year), Title(title), TreeItem() { } -Album::Album(const Album& other) +Album::Album(const Album& other):TreeItem(other) { id=other.id; Year=other.Year; diff --git a/artist.cpp b/artist.cpp index 333c8b5..faa5f97 100644 --- a/artist.cpp +++ b/artist.cpp @@ -1,22 +1,17 @@ #include "artist.hpp" #include "cd.hpp" -Artist::Artist(const QString& name) +Artist::Artist(const QString& name):TreeItem() { Name=name; Albums=&Children; } -Artist::Artist(const Artist& other) +Artist::Artist(const Artist& other):TreeItem(other) { id=other.id; Name=other.Name; Albums=&Children; - for(const TreeItem* item:other.Children) - { - Children.push_back(item->Copy()); - Children.back()->Parent=this; - } } TreeItem* Artist::Copy() const diff --git a/cd.cpp b/cd.cpp index f87d706..f16efb0 100644 --- a/cd.cpp +++ b/cd.cpp @@ -7,12 +7,7 @@ CD::CD(const int year, const QString& title):Album(year,title) CD::CD(const CD& other):Album(other) { - for(const TreeItem* item:other.Children) - { - Children.push_back(item->Copy()); - Children.back()->Parent=this; - } - Tracks=&Children; + Tracks=&Children; } TreeItem* CD::Copy() const @@ -23,6 +18,7 @@ TreeItem* CD::Copy() const void CD::AddTrack(const QString& title, const int duration, const int index) { Children.push_back(new Track(Children.size()+1, title, duration)); + Children.back()->Parent=this; } Album::Types CD::AlbumType() const diff --git a/dialog.cpp b/dialog.cpp index 596368e..208af8c 100644 --- a/dialog.cpp +++ b/dialog.cpp @@ -1,6 +1,9 @@ #include "dialog.hpp" #include "ui_dialog.h" #include +#include "artist.hpp" +#include "cd.hpp" +#include Dialog::Dialog(QWidget *parent) : QDialog(parent), @@ -17,29 +20,93 @@ Dialog::Dialog(QWidget *parent) : connect(ui->RemoveButton, SIGNAL(clicked()), this, SLOT(DelTrack())); connect(ui->UpButton, SIGNAL(clicked()), this, SLOT(PopTrack())); connect(ui->DownButton, SIGNAL(clicked()), this, SLOT(PushTrack())); + NewArtist=NULL; } Dialog::~Dialog() { - delete ui; + delete ui; delete model; + //delete NewArtist; //Tym zajmuje się już model } void Dialog::Check() { - if(ui->ArtistEdit->text().size()==0) - return; - if(ui->TitleEdit->text().size()==0) - return; - if(ui->YearEdit->text().size()==0) - return; + QString artistName, albumTitle; + int albumYear; + + if(NewArtist!=NULL) + { + delete NewArtist; + NewArtist=NULL; + } + + artistName=ui->ArtistEdit->text(); + if(artistName.isEmpty()) + { + QMessageBox check; + check.setText("There were errors in the name of the artist.\nCorrect your data and try again."); + check.exec(); + return; + } + NewArtist=new Artist(artistName); + + albumTitle=ui->TitleEdit->text(); + if(albumTitle.isEmpty()) + { + QMessageBox check; + check.setText("There were errors in title of the album.\nCorrect your data and try again."); + check.exec(); + return; + } + + bool yearOk; + albumYear=ui->YearEdit->text().toInt(&yearOk); + if(ui->YearEdit->text().size()==0||!yearOk) + { + QMessageBox check; + check.setText("There were errors in year of production of the album.\nCorrect your data and try again."); + check.exec(); + return; + } + Album* NewAlbum=new CD(albumYear, albumTitle); + NewArtist->Children.push_back(NewAlbum); + NewAlbum->Parent=NewArtist; + + if(model->rowCount()==0) - return; + { + QMessageBox check; + check.setText("There were errors in track list.\nCorrect your data and try again."); + check.exec(); + return; + } + + for(int trackIndex=0;trackIndexrowCount();trackIndex++) + { + QString trackTitle=model->item(trackIndex,0)->text(); + + if(trackTitle.isEmpty()) + { + QMessageBox check; + check.setText("There were errors in track list.\nCorrect your data and try again."); + check.exec(); + return; + } + QTime duration=QTime::fromString(model->item(trackIndex,1)->text(), "m:s"); + + if(!duration.isValid()) + { + QMessageBox check; + check.setText("There were errors in track list.\nCorrect your data and try again."); + check.exec(); + return; + } + NewAlbum->AddTrack(trackTitle, duration.elapsed()*1000); + + } - QMessageBox check; - check.setText("check"); - check.exec(); emit Ok(); } diff --git a/dialog.hpp b/dialog.hpp index c5bf4c8..032687b 100644 --- a/dialog.hpp +++ b/dialog.hpp @@ -4,6 +4,8 @@ #include #include +#include "artist.hpp" + namespace Ui { class Dialog; } @@ -16,6 +18,7 @@ class Dialog : public QDialog explicit Dialog(QWidget *parent = 0); ~Dialog(); QStandardItemModel *model; + Artist* NewArtist; public slots: void Check(); diff --git a/library.cpp b/library.cpp index e122ef6..c25ce8c 100644 --- a/library.cpp +++ b/library.cpp @@ -1,21 +1,16 @@ #include "library.hpp" -Library::Library(std::string name) +Library::Library(std::string name):TreeItem() { Name=name; Artists=&Children; } -Library::Library(const Library& library) +Library::Library(const Library& library):TreeItem(library) { Artists=&Children; id=library.id; Name=library.Name; - for(const TreeItem* item:library.Children) - { - Children.push_back(item->Copy()); - Children.back()->Parent=this; - } } TreeItem* Library::Copy() const @@ -32,3 +27,22 @@ TreeItem::ItemTypes Library::ItemType() const { return ItemTypes::library; } + +TreeItem* Library::AddArtist(Artist* artist) +{ + for(TreeItem* knownArtist:*Artists) + { + if(dynamic_cast(knownArtist)->Name==artist->Name) + { + knownArtist->Children.push_back(artist->Children[0]); + knownArtist->Children.back()->Parent=knownArtist; + artist->Children.pop_back();// żeby destruktor nie zniszczył mi albumu + delete artist;// Bo klasy wyżej nie będą wiedziały, czy skopiowaliśmy, czy dodaliśmy artystę + return knownArtist->Children.back(); + } + } + //Jeśli tu doszliśmy, to jest to nowy artysta; + Children.push_back(artist); + artist->Parent=this; + return Children.back(); +} diff --git a/library.hpp b/library.hpp index aa5fc85..dbee3a4 100644 --- a/library.hpp +++ b/library.hpp @@ -25,6 +25,8 @@ class Library:public TreeItem virtual QString QData() const; virtual ItemTypes ItemType() const; + TreeItem* AddArtist(Artist* artist); + protected: friend class odb::access; diff --git a/main.cpp b/main.cpp index c4892f8..e613ca9 100644 --- a/main.cpp +++ b/main.cpp @@ -34,9 +34,6 @@ void populate(Model& model) a->Albums->push_back(al); alb->AddTrack("Track 1", 76); - //model.Root=lib->Copy(); - //std::cout<<*lib<Persist(db); @@ -51,8 +48,8 @@ int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; - create(*w.model); - populate(*w.model); + //create(*w.model); + //populate(*w.model); w.showMaximized(); return a.exec(); diff --git a/mainwindow.cpp b/mainwindow.cpp index 68ef9b6..84efed0 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -34,15 +34,14 @@ void MainWindow::Reload() ui->treeView->setModel(model); } -void MainWindow::Save() -{ - //model-> -} - bool MainWindow::Add() { Dialog dialog(this); - return dialog.exec(); + if(dialog.exec()) + model->AddArtist(dialog.NewArtist); + ui->treeView->setModel(NULL); + ui->treeView->setModel(model); + } void MainWindow::Delete() diff --git a/mainwindow.hpp b/mainwindow.hpp index 4d67719..402f15c 100644 --- a/mainwindow.hpp +++ b/mainwindow.hpp @@ -20,7 +20,6 @@ class MainWindow : public QMainWindow Model* model; public slots: void Reload(); - void Save(); bool Add(); void Delete(); diff --git a/mainwindow.ui b/mainwindow.ui index 1ad3342..78f5138 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -32,13 +32,6 @@ - - - - Save database - - - diff --git a/model.cpp b/model.cpp index 322aeee..d69d827 100644 --- a/model.cpp +++ b/model.cpp @@ -39,6 +39,7 @@ void Model::LoadDatabase(const QString& filename) //ograniczam się do jednej bazy Root=r.begin()->Copy(); + t.commit(); //std::cout<<*Root<(Root)->AddArtist(artist); + + odb::sqlite::database db(DatabaseFilename.toStdString(), SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE); + odb::core::transaction t (db.begin ()); + + newNode->Persist(db); + db.update(*(newNode->Parent)); + t.commit(); +} + std::ostream& operator<<(std::ostream& out, const Model& model) { out<<*model.Root< -Track::Track(const int number, const QString& title, const int duration):Number(number), Title(title), DurationSeconds(duration) +Track::Track(const int number, const QString& title, const int duration):Number(number), Title(title), DurationSeconds(duration), TreeItem() { } diff --git a/treeitem.cpp b/treeitem.cpp index 80efd61..cde94b1 100644 --- a/treeitem.cpp +++ b/treeitem.cpp @@ -75,7 +75,16 @@ void TreeItem::Erase(odb::database& db) void TreeItem::Update(odb::database& db) { for(TreeItem* item:Children) - item->Update(db); + { + try + { + item->Update(db); + } + catch(odb::object_not_persistent e) + { + item->Persist(db); + } + } db.update(const_cast(*this)); } diff --git a/treeitem.hpp b/treeitem.hpp index eb74c2b..a0c4682 100644 --- a/treeitem.hpp +++ b/treeitem.hpp @@ -20,6 +20,7 @@ class TreeItem QList Children; //Wyświetlanie w QT zależy od parenta +#pragma db transient TreeItem* Parent; TreeItem(TreeItem* parent=NULL); diff --git a/yarl.db b/yarl.db index 27c7fde..4219b60 100644 Binary files a/yarl.db and b/yarl.db differ