31using namespace std::string_literals;
 
   57   auto separ = 
fSelect.rfind(
"/");
 
   58   if (separ == std::string::npos)
 
   63   if (separ != std::string::npos) {
 
   64      workdir = 
fSelect.substr(0, separ);
 
   68   auto comp = std::make_shared<Browsable::RGroup>(
"top", 
"Top file dialog element");
 
   76   fWebWindow->SetPanelName(
"rootui5.browser.view.FileDialog");
 
   80                            [
this](
unsigned connid, 
const std::string &arg) { 
ProcessMsg(connid, arg); },
 
  140      case kSaveAs: 
return "SaveAs"s;
 
  165   std::string lastname, allname;
 
  168      auto pp = entry.find(
" (");
 
  169      if (pp == std::string::npos) 
continue;
 
  170      auto name = entry.substr(0, pp);
 
  181   if (!allname.empty()) 
return allname;
 
  182   if (!lastname.empty()) 
return lastname;
 
  195         if (entry.compare(0, fname.length(), fname) == 0) {
 
  196            auto pp = entry.find(
"(", fname.length());
 
  200            while (pp != std::string::npos) {
 
  201               pp = entry.find(
"*.", pp);
 
  202               if (pp == std::string::npos) 
break;
 
  204               auto pp2 = entry.find_first_of(
" )", pp+2);
 
  205               if (pp2 == std::string::npos) 
break;
 
  207               if (res.empty()) res = 
"^(.*\\.(";
 
  208                           else res.append(
"|");
 
  210               res.append(entry.substr(pp+2, pp2 - pp - 2));
 
  215            if (!res.empty()) res.append(
")$)");
 
  233   req.
sort = 
"alphabetical";
 
  243                                   "\"title\" : "s + jtitle.Data() + 
","s +
 
  244                                   "\"path\" : "s + jpath.Data() + 
","s +
 
  245                                   "\"can_change_path\" : "s + (
GetCanChangePath() ? 
"true"s : 
"false"s) + 
","s +
 
  246                                   "\"filter\" : "s + jfilter.Data() + 
","s +
 
  247                                   "\"filters\" : "s + jfilters.Data() + 
","s +
 
  248                                   "\"fname\" : "s + jfname.Data() + 
","s +
 
  258   req.
sort = 
"alphabetical";
 
  263   fWebWindow->Send(connid, 
"CHMSG:{\"path\" : "s + jpath.Data() +
 
  272   if (arg.compare(0, 7, 
"CHPATH:") == 0) {
 
  274         auto path = TBufferJSON::FromJSON<Browsable::RElementPath_t>(arg.substr(7));
 
  280   } 
else if (arg.compare(0, 6, 
"CHEXT:") == 0) {
 
  286   } 
else if (arg.compare(0, 10, 
"DLGSELECT:") == 0) {
 
  289      auto path = TBufferJSON::FromJSON<Browsable::RElementPath_t>(arg.substr(10));
 
  299         fSelect = elem->GetContent(
"filename");
 
  303      bool need_confirm = 
false;
 
  309            std::string fname = path->back();
 
  313               fSelect = direlem->GetContent(
"filename") + 
"/"s + fname;
 
  323   } 
else if (arg == 
"DLGNOSELECT") {
 
  326      fWebWindow->Send(connid, 
"NOSELECT_CONFIRMED"s); 
 
  327   } 
else if (arg == 
"DLG_CONFIRM_SELECT") {
 
  426   return msg.compare(0, 11, 
"FILEDIALOG:") == 0;
 
  437std::shared_ptr<RFileDialog> 
RFileDialog::Embed(
const std::shared_ptr<RWebWindow> &window, 
unsigned connid, 
const std::string &args)
 
  442   auto arr = TBufferJSON::FromJSON<std::vector<std::string>>(args.substr(11));
 
  444   if (!arr || (arr->size() < 3)) {
 
  445      R__LOG_ERROR(
BrowserLog()) << 
"Embedded FileDialog failure - argument should have at least three strings" << args.substr(11);
 
  456   auto dialog = std::make_shared<RFileDialog>(kind, 
"", arr->at(1));
 
  458   auto chid = std::stoi(arr->at(2));
 
  460   if ((arr->size() > 3) && (arr->at(3) == 
"__cannotChangePath__"s)) {
 
  461      dialog->SetCanChangePath(
false);
 
  462      arr->erase(arr->begin() + 3, arr->begin() + 4); 
 
  463   } 
else if ((arr->size() > 3) && (arr->at(3) == 
"__canChangePath__"s)) {
 
  464      dialog->SetCanChangePath(
true);
 
  465      arr->erase(arr->begin() + 3, arr->begin() + 4); 
 
  468   if ((arr->size() > 4) && (arr->at(3) == 
"__workingPath__"s)) {
 
  469      dialog->SetWorkingPath(arr->at(4));
 
  470      arr->erase(arr->begin() + 3, arr->begin() + 5); 
 
  473   if (arr->size() > 4) {
 
  474      dialog->SetSelectedFilter(arr->at(3));
 
  475      arr->erase(arr->begin(), arr->begin() + 4); 
 
  476      dialog->SetNameFilters(*arr);
 
  479   dialog->Show({window, connid, chid});
 
  482   dialog->SetCallback([dialog](
const std::string &) 
mutable { dialog.reset(); });
 
  495         return res ? true : 
false;
 
#define R__LOG_ERROR(...)
#define R__LOG_DEBUG(DEBUGLEVEL,...)
winID h TVirtualViewer3D TVirtualGLPainter p
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void on
static std::string GetPathAsString(const RElementPath_t &path)
Converts element path back to string.
static RElementPath_t ParsePath(const std::string &str)
Parse string path to produce RElementPath_t One should avoid to use string pathes as much as possible...
static RElementPath_t ProvideTopEntries(std::shared_ptr< RGroup > &comp, const std::string &workdir="")
Provide top entries for file system On windows it is list of existing drivers, on Linux it is "Files ...
void SetTopElement(std::shared_ptr< Browsable::RElement > elem)
set top element for browsing
std::shared_ptr< Browsable::RElement > GetSubElement(const Browsable::RElementPath_t &path)
Returns sub-element starting from top, using cached data.
std::shared_ptr< Browsable::RElement > GetElementFromTop(const Browsable::RElementPath_t &path)
Returns element with path, specified as Browsable::RElementPath_t.
std::string ProcessRequest(const RBrowserRequest &request)
Process browser request, returns string with JSON of RBrowserReply data.
void SetWorkingPath(const Browsable::RElementPath_t &path)
set working directory relative to top element
const Browsable::RElementPath_t & GetWorkingPath() const
Request send from client to get content of path element.
std::string sort
kind of sorting
std::string regex
applied regex
std::vector< std::string > fNameFilters
! name filters
static void SetStartFunc(bool on)
Set start dialog function for RWebWindow.
static std::string Dialog(EDialogTypes kind, const std::string &title, const std::string &fname)
Start specified dialog type.
std::shared_ptr< RWebWindow > fWebWindow
! web window for file dialog
EDialogTypes fKind
! dialog kind OpenFile, SaveAs, NewFile
bool GetCanChangePath() const
Returns true if working path can be change with gui elements.
RFileDialogCallback_t fCallback
! function receiving result, called once
void Show(const RWebDisplayArgs &args="")
Show or update RFileDialog in web window If web window already started - just refresh it like "reload...
void InvokeCallBack()
Invoke specified callback.
static std::string SaveAs(const std::string &title="", const std::string &fname="")
Start SaveAs dialog.
std::string GetSelectedFilter() const
Returns selected filter Can differ from specified value - if it does not match to existing entry in N...
void ProcessMsg(unsigned connid, const std::string &arg)
Process received data from client.
bool fDidSelect
! true when dialog is selected or closed
static std::string OpenFile(const std::string &title="", const std::string &fname="")
Start OpenFile dialog.
void Hide()
Hide ROOT Browser.
std::string GetRegexp(const std::string &name) const
Returns regexp for selected filter String should have form "Filter name (*.ext1 *....
std::string fSelectedFilter
! name of selected filter
void SendChPathMsg(unsigned connid)
Sends new data after change current directory.
static bool IsMessageToStartDialog(const std::string &msg)
Check if this could be the message send by client to start new file dialog If returns true,...
std::string GetWorkingPath() const
Returns current working path.
static std::string TypeAsString(EDialogTypes kind)
Returns dialog type as string String value used for configuring JS-side.
static std::string NewFile(const std::string &title="", const std::string &fname="")
Start NewFile dialog.
void SetSelectedFilter(const std::string &name)
Configure selected filter Has to be one of the string from NameFilters entry.
RFileDialog(EDialogTypes kind=kOpenFile, const std::string &title="", const std::string &fname="")
constructor When title not specified, default will be used
static std::shared_ptr< RFileDialog > Embed(const std::shared_ptr< RWebWindow > &window, unsigned connid, const std::string &args)
Create dialog instance to use as embedded dialog inside other widget Embedded dialog started on the c...
void SetCallback(RFileDialogCallback_t callback)
Assign callback.
RBrowserData fBrowsable
! central browsing element
std::string fTitle
! title, when not specified default will be used
void SendInitMsg(unsigned connid)
Sends initial message to the client.
const EDialogTypes & GetType() const
void SetWorkingPath(const std::string &)
Change current working path of file dialog If dialog already shown, change will be immediately applie...
virtual ~RFileDialog()
destructor
std::string fSelect
! result of file selection
Holds different arguments for starting browser with RWebDisplayHandle::Display() method.
static std::shared_ptr< RWebWindow > Create()
Create new RWebWindow Using default RWebWindowsManager.
static unsigned ShowWindow(std::shared_ptr< RWebWindow > window, const RWebDisplayArgs &args="")
Static method to show web window Has to be used instead of RWebWindow::Show() when window potentially...
static void SetStartDialogFunc(std::function< bool(const std::shared_ptr< RWebWindow > &, unsigned, const std::string &)>)
Configure func which has to be used for starting dialog.
static TString ToJSON(const T *obj, Int_t compact=0, const char *member_name=nullptr)
class ROOT::Details::RWebWindowPlugin sRWebWindowPlugin
This file contains a specialised ROOT message handler to test for diagnostic in unit tests.
std::function< void(const std::string &)> RFileDialogCallback_t
function signature for file dialog call-backs argument is selected file name
ROOT::Experimental::RLogChannel & BrowserLog()
Log channel for Browser diagnostics.