Example #1
0
void down_single_click_handler(ClickRecognizerRef recognizer, Window *window) {
  (void)recognizer;
  (void)window;

  page = page < (pageSize - 1) ? page + 1 : 0;
  drawPage(page);
}
Example #2
0
void up_single_click_handler(ClickRecognizerRef recognizer, Window *window) {
  (void)recognizer;
  (void)window;

  page = page > 0 ? page - 1 : (pageSize - 1);
  drawPage(page);
}
Example #3
0
void updateCenter(AppState & state) {
  Point bottomLeft = state.convertBufferToScreen(Point(0,0));
  Point topRight = state.convertBufferToScreen(Point(MY_BG_W,MY_BG_H));

  Point newCenter = state.convertScreenToImage(Point(SCREEN_WIDTH/2, SCREEN_HEIGHT/2));
  // printf("--------------\n");
  // printf("%d %d\n", bottomLeft.x, bottomLeft.y);
  // printf("%d %d\n", topRight.x, topRight.y);
  // printf("%d %d\n", newCenter.x, newCenter.y);

  if (bottomLeft.x > 0 || bottomLeft.y > 0 || topRight.x < SCREEN_WIDTH || topRight.y < SCREEN_HEIGHT) {
    //Point newCenter = state.convertScreenToImage(Point(SCREEN_WIDTH/2, SCREEN_HEIGHT/2));
      state.scroll_x = MY_BG_W/2-SCREEN_WIDTH/2;
      state.scroll_y = MY_BG_H/2-SCREEN_HEIGHT/2;
      state.center_x = newCenter.x;
      state.center_y = newCenter.y;

      // printf("%d %d\n", state.center_x, state.center_y);
      bgHide(3);
      fillDisplay(RGB15(0,0,0) | BIT(15), state.lastPage, state);
      drawPage(state.currentPage, RGB15(31,0,0) | BIT(15), state);
  }
  bgSetScroll(3, state.scroll_x, state.scroll_y);
  bgUpdate();
  bgShow(3);
}
void KoPagePreviewWidget::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);
    // resolution[XY] is in pixel per pt
    qreal resolutionX = POINT_TO_INCH( static_cast<qreal>(KoDpi::dpiX()) );
    qreal resolutionY = POINT_TO_INCH( static_cast<qreal>(KoDpi::dpiY()) );

    qreal pageWidth = d->pageLayout.width * resolutionX;
    qreal pageHeight = d->pageLayout.height * resolutionY;

    const bool pageSpread = (d->pageLayout.bindingSide >= 0 && d->pageLayout.pageEdge >= 0);
    qreal sheetWidth = pageWidth / (pageSpread?2:1);

    qreal zoomH = (height() * 90 / 100) / pageHeight;
    qreal zoomW = (width() * 90 / 100) / pageWidth;
    qreal zoom = qMin( zoomW, zoomH );

    pageWidth *= zoom;
    sheetWidth *= zoom;
    pageHeight *= zoom;
    QPainter painter( this );

    QRect page = QRectF((width() - pageWidth) / 2.0,
            (height() - pageHeight) / 2.0, sheetWidth, pageHeight).toRect();

    painter.save();
    drawPage(painter, zoom, page, true);
    painter.restore();
    if(pageSpread) {
        page.moveLeft(page.left() + (int) (sheetWidth));
        painter.save();
        drawPage(painter, zoom, page, false);
        painter.restore();
    }

    painter.end();

    // paint scale
}
Example #5
0
int displayMenu(int *keyPressed, int *inputBoxPressed, int *buttonPressed,
		int * sdBoxPressed) {
	int validPress = 0;
	Point p;
	int choice = -1;
	int checkButtonPressed = -1;
	int checkKeyPressed = -1;
	int checkInputBoxPressed = -1;
	int checkSDBoxPressed = -1;

	// if we are outside the area, we will draw the panic page over home page
	if (panicFlag == 1) {
		if (globalCurrentPage == home) {
			globalCurrentPage = panic;
		}
	}
	drawPage(globalCurrentPage);
	while (validPress == 0) {
		//pen down
		GetPress(&p);
		checkButtonPressed = validpress(p, *globalCurrentPage, buttonPressed);
		checkKeyPressed = validkeypress(p, *globalCurrentPage, keyPressed);
		checkInputBoxPressed = validinputboxpress(p, *globalCurrentPage,
				inputBoxPressed);
		checkSDBoxPressed = validsdboxpress(p, *globalCurrentPage,
				sdBoxPressed);

		if (checkButtonPressed != -1 || checkKeyPressed != -1
				|| checkInputBoxPressed != -1 || checkSDBoxPressed != -1) {
			validPress = 1;
		}
		*keyPressed = -1;
		*inputBoxPressed = -1;
		*buttonPressed = -1;
		*sdBoxPressed = -1;
		if (validPress == 1) {
			validPress = 0;
			//pen up
			GetRelease(&p);

			choice = checkChoice(p, globalCurrentPage, keyPressed,
					inputBoxPressed, buttonPressed, sdBoxPressed);

			if (choice != -1 || *keyPressed != -1 || *buttonPressed != -1
					|| *inputBoxPressed != -1 || *sdBoxPressed != -1) {
				validPress = 1;
			}
		}
	}
	return choice;
}
Example #6
0
void handle_init(AppContextRef ctx) {
  (void)ctx;

  window_init(&window, "Window Name");
  window_stack_push(&window, true /* Animated */);
  window_set_fullscreen(&window, true);
  window_set_background_color(&window, GColorBlack);

  resource_init_current_app(&APP_RESOURCES);

  text_layer_init(&text_layer, window.layer.frame);
  text_layer_set_text_color(&text_layer, GColorWhite);
  text_layer_set_background_color(&text_layer, GColorClear);
  text_layer_set_font(&text_layer, fonts_load_custom_font(resource_get_handle(RESOURCE_ID_FONT_9)));
  layer_add_child(&window.layer, &text_layer.layer);

  populateTexts();
  drawPage(page);

  window_set_click_config_provider(&window, (ClickConfigProvider) config_provider);
}
Example #7
0
void UI::updateValues() {
	drawTitlebar(m_data->time_hour, m_data->time_minute, m_data->time_second, batteryPercentage(m_data->battery_voltage));

	// debug
	//m_lcd->drawStringF(0,312, 1, RED, WHITE, "%2.2f %d  ", m_data->battery_voltage, m_data->geiger_voltage);

	switch (m_page) {
		case PAGE_MEASURE: {
			m_lcd->drawStringF(8,  40, 2, BLUE, WHITE, "%2.2f%cC", m_data->bmp180_temp,247);
			m_lcd->drawStringF(8,  72, 2, BLUE, WHITE, "%4uhPa", m_data->bmp180_pressure / 100);
			m_lcd->drawStringF(8, 104, 2, BLUE, WHITE, "%4.2fm", m_data->bmp180_altitude);
			m_lcd->drawStringF(8, 136, 2, PURPLE, WHITE, "%2.2fmgm%c", m_data->gp2y10_dust, 254);
			m_lcd->drawStringF(8, 168, 2, DARKGREEN, WHITE, "%4.2fppm", m_data->vz89_co2);
			m_lcd->drawStringF(8, 200, 2, DARKGREEN, WHITE, "%4.2fppb", m_data->vz89_voc);
			m_lcd->drawStringF(8, 232, 2, RED, WHITE, "%luCPM", m_data->geiger_cpm);

			float bmp180_temp = m_data->getBMP180Temp_scaled(),
					bmp180_altitude = m_data->getBMP180Altitude_scaled(),
					gp2y10_dust = m_data->getGP2Y10Dust_scaled(),
					vz89_co2 = m_data->getVZ89CO2_scaled() ,
					vz89_voc = m_data->getVZ89VOC_scaled();
			uint32_t bmp180_pressure = m_data->getBMP180Pressure_scaled(),
			 		geiger_cpm = m_data->getGeigerCPM_scaled();

			if (m_chartX == 120) {
				m_lcd->drawPixel(m_chartX, 64 - bmp180_temp, BLUE);
				m_lcd->drawPixel(m_chartX, 96 - bmp180_pressure, BLUE);
				m_lcd->drawPixel(m_chartX,128 - bmp180_altitude, BLUE);
				m_lcd->drawPixel(m_chartX,160 - gp2y10_dust, PURPLE);
				m_lcd->drawPixel(m_chartX,192 - vz89_co2, DARKGREEN);
				m_lcd->drawPixel(m_chartX,224 - vz89_voc, DARKGREEN);
				m_lcd->drawPixel(m_chartX,256 - geiger_cpm, RED);
			} else {
				m_lcd->drawLine(m_chartX, 64 - m_data->bmp180_temp_last, m_chartX, 64 - bmp180_temp, BLUE);
				m_lcd->drawLine(m_chartX, 96 - m_data->bmp180_pressure_last, m_chartX, 96 - bmp180_pressure, BLUE);
				m_lcd->drawLine(m_chartX, 128 - m_data->bmp180_altitude_last, m_chartX, 128 - bmp180_altitude, BLUE);
				m_lcd->drawLine(m_chartX, 160 - m_data->gp2y10_dust_last, m_chartX, 160 - gp2y10_dust, PURPLE);
				m_lcd->drawLine(m_chartX, 192 - m_data->vz89_co2_last, m_chartX, 192 - vz89_co2, DARKGREEN);
				m_lcd->drawLine(m_chartX, 224 - m_data->vz89_voc_last, m_chartX, 224 - vz89_voc, DARKGREEN);
				m_lcd->drawLine(m_chartX, 256 - m_data->geiger_cpm_last, m_chartX, 256 - geiger_cpm, RED);
			}

			if (m_chartX < 240) {
				m_chartX ++;
				// clear in front
				m_lcd->drawRectFilled(m_chartX, 32, 1, 225, WHITE);
				// save last values
				m_data->bmp180_temp_last = bmp180_temp;
				m_data->bmp180_pressure_last = bmp180_pressure;
				m_data->bmp180_altitude_last = bmp180_altitude;
				m_data->gp2y10_dust_last = gp2y10_dust;
				m_data->vz89_co2_last = vz89_co2;
				m_data->vz89_voc_last = vz89_voc;
				m_data->geiger_cpm_last = geiger_cpm;

			}
			else
				m_chartX  = 120;
		}
		break;
		case PAGE_MONITOR: {
			m_lcd->drawStringF(8,  104, 2, BLUE, WHITE,      "Sent:    %09luB", m_data->serial_sent);
			m_lcd->drawStringF(8,  120, 2, BLUE, WHITE,      "Received:%09luB", m_data->serial_recv);
			m_lcd->drawStringF(8,  168, 2, DARKGREEN, WHITE, "Sent:    %09luB", m_data->wlan_sent);
			m_lcd->drawStringF(8,  184, 2, DARKGREEN, WHITE, "Received:%09luB", m_data->wlan_recv);
			m_lcd->drawStringF(8,  216, 2, BLACK, WHITE, "Tube: %3uV", m_data->geiger_voltage);
			m_lcd->drawStringF(8,  232, 2, BLACK, WHITE, "Battery: %2.2fV", m_data->battery_voltage);
		} break;
		case PAGE_SETTINGS: {
			// nothing to update here
		} break;
		case PAGE_CALIBRATE: {
			m_lcd->drawStringF(CENTERX,  CENTERY, 2, BLUE, WHITE, "%04d,%04d,%04d", m_touch->lastRawX, m_touch->lastRawY, m_touch->lastRawZ);
			m_lcd->drawPixel(m_touchX, m_touchY,3, RED);
		}
		break;
		case PAGE_WLAN: {
			if (m_butCount != m_data->freeAPCount + 1) // count the back button
				drawPage(PAGE_WLAN);
		}
	}
}
Example #8
0
void SpellBookView::draw()
{
  Gfx::draw(LSI(SPELLS,0), 16, 11);
  drawPage(0);
  drawPage(1);
}
Example #9
0
int main(void) {

  consoleDemoInit();

  //videoSetMode(MODE_FB0);
  videoSetMode( MODE_5_2D );
  vramSetBankA(VRAM_A_MAIN_BG);
  vramSetBankB(VRAM_B_MAIN_BG);
  // vramSetBankC(VRAM_C_MAIN_BG);
  // vramSetBankD(VRAM_D_MAIN_BG_0x06040000);
  int bg = bgInit(3, BgType_Bmp8, BgSize_B8_512x512, 0,0);  //vramSetBankA(VRAM_A_LCD);

  lcdMainOnBottom();
  // lcdMainOnTop();

  printf("Video modes configured\n");
  printf("BG ID %d\n", bg);

  if (fatInitDefault())
    printf("FAT initialized\n");
  else
    printf("FAT initialization failed\n");

  AppState state;
  uiOpenNotebook(state);

  // Keyboard *kbd =  keyboardDemoInit();

  Segment * currentSegment = NULL;


  touchPosition touch;

  while (1) {
    scanKeys();
    
    if(keysHeld() & KEY_TOUCH)
      {
	// write the touchscreen coordinates in the touch variable
	touchRead(&touch);
	
	Point screenPoint = Point(touch.px, touch.py);
	Point imagePoint = state.convertScreenToImage(screenPoint);

	if (currentSegment == NULL) {
	  state.currentPage->segments.push_back(Segment());
	  currentSegment = &(state.currentPage->segments[state.currentPage->segments.size()-1]);
	  currentSegment->points.push_back(imagePoint);
	  continue;
	}

	Point lastImagePoint = currentSegment->points[currentSegment->points.size()-1];
	currentSegment->points.push_back(imagePoint);

	Point bufferPoint = state.convertScreenToBuffer(screenPoint);
	Point lastBufferPoint = state.convertImageToBuffer(lastImagePoint);
	drawLine(lastBufferPoint.x, lastBufferPoint.y,  bufferPoint.x, bufferPoint.y, RGB15(31,0,0) | BIT(15));
      }    
    else {
      currentSegment = NULL;
    }
    if (keysDown() & KEY_X) {
      int page = state.lastPage+1;
      while (state.notebook.pages.size() < page+1) {
	state.notebook.pages.push_back(Page());
	printf("New Page created\n");
      }
      state.currentPage = &(state.notebook.pages[page]);
      currentSegment = NULL;

      printf("Display page %d\n", page);

      fillDisplay(RGB15(0,0,0) | BIT(15), page, state);
      drawPage(state.currentPage, RGB15(31,0,0) | BIT(15), state);
    }
    if (keysDown() & KEY_Y) {
      int page = 0;
      if (state.lastPage > 0) {
	page = state.lastPage-1;
      }
      state.currentPage = &(state.notebook.pages[page]);
      currentSegment = NULL;

      printf("Display page %d\n", page);

      fillDisplay(RGB15(0,0,0) | BIT(15), page, state);
      drawPage(state.currentPage, RGB15(31,0,0) | BIT(15), state);
    }
    if (keysDown() & KEY_A) {
      int page = 0;
      std::string fileName = state.notebookName + "/notes.txt";
      state.notebook = loadFile(fileName.c_str());

      state.currentPage = &(state.notebook.pages[page]);
      currentSegment = NULL;

      printf("Display page %d\n", page);

      fillDisplay(RGB15(0,0,0) | BIT(15), page, state);
      drawPage(state.currentPage, RGB15(31,0,0) | BIT(15), state);
    }
    if (keysDown() & KEY_B) {
      std::string fileName = state.notebookName + "/notes.txt";
      saveFile(fileName.c_str(), state.notebook);
    }
    if (keysDown() & KEY_LEFT) {
      state.scroll_x-=50;
      updateCenter(state);
    }
    if (keysDown() & KEY_RIGHT) {
      state.scroll_x+=50;
      updateCenter(state);
    }
    if (keysDown() & KEY_UP) {
      state.scroll_y-=50;
      updateCenter(state);
    }
    if (keysDown() & KEY_DOWN) {
      state.scroll_y+=50;
      updateCenter(state);
    }
    if (keysDown() & KEY_START) {
      uiOpenNotebook(state);
    }

    swiWaitForVBlank();
  }
}
Example #10
0
 void uiOpenNotebook(AppState & state) {
   lcdMainOnTop();

   DIR_ITER* dir = diropen (MAINPATH);
   if (dir == NULL) {
     printf("Marginalia data not found\n");
     return;
   }

   printf("\x1b[2J");
   printf("Select notebook to open\n(Press Select to create NEW)");

   struct stat st;
   char filename[MAXPATHLEN];
   int i=0;

   std::vector<std::string> notebooks;

   while (dirnext(dir, filename, &st) == 0) {
     // st.st_mode & S_IFDIR indicates a directory
     // if (!(st.st_mode & S_IFDIR))
     //   continue;
     // if (strcmp(filename, "..") == 0)
     //   continue;
     // if (strcmp(filename, ".") == 0)
     //   continue;
     printf ("\x1b[%d;3H%d)   %s\n", i+3, i, filename);
     notebooks.push_back(filename);
     i++;
   }
   dirclose (dir);
   int selected = 0;
   printf ("\x1b[%d;6H*", selected+3);
   
   while (1) {
    scanKeys();
    
    if(keysHeld() & KEY_TOUCH)
      {
      }    
    if (keysDown() & KEY_X) {
    }
    if (keysDown() & KEY_Y) {
    }
    if (keysDown() & KEY_SELECT) {
      printf ("\x1b[10;1H Insert new Directory Name");
      char newName[256];

      Keyboard *kbd =  keyboardDemoInit();

      scanf("%s", newName);
      printf ("\x1b[11;1H Creating directory %s", newName);

      state.notebookName = newName;
      if (mkdir(state.notebookName.c_str(), S_IRWXU|S_IRGRP|S_IXGRP) != 0) {
	printf ("\x1b[12;1H directory creation failed");
	continue;
      }
      
      state.lastPage = -1;
      state.scroll_x = 0;
      state.scroll_y = 0;

      state.center_x = MY_BG_W/2;
      state.center_y = MY_BG_H/2;

      fillDisplay(RGB15(0,0,0) | BIT(15), 0, state);

      std::string fileName = state.notebookName + "/notes.txt";
      state.notebook = loadFile(fileName.c_str());
      state.currentPage = &(state.notebook.pages[0]);

      drawPage(state.currentPage, RGB15(31,31,31) | BIT(15), state);
      lcdMainOnBottom();
      return;
    }
    if (keysDown() & KEY_A) {
      printf ("\x1b[20;6H opening %s\n", notebooks[selected].c_str());
      state.lastPage = -1;
      state.scroll_x = 0;
      state.scroll_y = 0;

      state.center_x = MY_BG_W/2;
      state.center_y = MY_BG_H/2;

      state.notebookName = notebooks[selected];

      fillDisplay(RGB15(0,0,0) | BIT(15), 0, state);

      std::string fileName = state.notebookName + "/notes.txt";
      state.notebook = loadFile(fileName.c_str());
      state.currentPage = &(state.notebook.pages[0]);

      drawPage(state.currentPage, RGB15(31,31,31) | BIT(15), state);
      lcdMainOnBottom();
      return;
    }
    if (keysDown() & KEY_B) {
    }
    if (keysDown() & KEY_LEFT) {
    }
    if (keysDown() & KEY_RIGHT) {
    }
    if (keysDown() & KEY_UP) {
      printf ("\x1b[%d;6H ", selected+3);
      selected -= 1;
      printf ("\x1b[%d;6H*", selected+3);
    }
    if (keysDown() & KEY_DOWN) {
      printf ("\x1b[%d;6H ", selected+3);
      selected += 1;
      printf ("\x1b[%d;6H*", selected+3);
    }

    swiWaitForVBlank();
  }
 }
Example #11
0
void Gui::exportAs(QString &suffix)
{
    float pageWidth = page.meta.LPub.page.size.value(0);
    float pageHeight = page.meta.LPub.page.size.value(1);
    if (page.meta.LPub.resolution.type() == DPI) {
        // convert to MM
        pageWidth = int(inches2centimeters(pageWidth)*10);
        pageHeight = int(inches2centimeters(pageHeight)*10);
    }

    QPrinter::PaperSize paperSize = QPrinter::PaperSize();
    QPrinter::Orientation orientation = QPrinter::Orientation();
    int bestSize;
    bestSize = bestPaperSizeOrientation(pageWidth,pageHeight,paperSize,orientation);

    // Convert closest page size to pixels for bounding rect

    if (orientation == QPrinter::Portrait) {
        pageWidth = paperSizes[bestSize].width/10.0;  // in centimeters
        pageHeight = paperSizes[bestSize].height/10.0; // in centimeters
    } else {
        pageWidth = paperSizes[bestSize].height/10.0;  // in centimeters
        pageHeight = paperSizes[bestSize].width/10.0; // in centimeters
    }

    if (resolutionType() == DPI) {
        pageWidth = centimeters2inches(pageWidth);
        pageHeight = centimeters2inches(pageHeight);
    }
    pageWidth *= resolution();
    pageHeight *= resolution();
    if (resolutionType() == DPCM) {
        pageWidth = centimeters2inches(pageWidth);
        pageHeight = centimeters2inches(pageHeight);
    }

    QGraphicsScene scene;
    LGraphicsView  view(&scene);

    int savePageNumber = displayPageNum;

    QFileInfo fileInfo(curFile);
    QString   baseName = fileInfo.baseName();

    //clearPage(KpageView,KpageScene);

    // Strangeness needing to warm up the process?

    QImage image(pageWidth,pageHeight,QImage::Format_ARGB32);

    for (displayPageNum = 1;
            displayPageNum <= maxPages && displayPageNum < 6;
            displayPageNum++) {

        qApp->processEvents();

        QRect  bounding(0,0,pageWidth,pageHeight);
        view.setGeometry(bounding);
        view.setRenderHints(QPainter::Antialiasing |
                            QPainter::TextAntialiasing |
                            QPainter::SmoothPixmapTransform);
        view.scale(1.0,1.0);
        QRectF boundingRect(0.0,0.0,pageWidth,pageHeight);
        view.centerOn(boundingRect.center());
        drawPage(&view,&scene,true);

        QPainter painter;
        painter.begin(&image);
        view.render(&painter);
        QString pn = QString("%1") .arg(displayPageNum);
        image.save(baseName + "_page_" +pn + suffix);
        painter.end();

        clearPage(&view,&scene);
    }

    for (displayPageNum = 1; displayPageNum <= maxPages; displayPageNum++) {

        qApp->processEvents();

        QRect  bounding(0,0,pageWidth,pageHeight);
        view.setGeometry(bounding);
        view.setRenderHints(QPainter::Antialiasing |
                            QPainter::TextAntialiasing |
                            QPainter::SmoothPixmapTransform);
        view.scale(1.0,1.0);
        QRectF boundingRect(0.0,0.0,pageWidth,pageHeight);
        view.centerOn(boundingRect.center());
        drawPage(&view,&scene,true);

        QPainter painter;
        painter.begin(&image);
        view.render(&painter);
        QString pn = QString("%1") .arg(displayPageNum);
        image.save(baseName + "_page_" +pn + suffix);
        painter.end();

        clearPage(&view,&scene);
    }
    displayPageNum = savePageNumber;
    drawPage(KpageView,KpageScene,false);
}
Example #12
0
void Gui::printToFile()
{
    float pageWidth = page.meta.LPub.page.size.value(0);
    float pageHeight = page.meta.LPub.page.size.value(1);

    if (page.meta.LPub.resolution.type() == DPI) {
        // convert to MM
        pageWidth = int(inches2centimeters(pageWidth));
        pageHeight = int(inches2centimeters(pageHeight));
    }
    pageWidth  *= 10;  // convert to mm
    pageHeight *= 10;

    QPrinter::PaperSize paperSize = QPrinter::PaperSize();
    QPrinter::Orientation orientation = QPrinter::Orientation();
    int bestSize;
    bestSize = bestPaperSizeOrientation(pageWidth,pageHeight,paperSize,orientation);

    // Convert closest page size to pixels for bounding rect

    if (orientation == QPrinter::Portrait) {
        pageWidth = paperSizes[bestSize].width/10.0;  // in centimeters
        pageHeight = paperSizes[bestSize].height/10.0; // in centimeters
    } else {
        pageWidth = paperSizes[bestSize].height/10.0;  // in centimeters
        pageHeight = paperSizes[bestSize].width/10.0; // in centimeters
    }

    if (resolutionType() == DPI) {
        pageWidth = centimeters2inches(pageWidth);
        pageHeight = centimeters2inches(pageHeight);
    }

    pageWidth *= resolution();
    pageHeight *= resolution();

    if (resolutionType() == DPCM) {
        pageWidth = centimeters2inches(pageWidth);
        pageHeight = centimeters2inches(pageHeight);
    }

    QFileInfo fileInfo(curFile);
    QString   baseName = fileInfo.baseName();

    QString fileName = QFileDialog::getSaveFileName(
                           this,
                           tr("Print File Name"),
                           QDir::currentPath() + "/" + baseName,
                           tr("PDF (*.pdf)\nPDF (*.PDF)"));

    if (fileName == "") {
        return;
    }

    fileInfo.setFile(fileName);

    QString suffix = fileInfo.suffix();
    if (suffix == "") {
        fileName += ".pdf";
    } else if (suffix != ".pdf" && suffix != ".PDF") {
        fileName = fileInfo.path() + "/" + fileInfo.completeBaseName() + ".pdf";
    }

    QPrinter printer(QPrinter::ScreenResolution);
    printer.setOutputFileName(fileName);
    printer.setOrientation(orientation);
    printer.setPaperSize(paperSize);
    printer.setPageMargins(0,0,0,0,QPrinter::Inch);
    printer.setFullPage(true);

    QPainter painter;
    painter.begin(&printer);

    int savePageNumber = displayPageNum;

    QGraphicsScene scene;
    LGraphicsView  view(&scene);

    QRectF boundingRect(0.0,0.0,pageWidth,pageHeight);
    QRect  bounding(0,0,pageWidth,pageHeight);
    view.setMinimumSize(pageWidth,pageHeight);
    view.setMaximumSize(pageWidth,pageHeight);
    view.setGeometry(bounding);
    view.setSceneRect(boundingRect);
    view.setRenderHints(QPainter::Antialiasing |
                        QPainter::TextAntialiasing |
                        QPainter::SmoothPixmapTransform);

    view.scale(1.0,1.0);
    view.centerOn(boundingRect.center());
    clearPage(&view,&scene);

    for (displayPageNum = 1; displayPageNum <= maxPages; displayPageNum++) {

        qApp->processEvents();

        drawPage(&view,&scene,true);
        view.render(&painter);
        clearPage(&view,&scene);

        if (maxPages - displayPageNum > 0) {
            printer.newPage();
        }
    }
    painter.end();
    displayPageNum = savePageNumber;
    drawPage(KpageView,KpageScene,false);
}
Example #13
0
kdvi::kdvi( char *fname, QWidget *, const char *name )
    : KTopLevelWidget( name )
{
    msg = NULL;
    ssmenu = NULL;
    hbl = NULL;
    prefs = NULL;

    keys = new KAccel(this);

    readConfig();
    setMinimumSize( 400, 60 );
    setCaption( kapp->getCaption() );
    tipgroup = new QToolTipGroup( this, "TipGroup" );
    connect( tipgroup, SIGNAL(showTip(const char *)), SLOT(showTip(const char *)) );
    connect( tipgroup, SIGNAL(removeTip()), SLOT(removeTip()) );

    // Create KPanner for toolBar2 and dviwindow

    kpan = new KPanner( this, "panner",
                        KPanner::O_VERTICAL|KPanner::U_ABSOLUTE, 100);
    setView( kpan, TRUE );
    setFrameBorderWidth( 4 );
    kpan->setAbsSeparator( pannerValue );
    connect( kpan, SIGNAL(positionChanged()), SLOT(pannerChanged()) );

    // Create a dvi window

    dviwin = new dviWindow( basedpi, mfmode, paper, makepk,
                            kpan->child1(), "dviWindow" );
    connect( dviwin, SIGNAL(currentPage(int)), SLOT(setPage(int)) );
    connect( dviwin, SIGNAL(shrinkChanged(int)), SLOT(shrinkChanged(int)) );
    connect( dviwin, SIGNAL(fileChanged()), SLOT(fileChanged()) );
    connect( dviwin, SIGNAL(statusChange(const char *)),
             SLOT(showTip(const char *)) );
    connect( dviwin, SIGNAL(setPoint(QPoint)), SLOT(showPoint(QPoint)) );

    // Create a menubar

    menuBar = NULL;
    makeMenuBar();

    // Create toolbars

    toolBar = NULL;
    makeButtons();
    makeToolBar2( kpan->child0() );

    // Create a statusbar

    statusBar = NULL;
    makeStatusBar( i18n("No document") );

    // Lay out widgets

    QBoxLayout *l;
    l = new QBoxLayout( kpan->child0(), QBoxLayout::LeftToRight );
    l->addWidget( toolBar2 );
    l->activate();
    l = new QBoxLayout( kpan->child1(), QBoxLayout::LeftToRight );
    l->addWidget( dviwin );
    l->activate();

    // Create RMB menu

    rmbmenu = new QPopupMenu;
    rmbmenu->setMouseTracking( TRUE );
    rmbmenu->connectItem( rmbmenu->insertItem(i18n("Toggle Menubar")),
                          this, SLOT(toggleShowMenubar()) );
    rmbmenu->connectItem( rmbmenu->insertItem(i18n("Mark page")),
                          marklist, SLOT(markSelected()) );
    rmbmenu->connectItem( rmbmenu->insertItem(i18n("Redraw")),
                          dviwin, SLOT(drawPage()) );
    rmbmenu->connectItem( rmbmenu->insertItem(i18n("Preferences ...")),
                          this, SLOT(optionsPreferences()) );

    // Bind keys

    bindKeys();
    updateMenuAccel();

// Drag and drop

    KDNDDropZone * dropZone = new KDNDDropZone( this , DndURL);
    connect( dropZone, SIGNAL( dropAction( KDNDDropZone *) ),
             SLOT( dropEvent( KDNDDropZone *) ) );

    // Read config options

    applyPreferences();

    selectSmall();
    dviwin->installEventFilter( this );

    message( "" );
    openFile(QString(fname));
}
Example #14
0
void kdvi::makeMenuBar()
{
    if (menuBar) delete menuBar;
    menuBar = new KMenuBar( this );
    CHECK_PTR( menuBar );

    QPopupMenu *p = new QPopupMenu;
    CHECK_PTR( p );

    m_fn = p->insertItem( i18n("&New"),	this, SLOT(fileNew()) );
    m_fo = p->insertItem( i18n("&Open ..."),	this, SLOT(fileOpen()) );

    recentmenu = new QPopupMenu;
    CHECK_PTR( recentmenu );

    connect( recentmenu, SIGNAL(activated(int)), SLOT(openRecent(int)) );

    m_fr = p->insertItem( i18n("Open &recent"),	recentmenu );

    m_fp = p->insertItem( i18n("&Print ..."),	this, SLOT(filePrint()));
    m_fx = p->insertItem( i18n("E&xit"), this, SLOT(fileExit()));

    m_f = p;
    menuBar->insertItem( i18n("&File"), p, -2 );

    p = new QPopupMenu;
    CHECK_PTR( p );
    m_vi = p->insertItem( i18n("Zoom &in"),	dviwin, SLOT(prevShrink()) );
    m_vo = p->insertItem( i18n("Zoom &out"),	dviwin, SLOT(nextShrink()) );
    m_vf = p->insertItem( i18n("&Fit to page"),	this, SLOT(viewFitPage()) );
    m_vw = p->insertItem( i18n("Fit to page &width"),	this, SLOT(viewFitPageWidth()));
    p->insertSeparator();
    m_vr = p->insertItem( i18n("&Redraw page"),	dviwin, SLOT(drawPage()) );

    m_v = p;
    menuBar->insertItem( i18n("&View"), p, -2 );

    p = new QPopupMenu;
    CHECK_PTR( p );
    m_pp = p->insertItem( i18n("&Previous"),	dviwin, SLOT(prevPage()) );
    m_pn = p->insertItem( i18n("&Next"),		dviwin, SLOT(nextPage()) );
    m_pf = p->insertItem( i18n("&First"),	dviwin, SLOT(firstPage()) );
    m_pl = p->insertItem( i18n("&Last"),		dviwin, SLOT(lastPage()) );
    m_pg = p->insertItem( i18n("&Go to ..."),	this,   SLOT(pageGoto()) );

    m_p = p;
    menuBar->insertItem( i18n("&Page"), p, -2 );

    p = new QPopupMenu;
    CHECK_PTR( p );
    p->setCheckable( TRUE );
    m_op = p->insertItem( i18n("&Preferences ..."), this, SLOT(optionsPreferences()));
    m_ok = p->insertItem( i18n("&Keys ..."), this, SLOT(configKeys()));
    p->insertSeparator();
    m_of = p->insertItem( i18n("Make PK-&fonts"), this, SLOT(toggleMakePK()) );
    p->setItemChecked( m_of, makepk );
    m_o0 = p->insertItem( i18n("Show PS"), this, SLOT(toggleShowPS()));
    p->setItemChecked( m_o0, showPS );
    m_om = p->insertItem( i18n("Show &Menubar"), this, SLOT(toggleShowMenubar()) );
    p->setItemChecked( m_om, !hideMenubar );
    m_ob = p->insertItem( i18n("Show &Buttons"), this, SLOT(toggleShowButtons()) );
    p->setItemChecked( m_ob, !hideButtons );
    m_ot = p->insertItem( i18n("Show Page Lis&t"), this, SLOT(toggleVertToolbar()) );
    p->setItemChecked( m_ol, vertToolbar );
    m_os = p->insertItem( i18n("Show &Statusbar"), this, SLOT(toggleShowStatusbar()) );
    p->setItemChecked( m_os, !hideStatusbar );
    m_ol = p->insertItem( i18n("Show Scro&llbars"), this, SLOT(toggleShowScrollbars()) );
    p->setItemChecked( m_ol, !hideScrollbars );

    m_o = p;
    menuBar->insertItem( i18n("&Options"), p, -2 );
    optionsmenu = p;

    menuBar->insertSeparator();

    QPopupMenu *help = kapp->getHelpMenu(true, QString(i18n("DVI Viewer"))
                                         + " " + KDVI_VERSION
                                         + i18n("\n\nby Markku Hihnala")
                                         + " ([email protected])");

    m_h = p;
    menuBar->insertItem( i18n("&Help"), help );
    if ( hideMenubar )	menuBar->hide();
    setMenu( menuBar );
}
Example #15
0
int Gui::findPage(
  LGraphicsView  *view,
  QGraphicsScene *scene,
  int            &pageNum,
  QString const  &addLine,
  Where          &current,
  bool            isMirrored,
  Meta            meta,
  bool            printing)
{
  bool stepGroup  = false;
  bool partIgnore = false;
  bool coverPage  = false;
  bool stepPage   = false;
  bool bfxStore1  = false;
  bool bfxStore2  = false;
  QStringList bfxParts;
  int  partsAdded = 0;
  int  stepNumber = 1;
  Rc   rc;
  
  skipHeader(current);

  if (pageNum == 1) {
    topOfPages.clear();
    topOfPages.append(current);
  }

  QStringList csiParts;
  QStringList saveCsiParts;
  Where       saveCurrent = current;
  Where       stepGroupCurrent;
  int         saveStepNumber = 1;
              saveStepPageNum = stepPageNum;
              
  Meta        saveMeta = meta;

  QHash<QString, QStringList> bfx;
  QHash<QString, QStringList> saveBfx;

  int numLines = ldrawFile.size(current.modelName);

  Where topOfStep = current;
  
  ldrawFile.setRendered(current.modelName, isMirrored);

  for ( ;
       current.lineNumber < numLines;
       current.lineNumber++) {

    // scan through the rest of the model counting pages
    // if we've already hit the display page, then do as little as possible

    QString line = ldrawFile.readLine(current.modelName,current.lineNumber).trimmed();

    if (line.startsWith("0 GHOST ")) {
      line = line.mid(8).trimmed();
    }

    switch (line.toAscii()[0]) {
      case '1':
        if ( ! partIgnore) {

          csiParts << line;

          if (firstStepPageNum == -1) {
            firstStepPageNum = pageNum;
          }
          lastStepPageNum = pageNum;

          QStringList token;
          
          split(line,token);
          
          QString    type = token[token.size()-1];
          
          isMirrored = ldrawFile.mirrored(token);
          bool contains   = ldrawFile.contains(type);
          bool rendered   = ldrawFile.rendered(type,isMirrored);
                    
          if (contains) {
            if ( ! rendered && ! bfxStore2) {
              
              // can't be a callout
              SubmodelStack tos(current.modelName,current.lineNumber,stepNumber);
              meta.submodelStack << tos;
              Where current2(type,0);

              findPage(view,scene,pageNum,line,current2,isMirrored,meta,printing);
              saveStepPageNum = stepPageNum;
              meta.submodelStack.pop_back();
            }
          }
          if (bfxStore1) {
            bfxParts << token[1]+type;
          }
        }
      case '2':
      case '3':
      case '4':
      case '5':
        ++partsAdded;
        csiParts << line;
      break;

      case '0':
        rc = meta.parse(line,current);
        switch (rc) {
          case StepGroupBeginRc:
            stepGroup = true;
            stepGroupCurrent = topOfStep;
          break;
          case StepGroupEndRc:
            if (stepGroup) {
              stepGroup = false;
              if (pageNum < displayPageNum) {
                saveCsiParts   = csiParts;
                saveStepNumber = stepNumber;
                saveMeta       = meta;
                saveBfx        = bfx;
              } else if (pageNum == displayPageNum) {
                csiParts.clear();
                stepPageNum = saveStepPageNum;
                if (pageNum == 1) {
                  page.meta = meta;
                } else {
                  page.meta = saveMeta;
                }
                page.meta.pop();

                QStringList pliParts;
                
                (void) drawPage(view,
                                scene,
                                &page,
                                saveStepNumber,
                                addLine,
                                stepGroupCurrent,
                                saveCsiParts,
                                pliParts,
                                isMirrored,
                                saveBfx,
                                printing,
                                bfxStore2,
                                bfxParts);
                                
                saveCurrent.modelName.clear();
                saveCsiParts.clear();
              }
              ++pageNum;
              topOfPages.append(current);
              saveStepPageNum = ++stepPageNum;
            }
          break;

          case StepRc:
          case RotStepRc:
            if (partsAdded) {
              stepNumber += ! coverPage && ! stepPage;
              stepPageNum += ! coverPage && ! stepGroup;
              if (pageNum < displayPageNum) {
                if ( ! stepGroup) {
                  saveCsiParts   = csiParts;
                  saveStepNumber = stepNumber;
                  saveMeta       = meta;
                  saveBfx        = bfx;
                  saveStepPageNum = stepPageNum;
                }
                saveCurrent    = current;
              }
              if ( ! stepGroup) {
                if (pageNum == displayPageNum) {
                  csiParts.clear();
                  stepPageNum = saveStepPageNum;
                  if (pageNum == 1) {
                    page.meta = meta;
                  } else {
                    page.meta = saveMeta;
                  }
                  page.meta.pop();
                  QStringList pliParts;
                                    
                  (void) drawPage(view,
                                  scene,
                                  &page,
                                  saveStepNumber,
                                  addLine,
                                  saveCurrent,
                                  saveCsiParts,
                                  pliParts,
                                  isMirrored,
                                  saveBfx,
                                  printing,
                                  bfxStore2,
                                  bfxParts);

                  saveCurrent.modelName.clear();
                  saveCsiParts.clear();
                } 
                ++pageNum;
                topOfPages.append(current);
              }
              topOfStep = current;
              partsAdded = 0;
              meta.pop();
              coverPage = false;
              stepPage = false;
              bfxStore2 = bfxStore1;
              bfxStore1 = false;
              if ( ! bfxStore2) {
                bfxParts.clear();
              }
            } else if ( ! stepGroup) {
              saveCurrent = current;  // so that draw page doesn't have to
                                      // deal with steps that are not steps
            }
          break;  

          case CalloutBeginRc:
            ++current;
            {
              Meta tmpMeta;
              while (rc != CalloutEndRc && current.lineNumber < numLines) {
                line = ldrawFile.readLine(current.modelName,current.lineNumber++).trimmed();
                rc = OkRc;
                if (line[0] == '0') {
                  rc = tmpMeta.parse(line,current);
                } else if (line[0] >= '1' && line[0] <= '5') {
                  if (line[0] == '1') {
                    partsAdded++;
                    csiParts << line;
                  }
                }
              }
            }
            --current;
          break;
          
          case InsertCoverPageRc:
            coverPage  = true;
            partsAdded = true;
          break;
          case InsertPageRc:
            stepPage   = true;
            partsAdded = true;
          break;
          
          case PartBeginIgnRc:
            partIgnore = true;
          break;
          case PartEndRc:
            partIgnore = false;
          break;

          // Any of the metas that can change csiParts needs
          // to be processed here

          case ClearRc:
            csiParts.empty();
          break;

          /* Buffer exchange */
          case BufferStoreRc:
            if (pageNum < displayPageNum) {
              bfx[meta.bfx.value()] = csiParts;
            }
            bfxStore1 = true;
            bfxParts.clear();
          break;
          case BufferLoadRc:
            if (pageNum < displayPageNum) {
              csiParts = bfx[meta.bfx.value()];
            }
            partsAdded = true;
          break;

          case MLCadGroupRc:
            if (pageNum < displayPageNum) {
              csiParts << line;
              partsAdded++;
            }
          break;

          /* remove a group or all instances of a part type */
          case GroupRemoveRc:
          case RemoveGroupRc:
          case RemovePartRc:
          case RemoveNameRc:
            if (pageNum < displayPageNum) {
              QStringList newCSIParts;
              if (rc == RemoveGroupRc) {
                remove_group(csiParts,    meta.LPub.remove.group.value(),newCSIParts);
              } else if (rc == RemovePartRc) {
                remove_parttype(csiParts, meta.LPub.remove.parttype.value(),newCSIParts);
              } else {
                remove_partname(csiParts, meta.LPub.remove.partname.value(),newCSIParts);
              }
              csiParts = newCSIParts;
              newCSIParts.empty();
            }
          break;
          
          case IncludeRc:
            include(meta);
          break;
          
          default:
          break;
        } // switch
      break;
    }
  } // for every line
  csiParts.clear();
  if (partsAdded) {
    if (pageNum == displayPageNum) {
      page.meta = saveMeta;
      QStringList pliParts;
      (void) drawPage(view,
                      scene,
                      &page,
                      saveStepNumber,
                      addLine,
                      saveCurrent,
                      saveCsiParts,
                      pliParts,
                      isMirrored,
                      bfx,
                      printing,
                      bfxStore2,
                      bfxParts);
    }
    ++pageNum;
    topOfPages.append(current);
    ++stepPageNum;
  }
  return 0;
}
Example #16
0
int Gui::drawPage(
  LGraphicsView  *view,
  QGraphicsScene *scene,
  Steps          *steps,
  int             stepNum,
  QString const  &addLine,
  Where          &current,
  QStringList    &csiParts,
  QStringList    &pliParts,
  bool            isMirrored,
  QHash<QString, QStringList> &bfx,
  bool            printing,
  bool            bfxStore2,
  QStringList    &bfxParts,
  bool            calledOut)
{
  bool        global = true;
  QString     line;
  Callout    *callout     = NULL;
  Range      *range       = NULL;
  Step       *step        = NULL;
  bool        pliIgnore   = false;
  bool        partIgnore  = false;
  bool        synthBegin  = false;
  bool        multiStep   = false;
  bool        partsAdded  = false;
  bool        coverPage   = false;
  bool        bfxStore1   = false;
  bool        bfxLoad     = false;
  int         numLines = ldrawFile.size(current.modelName);
  bool        firstStep   = true;
  
  steps->isMirrored = isMirrored;
  
  QList<InsertMeta> inserts;
  
  Where topOfStep = current;
  Rc gprc = OkRc;
  Rc rc;

  statusBar()->showMessage("Processing " + current.modelName);

  page.coverPage = false;

  QStringList calloutParts;

  /*
   * do until end of page
   */
  for ( ; current <= numLines; current++) {

    Meta   &curMeta = callout ? callout->meta : steps->meta;

    QStringList tokens;

    // If we hit end of file we've got to note end of step

    if (current >= numLines) {
      line.clear();
      gprc = EndOfFileRc;
      tokens << "0";
      
      // not end of file, so get the next LDraw line 
     
    } else {
      line = ldrawFile.readLine(current.modelName,current.lineNumber);
      split(line,tokens);
    }
    
    if (tokens.size() == 15 && tokens[0] == "1") {
      
      QString color = tokens[1];
      QString type  = tokens[tokens.size()-1];

      csiParts << line;
      partsAdded = true;

      /* since we have a part usage, we have a valid step */

      if (step == NULL) {
        if (range == NULL) {
          range = newRange(steps,calledOut);
          steps->append(range);
        }

        step = new Step(topOfStep,
                        range,
                        stepNum,
                        curMeta,
                        calledOut,
                        multiStep);

        range->append(step);
      }

      /* addition of ldraw parts */

      if (curMeta.LPub.pli.show.value()
          && ! pliIgnore 
          && ! partIgnore 
          && ! synthBegin) {
        QString colorType = color+type;
        if (! isSubmodel(type) || curMeta.LPub.pli.includeSubs.value()) {
          if (bfxStore2 && bfxLoad) {
            bool removed = false;
            for (int i = 0; i < bfxParts.size(); i++) {
              if (bfxParts[i] == colorType) {
                bfxParts.removeAt(i);
                removed = true;
                break;
              }
            }
            if ( ! removed) {
              pliParts << Pli::partLine(line,current,steps->meta);
            }
          } else {
            pliParts << Pli::partLine(line,current,steps->meta);
          }
        }
        if (bfxStore1) {
          bfxParts << colorType;
        }
      }

      /* if it is a sub-model, then process it */

      if (ldrawFile.contains(type) && callout) {

        /* we are a callout, so gather all the steps within the callout */
        /* start with new meta, but no rotation step */

        if (callout->bottom.modelName != type) {

          Where current2(type,0);
          skipHeader(current2);          
          callout->meta.rotStep.clear();
          SubmodelStack tos(current.modelName,current.lineNumber,stepNum);
          callout->meta.submodelStack << tos;

          Meta saveMeta = callout->meta;
          callout->meta.LPub.pli.constrain.resetToDefault();

          step->append(callout);

          calloutParts.clear();
          QStringList csiParts2;

          QHash<QString, QStringList> calloutBfx;

          int rc;

          rc = drawPage(
                 view,
                 scene,
                 callout,
                 1,
                 line,
                 current2,
                 csiParts2,
                 calloutParts,
                 ldrawFile.mirrored(tokens),
                 calloutBfx,
                 printing,
                 bfxStore2,
                 bfxParts,
                 true);

          callout->meta = saveMeta;

          if (callout->meta.LPub.pli.show.value() &&
            ! callout->meta.LPub.callout.pli.perStep.value() &&
            ! pliIgnore && ! partIgnore && ! synthBegin) {

            pliParts += calloutParts;
          }

          if (rc != 0) {
            steps->placement = steps->meta.LPub.assem.placement;
            return rc;
          }
        } else {
          callout->instances++;
          pliParts += calloutParts;
        }

        /* remind user what file we're working on */

        statusBar()->showMessage("Processing " + current.modelName);
      }
    } else if (tokens.size() > 0 &&
              (tokens[0] == "2" ||
               tokens[0] == "3" ||
               tokens[0] == "4" ||
               tokens[0] == "5")) {

      csiParts << line;
      partsAdded = true;

      /* we've got a line, triangle or polygon, so add it to the list */
      /* and make sure we know we have a step */

      if (step == NULL) {
        if (range == NULL) {            
          range = newRange(steps,calledOut);
          steps->append(range);
        }

        step = new Step(topOfStep,
                        range,
                        stepNum,
                        steps->meta,
                        calledOut,
                        multiStep);
        range->append(step);
      }

    } else if (tokens.size() > 0 && tokens[0] == "0" || gprc == EndOfFileRc) {
      
      /* must be meta-command (or comment) */
      if (global && tokens.contains("!LPUB") && tokens.contains("GLOBAL")) {
        topOfStep = current;
      } else {
        global = false;
      }

      QString part;

      if (gprc == EndOfFileRc) {
        rc = gprc;
      } else {
        rc = curMeta.parse(line,current,true);
      }

      /* handle specific meta-commands */

      switch (rc) {

        /* toss it all out the window, per James' original plan */
        case ClearRc:
          pliParts.clear();
          csiParts.clear();
          steps->freeSteps();
        break;

        /* Buffer exchange */
        case BufferStoreRc:
          bfx[curMeta.bfx.value()] = csiParts;
          bfxStore1 = true;
          bfxParts.clear();
        break;

        case BufferLoadRc:
          csiParts = bfx[curMeta.bfx.value()];
          bfxLoad = true;
        break;

        case MLCadGroupRc:
          csiParts << line;
        break;
        
        case IncludeRc:
          include(curMeta);
        break;

        /* substitute part/parts with this */

        case PliBeginSub1Rc:
          if (pliIgnore) {
            parseError("Nested PLI BEGIN/ENDS not allowed\n",current);
          } 
          if (steps->meta.LPub.pli.show.value() && 
              ! pliIgnore && 
              ! partIgnore && 
              ! synthBegin) {

            SubData subData = curMeta.LPub.pli.begin.sub.value();
            QString addPart = QString("1 0  0 0 0  0 0 0 0 0 0 0 0 0 %1") .arg(subData.part);
            pliParts << Pli::partLine(addPart,current,curMeta);
          }

          if (step == NULL) {
            if (range == NULL) {
              range = newRange(steps,calledOut);
              steps->append(range);
            }
            step = new Step(topOfStep,
                            range,
                            stepNum,
                            curMeta,
                            calledOut,
                            multiStep);
            range->append(step);
          }
          pliIgnore = true;
        break;

        /* substitute part/parts with this */
        case PliBeginSub2Rc:
          if (pliIgnore) {
            parseError("Nested BEGIN/ENDS not allowed\n",current);
          } 
          if (steps->meta.LPub.pli.show.value() &&
              ! pliIgnore &&
              ! partIgnore &&
              ! synthBegin) {

            SubData subData = curMeta.LPub.pli.begin.sub.value();
            QString addPart = QString("1 %1  0 0 0  0 0 0 0 0 0 0 0 0 %2") .arg(subData.color) .arg(subData.part);
            pliParts << Pli::partLine(addPart,current,curMeta);
          }

          if (step == NULL) {
            if (range == NULL) {
              range = newRange(steps,calledOut);
              steps->append(range);
            }
            step = new Step(topOfStep,
                            range,
                            stepNum,
                            curMeta,
                            calledOut,
                            multiStep);
            range->append(step);
          }
          pliIgnore = true;
        break;

        /* do not put subsequent parts into PLI */
        case PliBeginIgnRc:
          if (pliIgnore) {
            parseError("Nested BEGIN/ENDS not allowed\n",current);
          } 
          pliIgnore = true;
        break;
        case PliEndRc:
          if ( ! pliIgnore) {
            parseError("PLI END with no PLI BEGIN",current);
          }
          pliIgnore = false;
        break;

        /* discard subsequent parts, and don't create CSI's for them */
        case PartBeginIgnRc:
        case MLCadSkipBeginRc:
          if (partIgnore) {
            parseError("Nested BEGIN/ENDS not allowed\n",current);
          } 
          partIgnore = true;
        break;

        case PartEndRc:
        case MLCadSkipEndRc:
          if (partIgnore) {
            parseError("Ignore ending with no ignore begin",current);
          }
          partIgnore = false;
        break;

        case SynthBeginRc:
          if (synthBegin) {
            parseError("Nested BEGIN/ENDS not allowed\n",current);
          } 
          synthBegin = true;
        break;

        case SynthEndRc:
          if ( ! synthBegin) {
            parseError("Ignore ending with no ignore begin",current);
          }
          synthBegin = false;
        break;


        /* remove a group or all instances of a part type */
        case GroupRemoveRc:
        case RemoveGroupRc:
        case RemovePartRc:
        case RemoveNameRc:
          {
            QStringList newCSIParts;

            if (rc == RemoveGroupRc) {
              remove_group(csiParts,steps->meta.LPub.remove.group.value(),newCSIParts);
            } else if (rc == RemovePartRc) {
              remove_parttype(csiParts, steps->meta.LPub.remove.parttype.value(),newCSIParts);
            } else {
              remove_partname(csiParts, steps->meta.LPub.remove.partname.value(),newCSIParts);
            }
            csiParts = newCSIParts;

            if (step == NULL) {
              if (range == NULL) {
                range = newRange(steps,calledOut);
                steps->append(range);
              }
              step = new Step(topOfStep,
                              range,
                              stepNum,
                              curMeta,
                              calledOut,
                              multiStep);
              range->append(step);
            }
          }
        break;

        case ReserveSpaceRc:
          /* since we have a part usage, we have a valid step */
          if (calledOut || multiStep) {
            step = NULL;
            Reserve *reserve = new Reserve(current,steps->meta.LPub);
            if (range == NULL) {
              range = newRange(steps,calledOut);
              steps->append(range);
            }
            range->append(reserve);
          }
        break;
        
        case InsertCoverPageRc:
          coverPage = true;
          page.coverPage = true;

        case InsertPageRc:
          partsAdded = true;
        break;
        
        case InsertRc:
          inserts.append(curMeta.LPub.insert);  // these are always placed before any parts in step
        break;

        case CalloutBeginRc:
          if (callout) {
            parseError("Nested CALLOUT not allowed within the same file",current);
          } else {
            callout = new Callout(curMeta,view);
            callout->setTopOfCallout(current);
          }
        break;

        case CalloutDividerRc:
          if (range) {
            range->sepMeta = curMeta.LPub.callout.sep;
            range = NULL;
            step = NULL;
          }
        break;

        case CalloutPointerRc:
          if (callout) {
            callout->appendPointer(current,curMeta.LPub.callout);
          }
        break;

        case CalloutEndRc:
          if ( ! callout) {
            parseError("CALLOUT END without a CALLOUT BEGIN",current);
          } else {
            callout->parentStep = step;
            callout->parentRelativeType = step->relativeType;
            callout->pli.clear();
            callout->placement = curMeta.LPub.callout.placement;
            callout->setBottomOfCallout(current);
            callout = NULL;
          }
        break;

        case StepGroupBeginRc:
          if (calledOut) {
            parseError("MULTI_STEP not allowed inside callout models",current);
          } else {
            if (multiStep) {
              parseError("Nested MULTI_STEP not allowed",current);
            }
            multiStep = true;
          }
          steps->relativeType = StepGroupType;
        break;

        case StepGroupDividerRc:
          if (range) {
            range->sepMeta = steps->meta.LPub.multiStep.sep;
            range = NULL;
            step = NULL;
          }
        break;

        /* finished off a multiStep */
        case StepGroupEndRc:
          if (multiStep) {
            // save the current meta as the meta for step group
            // PLI for non-pli-per-step
            if (partsAdded) {
              parseError("Expected STEP before MULTI_STEP END", current);
            }
            multiStep = false;

            if (pliParts.size() && steps->meta.LPub.multiStep.pli.perStep.value() == false) {
              steps->pli.bom = false;
              steps->pli.setParts(pliParts,steps->stepGroupMeta);
              steps->pli.sizePli(&steps->stepGroupMeta, StepGroupType, false);
            }
            pliParts.clear();

            /* this is a page we're supposed to process */

            steps->placement = steps->meta.LPub.multiStep.placement;
            showLine(steps->topOfSteps());
            
            bool endOfSubmodel = stepNum == ldrawFile.numSteps(current.modelName);
            int  instances = ldrawFile.instances(current.modelName,isMirrored);
            addGraphicsPageItems(steps, coverPage, endOfSubmodel,instances, view, scene,printing);
            return HitEndOfPage;
          }
        break;

        /* we're hit some kind of step, or implied step and end of file */
        case EndOfFileRc:
        case RotStepRc:
        case StepRc:
          if ( ! partsAdded && bfxLoad) {  // special case of no parts added, but BFX load
            if (step == NULL) {
              if (range == NULL) {
                range = newRange(steps,calledOut);
                steps->append(range);
              }
              step = new Step(topOfStep,
                              range,
                              stepNum,
                              curMeta,
                              calledOut,
                              multiStep);
              range->append(step);
            }

            int rc = step->createCsi(
              isMirrored ? addLine : "1 color 0 0 0 1 0 0 0 1 0 0 0 1 foo.ldr",
              csiParts,
              &step->csiPixmap,
              steps->meta);
            partsAdded = true; // OK, so this is a lie, but it works
          }
          if (partsAdded) {
            if (firstStep) {
              steps->stepGroupMeta = curMeta;
              firstStep = false;
            }

            if (pliIgnore) {
              parseError("PLI BEGIN then STEP. Expected PLI END",current);
              pliIgnore = false;
            }
            if (partIgnore) {
              parseError("PART BEGIN then STEP. Expected PART END",current);
              partIgnore = false;
            }
            if (synthBegin) {
              parseError("SYNTH BEGIN then STEP. Expected SYNTH_END",current);
              synthBegin = false;
            }

            bool pliPerStep;

            if (multiStep && steps->meta.LPub.multiStep.pli.perStep.value()) {
              pliPerStep = true;
            } else if (calledOut && steps->meta.LPub.callout.pli.perStep.value()) {
              pliPerStep = true;
            } else if ( ! multiStep && ! calledOut) {
              pliPerStep = true;
            } else {
              pliPerStep = false;
            }

            if (step) {
              Page *page = dynamic_cast<Page *>(steps);
              if (page) {
                page->inserts = inserts;
              }
              if (pliPerStep) {
                PlacementType relativeType;
                if (multiStep) {
                  relativeType = StepGroupType;
                } else if (calledOut) {
                  relativeType = CalloutType;
                } else {
                  relativeType = SingleStepType;
                }
                step->pli.setParts(pliParts,steps->meta);
                pliParts.clear();
                step->pli.sizePli(&steps->meta,relativeType,pliPerStep);
              }

              int rc = step->createCsi(
                 isMirrored ? addLine : "1 color 0 0 0 1 0 0 0 1 0 0 0 1 foo.ldr",
                 csiParts,
                &step->csiPixmap,
                 steps->meta);

              statusBar()->showMessage("Processing " + current.modelName);

              if (rc) {
                return rc;
              }
            } else {
              if (pliPerStep) {
                pliParts.clear();
              }
              
              /*
               * Only pages or step can have inserts.... no callouts
               */
              if ( ! multiStep && ! calledOut) {
                Page *page = dynamic_cast<Page *>(steps);
                if (page) {
                  page->inserts = inserts;
                }
              }
            }

            if ( ! multiStep && ! calledOut) {

              /*
               * Simple step
               */
              if (steps->list.size() == 0) {
                steps->relativeType = PageType;
              }
              steps->placement = steps->meta.LPub.assem.placement;
              showLine(topOfStep);

              int  numSteps = ldrawFile.numSteps(current.modelName);
              bool endOfSubmodel = numSteps == 0 || stepNum == numSteps;
              int  instances = ldrawFile.instances(current.modelName,isMirrored);

              addGraphicsPageItems(steps,coverPage,endOfSubmodel,instances,view,scene,printing);
              stepPageNum += ! coverPage;
              steps->setBottomOfSteps(current);
              return HitEndOfPage;
            }
            steps->meta.pop();
            stepNum += partsAdded;
            topOfStep = current;

            partsAdded = false;
            coverPage = false;
            step = NULL;
            bfxStore2 = bfxStore1;
            bfxStore1 = false;
            bfxLoad = false;
          }
          inserts.clear();
          steps->setBottomOfSteps(current);
        break;
        case RangeErrorRc:
          showLine(current);
          QMessageBox::critical(NULL,
                               QMessageBox::tr("LPub"),
                               QMessageBox::tr("Parameter(s) out of range: %1:%2\n%3")
                               .arg(current.modelName) 
                               .arg(current.lineNumber) 
                               .arg(line));
          return RangeErrorRc;
        break;
        default:
        break;
      }
    } else if (line != "") {
      showLine(current);
      QMessageBox::critical(NULL,
                            QMessageBox::tr("LPub"),
                            QMessageBox::tr("Invalid LDraw Line Type: %1:%2\n  %3")
                            .arg(current.modelName) 
                            .arg(current.lineNumber) 
                            .arg(line));
      return InvalidLDrawLineRc;
    }
  }
  steps->meta.rotStep.clear();
  return 0;
}