void SkinDocument::cursorChanged() { if(editor->isError(editor->textCursor().blockNumber() + 1)) { QTextCursor line = editor->textCursor(); line.movePosition(QTextCursor::StartOfLine); line.movePosition(QTextCursor::EndOfLine, QTextCursor::KeepAnchor); skin_parse(line.selectedText().toAscii()); if(skin_error_line() > 0) parseStatus = tr("Error on line ") + QString::number(line.blockNumber() + 1) + tr(": ") + skin_error_message(); statusLabel->setText(parseStatus); } else if(editor->hasErrors()) { parseStatus = tr("Errors in document"); statusLabel->setText(parseStatus); } else { emit lineChanged(editor->textCursor().blockNumber() + 1); } }
QString ParseTreeModel::changeTree(const char *document) { struct skin_element* test = skin_parse(document); if(!test) { QString error = tr("Error on line ") + QString::number(skin_error_line()) + tr(", column ") + QString::number(skin_error_col()) + tr(": ") + QString(skin_error_message()); return error; } ParseTreeNode* temp = new ParseTreeNode(test, this); if(root) { emit beginRemoveRows(QModelIndex(), 0, root->numChildren() - 1); delete root; emit endRemoveRows(); } root = temp; emit beginInsertRows(QModelIndex(), 0, temp->numChildren() - 1); emit endInsertRows(); return tr("Document Parses Successfully"); }
void SkinDocument::codeChanged() { if(blockUpdate) return; if(editor->document()->isEmpty()) { parseStatus = tr("Empty document"); statusLabel->setText(parseStatus); return; } editor->clearErrors(); parseStatus = model->changeTree(editor->document()-> toPlainText().toAscii()); if(skin_error_line() > 0) parseStatus = tr("Errors in document"); statusLabel->setText(parseStatus); /* Highlighting if an error was found */ if(skin_error_line() > 0) { editor->addError(skin_error_line()); /* Now we're going to attempt parsing again at each line, until we find one that won't error out*/ QTextDocument doc(editor->document()->toPlainText()); int base = 0; while(skin_error_line() > 0 && !doc.isEmpty()) { QTextCursor rest(&doc); for(int i = 0; i < skin_error_line(); i++) rest.movePosition(QTextCursor::NextBlock, QTextCursor::KeepAnchor); if(skin_error_line() == doc.blockCount()) rest.movePosition(QTextCursor::End, QTextCursor::KeepAnchor); rest.removeSelectedText(); base += skin_error_line(); skin_parse(doc.toPlainText().toAscii()); if(skin_error_line() > 0) editor->addError(base + skin_error_line()); } } if(editor->document()->toPlainText() != saved) emit titleChanged(titleText + QChar('*')); else emit titleChanged(titleText); model->render(project, &fileName); cursorChanged(); }
ParseTreeModel::ParseTreeModel(const char* document, QObject* parent): QAbstractItemModel(parent), sbsModel(0) { this->tree = skin_parse(document); if(tree) this->root = new ParseTreeNode(tree, this); else this->root = 0; scene = new RBScene(); }
void ProjectExporter::checkWPS(ProjectModel* project, QString file) { /* Set this to false if any resource checks fail */ bool check = true; QSettings settings; settings.beginGroup("RBFont"); QString fontPack = settings.value("fontDir", "").toString() + "/"; settings.endGroup(); QString fontDir = project->getSetting("themebase", "") + "/fonts/"; QString wpsName = file.split("/").last().split(".").first(); QString imDir = project->getSetting("themebase", "") + "/wps/" + wpsName + "/"; QFile fin(file.replace("/.rockbox", project->getSetting("themebase", ""))); if(!fin.open(QFile::ReadOnly | QFile::Text)) { addWarning(tr("Couldn't open ") + file.split("/").last()); } QString contents(fin.readAll()); fin.close(); skin_element* root; root = skin_parse(contents.toAscii()); if(!root) { addWarning(tr("Couldn't parse ") + file.split("/").last()); return; } /* Now we scan through the tree to check all the resources */ /* Outer loop scans through all viewports */ while(root) { skin_element* line; if(root->children_count == 0) line = 0; else line = root->children[0]; /* Next loop scans through logical lines */ while(line) { /* Innermost loop gives top-level tags */ skin_element* current; if(line->children_count == 0) current = 0; else current = line->children[0]; while(current) { if(current->type == TAG) { if(QString(current->tag->name) == "Fl") { QString font = current->params[1].data.text; if(!QFile::exists(fontDir + font) && !QFile::exists(fontPack + font)) { check = false; addWarning(font + tr(" not found")); } } else if(QString(current->tag->name) == "X") { QString backdrop = current->params[0].data.text; if(!QFile::exists(imDir + backdrop)) { check = false; addWarning(backdrop + tr(" not found")); } } else if(QString(current->tag->name) == "xl") { QString image = current->params[1].data.text; if(!QFile::exists(imDir + image)) { check = false; addWarning(image + tr(" not found")); } } } current = current->next; } line = line->next; } root = root->next; } if(check) addSuccess(file.split("/").last() + tr(" passed resource check")); else addWarning(file.split("/").last() + tr(" failed resource check")); }
/* to setup up the wps-data from a format-buffer (isfile = false) from a (wps-)file (isfile = true)*/ bool skin_data_load(enum screen_type screen, struct wps_data *wps_data, const char *buf, bool isfile) { char *wps_buffer = NULL; if (!wps_data || !buf) return false; #ifdef HAVE_ALBUMART int status; struct mp3entry *curtrack; long offset; struct skin_albumart old_aa = {.state = WPS_ALBUMART_NONE}; if (wps_data->albumart) { old_aa.state = wps_data->albumart->state; old_aa.height = wps_data->albumart->height; old_aa.width = wps_data->albumart->width; } #endif #ifdef HAVE_LCD_BITMAP int i; for (i=0;i<MAXUSERFONTS;i++) { skinfonts[i].id = -1; skinfonts[i].name = NULL; } #endif #ifdef DEBUG_SKIN_ENGINE if (isfile && debug_wps) { DEBUGF("\n=====================\nLoading '%s'\n=====================\n", buf); } #endif skin_data_reset(wps_data); wps_data->wps_loaded = false; curr_screen = screen; curr_line = NULL; curr_vp = NULL; curr_viewport_element = NULL; if (isfile) { int fd = open_utf8(buf, O_RDONLY); if (fd < 0) return false; /* get buffer space from the plugin buffer */ size_t buffersize = 0; wps_buffer = (char *)plugin_get_buffer(&buffersize); if (!wps_buffer) return false; /* copy the file's content to the buffer for parsing, ensuring that every line ends with a newline char. */ unsigned int start = 0; while(read_line(fd, wps_buffer + start, buffersize - start) > 0) { start += strlen(wps_buffer + start); if (start < buffersize - 1) { wps_buffer[start++] = '\n'; wps_buffer[start] = 0; } } close(fd); if (start <= 0) return false; } else { wps_buffer = (char*)buf; } #if LCD_DEPTH > 1 || defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1 wps_data->backdrop = "-"; wps_data->backdrop_id = -1; #endif /* parse the skin source */ #ifndef APPLICATION skin_buffer_save_position(); #endif wps_data->tree = skin_parse(wps_buffer, skin_element_callback, wps_data); if (!wps_data->tree) { skin_data_reset(wps_data); #ifndef APPLICATION skin_buffer_restore_position(); #endif return false; } #ifdef HAVE_LCD_BITMAP char bmpdir[MAX_PATH]; if (isfile) { /* get the bitmap dir */ char *dot = strrchr(buf, '.'); strlcpy(bmpdir, buf, dot - buf + 1); } else { /* fall back to backdrop dir for built-in themes */ /* no get_user_file_path(), assuming we ship bmps for built-in themes */ snprintf(bmpdir, MAX_PATH, "%s", BACKDROP_DIR); } /* load the bitmaps that were found by the parsing */ if (!load_skin_bitmaps(wps_data, bmpdir) || !skin_load_fonts(wps_data)) { skin_data_reset(wps_data); #ifndef APPLICATION skin_buffer_restore_position(); #endif return false; } #endif #if defined(HAVE_ALBUMART) && !defined(__PCTOOL__) status = audio_status(); if (status & AUDIO_STATUS_PLAY) { struct skin_albumart *aa = wps_data->albumart; if (aa && ((aa->state && !old_aa.state) || (aa->state && (((old_aa.height != aa->height) || (old_aa.width != aa->width)))))) { curtrack = audio_current_track(); offset = curtrack->offset; audio_stop(); if (!(status & AUDIO_STATUS_PAUSE)) audio_play(offset); } } #endif wps_data->wps_loaded = true; #ifdef DEBUG_SKIN_ENGINE // if (isfile && debug_wps) // debug_skin_usage(); #endif return true; }