context-bar-controls.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750
  1. #include "window-basic-main.hpp"
  2. #include "context-bar-controls.hpp"
  3. #include "qt-wrappers.hpp"
  4. #include "obs-app.hpp"
  5. #include <QStandardItemModel>
  6. #include <QColorDialog>
  7. #include <QFontDialog>
  8. #include "ui_browser-source-toolbar.h"
  9. #include "ui_device-select-toolbar.h"
  10. #include "ui_game-capture-toolbar.h"
  11. #include "ui_image-source-toolbar.h"
  12. #include "ui_color-source-toolbar.h"
  13. #include "ui_text-source-toolbar.h"
  14. #ifdef _WIN32
  15. #define get_os_module(win, mac, linux) obs_get_module(win)
  16. #define get_os_text(mod, win, mac, linux) obs_module_get_locale_text(mod, win)
  17. #elif __APPLE__
  18. #define get_os_module(win, mac, linux) obs_get_module(mac)
  19. #define get_os_text(mod, win, mac, linux) obs_module_get_locale_text(mod, mac)
  20. #else
  21. #define get_os_module(win, mac, linux) obs_get_module(linux)
  22. #define get_os_text(mod, win, mac, linux) obs_module_get_locale_text(mod, linux)
  23. #endif
  24. /* ========================================================================= */
  25. SourceToolbar::SourceToolbar(QWidget *parent, OBSSource source)
  26. : QWidget(parent),
  27. weakSource(OBSGetWeakRef(source)),
  28. props(obs_source_properties(source), obs_properties_destroy)
  29. {
  30. }
  31. void SourceToolbar::SaveOldProperties(obs_source_t *source)
  32. {
  33. oldData = obs_data_create();
  34. obs_data_release(oldData);
  35. obs_data_t *oldSettings = obs_source_get_settings(source);
  36. obs_data_apply(oldData, oldSettings);
  37. obs_data_set_string(oldData, "undo_sname", obs_source_get_name(source));
  38. obs_data_release(oldSettings);
  39. }
  40. void SourceToolbar::SetUndoProperties(obs_source_t *source, bool repeatable)
  41. {
  42. if (!oldData) {
  43. blog(LOG_ERROR, "%s: somehow oldData was null.", __FUNCTION__);
  44. return;
  45. }
  46. OBSBasic *main = reinterpret_cast<OBSBasic *>(App()->GetMainWindow());
  47. OBSSource currentSceneSource = main->GetCurrentSceneSource();
  48. if (!currentSceneSource)
  49. return;
  50. std::string scene_name = obs_source_get_name(currentSceneSource);
  51. auto undo_redo = [scene_name,
  52. main = std::move(main)](const std::string &data) {
  53. obs_data_t *settings = obs_data_create_from_json(data.c_str());
  54. obs_source_t *source = obs_get_source_by_name(
  55. obs_data_get_string(settings, "undo_sname"));
  56. obs_source_reset_settings(source, settings);
  57. obs_source_t *scene_source =
  58. obs_get_source_by_name(scene_name.c_str());
  59. main->SetCurrentScene(scene_source, true);
  60. obs_source_release(scene_source);
  61. obs_data_release(settings);
  62. obs_source_release(source);
  63. main->UpdateContextBar();
  64. };
  65. OBSData new_settings = obs_data_create();
  66. OBSData curr_settings = obs_source_get_settings(source);
  67. obs_data_apply(new_settings, curr_settings);
  68. obs_data_set_string(new_settings, "undo_sname",
  69. obs_source_get_name(source));
  70. std::string undo_data(obs_data_get_json(oldData));
  71. std::string redo_data(obs_data_get_json(new_settings));
  72. if (undo_data.compare(redo_data) != 0)
  73. main->undo_s.add_action(
  74. QTStr("Undo.Properties")
  75. .arg(obs_source_get_name(source)),
  76. undo_redo, undo_redo, undo_data, redo_data, repeatable);
  77. obs_data_release(new_settings);
  78. obs_data_release(curr_settings);
  79. oldData = nullptr;
  80. }
  81. /* ========================================================================= */
  82. BrowserToolbar::BrowserToolbar(QWidget *parent, OBSSource source)
  83. : SourceToolbar(parent, source), ui(new Ui_BrowserSourceToolbar)
  84. {
  85. ui->setupUi(this);
  86. }
  87. BrowserToolbar::~BrowserToolbar()
  88. {
  89. delete ui;
  90. }
  91. void BrowserToolbar::on_refresh_clicked()
  92. {
  93. OBSSource source = GetSource();
  94. if (!source) {
  95. return;
  96. }
  97. obs_property_t *p = obs_properties_get(props.get(), "refreshnocache");
  98. obs_property_button_clicked(p, source.Get());
  99. }
  100. /* ========================================================================= */
  101. ComboSelectToolbar::ComboSelectToolbar(QWidget *parent, OBSSource source)
  102. : SourceToolbar(parent, source), ui(new Ui_DeviceSelectToolbar)
  103. {
  104. ui->setupUi(this);
  105. }
  106. ComboSelectToolbar::~ComboSelectToolbar()
  107. {
  108. delete ui;
  109. }
  110. static int FillPropertyCombo(QComboBox *c, obs_property_t *p,
  111. const std::string &cur_id, bool is_int = false)
  112. {
  113. size_t count = obs_property_list_item_count(p);
  114. int cur_idx = -1;
  115. for (size_t i = 0; i < count; i++) {
  116. const char *name = obs_property_list_item_name(p, i);
  117. std::string id;
  118. if (is_int) {
  119. id = std::to_string(obs_property_list_item_int(p, i));
  120. } else {
  121. const char *val = obs_property_list_item_string(p, i);
  122. id = val ? val : "";
  123. }
  124. if (cur_id == id)
  125. cur_idx = (int)i;
  126. c->addItem(name, id.c_str());
  127. }
  128. return cur_idx;
  129. }
  130. void UpdateSourceComboToolbarProperties(QComboBox *combo, OBSSource source,
  131. obs_properties_t *props,
  132. const char *prop_name, bool is_int)
  133. {
  134. std::string cur_id;
  135. obs_data_t *settings = obs_source_get_settings(source);
  136. if (is_int) {
  137. cur_id = std::to_string(obs_data_get_int(settings, prop_name));
  138. } else {
  139. cur_id = obs_data_get_string(settings, prop_name);
  140. }
  141. obs_data_release(settings);
  142. combo->blockSignals(true);
  143. obs_property_t *p = obs_properties_get(props, prop_name);
  144. int cur_idx = FillPropertyCombo(combo, p, cur_id, is_int);
  145. if (cur_idx == -1 || obs_property_list_item_disabled(p, cur_idx)) {
  146. if (cur_idx == -1) {
  147. combo->insertItem(
  148. 0,
  149. QTStr("Basic.Settings.Audio.UnknownAudioDevice"));
  150. cur_idx = 0;
  151. }
  152. SetComboItemEnabled(combo, cur_idx, false);
  153. }
  154. combo->setCurrentIndex(cur_idx);
  155. combo->blockSignals(false);
  156. }
  157. void ComboSelectToolbar::Init()
  158. {
  159. OBSSource source = GetSource();
  160. if (!source) {
  161. return;
  162. }
  163. UpdateSourceComboToolbarProperties(ui->device, source, props.get(),
  164. prop_name, is_int);
  165. }
  166. void UpdateSourceComboToolbarValue(QComboBox *combo, OBSSource source, int idx,
  167. const char *prop_name, bool is_int)
  168. {
  169. QString id = combo->itemData(idx).toString();
  170. obs_data_t *settings = obs_data_create();
  171. if (is_int) {
  172. obs_data_set_int(settings, prop_name, id.toInt());
  173. } else {
  174. obs_data_set_string(settings, prop_name, QT_TO_UTF8(id));
  175. }
  176. obs_source_update(source, settings);
  177. obs_data_release(settings);
  178. }
  179. void ComboSelectToolbar::on_device_currentIndexChanged(int idx)
  180. {
  181. OBSSource source = GetSource();
  182. if (idx == -1 || !source) {
  183. return;
  184. }
  185. SaveOldProperties(source);
  186. UpdateSourceComboToolbarValue(ui->device, source, idx, prop_name,
  187. is_int);
  188. SetUndoProperties(source);
  189. }
  190. AudioCaptureToolbar::AudioCaptureToolbar(QWidget *parent, OBSSource source)
  191. : ComboSelectToolbar(parent, source)
  192. {
  193. }
  194. void AudioCaptureToolbar::Init()
  195. {
  196. delete ui->activateButton;
  197. ui->activateButton = nullptr;
  198. obs_module_t *mod =
  199. get_os_module("win-wasapi", "mac-capture", "linux-pulseaudio");
  200. if (!mod) {
  201. return;
  202. }
  203. const char *device_str =
  204. get_os_text(mod, "Device", "CoreAudio.Device", "Device");
  205. ui->deviceLabel->setText(device_str);
  206. prop_name = "device_id";
  207. ComboSelectToolbar::Init();
  208. }
  209. WindowCaptureToolbar::WindowCaptureToolbar(QWidget *parent, OBSSource source)
  210. : ComboSelectToolbar(parent, source)
  211. {
  212. }
  213. void WindowCaptureToolbar::Init()
  214. {
  215. delete ui->activateButton;
  216. ui->activateButton = nullptr;
  217. obs_module_t *mod =
  218. get_os_module("win-capture", "mac-capture", "linux-capture");
  219. const char *device_str = get_os_text(mod, "WindowCapture.Window",
  220. "WindowUtils.Window", "Window");
  221. ui->deviceLabel->setText(device_str);
  222. #if !defined(_WIN32) && !defined(__APPLE__) //linux
  223. prop_name = "capture_window";
  224. #else
  225. prop_name = "window";
  226. #endif
  227. #ifdef __APPLE__
  228. is_int = true;
  229. #endif
  230. ComboSelectToolbar::Init();
  231. }
  232. DisplayCaptureToolbar::DisplayCaptureToolbar(QWidget *parent, OBSSource source)
  233. : ComboSelectToolbar(parent, source)
  234. {
  235. }
  236. void DisplayCaptureToolbar::Init()
  237. {
  238. delete ui->activateButton;
  239. ui->activateButton = nullptr;
  240. obs_module_t *mod =
  241. get_os_module("win-capture", "mac-capture", "linux-capture");
  242. const char *device_str =
  243. get_os_text(mod, "Monitor", "DisplayCapture.Display", "Screen");
  244. ui->deviceLabel->setText(device_str);
  245. is_int = true;
  246. #ifdef _WIN32
  247. prop_name = "monitor";
  248. #elif __APPLE__
  249. prop_name = "display";
  250. #else
  251. prop_name = "screen";
  252. #endif
  253. ComboSelectToolbar::Init();
  254. }
  255. /* ========================================================================= */
  256. DeviceCaptureToolbar::DeviceCaptureToolbar(QWidget *parent, OBSSource source)
  257. : QWidget(parent),
  258. weakSource(OBSGetWeakRef(source)),
  259. ui(new Ui_DeviceSelectToolbar)
  260. {
  261. ui->setupUi(this);
  262. delete ui->deviceLabel;
  263. delete ui->device;
  264. ui->deviceLabel = nullptr;
  265. ui->device = nullptr;
  266. obs_data_t *settings = obs_source_get_settings(source);
  267. active = obs_data_get_bool(settings, "active");
  268. obs_data_release(settings);
  269. obs_module_t *mod = obs_get_module("win-dshow");
  270. activateText = obs_module_get_locale_text(mod, "Activate");
  271. deactivateText = obs_module_get_locale_text(mod, "Deactivate");
  272. ui->activateButton->setText(active ? deactivateText : activateText);
  273. }
  274. DeviceCaptureToolbar::~DeviceCaptureToolbar()
  275. {
  276. delete ui;
  277. }
  278. void DeviceCaptureToolbar::on_activateButton_clicked()
  279. {
  280. OBSSource source = OBSGetStrongRef(weakSource);
  281. if (!source) {
  282. return;
  283. }
  284. obs_data_t *settings = obs_source_get_settings(source);
  285. bool now_active = obs_data_get_bool(settings, "active");
  286. obs_data_release(settings);
  287. bool desyncedSetting = now_active != active;
  288. active = !active;
  289. const char *text = active ? deactivateText : activateText;
  290. ui->activateButton->setText(text);
  291. if (desyncedSetting) {
  292. return;
  293. }
  294. calldata_t cd = {};
  295. calldata_set_bool(&cd, "active", active);
  296. proc_handler_t *ph = obs_source_get_proc_handler(source);
  297. proc_handler_call(ph, "activate", &cd);
  298. calldata_free(&cd);
  299. }
  300. /* ========================================================================= */
  301. GameCaptureToolbar::GameCaptureToolbar(QWidget *parent, OBSSource source)
  302. : SourceToolbar(parent, source), ui(new Ui_GameCaptureToolbar)
  303. {
  304. obs_property_t *p;
  305. int cur_idx;
  306. ui->setupUi(this);
  307. obs_module_t *mod = obs_get_module("win-capture");
  308. ui->modeLabel->setText(obs_module_get_locale_text(mod, "Mode"));
  309. ui->windowLabel->setText(
  310. obs_module_get_locale_text(mod, "WindowCapture.Window"));
  311. obs_data_t *settings = obs_source_get_settings(source);
  312. std::string cur_mode = obs_data_get_string(settings, "capture_mode");
  313. std::string cur_window = obs_data_get_string(settings, "window");
  314. obs_data_release(settings);
  315. ui->mode->blockSignals(true);
  316. p = obs_properties_get(props.get(), "capture_mode");
  317. cur_idx = FillPropertyCombo(ui->mode, p, cur_mode);
  318. ui->mode->setCurrentIndex(cur_idx);
  319. ui->mode->blockSignals(false);
  320. ui->window->blockSignals(true);
  321. p = obs_properties_get(props.get(), "window");
  322. cur_idx = FillPropertyCombo(ui->window, p, cur_window);
  323. ui->window->setCurrentIndex(cur_idx);
  324. ui->window->blockSignals(false);
  325. if (cur_idx != -1 && obs_property_list_item_disabled(p, cur_idx)) {
  326. SetComboItemEnabled(ui->window, cur_idx, false);
  327. }
  328. UpdateWindowVisibility();
  329. }
  330. GameCaptureToolbar::~GameCaptureToolbar()
  331. {
  332. delete ui;
  333. }
  334. void GameCaptureToolbar::UpdateWindowVisibility()
  335. {
  336. QString mode = ui->mode->currentData().toString();
  337. bool is_window = (mode == "window");
  338. ui->windowLabel->setVisible(is_window);
  339. ui->window->setVisible(is_window);
  340. }
  341. void GameCaptureToolbar::on_mode_currentIndexChanged(int idx)
  342. {
  343. OBSSource source = GetSource();
  344. if (idx == -1 || !source) {
  345. return;
  346. }
  347. QString id = ui->mode->itemData(idx).toString();
  348. SaveOldProperties(source);
  349. obs_data_t *settings = obs_data_create();
  350. obs_data_set_string(settings, "capture_mode", QT_TO_UTF8(id));
  351. obs_source_update(source, settings);
  352. obs_data_release(settings);
  353. SetUndoProperties(source);
  354. UpdateWindowVisibility();
  355. }
  356. void GameCaptureToolbar::on_window_currentIndexChanged(int idx)
  357. {
  358. OBSSource source = GetSource();
  359. if (idx == -1 || !source) {
  360. return;
  361. }
  362. QString id = ui->window->itemData(idx).toString();
  363. SaveOldProperties(source);
  364. obs_data_t *settings = obs_data_create();
  365. obs_data_set_string(settings, "window", QT_TO_UTF8(id));
  366. obs_source_update(source, settings);
  367. obs_data_release(settings);
  368. SetUndoProperties(source);
  369. }
  370. /* ========================================================================= */
  371. ImageSourceToolbar::ImageSourceToolbar(QWidget *parent, OBSSource source)
  372. : SourceToolbar(parent, source), ui(new Ui_ImageSourceToolbar)
  373. {
  374. ui->setupUi(this);
  375. obs_module_t *mod = obs_get_module("image-source");
  376. ui->pathLabel->setText(obs_module_get_locale_text(mod, "File"));
  377. obs_data_t *settings = obs_source_get_settings(source);
  378. std::string file = obs_data_get_string(settings, "file");
  379. obs_data_release(settings);
  380. ui->path->setText(file.c_str());
  381. }
  382. ImageSourceToolbar::~ImageSourceToolbar()
  383. {
  384. delete ui;
  385. }
  386. void ImageSourceToolbar::on_browse_clicked()
  387. {
  388. OBSSource source = GetSource();
  389. if (!source) {
  390. return;
  391. }
  392. obs_property_t *p = obs_properties_get(props.get(), "file");
  393. const char *desc = obs_property_description(p);
  394. const char *filter = obs_property_path_filter(p);
  395. const char *default_path = obs_property_path_default_path(p);
  396. QString path = OpenFile(this, desc, default_path, filter);
  397. if (path.isEmpty()) {
  398. return;
  399. }
  400. ui->path->setText(path);
  401. SaveOldProperties(source);
  402. obs_data_t *settings = obs_data_create();
  403. obs_data_set_string(settings, "file", QT_TO_UTF8(path));
  404. obs_source_update(source, settings);
  405. obs_data_release(settings);
  406. SetUndoProperties(source);
  407. }
  408. /* ========================================================================= */
  409. static inline QColor color_from_int(long long val)
  410. {
  411. return QColor(val & 0xff, (val >> 8) & 0xff, (val >> 16) & 0xff,
  412. (val >> 24) & 0xff);
  413. }
  414. static inline long long color_to_int(QColor color)
  415. {
  416. auto shift = [&](unsigned val, int shift) {
  417. return ((val & 0xff) << shift);
  418. };
  419. return shift(color.red(), 0) | shift(color.green(), 8) |
  420. shift(color.blue(), 16) | shift(color.alpha(), 24);
  421. }
  422. ColorSourceToolbar::ColorSourceToolbar(QWidget *parent, OBSSource source)
  423. : SourceToolbar(parent, source), ui(new Ui_ColorSourceToolbar)
  424. {
  425. ui->setupUi(this);
  426. obs_data_t *settings = obs_source_get_settings(source);
  427. unsigned int val = (unsigned int)obs_data_get_int(settings, "color");
  428. obs_data_release(settings);
  429. color = color_from_int(val);
  430. UpdateColor();
  431. }
  432. ColorSourceToolbar::~ColorSourceToolbar()
  433. {
  434. delete ui;
  435. }
  436. void ColorSourceToolbar::UpdateColor()
  437. {
  438. QPalette palette = QPalette(color);
  439. ui->color->setFrameStyle(QFrame::Sunken | QFrame::Panel);
  440. ui->color->setText(color.name(QColor::HexRgb));
  441. ui->color->setPalette(palette);
  442. ui->color->setStyleSheet(
  443. QString("background-color :%1; color: %2;")
  444. .arg(palette.color(QPalette::Window)
  445. .name(QColor::HexRgb))
  446. .arg(palette.color(QPalette::WindowText)
  447. .name(QColor::HexRgb)));
  448. ui->color->setAutoFillBackground(true);
  449. ui->color->setAlignment(Qt::AlignCenter);
  450. }
  451. void ColorSourceToolbar::on_choose_clicked()
  452. {
  453. OBSSource source = GetSource();
  454. if (!source) {
  455. return;
  456. }
  457. obs_property_t *p = obs_properties_get(props.get(), "color");
  458. const char *desc = obs_property_description(p);
  459. QColorDialog::ColorDialogOptions options;
  460. options |= QColorDialog::ShowAlphaChannel;
  461. #ifndef _WIN32
  462. options |= QColorDialog::DontUseNativeDialog;
  463. #endif
  464. QColor newColor = QColorDialog::getColor(color, this, desc, options);
  465. if (!newColor.isValid()) {
  466. return;
  467. }
  468. color = newColor;
  469. UpdateColor();
  470. SaveOldProperties(source);
  471. obs_data_t *settings = obs_data_create();
  472. obs_data_set_int(settings, "color", color_to_int(color));
  473. obs_source_update(source, settings);
  474. obs_data_release(settings);
  475. SetUndoProperties(source);
  476. }
  477. /* ========================================================================= */
  478. extern void MakeQFont(obs_data_t *font_obj, QFont &font, bool limit = false);
  479. TextSourceToolbar::TextSourceToolbar(QWidget *parent, OBSSource source)
  480. : SourceToolbar(parent, source), ui(new Ui_TextSourceToolbar)
  481. {
  482. ui->setupUi(this);
  483. obs_data_t *settings = obs_source_get_settings(source);
  484. const char *id = obs_source_get_unversioned_id(source);
  485. bool ft2 = strcmp(id, "text_ft2_source") == 0;
  486. bool read_from_file = obs_data_get_bool(
  487. settings, ft2 ? "from_file" : "read_from_file");
  488. obs_data_t *font_obj = obs_data_get_obj(settings, "font");
  489. MakeQFont(font_obj, font);
  490. obs_data_release(font_obj);
  491. // Use "color1" if it's a freetype source and "color" elsewise
  492. unsigned int val = (unsigned int)obs_data_get_int(
  493. settings,
  494. (strncmp(obs_source_get_id(source), "text_ft2_source", 15) == 0)
  495. ? "color1"
  496. : "color");
  497. color = color_from_int(val);
  498. const char *text = obs_data_get_string(settings, "text");
  499. bool single_line = !read_from_file &&
  500. (!text || (strchr(text, '\n') == nullptr));
  501. ui->emptySpace->setVisible(!single_line);
  502. ui->text->setVisible(single_line);
  503. if (single_line)
  504. ui->text->setText(text);
  505. obs_data_release(settings);
  506. }
  507. TextSourceToolbar::~TextSourceToolbar()
  508. {
  509. delete ui;
  510. }
  511. void TextSourceToolbar::on_selectFont_clicked()
  512. {
  513. OBSSource source = GetSource();
  514. if (!source) {
  515. return;
  516. }
  517. QFontDialog::FontDialogOptions options;
  518. uint32_t flags;
  519. bool success;
  520. #ifndef _WIN32
  521. options = QFontDialog::DontUseNativeDialog;
  522. #endif
  523. font = QFontDialog::getFont(&success, font, this, "Pick a Font",
  524. options);
  525. if (!success) {
  526. return;
  527. }
  528. obs_data_t *font_obj = obs_data_create();
  529. obs_data_set_string(font_obj, "face", QT_TO_UTF8(font.family()));
  530. obs_data_set_string(font_obj, "style", QT_TO_UTF8(font.styleName()));
  531. obs_data_set_int(font_obj, "size", font.pointSize());
  532. flags = font.bold() ? OBS_FONT_BOLD : 0;
  533. flags |= font.italic() ? OBS_FONT_ITALIC : 0;
  534. flags |= font.underline() ? OBS_FONT_UNDERLINE : 0;
  535. flags |= font.strikeOut() ? OBS_FONT_STRIKEOUT : 0;
  536. obs_data_set_int(font_obj, "flags", flags);
  537. SaveOldProperties(source);
  538. obs_data_t *settings = obs_data_create();
  539. obs_data_set_obj(settings, "font", font_obj);
  540. obs_data_release(font_obj);
  541. obs_source_update(source, settings);
  542. obs_data_release(settings);
  543. SetUndoProperties(source);
  544. }
  545. void TextSourceToolbar::on_selectColor_clicked()
  546. {
  547. OBSSource source = GetSource();
  548. if (!source) {
  549. return;
  550. }
  551. bool freetype =
  552. strncmp(obs_source_get_id(source), "text_ft2_source", 15) == 0;
  553. obs_property_t *p =
  554. obs_properties_get(props.get(), freetype ? "color1" : "color");
  555. const char *desc = obs_property_description(p);
  556. QColorDialog::ColorDialogOptions options;
  557. options |= QColorDialog::ShowAlphaChannel;
  558. #ifndef _WIN32
  559. options |= QColorDialog::DontUseNativeDialog;
  560. #endif
  561. QColor newColor = QColorDialog::getColor(color, this, desc, options);
  562. if (!newColor.isValid()) {
  563. return;
  564. }
  565. color = newColor;
  566. SaveOldProperties(source);
  567. obs_data_t *settings = obs_data_create();
  568. if (freetype) {
  569. obs_data_set_int(settings, "color1", color_to_int(color));
  570. obs_data_set_int(settings, "color2", color_to_int(color));
  571. } else {
  572. obs_data_set_int(settings, "color", color_to_int(color));
  573. }
  574. obs_source_update(source, settings);
  575. obs_data_release(settings);
  576. SetUndoProperties(source);
  577. }
  578. void TextSourceToolbar::on_text_textChanged()
  579. {
  580. OBSSource source = GetSource();
  581. if (!source) {
  582. return;
  583. }
  584. SaveOldProperties(source);
  585. obs_data_t *settings = obs_data_create();
  586. obs_data_set_string(settings, "text", QT_TO_UTF8(ui->text->text()));
  587. obs_source_update(source, settings);
  588. obs_data_release(settings);
  589. SetUndoProperties(source, true);
  590. }