| 26 * POSSIBILITY OF SUCH DAMAGE. |
26 * POSSIBILITY OF SUCH DAMAGE. |
| 27 */ |
27 */ |
| 28 |
28 |
| 29 #include "model.h" |
29 #include "model.h" |
| 30 |
30 |
| 31 UiListSelection* listSelection(QItemSelectionModel *s) { |
|
| 32 UiListSelection *selection = new UiListSelection(); |
|
| 33 |
|
| 34 QModelIndexList list = s->selectedRows(); |
|
| 35 selection->count = list.count(); |
|
| 36 if(selection->count > 0) { |
|
| 37 selection->rows = new int[selection->count]; |
|
| 38 } |
|
| 39 |
|
| 40 QModelIndex index; |
|
| 41 int i=0; |
|
| 42 foreach(index, list) { |
|
| 43 selection->rows[i] = index.row(); |
|
| 44 i++; |
|
| 45 } |
|
| 46 return selection; |
|
| 47 } |
|
| 48 |
|
| 49 ListModel::ListModel(UiObject* obj, QListView* view, UiListPtr* list, ui_model_getvalue_f getvalue, ui_callback f, void* userdata) { |
|
| 50 this->obj = obj; |
|
| 51 this->view = view; |
|
| 52 this->list = list; |
|
| 53 this->getvalue = getvalue; |
|
| 54 this->callback = f; |
|
| 55 this->userdata = userdata; |
|
| 56 } |
|
| 57 |
|
| 58 int ListModel::rowCount(const QModelIndex& parent) const { |
|
| 59 return list->list->count(list->list); |
|
| 60 } |
|
| 61 |
|
| 62 QVariant ListModel::data(const QModelIndex &index, int role) const { |
|
| 63 if(role == Qt::DisplayRole) { |
|
| 64 UiList *ls = list->list; |
|
| 65 void *rowData = ls->get(ls, index.row()); |
|
| 66 if(rowData && getvalue) { |
|
| 67 void *value = getvalue(rowData, 0); |
|
| 68 return QString::fromUtf8((char*)value); |
|
| 69 } |
|
| 70 } |
|
| 71 return QVariant(); |
|
| 72 } |
|
| 73 |
|
| 74 void ListModel::selectionChanged(const QItemSelection& selected, const QItemSelection& deselected) { |
|
| 75 UiListSelection *selection = listSelection(view->selectionModel()); |
|
| 76 |
|
| 77 UiEvent e; |
|
| 78 e.obj = obj; |
|
| 79 e.window = obj->window; |
|
| 80 e.document = obj->ctx->document; |
|
| 81 e.eventdata = selection; |
|
| 82 e.intval = selection->count > 0 ? selection->rows[0] : -1; |
|
| 83 callback(&e, userdata); |
|
| 84 |
|
| 85 if(selection->count > 0) { |
|
| 86 delete selection->rows; |
|
| 87 } |
|
| 88 delete selection; |
|
| 89 } |
|
| 90 |
|
| 91 TableModel::TableModel(UiObject *obj, QTreeView *view, UiListPtr *list, UiModelInfo *info) { |
|
| 92 this->obj = obj; |
|
| 93 this->list = list; |
|
| 94 this->info = info; |
|
| 95 this->view = view; |
|
| 96 } |
|
| 97 |
|
| 98 int TableModel::rowCount(const QModelIndex &parent) const { |
|
| 99 return list->list->count(list->list); |
|
| 100 } |
|
| 101 |
|
| 102 int TableModel::columnCount(const QModelIndex &parent) const { |
|
| 103 return info->columns; |
|
| 104 } |
|
| 105 |
|
| 106 QVariant TableModel::data(const QModelIndex &index, int role) const { |
|
| 107 if(role == Qt::DisplayRole) { |
|
| 108 UiList *ls = list->list; |
|
| 109 void *rowData = ls->get(ls, index.row()); |
|
| 110 if(rowData && info->getvalue) { |
|
| 111 void *value = info->getvalue(rowData, index.column()); |
|
| 112 switch(info->types[index.column()]) { |
|
| 113 case UI_STRING: { |
|
| 114 return QString::fromUtf8((char*)value); |
|
| 115 } |
|
| 116 case UI_INTEGER: { |
|
| 117 int *intptr = (int*)value; |
|
| 118 return QVariant(*intptr); |
|
| 119 } |
|
| 120 } |
|
| 121 } |
|
| 122 } |
|
| 123 return QVariant(); |
|
| 124 } |
|
| 125 |
|
| 126 QVariant TableModel::headerData(int section, Qt::Orientation orientation, int role) const { |
|
| 127 if(role == Qt::DisplayRole) { |
|
| 128 char *label = info->titles[section]; |
|
| 129 return QString::fromUtf8(label); |
|
| 130 } |
|
| 131 return QVariant(); |
|
| 132 } |
|
| 133 |
|
| 134 void TableModel::update() { |
|
| 135 emit dataChanged(QModelIndex(),QModelIndex()); |
|
| 136 } |
|
| 137 |
|
| 138 void TableModel::selectionChanged(const QItemSelection& selected, const QItemSelection& deselected) { |
|
| 139 UiListSelection *selection = listSelection(view->selectionModel()); |
|
| 140 |
|
| 141 UiEvent e; |
|
| 142 e.obj = obj; |
|
| 143 e.window = obj->window; |
|
| 144 e.document = obj->ctx->document; |
|
| 145 e.eventdata = selection; |
|
| 146 e.intval = selection->count > 0 ? selection->rows[0] : -1; |
|
| 147 info->selection(&e, info->userdata); |
|
| 148 |
|
| 149 if(selection->count > 0) { |
|
| 150 delete selection->rows; |
|
| 151 } |
|
| 152 delete selection; |
|
| 153 } |
|
| 154 |
|
| 155 void TableModel::activate(const QModelIndex &) { |
|
| 156 UiListSelection *selection = listSelection(view->selectionModel()); |
|
| 157 |
|
| 158 UiEvent e; |
|
| 159 e.obj = obj; |
|
| 160 e.window = obj->window; |
|
| 161 e.document = obj->ctx->document; |
|
| 162 e.eventdata = selection; |
|
| 163 e.intval = selection->count > 0 ? selection->rows[0] : -1; |
|
| 164 info->activate(&e, info->userdata); |
|
| 165 |
|
| 166 if(selection->count > 0) { |
|
| 167 delete selection->rows; |
|
| 168 } |
|
| 169 delete selection; |
|
| 170 } |
|