diff options
-rw-r--r-- | indra/newview/llfloatersocial.cpp | 181 | ||||
-rw-r--r-- | indra/newview/llfloatersocial.h | 17 | ||||
-rw-r--r-- | indra/newview/llsnapshotlivepreview.cpp | 4 | ||||
-rw-r--r-- | indra/newview/skins/default/xui/en/floater_social.xml | 6 |
4 files changed, 199 insertions, 9 deletions
diff --git a/indra/newview/llfloatersocial.cpp b/indra/newview/llfloatersocial.cpp index fe5c324d0b..f2110e09c1 100644 --- a/indra/newview/llfloatersocial.cpp +++ b/indra/newview/llfloatersocial.cpp @@ -42,6 +42,8 @@ static LLRegisterPanelClassWrapper<LLSocialStatusPanel> t_panel_status("llsocial static LLRegisterPanelClassWrapper<LLSocialPhotoPanel> t_panel_photo("llsocialphotopanel"); static LLRegisterPanelClassWrapper<LLSocialCheckinPanel> t_panel_checkin("llsocialcheckinpanel"); +const S32 MAX_POSTCARD_DATASIZE = 1024 * 1024; // one megabyte + std::string get_map_url() { LLVector3d center_agent; @@ -94,6 +96,8 @@ LLSocialPhotoPanel::~LLSocialPhotoPanel() BOOL LLSocialPhotoPanel::postBuild() { + mResolutionComboBox = getChild<LLUICtrl>("resolution_combobox"); + mResolutionComboBox->setCommitCallback(boost::bind(&LLSocialPhotoPanel::onResolutionComboCommit, this)); mRefreshBtn = getChild<LLUICtrl>("new_snapshot_btn"); childSetAction("new_snapshot_btn", boost::bind(&LLSocialPhotoPanel::onClickNewSnapshot, this)); mRefreshLabel = getChild<LLUICtrl>("refresh_lbl"); @@ -112,6 +116,12 @@ BOOL LLSocialPhotoPanel::postBuild() return LLPanel::postBuild(); } +void LLSocialPhotoPanel::onResolutionComboCommit() +{ + LLFloaterSocial* instance = LLFloaterReg::findTypedInstance<LLFloaterSocial>("social"); + updateResolution(mResolutionComboBox, instance); +} + void LLSocialPhotoPanel::onClickNewSnapshot() { LLSnapshotLivePreview* previewp = static_cast<LLSnapshotLivePreview*>(mPreviewHandle.get()); @@ -124,6 +134,131 @@ void LLSocialPhotoPanel::onClickNewSnapshot() } } +void LLSocialPhotoPanel::updateResolution(LLUICtrl* ctrl, void* data, BOOL do_update) +{ + LLComboBox* combobox = (LLComboBox*)ctrl; + LLFloaterSnapshot *view = (LLFloaterSnapshot *)data; + + if (!view || !combobox) + { + llassert(view && combobox); + return; + } + + std::string sdstring = combobox->getSelectedValue(); + LLSD sdres; + std::stringstream sstream(sdstring); + LLSDSerialize::fromNotation(sdres, sstream, sdstring.size()); + + S32 width = sdres[0]; + S32 height = sdres[1]; + + LLSnapshotLivePreview * previewp = static_cast<LLSnapshotLivePreview *>(mPreviewHandle.get()); + if (previewp && combobox->getCurrentIndex() >= 0) + { + S32 original_width = 0 , original_height = 0 ; + previewp->getSize(original_width, original_height) ; + + if (width == 0 || height == 0) + { + // take resolution from current window size + lldebugs << "Setting preview res from window: " << gViewerWindow->getWindowWidthRaw() << "x" << gViewerWindow->getWindowHeightRaw() << llendl; + previewp->setSize(gViewerWindow->getWindowWidthRaw(), gViewerWindow->getWindowHeightRaw()); + } + else + { + // use the resolution from the selected pre-canned drop-down choice + lldebugs << "Setting preview res selected from combo: " << width << "x" << height << llendl; + previewp->setSize(width, height); + } + + checkAspectRatio(view, width) ; + + previewp->getSize(width, height); + + if(original_width != width || original_height != height) + { + previewp->setSize(width, height); + + // hide old preview as the aspect ratio could be wrong + lldebugs << "updating thumbnail" << llendl; + + previewp->updateSnapshot(FALSE, TRUE); + if(do_update) + { + lldebugs << "Will update controls" << llendl; + updateControls(); + setNeedRefresh(true); + } + } + + } +} + +void LLSocialPhotoPanel::setNeedRefresh(bool need) +{ + mRefreshLabel->setVisible(need); + mNeedRefresh = need; +} + +void LLSocialPhotoPanel::checkAspectRatio(LLFloaterSnapshot *view, S32 index) +{ + LLSnapshotLivePreview *previewp = getPreviewView() ; + + BOOL keep_aspect = FALSE; + + if (0 == index) // current window size + { + keep_aspect = TRUE; + } + else // predefined resolution + { + keep_aspect = FALSE; + } + + if (previewp) + { + previewp->mKeepAspectRatio = keep_aspect; + } +} + +LLSnapshotLivePreview* LLSocialPhotoPanel::getPreviewView() +{ + LLSnapshotLivePreview* previewp = (LLSnapshotLivePreview*)mPreviewHandle.get(); + return previewp; +} + + +void LLSocialPhotoPanel::updateControls() +{ + + + LLSnapshotLivePreview* previewp = getPreviewView(); + BOOL got_bytes = previewp && previewp->getDataSize() > 0; + BOOL got_snap = previewp && previewp->getSnapshotUpToDate(); + + // *TODO: Separate maximum size for Web images from postcards + lldebugs << "Is snapshot up-to-date? " << got_snap << llendl; + + LLLocale locale(LLLocale::USER_LOCALE); + std::string bytes_string; + if (got_snap) + { + LLResMgr::getInstance()->getIntegerString(bytes_string, (previewp->getDataSize()) >> 10 ); + } + + //getChild<LLUICtrl>("file_size_label")->setTextArg("[SIZE]", got_snap ? bytes_string : getString("unknown")); + getChild<LLUICtrl>("file_size_label")->setTextArg("[SIZE]", got_snap ? bytes_string : "unknown"); + getChild<LLUICtrl>("file_size_label")->setColor( + true + && got_bytes + && previewp->getDataSize() > MAX_POSTCARD_DATASIZE ? LLUIColor(LLColor4::red) : LLUIColorTable::instance().getColor( "LabelTextColor" )); + + LLComboBox* combo = getChild<LLComboBox>("resolution_combobox"); + LLFloaterSocial* instance = LLFloaterReg::findTypedInstance<LLFloaterSocial>("social"); + updateResolution(combo, instance, FALSE); +} + void LLSocialPhotoPanel::draw() { LLSnapshotLivePreview * previewp = static_cast<LLSnapshotLivePreview *>(mPreviewHandle.get()); @@ -179,7 +314,7 @@ void LLSocialPhotoPanel::draw() // Position the refresh button in the bottom left corner of the thumbnail. mRefreshBtn->setOrigin(local_offset_x + PADDING, local_offset_y + PADDING); - if (/*impl.mNeedRefresh*/false) + if (mNeedRefresh) { // Place the refresh hint text to the right of the refresh button. const LLRect& refresh_btn_rect = mRefreshBtn->getRect(); @@ -191,7 +326,11 @@ void LLSocialPhotoPanel::draw() } gGL.pushUIMatrix(); - LLUI::translate((F32) thumbnail_rect.mLeft, (F32) thumbnail_rect.mBottom); + S32 x_pos; + S32 y_pos; + snapshot_panel->localPointToOtherView(thumbnail_rect.mLeft, thumbnail_rect.mBottom, &x_pos, &y_pos, gFloaterView->getParentFloater(this)); + + LLUI::translate((F32) x_pos, (F32) y_pos); mThumbnailPlaceholder->draw(); gGL.popUIMatrix(); } @@ -313,3 +452,41 @@ void LLFloaterSocial::onOpen(const LLSD& key) preview->updateSnapshot(TRUE); } } + +// static +void LLFloaterSocial::preUpdate() +{ + // FIXME: duplicated code + LLFloaterSocial* instance = LLFloaterReg::findTypedInstance<LLFloaterSocial>("social"); + if (instance) + { + // Disable the send/post/save buttons until snapshot is ready. + instance->mSocialPhotoPanel->updateControls(); + + // Force hiding the "Refresh to save" hint because we know we've just started refresh. + instance->mSocialPhotoPanel->setNeedRefresh(false); + } +} + +// static +void LLFloaterSocial::postUpdate() +{ + // FIXME: duplicated code + LLFloaterSocial* instance = LLFloaterReg::findTypedInstance<LLFloaterSocial>("social"); + if (instance) + { + // Enable the send/post/save buttons. + instance->mSocialPhotoPanel->updateControls(); + + // We've just done refresh. + instance->mSocialPhotoPanel->setNeedRefresh(false); + + // The refresh button is initially hidden. We show it after the first update, + // i.e. when preview appears. + if (!instance->mSocialPhotoPanel->mRefreshBtn->getVisible()) + { + instance->mSocialPhotoPanel->mRefreshBtn->setVisible(true); + } + + } +} diff --git a/indra/newview/llfloatersocial.h b/indra/newview/llfloatersocial.h index a08bbb99ad..7b8db2d64a 100644 --- a/indra/newview/llfloatersocial.h +++ b/indra/newview/llfloatersocial.h @@ -51,14 +51,24 @@ class LLSocialPhotoPanel : public LLPanel void onSend(); const LLRect& getThumbnailPlaceholderRect() { return mThumbnailPlaceholder->getRect(); } + void onResolutionComboCommit(); void onClickNewSnapshot(); LLHandle<LLView> mPreviewHandle; -private: + void updateResolution(LLUICtrl* ctrl, void* data, BOOL do_update = TRUE); + void setNeedRefresh(bool need); + void checkAspectRatio(LLFloaterSnapshot *view, S32 index); + LLSnapshotLivePreview* getPreviewView(); + + void updateControls(); + + LLUICtrl * mResolutionComboBox; LLUICtrl *mRefreshBtn, *mRefreshLabel; LLUICtrl *mSucceessLblPanel, *mFailureLblPanel; LLUICtrl* mThumbnailPlaceholder; + + bool mNeedRefresh; }; class LLSocialCheckinPanel : public LLPanel @@ -76,6 +86,11 @@ public: void onCancel(); void onOpen(const LLSD& key); /*virtual*/ void draw(); + + + static void preUpdate(); + static void postUpdate(); + private: LLSocialPhotoPanel * mSocialPhotoPanel; std::string mMapUrl; diff --git a/indra/newview/llsnapshotlivepreview.cpp b/indra/newview/llsnapshotlivepreview.cpp index 7bae7c90ed..70c0584231 100644 --- a/indra/newview/llsnapshotlivepreview.cpp +++ b/indra/newview/llsnapshotlivepreview.cpp @@ -29,7 +29,7 @@ #include "llsnapshotlivepreview.h" - +#include "llfloatersocial.h" const F32 AUTO_SNAPSHOT_TIME_DELAY = 1.f; @@ -186,6 +186,7 @@ void LLSnapshotLivePreview::updateSnapshot(BOOL new_snapshot, BOOL new_thumbnail mSnapshotDelayTimer.start(); mSnapshotDelayTimer.setTimerExpirySec(delay); LLFloaterSnapshot::preUpdate(); + LLFloaterSocial::preUpdate(); } // Update thumbnail if requested. @@ -742,6 +743,7 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview ) } lldebugs << "done creating snapshot" << llendl; LLFloaterSnapshot::postUpdate(); + LLFloaterSocial::postUpdate(); return TRUE; } diff --git a/indra/newview/skins/default/xui/en/floater_social.xml b/indra/newview/skins/default/xui/en/floater_social.xml index 5c910ad986..1ae8f7ed65 100644 --- a/indra/newview/skins/default/xui/en/floater_social.xml +++ b/indra/newview/skins/default/xui/en/floater_social.xml @@ -131,10 +131,6 @@ label="1024x768" name="1024x768" value="[i1024,i768]" /> - <combo_box.item - label="Custom" - name="Custom" - value="[i-1,i-1]" /> </combo_box> <text follows="left|top" @@ -147,7 +143,7 @@ top="12" type="string" width="50"> - 1,031 KB + [SIZE] KB </text> <ui_ctrl height="150" |