void KMahjonggTilesetSelector::tilesetChanged() { KMahjonggTileset * selTileset = tilesetMap.value(tilesetList->currentItem()->text()); //Sanity checkings. Should not happen. if (!selTileset) return; if (selTileset->path()==kcfg_TileSet->text()) { return; } QLatin1String authstr("Author"); QLatin1String contactstr("AuthorEmail"); QLatin1String descstr("Description"); kcfg_TileSet->setText(selTileset->path()); tilesetAuthor->setText(selTileset->authorProperty(authstr)); tilesetContact->setText(selTileset->authorProperty(contactstr)); tilesetDescription->setText(selTileset->authorProperty(descstr)); //Make sure SVG is loaded when graphics is selected if (!selTileset->loadGraphics()) return; //Let the tileset calculate its ideal size for the preview area, but reduce the margins a bit (pass oversized drawing area) QSize tilesize = selTileset->preferredTileSize(tilesetPreview->size()*1.3, 1, 1); selTileset->reloadTileset(tilesize); //Draw the preview QImage qiRend(tilesetPreview->size(),QImage::Format_ARGB32_Premultiplied); qiRend.fill(0); QPainter p(&qiRend); //Calculate the margins to center the tile QSize margin = tilesetPreview->size() - tilesize; //Draw unselected tile and first tileface p.drawPixmap(margin.width()/2, margin.height()/2, selTileset->unselectedTile(1)); p.drawPixmap(margin.width()/2, margin.height()/2, selTileset->tileface(0)); p.end(); tilesetPreview->setPixmap(QPixmap::fromImage(qiRend)); }
/*! \brief Called by updates to @OPLinkStatus */ void ConfigPipXtremeWidget::updateStatus(UAVObject *object) { // Request and update of the setting object if we haven't received it yet. if (!settingsUpdated) { oplinkSettingsObj->requestUpdate(); } // Update the link state UAVObjectField *linkField = object->getField("LinkState"); m_oplink->LinkState->setText(linkField->getValue().toString()); bool linkConnected = (linkField->getValue() == linkField->getOptions().at(OPLinkStatus::LINKSTATE_CONNECTED)); bool modemEnabled = linkConnected || (linkField->getValue() == linkField->getOptions().at(OPLinkStatus::LINKSTATE_DISCONNECTED)) || (linkField->getValue() == linkField->getOptions().at(OPLinkStatus::LINKSTATE_ENABLED)); UAVObjectField *pairRssiField = object->getField("PairSignalStrengths"); bool bound; bool ok; quint32 boundPairId = m_oplink->CoordID->text().toUInt(&ok, 16); // Update the detected devices. UAVObjectField *pairIdField = object->getField("PairIDs"); quint32 pairid = pairIdField->getValue(0).toUInt(); bound = (pairid == boundPairId); m_oplink->PairID1->setText(QString::number(pairid, 16).toUpper()); m_oplink->PairID1->setEnabled(false); m_oplink->Bind1->setText(bound ? tr("Unbind") : tr("Bind")); m_oplink->Bind1->setEnabled(pairid && modemEnabled); m_oplink->PairSignalStrengthBar1->setValue(((bound && !linkConnected) || !modemEnabled) ? -127 : pairRssiField->getValue(0).toInt()); m_oplink->PairSignalStrengthLabel1->setText(QString("%1dB").arg(m_oplink->PairSignalStrengthBar1->value())); pairid = pairIdField->getValue(1).toUInt(); bound = (pairid == boundPairId); m_oplink->PairID2->setText(QString::number(pairid, 16).toUpper()); m_oplink->PairID2->setEnabled(false); m_oplink->Bind2->setText(bound ? tr("Unbind") : tr("Bind")); m_oplink->Bind2->setEnabled(pairid && modemEnabled); m_oplink->PairSignalStrengthBar2->setValue(((bound && !linkConnected) || !modemEnabled) ? -127 : pairRssiField->getValue(1).toInt()); m_oplink->PairSignalStrengthLabel2->setText(QString("%1dB").arg(m_oplink->PairSignalStrengthBar2->value())); pairid = pairIdField->getValue(2).toUInt(); bound = (pairid == boundPairId); m_oplink->PairID3->setText(QString::number(pairid, 16).toUpper()); m_oplink->PairID3->setEnabled(false); m_oplink->Bind3->setText(bound ? tr("Unbind") : tr("Bind")); m_oplink->Bind3->setEnabled(pairid && modemEnabled); m_oplink->PairSignalStrengthBar3->setValue(((bound && !linkConnected) || !modemEnabled) ? -127 : pairRssiField->getValue(2).toInt()); m_oplink->PairSignalStrengthLabel3->setText(QString("%1dB").arg(m_oplink->PairSignalStrengthBar3->value())); pairid = pairIdField->getValue(3).toUInt(); bound = (pairid == boundPairId); m_oplink->PairID4->setText(QString::number(pairid, 16).toUpper()); m_oplink->PairID4->setEnabled(false); m_oplink->Bind4->setText(bound ? tr("Unbind") : tr("Bind")); m_oplink->Bind4->setEnabled(pairid && modemEnabled); m_oplink->PairSignalStrengthBar4->setValue(((bound && !linkConnected) || !modemEnabled) ? -127 : pairRssiField->getValue(3).toInt()); m_oplink->PairSignalStrengthLabel4->setText(QString("%1dB").arg(m_oplink->PairSignalStrengthBar4->value())); // Update the Description field // TODO use UAVObjectUtilManager::descriptionToStructure() UAVObjectField *descField = object->getField("Description"); if (descField->getValue(0) != QChar(255)) { /* * This looks like a binary with a description at the end: * 4 bytes: header: "OpFw". * 4 bytes: GIT commit tag (short version of SHA1). * 4 bytes: Unix timestamp of compile time. * 2 bytes: target platform. Should follow same rule as BOARD_TYPE and BOARD_REVISION in board define files. * 26 bytes: commit tag if it is there, otherwise branch name. '-dirty' may be added if needed. Zero-padded. * 20 bytes: SHA1 sum of the firmware. * 20 bytes: SHA1 sum of the uavo definitions. * 20 bytes: free for now. */ char buf[OPLinkStatus::DESCRIPTION_NUMELEM]; for (unsigned int i = 0; i < 26; ++i) { buf[i] = descField->getValue(i + 14).toChar().toLatin1(); } buf[26] = '\0'; QString descstr(buf); quint32 gitDate = descField->getValue(11).toChar().toLatin1() & 0xFF; for (int i = 1; i < 4; i++) { gitDate = gitDate << 8; gitDate += descField->getValue(11 - i).toChar().toLatin1() & 0xFF; } QString date = QDateTime::fromTime_t(gitDate).toUTC().toString("yyyy-MM-dd HH:mm"); m_oplink->FirmwareVersion->setText(descstr + " " + date); } else { m_oplink->FirmwareVersion->setText(tr("Unknown")); } // Update the serial number field UAVObjectField *serialField = object->getField("CPUSerial"); char buf[OPLinkStatus::CPUSERIAL_NUMELEM * 2 + 1]; for (unsigned int i = 0; i < OPLinkStatus::CPUSERIAL_NUMELEM; ++i) { unsigned char val = serialField->getValue(i).toUInt() >> 4; buf[i * 2] = ((val < 10) ? '0' : '7') + val; val = serialField->getValue(i).toUInt() & 0xf; buf[i * 2 + 1] = ((val < 10) ? '0' : '7') + val; } buf[OPLinkStatus::CPUSERIAL_NUMELEM * 2] = '\0'; m_oplink->SerialNumber->setText(buf); updateEnableControls(); }
void StagePreview::showPreview(sf::RenderWindow *window, const char *stageName, int x, int y) { if (stageName_ != 0) { delete stageName_; } stageName_ = new char[strlen(stageName) + 1]; strcpy(stageName_, stageName); SetPosition(wxPoint(x, y)); infoSizer_->Clear(true); descSizer_->Clear(true); BerryBotsEngine *engine = new BerryBotsEngine(0, fileManager_, 0); Stage *stage = engine->getStage(); try { engine->initStage(getStagesDir().c_str(), stageName, getCacheDir().c_str()); } catch (EngineException *e) { wxMessageDialog errorMessage(NULL, e->what(), "Preview failure", wxOK | wxICON_EXCLAMATION); errorMessage.ShowModal(); delete engine; delete e; return; } SetTitle(wxString::Format(wxT("%s"), stage->getName())); unsigned int targetWidth; unsigned int targetHeight; char *previewFilename = savePreviewImage(window, engine, targetWidth, targetHeight); wxImage previewImage(previewFilename); delete previewFilename; double backingScale = getBackingScaleFactor(); if (backingScale > 1) { targetWidth /= backingScale; targetHeight /= backingScale; } visualPreview_->SetMinSize(wxSize(targetWidth, targetHeight)); visualPreview_->SetMaxSize(wxSize(targetWidth, targetHeight)); #ifdef __WXOSX__ int padding = 4; #else int padding = 8; #endif wxSizer *infoGrid = new wxFlexGridSizer(2, 0, padding); addInfo(infoGrid, "Name:", stage->getName()); addInfo(infoGrid, "Size:", wxString::Format(wxT("%i x %i"), stage->getWidth(), stage->getHeight())); if (engine->getTeamSize() > 1) { addInfo(infoGrid, "Team size:", engine->getTeamSize()); } addInfo(infoGrid, "Walls:", (stage->getWallCount() - 4)); addInfo(infoGrid, "Zones:", stage->getZoneCount()); addInfo(infoGrid, "Starts:", stage->getStartCount()); int numStageShips = stage->getStageShipCount(); if (numStageShips > 0) { char **stageShips = stage->getStageShips(); for (int x = 0; x < numStageShips; x++) { const char *shipName = stageShips[x]; if (shipName != 0) { int count = 1; for (int y = x + 1; y < numStageShips; y++) { const char *shipName2 = stageShips[y]; if (shipName2 != 0 && strcmp(shipName, shipName2) == 0) { count++; stageShips[y] = 0; } } wxString wxShipName = (count == 1) ? wxString(stageShips[x]) : wxString::Format(wxT("%s x%i"), shipName, count); addInfo(infoGrid, (x == 0 ? "Ships:" : ""), wxShipName); } } } infoSizer_->Add(infoGrid); char *description = fileManager_->getStageDescription( getStagesDir().c_str(), stageName, getCacheDir().c_str()); if (description == 0) { std::string descstr("<No description>"); description = new char[descstr.length() + 1]; strcpy(description, descstr.c_str()); } wxStaticText *descCtrl = new wxStaticText(mainPanel_, wxID_ANY, description); descSizer_->Add(descCtrl); delete description; mainPanel_->GetSizer()->SetSizeHints(mainPanel_); mainPanel_->Layout(); Fit(); mainPanel_->SetFocus(); wxBitmap bitmap; #ifdef __WINDOWS__ bitmap = wxBitmap(previewImage); #else bitmap.CreateScaled(targetWidth, targetHeight, wxBITMAP_SCREEN_DEPTH, backingScale); wxMemoryDC dc(bitmap); double logicalScale = (backingScale > 1) ? (1.0 / backingScale) : 1; dc.SetLogicalScale(logicalScale, logicalScale); dc.DrawBitmap(wxBitmap(previewImage), 0, 0); #endif // On Windows, if we set the bitmap before the Layout/Fit stuff, we get visual // artifacts when paging through the stages with up/down keys. visualPreview_->SetBitmap(bitmap); delete engine; }