llfloatergesture.cpp

Go to the documentation of this file.
00001 
00032 #include "llviewerprecompiledheaders.h"
00033 
00034 #include "llfloatergesture.h"
00035 
00036 #include "lldir.h"
00037 #include "llinventory.h"
00038 #include "llmultigesture.h"
00039 
00040 #include "llagent.h"
00041 #include "llviewerwindow.h"
00042 #include "llbutton.h"
00043 #include "llcombobox.h"
00044 #include "llgesturemgr.h"
00045 #include "llinventorymodel.h"
00046 #include "llinventoryview.h"
00047 #include "llkeyboard.h"
00048 #include "lllineeditor.h"
00049 #include "llpreviewgesture.h"
00050 #include "llresizehandle.h"
00051 #include "llscrollbar.h"
00052 #include "llscrollcontainer.h"
00053 #include "llscrolllistctrl.h"
00054 #include "lltextbox.h"
00055 #include "lluictrlfactory.h"
00056 #include "llviewergesture.h"
00057 #include "llviewerimagelist.h"
00058 #include "llviewerinventory.h"
00059 #include "llvoavatar.h"
00060 #include "llviewercontrol.h"
00061 
00062 // static
00063 LLFloaterGesture* LLFloaterGesture::sInstance = NULL;
00064 LLFloaterGestureObserver* LLFloaterGesture::sObserver = NULL;
00065 
00066 BOOL item_name_precedes( LLInventoryItem* a, LLInventoryItem* b )
00067 {
00068         return LLString::precedesDict( a->getName(), b->getName() );
00069 }
00070 
00071 class LLFloaterGestureObserver : public LLGestureManagerObserver
00072 {
00073 public:
00074         LLFloaterGestureObserver() {}
00075         virtual ~LLFloaterGestureObserver() {}
00076         virtual void changed() { LLFloaterGesture::refreshAll(); }
00077 };
00078 
00079 //---------------------------------------------------------------------------
00080 // LLFloaterGesture
00081 //---------------------------------------------------------------------------
00082 LLFloaterGesture::LLFloaterGesture()
00083 :       LLFloater("Gesture Floater")
00084 {
00085         sInstance = this;
00086 
00087         sObserver = new LLFloaterGestureObserver;
00088         gGestureManager.addObserver(sObserver);
00089 }
00090 
00091 // virtual
00092 LLFloaterGesture::~LLFloaterGesture()
00093 {
00094         gGestureManager.removeObserver(sObserver);
00095         delete sObserver;
00096         sObserver = NULL;
00097 
00098         sInstance = NULL;
00099 
00100         // Custom saving rectangle, since load must be done
00101         // after postBuild.
00102         gSavedSettings.setRect("FloaterGestureRect2", getRect());
00103 }
00104 
00105 // virtual
00106 BOOL LLFloaterGesture::postBuild()
00107 {
00108         LLString label;
00109 
00110         // Translate title
00111         label = getTitle();
00112         
00113         setTitle(label);
00114 
00115         childSetCommitCallback("gesture_list", onCommitList, this);
00116         childSetDoubleClickCallback("gesture_list", onClickPlay);
00117 
00118         childSetAction("inventory_btn", onClickInventory, this);
00119 
00120         childSetAction("edit_btn", onClickEdit, this);
00121 
00122         childSetAction("play_btn", onClickPlay, this);
00123         childSetAction("stop_btn", onClickPlay, this);
00124 
00125         childSetAction("new_gesture_btn", onClickNew, this);
00126 
00127         childSetVisible("play_btn", true);
00128         childSetVisible("stop_btn", false);
00129         setDefaultBtn("play_btn");
00130 
00131         return TRUE;
00132 }
00133 
00134 
00135 // static
00136 void LLFloaterGesture::show()
00137 {
00138         if (sInstance)
00139         {
00140                 sInstance->open();              /*Flawfinder: ignore*/
00141                 return;
00142         }
00143 
00144         LLFloaterGesture *self = new LLFloaterGesture();
00145 
00146         // Builds and adds to gFloaterView
00147         LLUICtrlFactory::getInstance()->buildFloater(self, "floater_gesture.xml");
00148 
00149         // Fix up rectangle
00150         LLRect rect = gSavedSettings.getRect("FloaterGestureRect2");
00151         self->reshape(rect.getWidth(), rect.getHeight());
00152         self->setRect(rect);
00153 
00154         self->buildGestureList();
00155 
00156         self->childSetFocus("gesture_list");
00157 
00158         LLCtrlListInterface *list = self->childGetListInterface("gesture_list");
00159         if (list)
00160         {
00161                 const BOOL ascending = TRUE;
00162                 list->sortByColumn("name", ascending);
00163                 list->selectFirstItem();
00164         }
00165         
00166         self->mSelectedID = LLUUID::null;
00167 
00168         // Update button labels
00169         onCommitList(NULL, self);
00170         self->open();   /*Flawfinder: ignore*/
00171 }
00172 
00173 // static
00174 void LLFloaterGesture::toggleVisibility()
00175 {
00176         if(sInstance && sInstance->getVisible())
00177         {
00178                 sInstance->close();
00179         }
00180         else
00181         {
00182                 show();
00183         }
00184 }
00185 
00186 // static
00187 void LLFloaterGesture::refreshAll()
00188 {
00189         if (sInstance)
00190         {
00191                 sInstance->buildGestureList();
00192 
00193                 LLCtrlListInterface *list = sInstance->childGetListInterface("gesture_list");
00194                 if (!list) return;
00195 
00196                 if (sInstance->mSelectedID.isNull())
00197                 {
00198                         list->selectFirstItem();
00199                 }
00200                 else
00201                 {
00202                         if (list->setCurrentByID(sInstance->mSelectedID))
00203                         {
00204                                 LLCtrlScrollInterface *scroll = sInstance->childGetScrollInterface("gesture_list");
00205                                 if (scroll) scroll->scrollToShowSelected();
00206                         }
00207                         else
00208                         {
00209                                 list->selectFirstItem();
00210                         }
00211                 }
00212 
00213                 // Update button labels
00214                 onCommitList(NULL, sInstance);
00215         }
00216 }
00217 
00218 void LLFloaterGesture::buildGestureList()
00219 {
00220         LLCtrlListInterface *list = childGetListInterface("gesture_list");
00221         if (!list) return;
00222 
00223         list->operateOnAll(LLCtrlListInterface::OP_DELETE);
00224 
00225         LLGestureManager::item_map_t::iterator it;
00226         for (it = gGestureManager.mActive.begin(); it != gGestureManager.mActive.end(); ++it)
00227         {
00228                 const LLUUID& item_id = (*it).first;
00229                 LLMultiGesture* gesture = (*it).second;
00230 
00231                 // Note: Can have NULL item if inventory hasn't arrived yet.
00232                 std::string item_name = "Loading...";
00233                 LLInventoryItem* item = gInventory.getItem(item_id);
00234                 if (item)
00235                 {
00236                         item_name = item->getName();
00237                 }
00238 
00239                 LLString font_style = "NORMAL";
00240                 // If gesture is playing, bold it
00241 
00242                 LLSD element;
00243                 element["id"] = item_id;
00244 
00245                 if (gesture)
00246                 {
00247                         if (gesture->mPlaying)
00248                         {
00249                                 font_style = "BOLD";
00250                         }
00251 
00252                         element["columns"][0]["column"] = "trigger";
00253                         element["columns"][0]["value"] = gesture->mTrigger;
00254                         element["columns"][0]["font"] = "SANSSERIF";
00255                         element["columns"][0]["font-style"] = font_style;
00256 
00257                         LLString key_string = LLKeyboard::stringFromKey(gesture->mKey);
00258                         LLString buffer;
00259 
00260                         {
00261                                 if (gesture->mKey == KEY_NONE)
00262                                 {
00263                                         buffer = "---";
00264                                         key_string = "~~~";             // alphabetize to end
00265                                 }
00266                                 else
00267                                 {
00268                                         if (gesture->mMask & MASK_CONTROL) buffer.append("Ctrl-");
00269                                         if (gesture->mMask & MASK_ALT) buffer.append("Alt-");
00270                                         if (gesture->mMask & MASK_SHIFT) buffer.append("Shift-");
00271                                         if ((gesture->mMask & (MASK_CONTROL|MASK_ALT|MASK_SHIFT)) &&
00272                                                 (key_string[0] == '-' || key_string[0] == '='))
00273                                         {
00274                                                 buffer.append(" ");
00275                                         }
00276                                         buffer.append(key_string);
00277                                 }
00278                         }
00279                         element["columns"][1]["column"] = "shortcut";
00280                         element["columns"][1]["value"] = buffer;
00281                         element["columns"][1]["font"] = "SANSSERIF";
00282                         element["columns"][1]["font-style"] = font_style;
00283 
00284                         // hidden column for sorting
00285                         element["columns"][2]["column"] = "key";
00286                         element["columns"][2]["value"] = key_string;
00287                         element["columns"][2]["font"] = "SANSSERIF";
00288                         element["columns"][2]["font-style"] = font_style;
00289 
00290                         // Only add "playing" if we've got the name, less confusing. JC
00291                         if (item && gesture->mPlaying)
00292                         {
00293                                 item_name += " (Playing)";
00294                         }
00295                         element["columns"][3]["column"] = "name";
00296                         element["columns"][3]["value"] = item_name;
00297                         element["columns"][3]["font"] = "SANSSERIF";
00298                         element["columns"][3]["font-style"] = font_style;
00299                 }
00300                 else
00301                 {
00302                         element["columns"][0]["column"] = "trigger";
00303                         element["columns"][0]["value"] = "";
00304                         element["columns"][0]["font"] = "SANSSERIF";
00305                         element["columns"][0]["font-style"] = font_style;
00306                         element["columns"][0]["column"] = "trigger";
00307                         element["columns"][0]["value"] = "---";
00308                         element["columns"][0]["font"] = "SANSSERIF";
00309                         element["columns"][0]["font-style"] = font_style;
00310                         element["columns"][2]["column"] = "key";
00311                         element["columns"][2]["value"] = "~~~";
00312                         element["columns"][2]["font"] = "SANSSERIF";
00313                         element["columns"][2]["font-style"] = font_style;
00314                         element["columns"][3]["column"] = "name";
00315                         element["columns"][3]["value"] = item_name;
00316                         element["columns"][3]["font"] = "SANSSERIF";
00317                         element["columns"][3]["font-style"] = font_style;
00318                 }
00319                 list->addElement(element, ADD_BOTTOM);
00320         }
00321 }
00322 
00323 // static
00324 void LLFloaterGesture::onClickInventory(void* data)
00325 {
00326         LLFloaterGesture* self = (LLFloaterGesture*)data;
00327 
00328         LLCtrlListInterface *list = self->childGetListInterface("gesture_list");
00329         if (!list) return;
00330         const LLUUID& item_id = list->getCurrentID();
00331 
00332         LLInventoryView* inv = LLInventoryView::showAgentInventory();
00333         if (!inv) return;
00334         inv->getPanel()->setSelection(item_id, TRUE);
00335 }
00336 
00337 // static
00338 void LLFloaterGesture::onClickPlay(void* data)
00339 {
00340         LLFloaterGesture* self = (LLFloaterGesture*)data;
00341 
00342         LLCtrlListInterface *list = self->childGetListInterface("gesture_list");
00343         if (!list) return;
00344         const LLUUID& item_id = list->getCurrentID();
00345 
00346         if (gGestureManager.isGesturePlaying(item_id))
00347         {
00348                 gGestureManager.stopGesture(item_id);
00349         }
00350         else
00351         {
00352                 gGestureManager.playGesture(item_id);
00353         }
00354 }
00355 
00356 class GestureShowCallback : public LLInventoryCallback
00357 {
00358 public:
00359         GestureShowCallback(LLString &title)
00360         {
00361                 mTitle = title;
00362         }
00363         void fire(const LLUUID &inv_item)
00364         {
00365                 LLPreviewGesture::show(mTitle.c_str(), inv_item, LLUUID::null);
00366         }
00367 private:
00368         LLString mTitle;
00369 };
00370 
00371 // static
00372 void LLFloaterGesture::onClickNew(void* data)
00373 {
00374         LLString title("Gesture: ");
00375         title.append("New Gesture");
00376         LLPointer<LLInventoryCallback> cb = new GestureShowCallback(title);
00377         create_inventory_item(gAgent.getID(), gAgent.getSessionID(),
00378                 LLUUID::null, LLTransactionID::tnull, "New Gesture", "", LLAssetType::AT_GESTURE,
00379                 LLInventoryType::IT_GESTURE, NOT_WEARABLE, PERM_MOVE | PERM_TRANSFER, cb);
00380 }
00381 
00382 
00383 // static
00384 void LLFloaterGesture::onClickEdit(void* data)
00385 {
00386         LLFloaterGesture* self = (LLFloaterGesture*)data;
00387 
00388         LLCtrlListInterface *list = self->childGetListInterface("gesture_list");
00389         if (!list) return;
00390         const LLUUID& item_id = list->getCurrentID();
00391 
00392         LLInventoryItem* item = gInventory.getItem(item_id);
00393         if (!item) return;
00394 
00395         LLString title("Gesture: ");
00396         title.append(item->getName());
00397 
00398         LLPreviewGesture* previewp = LLPreviewGesture::show(title, item_id, LLUUID::null);
00399         if (!previewp->getHost())
00400         {
00401                 previewp->setRect(gFloaterView->findNeighboringPosition(self, previewp));
00402         }
00403 }
00404 
00405 // static
00406 void LLFloaterGesture::onCommitList(LLUICtrl* ctrl, void* data)
00407 {
00408         LLFloaterGesture* self = (LLFloaterGesture*)data;
00409 
00410         const LLUUID& item_id = self->childGetValue("gesture_list").asUUID();
00411 
00412         self->mSelectedID = item_id;
00413         if (gGestureManager.isGesturePlaying(item_id))
00414         {
00415                 self->childSetVisible("play_btn", false);
00416                 self->childSetVisible("stop_btn", true);
00417         }
00418         else
00419         {
00420                 self->childSetVisible("play_btn", true);
00421                 self->childSetVisible("stop_btn", false);
00422         }
00423 }

Generated on Fri May 16 08:33:27 2008 for SecondLife by  doxygen 1.5.5