nodegui / react-nodegui

Build performant, native and cross-platform desktop applications with native React + powerful CSS like styling.🚀
https://react.nodegui.org
MIT License
6.18k stars 171 forks source link

Cannot receive close event of FileDialog #374

Open Dauto98 opened 2 years ago

Dauto98 commented 2 years ago

Describe the bug When using FileDialog I would like to handle the event when the user close the dialog through Cancel button or Alt-F4. Basically any way that is not selecting a file. The problem is I cannot find any event that is fired when I close the dialog this way. It is needed so I can set the open state back to false.

How can I handle this use case?

To Reproduce Sample code

const FileLoader = () => {
  const [open, setOpen] = useState(false);

  const onButtonClick = useEventHandler({
    clicked: () => {
      setOpen(true);
    }
  }, []);

  const onFileEvent = useEventHandler({
    // this one work, when the user select a file
    fileSelected: (file) => {
      setOpen(false);
      console.log(file);
    },
    // I tried all of these and none worked
    finished: (event) => {
      setOpen(false);
      console.log("close");
    },
    accept: () => {
      console.log("accept");
    },
    reject: () => {
      console.log("reject");
    },
    open: () => {
      console.log("open");
    },
    Close: () => {
      console.log("close");
    }
  }, []);

  return (
    <View>
      <Button on={onButtonClick}>Select file</Button>
      <FileDialog open={open} on={onFileEvent} />
    </View>
  );
};

Desktop (please complete the following information):

Dauto98 commented 2 years ago

I am debugging the issue and the problem seems to be no event is fired when I close the dialog through Cancel button (logExceptions not called in class EventWidget extends Component_1.Component in node_modules/@nodegui/nodegui/dist/lib/core/EventWidget.js).

Not sure is it related to the #373 issue (another issue of mine)

pro100andrik commented 10 months ago

I'm not sure is it actual right now, but I managed same issue like this

const [files, setFiles] = useState([]);
const chooseFileButtonHandler = useEventHandler<QPushButtonSignals>(
  {
    clicked: () => {
      const fileDialog = new QFileDialog();
      fileDialog.exec();
      const selectedFiles = fileDialog.selectedFiles();
      if (fileDialog.result() !== 0) {  // 0 = user closed the dialog, 1 = user selected file
        setFiles(selectedFiles)
      }
    }
  },
  []
);
  return (
    <View>
      <Button on={chooseFileButtonHandler} text='Chose file' />
    </View>
  );