Add custom model for tree view in Database Structure tab · feng2010java/sqlitebrowser@64a9387 · GitHub
Skip to content

Commit 64a9387

Browse files
committed
Add custom model for tree view in Database Structure tab
Use a custom model for the tree view in the "Database Structure" tab in the main window, i.e. change from a QTreeWidget to a QTreeView and do all the item management stuff manually. This might add some code and complexity but also offers some more flexibility for us.
1 parent afc53f7 commit 64a9387

6 files changed

Lines changed: 220 additions & 104 deletions

File tree

‎src/DbStructureModel.cpp‎

Lines changed: 155 additions & 0 deletions

‎src/DbStructureModel.h‎

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#ifndef __DBSTRUCTUREMODEL_H__
2+
#define __DBSTRUCTUREMODEL_H__
3+
4+
#include <QAbstractItemModel>
5+
class DBBrowserDB;
6+
class QTreeWidgetItem;
7+
8+
class DbStructureModel : public QAbstractItemModel
9+
{
10+
Q_OBJECT
11+
12+
public:
13+
explicit DbStructureModel(QObject* parent = 0);
14+
~DbStructureModel();
15+
16+
void reloadData(DBBrowserDB* db);
17+
18+
QVariant data(const QModelIndex& index, int role) const;
19+
Qt::ItemFlags flags(const QModelIndex& index) const;
20+
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
21+
QModelIndex index(int row, int column, const QModelIndex& parent = QModelIndex()) const;
22+
QModelIndex parent(const QModelIndex& index) const;
23+
int rowCount(const QModelIndex& parent = QModelIndex()) const;
24+
int columnCount(const QModelIndex& = QModelIndex()) const;
25+
26+
private:
27+
QTreeWidgetItem* rootItem;
28+
};
29+
30+
#endif

‎src/MainWindow.cpp‎

Lines changed: 26 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include "FilterTableHeader.h"
2727
#include "SqlExecutionArea.h"
2828
#include "VacuumDialog.h"
29+
#include "DbStructureModel.h"
2930

3031
MainWindow::MainWindow(QWidget* parent)
3132
: QMainWindow(parent),
@@ -54,16 +55,19 @@ void MainWindow::init()
5455
// Init the SQL log dock
5556
db.mainWindow = this;
5657

57-
// Set up the db tree widget
58-
ui->dbTreeWidget->setColumnHidden(1, true);
59-
ui->dbTreeWidget->setColumnWidth(0, 300);
60-
6158
// Set the validator for the goto line edit
6259
ui->editGoto->setValidator(gotoValidator);
6360

6461
// Set up DB models
6562
ui->dataTable->setModel(m_browseTableModel);
6663

64+
// Set up DB structure tab
65+
dbStructureModel = new DbStructureModel(ui->dbTreeWidget);
66+
ui->dbTreeWidget->setModel(dbStructureModel);
67+
ui->dbTreeWidget->setColumnHidden(1, true);
68+
ui->dbTreeWidget->setColumnWidth(0, 300);
69+
70+
// Set up filter row
6771
FilterTableHeader* tableHeader = new FilterTableHeader(ui->dataTable);
6872
connect(tableHeader, SIGNAL(filterChanged(int,QString)), m_browseTableModel, SLOT(updateFilter(int,QString)));
6973
connect(tableHeader, SIGNAL(filterChanged(int,QString)), this, SLOT(setRecordsetLabel()));
@@ -103,6 +107,7 @@ void MainWindow::init()
103107
connect(ui->dataTable->verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(setRecordsetLabel()));
104108
connect(editWin, SIGNAL(goingAway()), this, SLOT(editWinAway()));
105109
connect(editWin, SIGNAL(updateRecordText(int, int, QByteArray)), this, SLOT(updateRecordText(int, int, QByteArray)));
110+
connect(ui->dbTreeWidget->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), this, SLOT(changeTreeSelection()));
106111

107112
// Load window settings
108113
restoreGeometry(PreferencesDialog::getSettingsValue("MainWindow", "geometry").toByteArray());
@@ -175,10 +180,8 @@ void MainWindow::fileNew()
175180
}
176181
}
177182

178-
//** Populate DbTree Structure
179183
void MainWindow::populateStructure()
180184
{
181-
ui->dbTreeWidget->model()->removeRows(0, ui->dbTreeWidget->model()->rowCount());
182185
completerModelTables.clear();
183186
completerModelsFields.clear();
184187
if(!db.isOpen())
@@ -229,51 +232,9 @@ void MainWindow::populateStructure()
229232
sqlarea->getEditor()->insertFieldCompleterModels(completerModelsFields);
230233
}
231234

232-
// fill the structure tab
233-
QMap<QString, QTreeWidgetItem*> typeToParentItem;
234-
QTreeWidgetItem* itemTables = new QTreeWidgetItem(ui->dbTreeWidget);
235-
itemTables->setIcon(0, QIcon(QString(":/icons/table")));
236-
itemTables->setText(0, tr("Tables (%1)").arg(db.objMap.values("table").count()));
237-
typeToParentItem.insert("table", itemTables);
238-
QTreeWidgetItem* itemIndices = new QTreeWidgetItem(ui->dbTreeWidget);
239-
itemIndices->setIcon(0, QIcon(QString(":/icons/index")));
240-
itemIndices->setText(0, tr("Indices (%1)").arg(db.objMap.values("index").count()));
241-
typeToParentItem.insert("index", itemIndices);
242-
QTreeWidgetItem* itemViews = new QTreeWidgetItem(ui->dbTreeWidget);
243-
itemViews->setIcon(0, QIcon(QString(":/icons/view")));
244-
itemViews->setText(0, tr("Views (%1)").arg(db.objMap.values("view").count()));
245-
typeToParentItem.insert("view", itemViews);
246-
QTreeWidgetItem* itemTriggers = new QTreeWidgetItem(ui->dbTreeWidget);
247-
itemTriggers->setIcon(0, QIcon(QString(":/icons/trigger")));
248-
itemTriggers->setText(0, tr("Triggers (%1)").arg(db.objMap.values("trigger").count()));
249-
typeToParentItem.insert("trigger", itemTriggers);
250-
ui->dbTreeWidget->setItemExpanded(itemTables, true);
251-
ui->dbTreeWidget->setItemExpanded(itemIndices, true);
252-
ui->dbTreeWidget->setItemExpanded(itemViews, true);
253-
ui->dbTreeWidget->setItemExpanded(itemTriggers, true);
254-
255-
for(objectMap::ConstIterator it=db.objMap.begin();it!=db.objMap.end();++it)
256-
{
257-
// Object node
258-
QTreeWidgetItem *tableItem = new QTreeWidgetItem(typeToParentItem.value((*it).gettype()));
259-
tableItem->setIcon(0, QIcon(QString(":/icons/%1").arg((*it).gettype())));
260-
tableItem->setText(0, (*it).getname());
261-
tableItem->setText(1, (*it).gettype());
262-
tableItem->setText(3, (*it).getsql());
263-
264-
// If it is a table add the field Nodes
265-
if((*it).gettype() == "table" || (*it).gettype() == "view")
266-
{
267-
for(int i=0;i<(*it).fldmap.size();i++)
268-
{
269-
QTreeWidgetItem *fldItem = new QTreeWidgetItem(tableItem);
270-
fldItem->setText(0, (*it).fldmap.at(i)->name());
271-
fldItem->setText(1, "field");
272-
fldItem->setText(2, (*it).fldmap.at(i)->type());
273-
fldItem->setIcon(0, QIcon(":/icons/field"));
274-
}
275-
}
276-
}
235+
// Refresh the structure tab
236+
dbStructureModel->reloadData(&db);
237+
ui->dbTreeWidget->expandToDepth(0);
277238
}
278239

279240
void MainWindow::populateTable( const QString & tablename)
@@ -517,9 +478,9 @@ void MainWindow::compact()
517478

518479
void MainWindow::deleteObject()
519480
{
520-
// Get name of table to delete
521-
QString table = ui->dbTreeWidget->currentItem()->text(0);
522-
QString type = ui->dbTreeWidget->currentItem()->text(1);
481+
// Get name and type of object to delete
482+
QString table = ui->dbTreeWidget->model()->data(ui->dbTreeWidget->currentIndex().sibling(ui->dbTreeWidget->currentIndex().row(), 0)).toString();
483+
QString type = ui->dbTreeWidget->model()->data(ui->dbTreeWidget->currentIndex().sibling(ui->dbTreeWidget->currentIndex().row(), 1)).toString();
523484

524485
// Ask user if he really wants to delete that table
525486
if(QMessageBox::warning(this, QApplication::applicationName(), tr("Are you sure you want to delete the %1 '%2'?\nAll data associated with the %1 will be lost.").arg(type).arg(table),
@@ -547,7 +508,7 @@ void MainWindow::editTable()
547508
if(!ui->dbTreeWidget->selectionModel()->hasSelection()){
548509
return;
549510
}
550-
QString tableToEdit = ui->dbTreeWidget->currentItem()->text(0);
511+
QString tableToEdit = ui->dbTreeWidget->model()->data(ui->dbTreeWidget->currentIndex().sibling(ui->dbTreeWidget->currentIndex().row(), 0)).toString();
551512

552513
EditTableDialog dialog(&db, tableToEdit, this);
553514
if(dialog.exec())
@@ -867,9 +828,9 @@ void MainWindow::createTreeContextMenu(const QPoint &qPoint)
867828
if(!ui->dbTreeWidget->selectionModel()->hasSelection())
868829
return;
869830

870-
QTreeWidgetItem *cItem = ui->dbTreeWidget->currentItem();
831+
QString type = ui->dbTreeWidget->model()->data(ui->dbTreeWidget->currentIndex().sibling(ui->dbTreeWidget->currentIndex().row(), 1)).toString();
871832

872-
if(cItem->text(1) == "table" || cItem->text(1) == "view" || cItem->text(1) == "trigger" || cItem->text(1) == "index")
833+
if(type == "table" || type == "view" || type == "trigger" || type == "index")
873834
popupTableMenu->exec(ui->dbTreeWidget->mapToGlobal(qPoint));
874835
}
875836
//** Tree selection changed
@@ -879,26 +840,27 @@ void MainWindow::changeTreeSelection()
879840
ui->editDeleteObjectAction->setEnabled(false);
880841
ui->editModifyTableAction->setEnabled(false);
881842

882-
if(ui->dbTreeWidget->currentItem() == 0)
843+
if(!ui->dbTreeWidget->currentIndex().isValid())
883844
return;
884845

885846
// Change the text of the actions
886-
ui->editDeleteObjectAction->setIcon(QIcon(QString(":icons/%1_delete").arg(ui->dbTreeWidget->currentItem()->text(1))));
887-
if(ui->dbTreeWidget->currentItem()->text(1) == "view")
847+
QString type = ui->dbTreeWidget->model()->data(ui->dbTreeWidget->currentIndex().sibling(ui->dbTreeWidget->currentIndex().row(), 1)).toString();
848+
ui->editDeleteObjectAction->setIcon(QIcon(QString(":icons/%1_delete").arg(type)));
849+
if(type == "view")
888850
ui->editDeleteObjectAction->setText(tr("Delete View"));
889-
else if(ui->dbTreeWidget->currentItem()->text(1) == "trigger")
851+
else if(type == "trigger")
890852
ui->editDeleteObjectAction->setText(tr("Delete Trigger"));
891-
else if(ui->dbTreeWidget->currentItem()->text(1) == "index")
853+
else if(type == "index")
892854
ui->editDeleteObjectAction->setText(tr("Delete Index"));
893855
else
894856
ui->editDeleteObjectAction->setText(tr("Delete Table"));
895857

896858
// Activate actions
897-
if(ui->dbTreeWidget->currentItem()->text(1) == "table")
859+
if(type == "table")
898860
{
899861
ui->editDeleteObjectAction->setEnabled(true);
900862
ui->editModifyTableAction->setEnabled(true);
901-
} else if(ui->dbTreeWidget->currentItem()->text(1) == "view" || ui->dbTreeWidget->currentItem()->text(1) == "trigger" || ui->dbTreeWidget->currentItem()->text(1) == "index") {
863+
} else if(type == "view" || type == "trigger" || type == "index") {
902864
ui->editDeleteObjectAction->setEnabled(true);
903865
}
904866
}

‎src/MainWindow.h‎

Lines changed: 3 additions & 0 deletions

0 commit comments

Comments
 (0)