Skip to content

Commit

Permalink
data editing: set NULL
Browse files Browse the repository at this point in the history
  • Loading branch information
ragnar-lodbrok committed Sep 22, 2018
1 parent 604e81f commit d32836f
Show file tree
Hide file tree
Showing 14 changed files with 194 additions and 23 deletions.
5 changes: 5 additions & 0 deletions app/actions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,11 @@ void Actions::createActions()
_dataCancelChanges = new QAction(QIcon(":/icons/cross.png"),
tr("Cancel editing"), this);

// -------------------------------------------------------------------------
_dataSetNULL = new QAction(QIcon(":/icons/page_white_delete.png"),
tr("NULL"), this);
_dataSetNULL->setStatusTip(tr("Set focused cell to NULL"));

}

} // namespace meow
4 changes: 4 additions & 0 deletions app/actions.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ class Actions : public QObject
QAction * dataPostChanges() const { return _dataPostChanges; }
QAction * dataCancelChanges() const { return _dataCancelChanges; }

QAction * dataSetNULL() const { return _dataSetNULL; }

private:

void createActions();
Expand All @@ -29,6 +31,8 @@ class Actions : public QObject
QAction * _dataDelete;
QAction * _dataPostChanges;
QAction * _dataCancelChanges;

QAction * _dataSetNULL;
};

} // namespace meow
Expand Down
14 changes: 11 additions & 3 deletions db/editable_grid_data.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,15 +64,23 @@ class EditableGridData
return _editableRow != nullptr;
}

void discardModifications() {
int discardModifications() {
int editableRowNumber = -1;
if (_editableRow) {
editableRowNumber = _editableRow->rowNumber;
}
_editableRow.reset();
return editableRowNumber;
}

void applyModifications() {
if (!isModified()) return;
int applyModifications() {
if (!isModified()) return -1;

int editableRowNumber = _editableRow->rowNumber;
_rows[_editableRow->rowNumber] = _editableRow->data;
_editableRow.reset();

return editableRowNumber;
}

EditableGridDataRow * editableRow() const {
Expand Down
22 changes: 18 additions & 4 deletions db/query_data.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
namespace meow {
namespace db {

QueryData::QueryData()
QueryData::QueryData() : _curRowNumber(-1)
{

}
Expand Down Expand Up @@ -88,8 +88,10 @@ bool QueryData::isNullAt(int row, int column) const

bool QueryData::setData(int row, int col, const QVariant &value)
{
setCurrentRowNumber(row);
db::Query * query = _queryPtr.get();
if (query) {
query->prepareEditing();
Q_ASSERT(query->editableData());
query->editableData()->setData(row, col, value);
}
Expand All @@ -112,9 +114,9 @@ bool QueryData::isModified() const
&& _queryPtr->editableData()->isModified();
}

void QueryData::applyModifications()
int QueryData::applyModifications()
{
if (!isModified()) return;
if (!isModified()) return -1;

std::shared_ptr<QueryDataEditor> editor = query()->connection()
->queryDataEditor();
Expand All @@ -123,7 +125,14 @@ void QueryData::applyModifications()

ensureFullRow(true); // load from db new values

_queryPtr->editableData()->applyModifications();
return _queryPtr->editableData()->applyModifications();
}

int QueryData::discardModifications()
{
if (!isModified()) return -1;

return _queryPtr->editableData()->discardModifications();
}

QString QueryData::whereForCurRow(bool notModified) const
Expand Down Expand Up @@ -210,6 +219,11 @@ void QueryData::ensureFullRow(bool refresh)
row->data = newRowData;
}

void QueryData::setCurrentRowNumber(int row)
{
_curRowNumber = row;
}

bool QueryData::hasFullData() const
{
if (isModified()) return true;
Expand Down
13 changes: 10 additions & 3 deletions db/query_data.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,9 @@ class QueryData
QueryData();

db::Query * query() const { return _queryPtr.get(); }
void setQueryPtr(db::QueryPtr queryPtr) { _queryPtr = queryPtr; }
void clearData() { _queryPtr = nullptr; }
void setQueryPtr(db::QueryPtr queryPtr) { _queryPtr = queryPtr;
_curRowNumber = -1; }
void clearData() { setQueryPtr(nullptr); }

int rowCount() const;
int columnCount() const;
Expand All @@ -27,16 +28,22 @@ class QueryData
void prepareEditing();
bool setData(int row, int col, const QVariant &value);
bool isModified() const;
void applyModifications();

int applyModifications();
int discardModifications();

QString whereForCurRow(bool notModified = false) const;
void ensureFullRow(bool refresh = false);

void setCurrentRowNumber(int row);
int currentRowNumber() const { return _curRowNumber; }

private:

bool hasFullData() const;

db::QueryPtr _queryPtr;
int _curRowNumber;
};

} // namespace db
Expand Down
2 changes: 1 addition & 1 deletion icons.qrc
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@
<file>resources/icons/user_delete.png</file>
<file alias="data.png">resources/icons/text_columns.png</file>
<file>resources/icons/page_white_put.png</file>
<file>resources/icons/calendar_view_day.png</file>
<file alias="calendar_view_day.png">resources/icons/calendar_view_day.png</file>
<file>resources/icons/table_highlight.png</file>
<file>resources/icons/database_highlight.png</file>
<file>resources/icons/bullet_arrow_down.png</file>
Expand Down
6 changes: 4 additions & 2 deletions meow-sql.pro
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,8 @@ SOURCES += main.cpp\
ui/session_manager/start_tab.cpp \
ui/session_manager/window.cpp \
db/editable_grid_data.cpp \
db/query_data_editor.cpp
db/query_data_editor.cpp \
ui/common/editable_data_table_view.cpp

HEADERS += app/actions.h \
app/app.h \
Expand Down Expand Up @@ -250,7 +251,8 @@ HEADERS += app/actions.h \
ui/session_manager/start_tab.h \
ui/session_manager/window.h \
db/editable_grid_data.h \
db/query_data_editor.h
db/query_data_editor.h \
ui/common/editable_data_table_view.h


win32:INCLUDEPATH += "$$PWD\third_party\libmysql\windows\include"
Expand Down
25 changes: 23 additions & 2 deletions models/db/data_table_model.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -151,11 +151,32 @@ void DataTableModel::loadData(bool force)
void DataTableModel::applyModifications()
{
if (queryData() && queryData()->isModified()) {
queryData()->applyModifications();
// TODO emit dataChanged(row)
int modifiedRow = queryData()->applyModifications();
if (modifiedRow != -1) {
emit dataChanged(
index(modifiedRow, 0),
index(modifiedRow, columnCount() - 1));
}
}
}

void DataTableModel::discardModifications()
{
if (queryData() && queryData()->isModified()) {
int modifiedRow = queryData()->discardModifications();
if (modifiedRow != -1) {
emit dataChanged(
index(modifiedRow, 0),
index(modifiedRow, columnCount() - 1));
}
}
}

void DataTableModel::setCurrentRowNumber(int row)
{
queryData()->setCurrentRowNumber(row);
}

void DataTableModel::refresh()
{
removeData();
Expand Down
3 changes: 3 additions & 0 deletions models/db/data_table_model.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,9 @@ class DataTableModel : public BaseDataTableModel
QString rowCountStats() const;

void applyModifications();
void discardModifications();

void setCurrentRowNumber(int row);

private:

Expand Down
24 changes: 24 additions & 0 deletions ui/common/editable_data_table_view.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#include "editable_data_table_view.h"
#include "app/app.h"

#include <QtWidgets>

namespace meow {
namespace ui {

void EditableDataTableView::contextMenuEvent(QContextMenuEvent * event)
{

QMenu menu(this);

QMenu * insertValueSubMenu = menu.addMenu( // owns result
QIcon(":/icons/calendar_view_day.png"),
tr("Insert value"));

insertValueSubMenu->addAction( meow::app()->actions()->dataSetNULL() );

menu.exec(event->globalPos());
}

} // namespace ui
} // namespace meow
19 changes: 19 additions & 0 deletions ui/common/editable_data_table_view.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#ifndef MEOW_UI_EDITABLE_DATA_TABLE_VIEW_H
#define MEOW_UI_EDITABLE_DATA_TABLE_VIEW_H

#include "table_view.h"

namespace meow {
namespace ui {

class EditableDataTableView : public TableView
{

protected:
virtual void contextMenuEvent(QContextMenuEvent * event) override;
};

} // namespace ui
} // namespace meow

#endif // MEOW_UI_EDITABLE_DATA_TABLE_VIEW_H
61 changes: 58 additions & 3 deletions ui/main_window/central_right/data/central_right_data_tab.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#include "central_right_data_tab.h"
#include "db/common.h"
#include "app/app.h"
#include "ui/common/editable_data_table_view.h"

namespace meow {
namespace ui {
Expand All @@ -16,6 +17,25 @@ DataTab::DataTab(QWidget *parent) : QWidget(parent), _model()

createTopPanel();
createDataTable();

connect(meow::app()->actions()->dataSetNULL(),
&QAction::triggered,
this,
&DataTab::onDataSetNULLAction);

connect(meow::app()->actions()->dataPostChanges(),
&QAction::triggered,
[=](bool checked) {
Q_UNUSED(checked);
applyModifications();
});

connect(meow::app()->actions()->dataCancelChanges(),
&QAction::triggered,
[=](bool checked) {
Q_UNUSED(checked);
discardModifications();
});
}

void DataTab::createTopPanel()
Expand Down Expand Up @@ -77,7 +97,7 @@ void DataTab::createShowToolBar()
void DataTab::createDataTable()
{

_dataTable = new TableView();
_dataTable = new EditableDataTableView();
_dataTable->verticalHeader()->hide();
auto geometrySettings = meow::app()->settings()->geometrySettings();
_dataTable->verticalHeader()->setDefaultSectionSize(
Expand Down Expand Up @@ -176,9 +196,44 @@ void DataTab::currentRowChanged(const QModelIndex &current,
Q_UNUSED(current);
Q_UNUSED(previous);

// TODO: try/catch
_model.applyModifications();
QModelIndex curIndex = _dataTable->selectionModel()->currentIndex();
_model.setCurrentRowNumber(curIndex.row());

applyModifications();

}

void DataTab::onDataSetNULLAction(bool checked)
{
Q_UNUSED(checked);
QModelIndex curIndex = _dataTable->selectionModel()->currentIndex();
if (curIndex.isValid()) {
_model.setData(curIndex, QString());
}
}

void DataTab::applyModifications()
{
// TODO: commit editing data
try {
_model.applyModifications();
} catch(meow::db::Exception & ex) {

discardModifications();

QMessageBox msgBox;
msgBox.setText(ex.message());
msgBox.setStandardButtons(QMessageBox::Ok);
msgBox.setDefaultButton(QMessageBox::Ok);
msgBox.setIcon(QMessageBox::Critical);
msgBox.exec();
}
}

void DataTab::discardModifications()
{
// TODO: close editor
_model.discardModifications();
}

} // namespace central_right
Expand Down
11 changes: 9 additions & 2 deletions ui/main_window/central_right/data/central_right_data_tab.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@

#include <QtWidgets>
#include "models/db/data_table_model.h"
#include "ui/common/table_view.h"

namespace meow {
namespace ui {

class EditableDataTableView;

namespace main_window {
namespace central_right {

Expand Down Expand Up @@ -36,6 +38,11 @@ class DataTab : public QWidget
Q_SLOT void currentRowChanged(const QModelIndex &current,
const QModelIndex &previous);

Q_SLOT void onDataSetNULLAction(bool checked);

void applyModifications();
void discardModifications();

QVBoxLayout * _mainLayout;
// top panel:
QHBoxLayout * _topLayout;
Expand All @@ -45,7 +52,7 @@ class DataTab : public QWidget
QAction * _nextRowsAction;
QAction * _showAllRowsAction;
// bottom:
TableView * _dataTable;
EditableDataTableView * _dataTable;

models::db::DataTableModel _model;
};
Expand Down
Loading

0 comments on commit d32836f

Please sign in to comment.